From 92f96e41223ad174ff32901f71ce0d64b6a0eade Mon Sep 17 00:00:00 2001 From: Tünde Tóth Date: Wed, 4 Dec 2019 16:17:09 +0100 Subject: tdf#121991 Chart OOXML import: fix deleted legend entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The legend showed deleted legend entries too. Change-Id: I1e205cdfc4262c73d2bb189237d6bc316781931d Reviewed-on: https://gerrit.libreoffice.org/84516 Reviewed-by: László Németh Tested-by: László Németh (cherry picked from commit cea1ae2a4f7abdcfc3874d714bdafef801910c1c) Reviewed-on: https://gerrit.libreoffice.org/85024 Tested-by: Jenkins Reviewed-by: Tünde Tóth --- oox/inc/drawingml/chart/titlecontext.hxx | 12 ++++++++ oox/inc/drawingml/chart/titleconverter.hxx | 3 ++ oox/inc/drawingml/chart/titlemodel.hxx | 17 +++++++++-- oox/source/drawingml/chart/titlecontext.cxx | 28 +++++++++++++++++ oox/source/drawingml/chart/titleconverter.cxx | 44 +++++++++++++++++++++++++++ oox/source/drawingml/chart/titlemodel.cxx | 10 ++++++ oox/source/token/properties.txt | 1 + 7 files changed, 112 insertions(+), 3 deletions(-) (limited to 'oox') diff --git a/oox/inc/drawingml/chart/titlecontext.hxx b/oox/inc/drawingml/chart/titlecontext.hxx index 2d52720ef7a4..8538d5ce2e56 100644 --- a/oox/inc/drawingml/chart/titlecontext.hxx +++ b/oox/inc/drawingml/chart/titlecontext.hxx @@ -55,6 +55,18 @@ public: virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) override; }; +struct LegendEntryModel; + +/** Handler for a chart legend entry context (c:legendEntry element). + */ +class LegendEntryContext : public ContextBase< LegendEntryModel > +{ +public: + explicit LegendEntryContext( ::oox::core::ContextHandler2Helper& rParent, LegendEntryModel& rModel ); + virtual ~LegendEntryContext() override; + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) override; +}; struct LegendModel; diff --git a/oox/inc/drawingml/chart/titleconverter.hxx b/oox/inc/drawingml/chart/titleconverter.hxx index 10f2f000d4aa..40b95d25d193 100644 --- a/oox/inc/drawingml/chart/titleconverter.hxx +++ b/oox/inc/drawingml/chart/titleconverter.hxx @@ -90,6 +90,9 @@ public: /** Creates a legend object and attaches it at the passed diagram. */ void convertFromModel( const css::uno::Reference< css::chart2::XDiagram >& rxDiagram ); + +private: + void legendEntriesFormatting(const css::uno::Reference& rxDiagram); }; diff --git a/oox/inc/drawingml/chart/titlemodel.hxx b/oox/inc/drawingml/chart/titlemodel.hxx index dde078443869..f069c7697a60 100644 --- a/oox/inc/drawingml/chart/titlemodel.hxx +++ b/oox/inc/drawingml/chart/titlemodel.hxx @@ -57,12 +57,23 @@ struct TitleModel ~TitleModel(); }; +struct LegendEntryModel +{ + sal_Int32 mnLegendEntryIdx; /// Legend entry index. + bool mbLabelDeleted; /// True = legend label deleted. + + LegendEntryModel(); + ~LegendEntryModel(); +}; + struct LegendModel { - typedef ModelRef< Shape > ShapeRef; - typedef ModelRef< TextBody > TextBodyRef; - typedef ModelRef< LayoutModel > LayoutRef; + typedef ModelVector< LegendEntryModel > LegendEntryVector; + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< TextBody > TextBodyRef; + typedef ModelRef< LayoutModel > LayoutRef; + LegendEntryVector maLegendEntries; /// Legend entries formatting. ShapeRef mxShapeProp; /// Legend shape formatting. TextBodyRef mxTextProp; /// Legend text formatting. LayoutRef mxLayout; /// Layout/position of the legend. diff --git a/oox/source/drawingml/chart/titlecontext.cxx b/oox/source/drawingml/chart/titlecontext.cxx index 042b12553483..2dbbaac69746 100644 --- a/oox/source/drawingml/chart/titlecontext.cxx +++ b/oox/source/drawingml/chart/titlecontext.cxx @@ -114,6 +114,31 @@ ContextHandlerRef TitleContext::onCreateContext( sal_Int32 nElement, const Attri return nullptr; } +LegendEntryContext::LegendEntryContext( ContextHandler2Helper& rParent, LegendEntryModel& rModel ) : + ContextBase< LegendEntryModel >( rParent, rModel ) +{ +} + +LegendEntryContext::~LegendEntryContext() +{ +} + +ContextHandlerRef LegendEntryContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +{ + // this context handler is used for only + switch( nElement ) + { + case C_TOKEN( idx ): + mrModel.mnLegendEntryIdx = rAttribs.getInteger( XML_val, -1 ); + return nullptr; + + case C_TOKEN( delete ): + mrModel.mbLabelDeleted = rAttribs.getBool( XML_val, true ); + return nullptr; + } + return nullptr; +} + LegendContext::LegendContext( ContextHandler2Helper& rParent, LegendModel& rModel ) : ContextBase< LegendModel >( rParent, rModel ) { @@ -136,6 +161,9 @@ ContextHandlerRef LegendContext::onCreateContext( sal_Int32 nElement, const Attr mrModel.mnPosition = rAttribs.getToken( XML_val, XML_r ); return nullptr; + case C_TOKEN( legendEntry ): + return new LegendEntryContext( *this, mrModel.maLegendEntries.create() ); + case C_TOKEN( overlay ): mrModel.mbOverlay = rAttribs.getBool( XML_val, !bMSO2007Doc ); return nullptr; diff --git a/oox/source/drawingml/chart/titleconverter.cxx b/oox/source/drawingml/chart/titleconverter.cxx index 4f700c32725a..c41a794763b1 100644 --- a/oox/source/drawingml/chart/titleconverter.cxx +++ b/oox/source/drawingml/chart/titleconverter.cxx @@ -26,6 +26,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -249,12 +252,53 @@ void LegendConverter::convertFromModel( const Reference< XDiagram >& rxDiagram ) if(eLegendPos == LegendPosition_CUSTOM && bTopRight && !bManualLayout) aPropSet.setProperty( PROP_RelativePosition , makeAny(eRelPos)); + if (mrModel.maLegendEntries.size() > 0) + legendEntriesFormatting(rxDiagram); } catch( Exception& ) { } } +void LegendConverter::legendEntriesFormatting(const Reference& rxDiagram) +{ + Reference xCooSysContainer(rxDiagram, UNO_QUERY_THROW); + const Sequence> xCooSysSequence(xCooSysContainer->getCoordinateSystems()); + if (!xCooSysSequence.hasElements()) + return; + + sal_Int32 nIndex = 0; + for (const auto& rCooSysSequence : xCooSysSequence) + { + Reference xChartTypeContainer(rCooSysSequence, UNO_QUERY_THROW); + const Sequence> xChartTypeSequence(xChartTypeContainer->getChartTypes()); + if (!xChartTypeSequence.hasElements()) + continue; + + for (const auto& rCT : xChartTypeSequence) + { + Reference xDSCont(rCT, UNO_QUERY); + if (!xDSCont.is()) + continue; + + const Sequence> aDataSeriesSeq = xDSCont->getDataSeries(); + for (const auto& rDataSeries : aDataSeriesSeq) + { + PropertySet aSeriesProp(rDataSeries); + for (const auto& rLegendEntry : mrModel.maLegendEntries) + { + if (nIndex == rLegendEntry->mnLegendEntryIdx) + { + aSeriesProp.setProperty(PROP_ShowLegendEntry, !rLegendEntry->mbLabelDeleted); + break; + } + } + nIndex++; + } + } + } +} + } // namespace chart } // namespace drawingml } // namespace oox diff --git a/oox/source/drawingml/chart/titlemodel.cxx b/oox/source/drawingml/chart/titlemodel.cxx index f866297ca406..846ec218b5bf 100644 --- a/oox/source/drawingml/chart/titlemodel.cxx +++ b/oox/source/drawingml/chart/titlemodel.cxx @@ -42,6 +42,16 @@ TitleModel::~TitleModel() { } +LegendEntryModel::LegendEntryModel() : + mnLegendEntryIdx( -1 ), + mbLabelDeleted( false ) +{ +} + +LegendEntryModel::~LegendEntryModel() +{ +} + LegendModel::LegendModel(bool bMSO2007Doc) : mnPosition( XML_r ), mbOverlay( !bMSO2007Doc ) diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index db44e176ef33..f53b73f8b79e 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -461,6 +461,7 @@ ShowFormulas ShowGrid ShowHighLow ShowInputMessage +ShowLegendEntry ShowList ShowNegativeError ShowObjects -- cgit