From cea1ae2a4f7abdcfc3874d714bdafef801910c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=BCnde=20T=C3=B3th?= Date: Wed, 4 Dec 2019 16:17:09 +0100 Subject: [PATCH] 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 --- chart2/qa/extras/chart2import.cxx | 15 ++++++ .../data/xlsx/deleted_legend_entry.xlsx | Bin 0 -> 14346 bytes 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 + 9 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 chart2/qa/extras/data/xlsx/deleted_legend_entry.xlsx diff --git a/chart2/qa/extras/chart2import.cxx b/chart2/qa/extras/chart2import.cxx index f4bfb53fbf34..be010f3b309f 100644 --- a/chart2/qa/extras/chart2import.cxx +++ b/chart2/qa/extras/chart2import.cxx @@ -148,6 +148,7 @@ public: void testXaxisValues(); void testTdf123504(); void testTdf122765(); + void testTdf121991(); CPPUNIT_TEST_SUITE(Chart2ImportTest); CPPUNIT_TEST(Fdo60083); @@ -245,6 +246,7 @@ public: CPPUNIT_TEST(testXaxisValues); CPPUNIT_TEST(testTdf123504); CPPUNIT_TEST(testTdf122765); + CPPUNIT_TEST(testTdf121991); CPPUNIT_TEST_SUITE_END(); @@ -2281,6 +2283,19 @@ void Chart2ImportTest::testTdf122765() CPPUNIT_ASSERT_GREATER(sal_Int32(7000), aSlicePosition.X); } +void Chart2ImportTest::testTdf121991() +{ + load("/chart2/qa/extras/data/xlsx/", "deleted_legend_entry.xlsx"); + Reference< chart2::XChartDocument > xChartDoc = getChartDocFromSheet(0, mxComponent); + CPPUNIT_ASSERT(xChartDoc.is()); + Reference xDataSeries(getDataSeriesFromDoc(xChartDoc, 1)); + CPPUNIT_ASSERT(xDataSeries.is()); + Reference xPropertySet(xDataSeries, uno::UNO_QUERY_THROW); + bool bShowLegendEntry = true; + CPPUNIT_ASSERT(xPropertySet->getPropertyValue("ShowLegendEntry") >>= bShowLegendEntry); + CPPUNIT_ASSERT(!bShowLegendEntry); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ImportTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/chart2/qa/extras/data/xlsx/deleted_legend_entry.xlsx b/chart2/qa/extras/data/xlsx/deleted_legend_entry.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..06a052646f1e419a751b08b85ee49e4f9bdfc186 GIT binary patch literal 14346 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 literal 0 HcmV?d00001 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 a319b2bd42a9..2a9295367c11 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -462,6 +462,7 @@ ShowFormulas ShowGrid ShowHighLow ShowInputMessage +ShowLegendEntry ShowList ShowNegativeError ShowObjects