[Libreoffice-commits] core.git: chart2/qa chart2/source offapi/com oox/source

Tünde Tóth (via logerrit) logerrit at kemper.freedesktop.org
Fri Jan 10 13:22:08 UTC 2020


 chart2/qa/extras/chart2import.cxx                     |   24 +++++++
 chart2/qa/extras/data/xlsx/deleted_legend_entry2.xlsx |binary
 chart2/source/model/main/DataSeriesProperties.cxx     |    6 +
 chart2/source/model/main/DataSeriesProperties.hxx     |    3 
 chart2/source/view/charttypes/VSeriesPlotter.cxx      |   21 +++++-
 offapi/com/sun/star/chart2/DataSeries.idl             |    7 ++
 oox/source/drawingml/chart/titleconverter.cxx         |   61 +++++++++++++++---
 oox/source/token/properties.txt                       |    1 
 8 files changed, 114 insertions(+), 9 deletions(-)

New commits:
commit 6e847aa817999ab18acd534f9e6a86685bb268fc
Author:     Tünde Tóth <tundeth at gmail.com>
AuthorDate: Wed Dec 18 09:49:26 2019 +0100
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Fri Jan 10 14:21:35 2020 +0100

    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 at numbertext.org>
    Tested-by: László Németh <nemeth at numbertext.org>

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
Binary files /dev/null and b/chart2/qa/extras/data/xlsx/deleted_legend_entry2.xlsx 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


More information about the Libreoffice-commits mailing list