diff options
Diffstat (limited to 'oox/source')
-rw-r--r-- | oox/source/drawingml/chart/axiscontext.cxx | 2 | ||||
-rw-r--r-- | oox/source/drawingml/chart/axisconverter.cxx | 99 | ||||
-rw-r--r-- | oox/source/drawingml/chart/axismodel.cxx | 1 | ||||
-rw-r--r-- | oox/source/dump/biffdumper.cxx | 24 | ||||
-rw-r--r-- | oox/source/dump/biffdumper.ini | 30 |
5 files changed, 99 insertions, 57 deletions
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 |