Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:GA
libreoffice.1866
bnc-889755.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File bnc-889755.diff of Package libreoffice.1866
From 7f309e9d9288eb6220b5b98a8737e3450d068301 Mon Sep 17 00:00:00 2001 From: Marco Cecchetti <marco.cecchetti@collabora.com> Date: Fri, 31 Jul 2015 22:14:41 +0200 Subject: [PATCH] tdf#88154 workaround and unit test Fixed 45-degree layout for axis labels, too. Change-Id: I9764e281aeee0a439fa9eec1e3b0df840221b72f Reviewed-on: https://gerrit.libreoffice.org/18889 Reviewed-by: Jan Holesovsky <kendy@collabora.com> Tested-by: Jan Holesovsky <kendy@collabora.com> --- chart2/qa/extras/chart2import.cxx | 31 +++++++++++ chart2/qa/extras/data/pptx/bnc889755.pptx | Bin 0 -> 34771 bytes .../controller/chartapiwrapper/AxisWrapper.cxx | 13 ++++- chart2/source/model/main/Axis.cxx | 15 ++++- chart2/source/view/axes/VAxisProperties.cxx | 7 +++ chart2/source/view/axes/VAxisProperties.hxx | 5 ++ chart2/source/view/axes/VCartesianAxis.cxx | 23 +++++--- include/xmloff/xmltoken.hxx | 1 + offapi/com/sun/star/chart2/Axis.idl | 7 +++ oox/inc/drawingml/chart/datasourcecontext.hxx | 5 ++ oox/source/drawingml/chart/datasourcecontext.cxx | 62 ++++++++++++++++++++- xmloff/source/chart/PropertyMap.hxx | 1 + xmloff/source/chart/SchXMLAxisContext.cxx | 7 +++ xmloff/source/core/xmltoken.cxx | 1 + 14 files changed, 165 insertions(+), 13 deletions(-) create mode 100644 chart2/qa/extras/data/pptx/bnc889755.pptx diff --git a/chart2/source/controller/chartapiwrapper/AxisWrapper.cxx b/chart2/source/controller/chartapiwrapper/AxisWrapper.cxx index ee32f16..ddf589c 100644 --- a/chart2/source/controller/chartapiwrapper/AxisWrapper.cxx +++ b/chart2/source/controller/chartapiwrapper/AxisWrapper.cxx @@ -102,7 +102,8 @@ enum PROP_AXIS_OVERLAP, PROP_AXIS_GAP_WIDTH, PROP_AXIS_DISPLAY_UNITS, - PROP_AXIS_BUILTINUNIT + PROP_AXIS_BUILTINUNIT, + PROP_AXIS_TRY_STAGGERING_FIRST }; void lcl_AddPropertiesToVector( @@ -356,6 +357,15 @@ void lcl_AddPropertiesToVector( cppu::UnoType<OUString>::get(), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::MAYBEDEFAULT )); + + // Compatibility option: starting from LibreOffice 5.1 the rotated + // layout is preferred to staggering for axis labels. + rOutProperties.push_back( + Property( "TryStaggeringFirst", + PROP_AXIS_TRY_STAGGERING_FIRST, + cppu::UnoType<bool>::get(), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEDEFAULT )); } struct StaticAxisWrapperPropertyArray_Initializer @@ -656,6 +666,7 @@ const std::vector< WrappedProperty* > AxisWrapper::createWrappedProperties() aWrappedProperties.push_back( new WrappedProperty("ArrangeOrder","ArrangeOrder") ); aWrappedProperties.push_back( new WrappedProperty("Visible","Show") ); aWrappedProperties.push_back( new WrappedDirectStateProperty("DisplayLabels","DisplayLabels") ); + aWrappedProperties.push_back( new WrappedDirectStateProperty("TryStaggeringFirst","TryStaggeringFirst") ); aWrappedProperties.push_back( new WrappedDirectStateProperty("TextBreak","TextBreak") ); aWrappedProperties.push_back( new WrappedNumberFormatProperty(m_spChart2ModelContact) ); aWrappedProperties.push_back( new WrappedLinkNumberFormatProperty(m_spChart2ModelContact) ); diff --git a/chart2/source/model/main/Axis.cxx b/chart2/source/model/main/Axis.cxx index 7fcaaec..79855d6 100644 --- a/chart2/source/model/main/Axis.cxx +++ b/chart2/source/model/main/Axis.cxx @@ -83,7 +83,9 @@ enum PROP_AXIS_MARK_POSITION, PROP_AXIS_DISPLAY_UNITS, - PROP_AXIS_BUILTINUNIT + PROP_AXIS_BUILTINUNIT, + + PROP_AXIS_TRY_STAGGERING_FIRST }; void lcl_AddPropertiesToVector( @@ -210,6 +212,16 @@ void lcl_AddPropertiesToVector( cppu::UnoType<OUString>::get(), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::MAYBEDEFAULT )); + + // Compatibility option: starting from LibreOffice 5.1 the rotated + // layout is preferred to staggering for axis labels. + rOutProperties.push_back( + Property( "TryStaggeringFirst", + PROP_AXIS_TRY_STAGGERING_FIRST, + cppu::UnoType<bool>::get(), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEDEFAULT )); + } struct StaticAxisDefaults_Initializer @@ -246,6 +258,7 @@ private: ::chart::PropertyHelper::setPropertyValueDefault< sal_Int32 >( rOutMap, PROP_AXIS_MINOR_TICKMARKS, 0 /* CHAXIS_MARK_NONE */ ); ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_AXIS_MARK_POSITION, ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS_AND_AXIS ); ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_AXIS_DISPLAY_UNITS, false ); + ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_AXIS_TRY_STAGGERING_FIRST, false ); } }; diff --git a/chart2/source/view/axes/VAxisProperties.cxx b/chart2/source/view/axes/VAxisProperties.cxx index 3db365d..85721ad 100644 --- a/chart2/source/view/axes/VAxisProperties.cxx +++ b/chart2/source/view/axes/VAxisProperties.cxx @@ -164,6 +164,7 @@ AxisProperties::AxisProperties( const uno::Reference< XAxis >& xAxisModel , m_bCrossingAxisHasReverseDirection(false) , m_bCrossingAxisIsCategoryAxes(false) , m_bDisplayLabels( true ) + , m_bTryStaggeringFirst( false ) , m_nNumberFormatKey(0) , m_nMajorTickmarks(1) , m_nMinorTickmarks(1) @@ -189,6 +190,7 @@ AxisProperties::AxisProperties( const AxisProperties& rAxisProperties ) , m_bCrossingAxisIsCategoryAxes( rAxisProperties.m_bCrossingAxisIsCategoryAxes ) , maLabelAlignment( rAxisProperties.maLabelAlignment ) , m_bDisplayLabels( rAxisProperties.m_bDisplayLabels ) + , m_bTryStaggeringFirst( rAxisProperties.m_bTryStaggeringFirst ) , m_nNumberFormatKey( rAxisProperties.m_nNumberFormatKey ) , m_nMajorTickmarks( rAxisProperties.m_nMajorTickmarks ) , m_nMinorTickmarks( rAxisProperties.m_nMinorTickmarks ) @@ -331,6 +333,11 @@ void AxisProperties::init( bool bCartesian ) //init display labels xProp->getPropertyValue( "DisplayLabels" ) >>= m_bDisplayLabels; + // Init layout strategy hint for axis labels. + // Compatibility option: starting from LibreOffice 5.1 the rotated + // layout is preferred to staggering for axis labels. + xProp->getPropertyValue( "TryStaggeringFirst" ) >>= m_bTryStaggeringFirst; + //init TickmarkProperties xProp->getPropertyValue( "MajorTickmarks" ) >>= m_nMajorTickmarks; xProp->getPropertyValue( "MinorTickmarks" ) >>= m_nMinorTickmarks; diff --git a/chart2/source/view/axes/VAxisProperties.hxx b/chart2/source/view/axes/VAxisProperties.hxx index 1eadf70..039bd1c 100644 --- a/chart2/source/view/axes/VAxisProperties.hxx +++ b/chart2/source/view/axes/VAxisProperties.hxx @@ -118,6 +118,11 @@ struct AxisProperties SAL_FINAL bool m_bDisplayLabels; + // Compatibility option: starting from LibreOffice 5.1 the rotated + // layout is preferred to staggering for axis labels. + // So the default value of this flag for new documents is `false`. + bool m_bTryStaggeringFirst; + sal_Int32 m_nNumberFormatKey; /* diff --git a/chart2/source/view/axes/VCartesianAxis.cxx b/chart2/source/view/axes/VCartesianAxis.cxx index c8ae9e0..7651fee 100644 --- a/chart2/source/view/axes/VCartesianAxis.cxx +++ b/chart2/source/view/axes/VCartesianAxis.cxx @@ -826,15 +826,20 @@ bool VCartesianAxis::createTextShapes( bool bOverlapsAfterAutoStagger = true; if( !bIsStaggered && isAutoStaggeringOfLabelsAllowed( rAxisLabelProperties, bIsHorizontalAxis, bIsVerticalAxis ) ) { - bIsStaggered = true; - rAxisLabelProperties.eStaggering = STAGGER_EVEN; - pLastVisibleNeighbourTickInfo = pPREPreviousVisibleTickInfo; - if( !pLastVisibleNeighbourTickInfo || - !lcl_doesShapeOverlapWithTickmark( pLastVisibleNeighbourTickInfo->xTextShape - , rAxisLabelProperties.fRotationAngleDegree - , pTickInfo->aTickScreenPosition - , bIsHorizontalAxis, bIsVerticalAxis ) ) - bOverlapsAfterAutoStagger = false; + // Compatibility option: starting from LibreOffice 5.1 the rotated + // layout is preferred to staggering for axis labels. + if( m_aAxisProperties.m_bTryStaggeringFirst || !(::rtl::math::approxEqual( rAxisLabelProperties.fRotationAngleDegree, 0.0 ) ) ) + { + bIsStaggered = true; + rAxisLabelProperties.eStaggering = STAGGER_EVEN; + pLastVisibleNeighbourTickInfo = pPREPreviousVisibleTickInfo; + if( !pLastVisibleNeighbourTickInfo || + !lcl_doesShapeOverlapWithTickmark( pLastVisibleNeighbourTickInfo->xTextShape + , rAxisLabelProperties.fRotationAngleDegree + , pTickInfo->aTickScreenPosition + , bIsHorizontalAxis, bIsVerticalAxis ) ) + bOverlapsAfterAutoStagger = false; + } } if (bOverlapsAfterAutoStagger) diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx index 1eea8c1..29af403 100644 --- a/include/xmloff/xmltoken.hxx +++ b/include/xmloff/xmltoken.hxx @@ -1909,6 +1909,7 @@ namespace xmloff { namespace token { XML_TRANSPOSE, XML_TRUE, XML_TRUNCATE_ON_OVERFLOW, + XML_TRY_STAGGERING_FIRST, XML_TTB, XML_TYPE, XML_DOT_DASH, diff --git a/offapi/com/sun/star/chart2/Axis.idl b/offapi/com/sun/star/chart2/Axis.idl index c27bf8a..28f5c19 100644 --- a/offapi/com/sun/star/chart2/Axis.idl +++ b/offapi/com/sun/star/chart2/Axis.idl @@ -134,6 +134,13 @@ service Axis @since LibreOffice 4.3 */ [optional, property] string BuiltInUnit; + + /** Compatibility option: determines which strategy should be tried first for fixing axis labels overlapping issues + + @since LibreOffice 5.1 + */ + [optional, property] boolean TryStaggeringFirst; + }; } ; // chart2 diff --git a/oox/inc/drawingml/chart/datasourcecontext.hxx b/oox/inc/drawingml/chart/datasourcecontext.hxx index 82aa38e..ef3298c 100644 --- a/oox/inc/drawingml/chart/datasourcecontext.hxx +++ b/oox/inc/drawingml/chart/datasourcecontext.hxx @@ -21,6 +21,7 @@ #define INCLUDED_OOX_DRAWINGML_CHART_DATASOURCECONTEXT_HXX #include <drawingml/chart/chartcontextbase.hxx> +#include <svl/zforlist.hxx> namespace oox { namespace drawingml { @@ -46,7 +47,11 @@ public: virtual void onCharacters( const OUString& rChars ) SAL_OVERRIDE; private: + SvNumberFormatter* getNumberFormatter(); + +private: sal_Int32 mnPtIndex; /// Current data point index. + SvNumberFormatter* mpNumberFormatter; }; diff --git a/oox/source/drawingml/chart/datasourcecontext.cxx b/oox/source/drawingml/chart/datasourcecontext.cxx index 946b5bd..10ac7c6 100644 --- a/oox/source/drawingml/chart/datasourcecontext.cxx +++ b/oox/source/drawingml/chart/datasourcecontext.cxx @@ -21,6 +21,9 @@ #include "oox/drawingml/chart/datasourcemodel.hxx" +#include <comphelper/processfactory.hxx> +#include <oox/core/xmlfilterbase.hxx> +#include <svl/zforlist.hxx> #include <osl/diagnose.h> namespace oox { @@ -30,14 +33,21 @@ namespace chart { using ::oox::core::ContextHandler2Helper; using ::oox::core::ContextHandlerRef; +using namespace ::com::sun::star; + DoubleSequenceContext::DoubleSequenceContext( ContextHandler2Helper& rParent, DataSequenceModel& rModel ) : DataSequenceContextBase( rParent, rModel ), - mnPtIndex( -1 ) + mnPtIndex( -1 ), + mpNumberFormatter( NULL ) { } DoubleSequenceContext::~DoubleSequenceContext() { + if( mpNumberFormatter != NULL ) + { + delete mpNumberFormatter; + } } ContextHandlerRef DoubleSequenceContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) @@ -98,14 +108,62 @@ void DoubleSequenceContext::onCharacters( const OUString& rChars ) * TODO: NumberFormat conversion, remove the check then. */ if( isParentElement( C_TOKEN( cat ), 4 ) ) - mrModel.maData[ mnPtIndex ] <<= rChars; + { + // workaround for bug n#889755 + SvNumberFormatter* pNumFrmt = getNumberFormatter(); + if( pNumFrmt ) + { + sal_uInt32 nKey = pNumFrmt->GetEntryKey( mrModel.maFormatCode ); + bool bNoKey = ( nKey == NUMBERFORMAT_ENTRY_NOT_FOUND ); + if( bNoKey ) + { + OUString aFormatCode = mrModel.maFormatCode; + sal_Int32 nCheckPos = 0; + short nType; + pNumFrmt->PutEntry( aFormatCode, nCheckPos, nType, nKey ); + bNoKey = (nCheckPos != 0); + } + if( bNoKey ) + { + mrModel.maData[ mnPtIndex ] <<= rChars; + } + else + { + double fValue = rChars.toDouble(); + Color* pColor = NULL; + OUString aFormattedValue; + pNumFrmt->GetOutputString( fValue, nKey, aFormattedValue, &pColor ); + mrModel.maData[ mnPtIndex ] <<= aFormattedValue; + } + } + else + { + mrModel.maData[ mnPtIndex ] <<= rChars; + } + } else + { mrModel.maData[ mnPtIndex ] <<= rChars.toDouble(); + } } break; } } + +SvNumberFormatter* DoubleSequenceContext::getNumberFormatter() +{ + if( mpNumberFormatter == NULL ) + { + uno::Reference<uno::XComponentContext> rContext = + this->getFilter().getComponentContext(); + mpNumberFormatter = + new SvNumberFormatter(rContext, LANGUAGE_DONTKNOW); + } + return mpNumberFormatter; +} + + StringSequenceContext::StringSequenceContext( ContextHandler2Helper& rParent, DataSequenceModel& rModel ) : DataSequenceContextBase( rParent, rModel ) , mnPtIndex(-1) diff --git a/xmloff/source/chart/PropertyMap.hxx b/xmloff/source/chart/PropertyMap.hxx index 0145bde..4a22c47 100644 --- a/xmloff/source/chart/PropertyMap.hxx +++ b/xmloff/source/chart/PropertyMap.hxx @@ -184,6 +184,7 @@ const XMLPropertyMapEntry aXMLChartPropMap[] = MAP_ENTRY( "TextCanOverlap", CHART, XML_TEXT_OVERLAP, XML_TYPE_BOOL ), MAP_ENTRY_ODF12( "ReverseDirection", CHART, XML_REVERSE_DIRECTION, XML_TYPE_BOOL ), MAP_ENTRY( "TextBreak", TEXT, XML_LINE_BREAK, XML_TYPE_BOOL ), + MAP_ENTRY_ODF_EXT( "TryStaggeringFirst", LO_EXT, XML_TRY_STAGGERING_FIRST, XML_TYPE_BOOL ), MAP_ENTRY( "ArrangeOrder", CHART, XML_LABEL_ARRANGEMENT, XML_SCH_TYPE_AXIS_ARRANGEMENT ), MAP_SPECIAL( "NumberFormat", STYLE, XML_DATA_STYLE_NAME, XML_TYPE_NUMBER, XML_SCH_CONTEXT_SPECIAL_NUMBER_FORMAT ), MAP_ENTRY( "LinkNumberFormatToSource", CHART, XML_LINK_DATA_STYLE_TO_SOURCE, XML_TYPE_BOOL ), diff --git a/xmloff/source/chart/SchXMLAxisContext.cxx b/xmloff/source/chart/SchXMLAxisContext.cxx index 502ef08..b693355 100644 --- a/xmloff/source/chart/SchXMLAxisContext.cxx +++ b/xmloff/source/chart/SchXMLAxisContext.cxx @@ -459,6 +459,13 @@ void SchXMLAxisContext::CreateAxis() m_xAxisProps->setPropertyValue("DisplayLabels", aFalseBool ); + // Compatibility option: starting from LibreOffice 5.1 the rotated + // layout is preferred to staggering for axis labels. + // So the import default value for having compatibility with ODF + // documents created with erlier LibreOffice versions is `true`. + if( GetImport().getGeneratorVersion() != SvXMLImport::ProductVersionUnknown ) + m_xAxisProps->setPropertyValue("TryStaggeringFirst", aTrueBool ); + // #88077# AutoOrigin 'on' is default m_xAxisProps->setPropertyValue("AutoOrigin", aTrueBool ); diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx index 63e4aff..0d4ed2d 100644 --- a/xmloff/source/core/xmltoken.cxx +++ b/xmloff/source/core/xmltoken.cxx @@ -1914,6 +1914,7 @@ namespace xmloff { namespace token { TOKEN( "transpose", XML_TRANSPOSE ), TOKEN( "true", XML_TRUE ), TOKEN( "truncate-on-overflow", XML_TRUNCATE_ON_OVERFLOW ), + TOKEN( "try-staggering-first", XML_TRY_STAGGERING_FIRST ), TOKEN( "ttb", XML_TTB ), TOKEN( "type", XML_TYPE ), TOKEN( "dot-dash", XML_DOT_DASH ), -- 2.1.4
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor