summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oox/inc/oox/drawingml/chart/axismodel.hxx4
-rw-r--r--oox/inc/oox/xls/biffhelper.hxx2
-rw-r--r--oox/source/drawingml/chart/axiscontext.cxx2
-rw-r--r--oox/source/drawingml/chart/axisconverter.cxx99
-rw-r--r--oox/source/drawingml/chart/axismodel.cxx1
-rw-r--r--oox/source/dump/biffdumper.cxx24
-rw-r--r--oox/source/dump/biffdumper.ini30
7 files changed, 102 insertions, 60 deletions
diff --git a/oox/inc/oox/drawingml/chart/axismodel.hxx b/oox/inc/oox/drawingml/chart/axismodel.hxx
index 23dc96037427..0ce24d6ff515 100644
--- a/oox/inc/oox/drawingml/chart/axismodel.hxx
+++ b/oox/inc/oox/drawingml/chart/axismodel.hxx
@@ -77,9 +77,9 @@ struct AxisModel
OptValue< double > mofLogBase; /// Logarithmic base for logarithmic axes.
OptValue< double > mofMax; /// Maximum axis value.
OptValue< double > mofMin; /// Minimum axis value.
+ OptValue< sal_Int32 > monBaseTimeUnit; /// Base time unit shown on a date axis.
sal_Int32 mnAxisId; /// Unique axis identifier.
sal_Int32 mnAxisPos; /// Position of the axis (top/bottom/left/right).
- sal_Int32 mnBaseTimeUnit; /// Base time unit shown on a date axis.
sal_Int32 mnCrossAxisId; /// Identifier of a crossing axis.
sal_Int32 mnCrossBetween; /// This value axis crosses between or inside category.
sal_Int32 mnCrossMode; /// Mode this axis crosses another axis (min, max, auto).
@@ -94,7 +94,7 @@ struct AxisModel
sal_Int32 mnTickLabelSkip; /// Number of tick mark labels to skip.
sal_Int32 mnTickMarkSkip; /// Number of tick marks to skip.
sal_Int32 mnTypeId; /// Type identifier of this axis.
- bool mbAuto; /// True = automatic axis settings.
+ bool mbAuto; /// True = automatic selection of text/date axis type.
bool mbDeleted; /// True = axis has been deleted manually.
bool mbNoMultiLevel; /// True = no multi-level categories supported.
diff --git a/oox/inc/oox/xls/biffhelper.hxx b/oox/inc/oox/xls/biffhelper.hxx
index 9c0a57a83c04..5552a5e5ce52 100644
--- a/oox/inc/oox/xls/biffhelper.hxx
+++ b/oox/inc/oox/xls/biffhelper.hxx
@@ -303,6 +303,7 @@ const sal_uInt16 BIFF_ID_CHCHART = 0x1002;
const sal_uInt16 BIFF_ID_CHCHART3D = 0x103A;
const sal_uInt16 BIFF_ID_CHCHARTLINE = 0x101C;
const sal_uInt16 BIFF_ID_CHDATAFORMAT = 0x1006;
+const sal_uInt16 BIFF_ID_CHDATERANGE = 0x1062;
const sal_uInt16 BIFF_ID_CHDEFAULTTEXT = 0x1024;
const sal_uInt16 BIFF_ID_CHDROPBAR = 0x103D;
const sal_uInt16 BIFF_ID_CHECKCOMPAT = 0x088C;
@@ -327,7 +328,6 @@ const sal_uInt16 BIFF_ID_CHFRTEXTPROPS = 0x08A5;
const sal_uInt16 BIFF_ID_CHFRUNITPROPS = 0x0857;
const sal_uInt16 BIFF_ID_CHFRWRAPPER = 0x0851;
const sal_uInt16 BIFF_ID_CHLABELRANGE = 0x1020;
-const sal_uInt16 BIFF_ID_CHLABELRANGE2 = 0x1062;
const sal_uInt16 BIFF_ID_CHLEGEND = 0x1015;
const sal_uInt16 BIFF_ID_CHLINE = 0x1018;
const sal_uInt16 BIFF_ID_CHLINEFORMAT = 0x1007;
diff --git a/oox/source/drawingml/chart/axiscontext.cxx b/oox/source/drawingml/chart/axiscontext.cxx
index cfcdd3ff0754..e590bf1c64cb 100644
--- a/oox/source/drawingml/chart/axiscontext.cxx
+++ b/oox/source/drawingml/chart/axiscontext.cxx
@@ -237,7 +237,7 @@ ContextHandlerRef DateAxisContext::onCreateContext( sal_Int32 nElement, const At
mrModel.mbAuto = rAttribs.getBool( XML_val, false );
return 0;
case C_TOKEN( baseTimeUnit ):
- mrModel.mnBaseTimeUnit = rAttribs.getToken( XML_val, XML_days );
+ mrModel.monBaseTimeUnit = rAttribs.getToken( XML_val, XML_days );
return 0;
case C_TOKEN( lblOffset ):
mrModel.mnLabelOffset = rAttribs.getInteger( XML_val, 100 );
diff --git a/oox/source/drawingml/chart/axisconverter.cxx b/oox/source/drawingml/chart/axisconverter.cxx
index 028fc3d19eb1..18dc00b9d866 100644
--- a/oox/source/drawingml/chart/axisconverter.cxx
+++ b/oox/source/drawingml/chart/axisconverter.cxx
@@ -31,6 +31,8 @@
#include <com/sun/star/chart/ChartAxisLabelPosition.hpp>
#include <com/sun/star/chart/ChartAxisMarkPosition.hpp>
#include <com/sun/star/chart/ChartAxisPosition.hpp>
+#include <com/sun/star/chart/TimeInterval.hpp>
+#include <com/sun/star/chart/TimeUnit.hpp>
#include <com/sun/star/chart2/AxisType.hpp>
#include <com/sun/star/chart2/TickmarkStyle.hpp>
#include <com/sun/star/chart2/XAxis.hpp>
@@ -57,23 +59,35 @@ using ::rtl::OUString;
namespace {
-template< typename Type >
-inline void lclSetValueOrClearAny( Any& orAny, const OptValue< Type >& roValue )
+inline void lclSetValueOrClearAny( Any& orAny, const OptValue< double >& rofValue )
{
- if( roValue.has() ) orAny <<= roValue.get(); else orAny.clear();
+ if( rofValue.has() ) orAny <<= rofValue.get(); else orAny.clear();
}
-void lclSetScaledValueOrClearAny( Any& orAny, const OptValue< double >& rofValue, const Reference< XScaling >& rxScaling )
+bool lclIsLogarithmicScale( const AxisModel& rAxisModel )
{
- if( rofValue.has() && rxScaling.is() )
- orAny <<= rxScaling->doScaling( rofValue.get() );
- else
- lclSetValueOrClearAny( orAny, rofValue );
+ return rAxisModel.mofLogBase.has() && (2.0 <= rAxisModel.mofLogBase.get()) && (rAxisModel.mofLogBase.get() <= 1000.0);
}
-bool lclIsLogarithmicScale( const AxisModel& rAxisModel )
+sal_Int32 lclGetApiTimeUnit( sal_Int32 nTimeUnit )
{
- return rAxisModel.mofLogBase.has() && (2.0 <= rAxisModel.mofLogBase.get()) && (rAxisModel.mofLogBase.get() <= 1000.0);
+ using namespace ::com::sun::star::chart;
+ switch( nTimeUnit )
+ {
+ case XML_days: return TimeUnit::DAY;
+ case XML_months: return TimeUnit::MONTH;
+ case XML_years: return TimeUnit::YEAR;
+ default: OSL_ENSURE( false, "lclGetApiTimeUnit - unexpected time unit" );
+ }
+ return TimeUnit::DAY;
+}
+
+void lclConvertTimeInterval( Any& orInterval, const OptValue< double >& rofUnit, sal_Int32 nTimeUnit )
+{
+ if( rofUnit.has() && (1.0 <= rofUnit.get()) && (rofUnit.get() <= SAL_MAX_INT32) )
+ orInterval <<= ::com::sun::star::chart::TimeInterval( static_cast< sal_Int32 >( rofUnit.get() ), lclGetApiTimeUnit( nTimeUnit ) );
+ else
+ orInterval.clear();
}
::com::sun::star::chart::ChartAxisLabelPosition lclGetLabelPosition( sal_Int32 nToken )
@@ -175,8 +189,13 @@ void AxisConverter::convertFromModel( const Reference< XCoordinateSystem >& rxCo
if( rTypeInfo.mbCategoryAxis )
{
OSL_ENSURE( (mrModel.mnTypeId == C_TOKEN( catAx )) || (mrModel.mnTypeId == C_TOKEN( dateAx )),
- "AxisConverter::convertFromModel - unexpected axis model type (must: c:catAx or c:dateEx)" );
- aScaleData.AxisType = cssc2::AxisType::CATEGORY;
+ "AxisConverter::convertFromModel - unexpected axis model type (must: c:catAx or c:dateAx)" );
+ bool bDateAxis = mrModel.mnTypeId == C_TOKEN( dateAx );
+ /* Chart2 requires axis type CATEGORY for automatic
+ category/date axis (even if it is a date axis
+ currently). */
+ aScaleData.AxisType = (bDateAxis && !mrModel.mbAuto) ? cssc2::AxisType::DATE : cssc2::AxisType::CATEGORY;
+ aScaleData.AutoDateAxis = mrModel.mbAuto;
aScaleData.Categories = rTypeGroup.createCategorySequence();
}
else
@@ -202,14 +221,37 @@ void AxisConverter::convertFromModel( const Reference< XCoordinateSystem >& rxCo
{
case cssc2::AxisType::CATEGORY:
case cssc2::AxisType::SERIES:
+ case cssc2::AxisType::DATE:
{
- // do not overlap text unless all labels are visible
- aAxisProp.setProperty( PROP_TextOverlap, mrModel.mnTickLabelSkip == 1 );
- // do not break text into several lines
- aAxisProp.setProperty( PROP_TextBreak, false );
- // do not stagger labels in two lines
- aAxisProp.setProperty( PROP_ArrangeOrder, cssc::ChartAxisArrangeOrderType_SIDE_BY_SIDE );
- //! TODO #i58731# show n-th category
+ /* Determine date axis type from XML type identifier, and not
+ via aScaleData.AxisType, as this value sticks to CATEGORY
+ for automatic category/date axes). */
+ if( mrModel.mnTypeId == C_TOKEN( dateAx ) )
+ {
+ // scaling algorithm
+ aScaleData.Scaling.set( createInstance( CREATE_OUSTRING( "com.sun.star.chart2.LinearScaling" ) ), UNO_QUERY );
+ // min/max
+ lclSetValueOrClearAny( aScaleData.Minimum, mrModel.mofMin );
+ lclSetValueOrClearAny( aScaleData.Maximum, mrModel.mofMax );
+ // major/minor increment
+ lclConvertTimeInterval( aScaleData.TimeIncrement.MajorTimeInterval, mrModel.mofMajorUnit, mrModel.mnMajorTimeUnit );
+ lclConvertTimeInterval( aScaleData.TimeIncrement.MinorTimeInterval, mrModel.mofMinorUnit, mrModel.mnMinorTimeUnit );
+ // base time unit
+ if( mrModel.monBaseTimeUnit.has() )
+ aScaleData.TimeIncrement.TimeResolution <<= lclGetApiTimeUnit( mrModel.monBaseTimeUnit.get() );
+ else
+ aScaleData.TimeIncrement.TimeResolution.clear();
+ }
+ else
+ {
+ // do not overlap text unless all labels are visible
+ aAxisProp.setProperty( PROP_TextOverlap, mrModel.mnTickLabelSkip == 1 );
+ // do not break text into several lines
+ aAxisProp.setProperty( PROP_TextBreak, false );
+ // do not stagger labels in two lines
+ aAxisProp.setProperty( PROP_ArrangeOrder, cssc::ChartAxisArrangeOrderType_SIDE_BY_SIDE );
+ //! TODO #i58731# show n-th category
+ }
}
break;
case cssc2::AxisType::REALNUMBER:
@@ -226,26 +268,25 @@ void AxisConverter::convertFromModel( const Reference< XCoordinateSystem >& rxCo
lclSetValueOrClearAny( aScaleData.Maximum, mrModel.mofMax );
// major increment
IncrementData& rIncrementData = aScaleData.IncrementData;
- lclSetScaledValueOrClearAny( rIncrementData.Distance, mrModel.mofMajorUnit, aScaleData.Scaling );
+ if( mrModel.mofMajorUnit.has() && aScaleData.Scaling.is() )
+ rIncrementData.Distance <<= aScaleData.Scaling->doScaling( mrModel.mofMajorUnit.get() );
+ else
+ lclSetValueOrClearAny( rIncrementData.Distance, mrModel.mofMajorUnit );
// minor increment
Sequence< SubIncrement >& rSubIncrementSeq = rIncrementData.SubIncrements;
rSubIncrementSeq.realloc( 1 );
Any& rIntervalCount = rSubIncrementSeq[ 0 ].IntervalCount;
+ rIntervalCount.clear();
if( bLogScale )
{
if( mrModel.mofMinorUnit.has() )
rIntervalCount <<= sal_Int32( 9 );
}
- else
+ else if( mrModel.mofMajorUnit.has() && mrModel.mofMinorUnit.has() && (0.0 < mrModel.mofMinorUnit.get()) && (mrModel.mofMinorUnit.get() <= mrModel.mofMajorUnit.get()) )
{
- OptValue< sal_Int32 > onCount;
- if( mrModel.mofMajorUnit.has() && mrModel.mofMinorUnit.has() && (0.0 < mrModel.mofMinorUnit.get()) && (mrModel.mofMinorUnit.get() <= mrModel.mofMajorUnit.get()) )
- {
- double fCount = mrModel.mofMajorUnit.get() / mrModel.mofMinorUnit.get() + 0.5;
- if( (1.0 <= fCount) && (fCount < 1001.0) )
- onCount = static_cast< sal_Int32 >( fCount );
- }
- lclSetValueOrClearAny( rIntervalCount, onCount );
+ double fCount = mrModel.mofMajorUnit.get() / mrModel.mofMinorUnit.get() + 0.5;
+ if( (1.0 <= fCount) && (fCount < 1001.0) )
+ rIntervalCount <<= static_cast< sal_Int32 >( fCount );
}
}
break;
diff --git a/oox/source/drawingml/chart/axismodel.cxx b/oox/source/drawingml/chart/axismodel.cxx
index 8736e8f6dcd5..c1bec6c1e1be 100644
--- a/oox/source/drawingml/chart/axismodel.cxx
+++ b/oox/source/drawingml/chart/axismodel.cxx
@@ -48,7 +48,6 @@ AxisDispUnitsModel::~AxisDispUnitsModel()
AxisModel::AxisModel( sal_Int32 nTypeId ) :
mnAxisId( -1 ),
mnAxisPos( XML_TOKEN_INVALID ),
- mnBaseTimeUnit( XML_days ),
mnCrossAxisId( -1 ),
mnCrossBetween( XML_between ),
mnCrossMode( XML_autoZero ),
diff --git a/oox/source/dump/biffdumper.cxx b/oox/source/dump/biffdumper.cxx
index 4e9156b5cc03..546ad186e7ab 100644
--- a/oox/source/dump/biffdumper.cxx
+++ b/oox/source/dump/biffdumper.cxx
@@ -1755,6 +1755,18 @@ void WorkbookStreamObject::implDumpRecordBody()
if( eBiff >= BIFF5 ) dumpHex< sal_uInt16 >( "flags", "CHDATAFORMAT-FLAGS" );
break;
+ case BIFF_ID_CHDATERANGE:
+ dumpDec< sal_uInt16 >( "minimum-date" );
+ dumpDec< sal_uInt16 >( "maximum-date" );
+ dumpDec< sal_uInt16 >( "major-unit-value" );
+ dumpDec< sal_uInt16 >( "major-unit", "CHDATERANGE-UNIT" );
+ dumpDec< sal_uInt16 >( "minor-unit-value" );
+ dumpDec< sal_uInt16 >( "minor-unit", "CHDATERANGE-UNIT" );
+ dumpDec< sal_uInt16 >( "base-unit", "CHDATERANGE-UNIT" );
+ dumpDec< sal_uInt16 >( "axis-crossing-date" );
+ dumpHex< sal_uInt16 >( "flags", "CHDATERANGE-FLAGS" );
+ break;
+
case BIFF_ID_CHECKCOMPAT:
dumpFrHeader( true, true );
dumpBool< sal_uInt32 >( "check-compatibility" );
@@ -1884,18 +1896,6 @@ void WorkbookStreamObject::implDumpRecordBody()
dumpHex< sal_uInt16 >( "flags", "CHLABELRANGE-FLAGS" );
break;
- case BIFF_ID_CHLABELRANGE2:
- dumpDec< sal_uInt16 >( "minimum-categ" );
- dumpDec< sal_uInt16 >( "maximum-categ" );
- dumpDec< sal_uInt16 >( "major-unit-value" );
- dumpDec< sal_uInt16 >( "major-unit" );
- dumpDec< sal_uInt16 >( "minor-unit-value" );
- dumpDec< sal_uInt16 >( "minor-unit" );
- dumpDec< sal_uInt16 >( "base-unit" );
- dumpDec< sal_uInt16 >( "axis-crossing-date" );
- dumpHex< sal_uInt16 >( "flags", "CHLABELRANGE2-FLAGS" );
- break;
-
case BIFF_ID_CHLEGEND:
dumpRect< sal_Int32 >( "position", (eBiff <= BIFF4) ? "CONV-TWIP-TO-CM" : "" );
dumpDec< sal_uInt8 >( "docked-pos", "CHLEGEND-DOCKPOS" );
diff --git a/oox/source/dump/biffdumper.ini b/oox/source/dump/biffdumper.ini
index f32ed89334f8..2e25ff81c890 100644
--- a/oox/source/dump/biffdumper.ini
+++ b/oox/source/dump/biffdumper.ini
@@ -397,7 +397,7 @@ multilist=RECORD-NAMES-BIFF8
0x08A0=,,,FORCEFULLCALC,CHFRSHAPEPROPS,CHFRTEXTPROPS,,CHFRPLOTAREALAYOUT
# chart records
0x1058=,,,,,,,CH3DDATAFORMAT
- 0x1060=CHFONTBASE,CHPIEEXT,CHLABELRANGE2,CHDATATABLE,CHPLOTGROWTH,CHSERINDEX,CHESCHERFORMAT,CHPIEEXTSETT
+ 0x1060=CHFONTBASE,CHPIEEXT,CHDATERANGE,CHDATATABLE,CHPLOTGROWTH,CHSERINDEX,CHESCHERFORMAT,CHPIEEXTSETT
end
# simple records -------------------------------------------------------------
@@ -821,6 +821,21 @@ flagslist=CHDATAFORMAT-FLAGS
0x0001=excel4-colors
end
+# CHDATERANGE ----------------------------------------------------------------
+
+shortlist=CHDATERANGE-UNIT,0,days,months,years
+
+flagslist=CHDATERANGE-FLAGS
+ 0x0001=auto-minimum
+ 0x0002=auto-maximum
+ 0x0004=auto-major
+ 0x0008=auto-minor
+ 0x0010=date-axis
+ 0x0020=auto-base
+ 0x0040=auto-axis-cross
+ 0x0080=auto-date
+end
+
# CHFRAME --------------------------------------------------------------------
shortlist=CHFRAME-FORMAT,0,standard,,,,shadow
@@ -977,19 +992,6 @@ flagslist=CHLABELRANGE-FLAGS
0x0004=reverse-order
end
-# CHLABELRANGE2 --------------------------------------------------------------
-
-flagslist=CHLABELRANGE2-FLAGS
- 0x0001=auto-minimum
- 0x0002=auto-maximum
- 0x0004=auto-major
- 0x0008=auto-minor
- 0x0010=date-axis
- 0x0020=auto-base
- 0x0040=auto-axis-cross
- 0x0080=auto-date
-end
-
# CHLEGEND -------------------------------------------------------------------
shortlist=CHLEGEND-DOCKPOS,0,bottom,top-right,top,right,left,,,manual