diff options
-rw-r--r-- | chart2/qa/extras/chart2import.cxx | 24 | ||||
-rw-r--r-- | chart2/qa/extras/data/xlsx/deleted_legend_entry2.xlsx | bin | 0 -> 20060 bytes | |||
-rw-r--r-- | chart2/source/model/main/DataSeriesProperties.cxx | 6 | ||||
-rw-r--r-- | chart2/source/model/main/DataSeriesProperties.hxx | 3 | ||||
-rw-r--r-- | chart2/source/view/charttypes/VSeriesPlotter.cxx | 21 | ||||
-rw-r--r-- | offapi/com/sun/star/chart2/DataSeries.idl | 7 | ||||
-rw-r--r-- | oox/source/drawingml/chart/titleconverter.cxx | 61 | ||||
-rw-r--r-- | oox/source/token/properties.txt | 1 |
8 files changed, 114 insertions, 9 deletions
diff --git a/chart2/qa/extras/chart2import.cxx b/chart2/qa/extras/chart2import.cxx index e44efe636eed..5fcf205df813 100644 --- a/chart2/qa/extras/chart2import.cxx +++ b/chart2/qa/extras/chart2import.cxx @@ -151,6 +151,7 @@ public: void testTdf121991(); void testTdf123206CustomLabelField(); void testTdf125444PercentageCustomLabel(); + void testDeletedLegendEntries(); CPPUNIT_TEST_SUITE(Chart2ImportTest); CPPUNIT_TEST(Fdo60083); @@ -251,6 +252,8 @@ public: CPPUNIT_TEST(testTdf121991); CPPUNIT_TEST(testTdf123206CustomLabelField); CPPUNIT_TEST(testTdf125444PercentageCustomLabel); + CPPUNIT_TEST(testDeletedLegendEntries); + CPPUNIT_TEST_SUITE_END(); private: @@ -2334,7 +2337,28 @@ void Chart2ImportTest::testTdf125444PercentageCustomLabel() // to assert the latter. CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), aLabelFields.getLength()); CPPUNIT_ASSERT_EQUAL(chart2::DataPointCustomLabelFieldType_PERCENTAGE, aLabelFields[2]->getFieldType()); +} + +void Chart2ImportTest::testDeletedLegendEntries() +{ + load("/chart2/qa/extras/data/xlsx/", "deleted_legend_entry2.xlsx"); + Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0, mxComponent); + CPPUNIT_ASSERT(xChartDoc.is()); + Reference<chart2::XDataSeries> xDataSeries(getDataSeriesFromDoc(xChartDoc, 0)); + CPPUNIT_ASSERT(xDataSeries.is()); + Reference<beans::XPropertySet> xPropertySet(xDataSeries, uno::UNO_QUERY_THROW); + bool bShowLegendEntry = true; + CPPUNIT_ASSERT(xPropertySet->getPropertyValue("ShowLegendEntry") >>= bShowLegendEntry); + CPPUNIT_ASSERT(!bShowLegendEntry); + Reference<chart2::XChartDocument> xChartDoc2 = getChartDocFromSheet(1, mxComponent); + CPPUNIT_ASSERT(xChartDoc.is()); + Reference<chart2::XDataSeries> xDataSeries2(getDataSeriesFromDoc(xChartDoc2, 0)); + CPPUNIT_ASSERT(xDataSeries2.is()); + Reference<beans::XPropertySet> xPropertySet2(xDataSeries2, uno::UNO_QUERY_THROW); + Sequence<sal_Int32> deletedLegendEntriesSeq; + CPPUNIT_ASSERT(xPropertySet2->getPropertyValue("DeletedLegendEntries") >>= deletedLegendEntriesSeq); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), deletedLegendEntriesSeq[0]); } CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ImportTest); diff --git a/chart2/qa/extras/data/xlsx/deleted_legend_entry2.xlsx b/chart2/qa/extras/data/xlsx/deleted_legend_entry2.xlsx Binary files differnew file mode 100644 index 000000000000..ea02464b1c46 --- /dev/null +++ b/chart2/qa/extras/data/xlsx/deleted_legend_entry2.xlsx diff --git a/chart2/source/model/main/DataSeriesProperties.cxx b/chart2/source/model/main/DataSeriesProperties.cxx index c43ced71f40c..5d0cb777e151 100644 --- a/chart2/source/model/main/DataSeriesProperties.cxx +++ b/chart2/source/model/main/DataSeriesProperties.cxx @@ -63,6 +63,12 @@ void DataSeriesProperties::AddPropertiesToVector( beans::PropertyAttribute::BOUND | beans::PropertyAttribute::MAYBEDEFAULT ); + rOutProperties.emplace_back( "DeletedLegendEntries", + PROP_DATASERIES_DELETED_LEGEND_ENTRIES, + cppu::UnoType<uno::Sequence<sal_Int32>>::get(), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEVOID ); + // add properties of service DataPointProperties DataPointProperties::AddPropertiesToVector( rOutProperties ); } diff --git a/chart2/source/model/main/DataSeriesProperties.hxx b/chart2/source/model/main/DataSeriesProperties.hxx index 6791078d5678..b0f6283db54c 100644 --- a/chart2/source/model/main/DataSeriesProperties.hxx +++ b/chart2/source/model/main/DataSeriesProperties.hxx @@ -37,7 +37,8 @@ namespace DataSeriesProperties PROP_DATASERIES_STACKING_DIRECTION, PROP_DATASERIES_VARY_COLORS_BY_POINT, PROP_DATASERIES_ATTACHED_AXIS_INDEX, - PROP_DATASERIES_SHOW_LEGEND_ENTRY + PROP_DATASERIES_SHOW_LEGEND_ENTRY, + PROP_DATASERIES_DELETED_LEGEND_ENTRIES }; void AddPropertiesToVector( diff --git a/chart2/source/view/charttypes/VSeriesPlotter.cxx b/chart2/source/view/charttypes/VSeriesPlotter.cxx index 34036f3dd0ed..f7e828425246 100644 --- a/chart2/source/view/charttypes/VSeriesPlotter.cxx +++ b/chart2/source/view/charttypes/VSeriesPlotter.cxx @@ -2657,9 +2657,28 @@ std::vector< ViewLegendEntry > VSeriesPlotter::createLegendEntriesForSeries( Sequence< OUString > aCategoryNames; if( m_pExplicitCategoriesProvider ) aCategoryNames = m_pExplicitCategoriesProvider->getSimpleCategories(); - + Sequence<sal_Int32> deletedLegendEntries; + try + { + rSeries.getPropertiesOfSeries()->getPropertyValue("DeletedLegendEntries") >>= deletedLegendEntries; + } + catch (const uno::Exception&) + { + } for( sal_Int32 nIdx=0; nIdx<aCategoryNames.getLength(); ++nIdx ) { + bool deletedLegendEntry = false; + for (auto& deletedLegendEntryIdx : deletedLegendEntries) + { + if (nIdx == deletedLegendEntryIdx) + { + deletedLegendEntry = true; + break; + } + } + if (deletedLegendEntry) + continue; + // symbol uno::Reference< drawing::XShapes > xSymbolGroup( ShapeFactory::getOrCreateShapeFactory(xShapeFactory)->createGroup2D( xTarget )); diff --git a/offapi/com/sun/star/chart2/DataSeries.idl b/offapi/com/sun/star/chart2/DataSeries.idl index 357ec4fcd097..fb44d145890a 100644 --- a/offapi/com/sun/star/chart2/DataSeries.idl +++ b/offapi/com/sun/star/chart2/DataSeries.idl @@ -180,6 +180,13 @@ service DataSeries @since LibreOffice 6.3 */ [optional, property] boolean ShowLegendEntry; + + /** A sequence of indexes denoting which data points shouldn't be + shown in the legend. + + @since LibreOffice 6.5 + */ + [optional, property] sequence<long> DeletedLegendEntries; }; } ; // chart2 diff --git a/oox/source/drawingml/chart/titleconverter.cxx b/oox/source/drawingml/chart/titleconverter.cxx index c41a794763b1..e6591e1a5323 100644 --- a/oox/source/drawingml/chart/titleconverter.cxx +++ b/oox/source/drawingml/chart/titleconverter.cxx @@ -268,9 +268,13 @@ void LegendConverter::legendEntriesFormatting(const Reference<XDiagram>& rxDiagr return; sal_Int32 nIndex = 0; - for (const auto& rCooSysSequence : xCooSysSequence) + for (const auto& rCooSys : xCooSysSequence) { - Reference<XChartTypeContainer> xChartTypeContainer(rCooSysSequence, UNO_QUERY_THROW); + PropertySet aCooSysProp(rCooSys); + bool bSwapXAndY = false; + aCooSysProp.getProperty(bSwapXAndY, PROP_SwapXAndYAxis); + + Reference<XChartTypeContainer> xChartTypeContainer(rCooSys, UNO_QUERY_THROW); const Sequence<Reference<XChartType>> xChartTypeSequence(xChartTypeContainer->getChartTypes()); if (!xChartTypeSequence.hasElements()) continue; @@ -282,19 +286,62 @@ void LegendConverter::legendEntriesFormatting(const Reference<XDiagram>& rxDiagr continue; const Sequence<Reference<XDataSeries>> aDataSeriesSeq = xDSCont->getDataSeries(); + if (bSwapXAndY) + nIndex += aDataSeriesSeq.getLength() - 1; for (const auto& rDataSeries : aDataSeriesSeq) { PropertySet aSeriesProp(rDataSeries); - for (const auto& rLegendEntry : mrModel.maLegendEntries) + bool bVaryColorsByPoint = false; + aSeriesProp.getProperty(bVaryColorsByPoint, PROP_VaryColorsByPoint); + + if (bVaryColorsByPoint) + { + Reference<XDataSource> xDSrc(rDataSeries, UNO_QUERY); + if (!xDSrc.is()) + continue; + + const Sequence<Reference<XLabeledDataSequence> > aDataSeqs = xDSrc->getDataSequences(); + std::vector<sal_Int32> deletedLegendEntries; + sal_Int32 j = 0; + for (const auto& rDataSeq : aDataSeqs) + { + Reference<XDataSequence> xValues = rDataSeq->getValues(); + if (!xValues.is()) + continue; + + sal_Int32 nDataSeqSize = xValues->getData().getLength(); + for (sal_Int32 i = 0; i < nDataSeqSize; ++i) + { + for (const auto& rLegendEntry : mrModel.maLegendEntries) + { + if (nIndex == rLegendEntry->mnLegendEntryIdx && rLegendEntry->mbLabelDeleted) + { + deletedLegendEntries.push_back(j + i); + break; + } + } + nIndex++; + } + j += nDataSeqSize; + } + if (deletedLegendEntries.size() > 0) + aSeriesProp.setProperty(PROP_DeletedLegendEntries, ContainerHelper::vectorToSequence(deletedLegendEntries)); + } + else { - if (nIndex == rLegendEntry->mnLegendEntryIdx) + for (const auto& rLegendEntry : mrModel.maLegendEntries) { - aSeriesProp.setProperty(PROP_ShowLegendEntry, !rLegendEntry->mbLabelDeleted); - break; + if (nIndex == rLegendEntry->mnLegendEntryIdx) + { + aSeriesProp.setProperty(PROP_ShowLegendEntry, !rLegendEntry->mbLabelDeleted); + break; + } } + bSwapXAndY ? nIndex-- : nIndex++; } - nIndex++; } + if (bSwapXAndY) + nIndex += aDataSeriesSeq.getLength() + 1; } } } diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index 2a9295367c11..b7a76058d688 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -132,6 +132,7 @@ DefaultSpinValue DefaultState DefaultText DefaultValue +DeletedLegendEntries DiagonalBLTR DiagonalTLBR DialogLibraries |