summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTünde Tóth <tundeth@gmail.com>2019-12-18 09:49:26 +0100
committerLászló Németh <nemeth@numbertext.org>2020-01-10 14:21:35 +0100
commit6e847aa817999ab18acd534f9e6a86685bb268fc (patch)
tree640176e25db6e79ef4976b9fd6c527b684456c7d
parent04b2310aaa094794ceedaa1bb6ff1823a2d29d3e (diff)
tdf#129859 XLSX import: don't show deleted legend entries
by adding a new feature to disable selected data points in pie charts. Fixing also tdf#129858 by deleting the correct legend entry in bar charts. Change-Id: Iaaf3a864e9404b8b6d3e2affbb366e18d0f4b43e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86160 Reviewed-by: László Németh <nemeth@numbertext.org> Tested-by: László Németh <nemeth@numbertext.org>
-rw-r--r--chart2/qa/extras/chart2import.cxx24
-rw-r--r--chart2/qa/extras/data/xlsx/deleted_legend_entry2.xlsxbin0 -> 20060 bytes
-rw-r--r--chart2/source/model/main/DataSeriesProperties.cxx6
-rw-r--r--chart2/source/model/main/DataSeriesProperties.hxx3
-rw-r--r--chart2/source/view/charttypes/VSeriesPlotter.cxx21
-rw-r--r--offapi/com/sun/star/chart2/DataSeries.idl7
-rw-r--r--oox/source/drawingml/chart/titleconverter.cxx61
-rw-r--r--oox/source/token/properties.txt1
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
new file mode 100644
index 000000000000..ea02464b1c46
--- /dev/null
+++ b/chart2/qa/extras/data/xlsx/deleted_legend_entry2.xlsx
Binary files differ
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