[Libreoffice-commits] core.git: Branch 'feature/pivotcharts' - 1098 commits - accessibility/inc accessibility/source android/Bootstrap android/source apple_remote/source avmedia/inc avmedia/source basctl/inc basctl/sdi basctl/source basctl/uiconfig basegfx/source basic/inc basic/qa basic/source bean/com bin/find-unused-defines-in-hrc-files.py bin/gbuild-to-ide bin/list-dispatch-commands.php bin/lo-all-static-libs bin/lo-pack-sources bin/oss-fuzz-build.sh bin/parse-perfcheck.py bin/symbolstore.py bridges/source canvas/Library_canvasfactory.mk canvas/source chart2/AllLangResTarget_chartcontroller.mk chart2/CppunitTest_chart2_pivot_chart_test.mk chart2/inc chart2/Module_chart2.mk chart2/qa chart2/source cli_ure/source comphelper/qa comphelper/source compilerplugins/clang config_host/config_features.h.in config_host.mk.in configmgr/qa configmgr/source configure.ac connectivity/JunitTest_complex.mk connectivity/qa connectivity/source cppcanvas/qa cppuhelper/source cpputools/source cui/AllLangResTarget _cui.mk cui/source cui/uiconfig dbaccess/AllLangResTarget_dbu.mk dbaccess/source desktop/CppunitTest_desktop_app.mk desktop/inc desktop/qa desktop/source desktop/test desktop/unx distro-configs/Jenkins download.lst drawinglayer/qa drawinglayer/source dtrans/source editeng/CppunitTest_editeng_core.mk editeng/Library_editeng.mk editeng/qa editeng/source embeddedobj/source embeddedobj/test embedserv/source extensions/inc extensions/Library_so_activex_x64.mk extensions/Module_extensions.mk extensions/source extensions/test external/firebird external/fontconfig external/hunspell external/jpeg external/jpeg-turbo external/libcmis external/liblangtag external/libxmlsec external/Module_external.mk external/pdfium extras/source filter/qa filter/source filter/uiconfig forms/qa forms/source formula/source fpicker/source framework/inc framework/qa framework/source .git-hooks/pre-commit helpcompiler/inc helpcompiler/source helpcontent2 hwpfilter/source i18nlangtag/qa i18nlangtag/README i18nlangt ag/source i18npool/qa i18npool/source i18nutil/README i18nutil/source icon-themes/breeze icon-themes/breeze_dark icon-themes/breeze_svg icon-themes/elementary icon-themes/galaxy icon-themes/sifr icon-themes/tango idlc/source idl/inc idl/source include/apple_remote include/basegfx include/basic include/canvas include/comphelper include/connectivity include/cppu include/dbaccess include/drawinglayer include/editeng include/filter include/formula include/i18nlangtag include/jvmfwk include/LibreOfficeKit include/o3tl include/onlineupdate include/oox include/osl include/registry include/rtl include/sal include/salhelper include/sfx2 include/svl include/svtools include/svx include/toolkit include/tools include/tubes include/ucbhelper include/uno include/unotools include/vbahelper include/vcl include/xmloff include/xmlsecurity instsetoo_native/CustomTarget_setup.mk instsetoo_native/util ios/CustomTarget_LibreOfficeLight_app.mk ios/CustomTarget_Prototype_app.mk ios/CustomTarget_TiledLibreOf fice_app.mk ios/experimental ios/Module_ios.mk io/source ios/README javaunohelper/com javaunohelper/test jurt/com jvmfwk/inc jvmfwk/plugins jvmfwk/source l10ntools/inc l10ntools/source librelogo/source libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk libreofficekit/qa libreofficekit/README libreofficekit/source libreofficekit/UnoCommands.txt lingucomponent/source linguistic/source linguistic/workben lotuswordpro/qa lotuswordpro/source Makefile.fetch Makefile.in mysqlc/README o3tl/qa odk/examples odk/source offapi/com offapi/UnoApi_offapi.mk officecfg/README officecfg/registry onlineupdate/source oox/inc oox/README oox/source package/source postprocess/Rdb_services.mk pyuno/source qadevOOo/runner qadevOOo/tests readlicense_oo/license reportbuilder/java reportdesign/inc reportdesign/source RepositoryExternal.mk Repository.mk rsc/inc rsc/source sal/cppunittester salhelper/source sal/osl sal/qa sal/rtl sal/textenc sax/qa sax/source sax/test scaddins/source sc/AllLangResTarget _sc.mk schema/odf1.0 sc/inc sc/Library_sc.mk sc/Module_sc.mk scp2/InstallScript_setup_osl.mk scp2/Module_scp2.mk scp2/source sc/qa scripting/source sc/sdi sc/source sc/uiconfig sc/UIConfig_scalc.mk sc/UITest_autofilter.mk sc/UITest_hide_cols.mk sc/UITest_range_name.mk sdext/source sd/inc sd/qa sd/README_REMOTE sd/sdi sd/source sd/uiconfig sd/UIConfig_simpress.mk setup_native/Module_setup_native.mk sfx2/classification sfx2/inc sfx2/Library_sfx.mk sfx2/sdi sfx2/source shell/CustomTarget_spsupp_idl.mk shell/CustomTarget_x64.mk shell/inc shell/Library_spsupp.mk shell/Library_spsupp_x64.mk shell/Module_shell.mk shell/source shell/WinResTarget_spsupp.mk slideshow/source smoketest/data solenv/bin solenv/CompilerTest_compilerplugins_clang.mk solenv/doc solenv/gbuild solenv/qa soltools/cpp soltools/mkdepend sot/qa sot/source starmath/inc starmath/qa starmath/sdi starmath/source stoc/source svl/qa svl/source svtools/source svx/CppunitTest_svx_unit.mk svx/Executable_gengal.mk svx/inc svx/qa sv x/sdi svx/source svx/uiconfig sw/CppunitTest_sw_docbookexport.mk sw/CppunitTest_sw_globalfilter.mk sw/CppunitTest_sw_odfexport.mk sw/CppunitTest_sw_odfimport.mk sw/CppunitTest_sw_ooxmlexport8.mk sw/CppunitTest_sw_ooxmlimport.mk sw/CppunitTest_sw_rtfexport.mk sw/CppunitTest_sw_rtfimport.mk sw/CppunitTest_sw_ww8export2.mk sw/CppunitTest_sw_ww8import.mk sw/inc sw/ooxmlexport_setup.mk sw/qa sw/sdi sw/source sw/uiconfig sw/UIConfig_swriter.mk sysui/desktop test/source testtools/qa toolkit/qa toolkit/README toolkit/source toolkit/test tools/source translations tubes/source ucb/Library_ucpdav1.mk ucb/qa ucb/source udkapi/com uitest/calc_tests uitest/impress_tests uitest/libreoffice uitest/uitest uitest/writer_tests UnoControls/source unotools/qa unotools/source unoxml/source uui/source vbahelper/source vcl/CppunitTest_vcl_pdfexport.mk vcl/CppunitTest_vcl_wmf_test.mk vcl/Executable_olefuzzer.mk vcl/Executable_pptfuzzer.mk vcl/headless vcl/inc vcl/Library_vcl.mk vcl/Module_vcl.mk vcl/opengl vcl/osx vcl/qa vcl/quartz vcl/README vcl/source vcl/unx vcl/win vcl/workben winaccessibility/source wizards/com wizards/source writerfilter/documentation writerfilter/inc writerfilter/source writerperfect/qa writerperfect/source xmerge/source xmloff/dtd xmloff/inc xmloff/README xmloff/source xmlscript/source xmlsecurity/CppunitTest_xmlsecurity_pdfsigning.mk xmlsecurity/Executable_pdfverify.mk xmlsecurity/inc xmlsecurity/Library_xsec_fw.mk xmlsecurity/Library_xsec_gpg.mk xmlsecurity/qa xmlsecurity/source xmlsecurity/test_docs xmlsecurity/uiconfig xmlsecurity/util xmlsecurity/workben

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Fri Mar 31 09:21:16 UTC 2017


Rebased ref, commits from common ancestor:
commit 85f9f06f5904b57a23a56416e4477bb5f6703369
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Thu Mar 30 23:50:38 2017 +0200

    chart2: pivot chart round-trip test, pivot table update test
    
    Change-Id: Ia96bae4f24e7031929ceb9dc9fbeaa841def7547

diff --git a/chart2/CppunitTest_chart2_pivot_chart_test.mk b/chart2/CppunitTest_chart2_pivot_chart_test.mk
new file mode 100644
index 000000000000..418db1af9cc9
--- /dev/null
+++ b/chart2/CppunitTest_chart2_pivot_chart_test.mk
@@ -0,0 +1,131 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#*************************************************************************
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#*************************************************************************
+
+$(eval $(call gb_CppunitTest_CppunitTest,chart2_pivot_chart_test))
+
+$(eval $(call gb_CppunitTest_use_externals,chart2_pivot_chart_test, \
+	boost_headers \
+	libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,chart2_pivot_chart_test, \
+    chart2/qa/extras/PivotChartTest \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,chart2_pivot_chart_test, \
+    basegfx \
+    comphelper \
+    cppu \
+    cppuhelper \
+    drawinglayer \
+    editeng \
+    for \
+    forui \
+    i18nlangtag \
+    msfilter \
+    vcl \
+    oox \
+    sal \
+    salhelper \
+    sax \
+    sb \
+    sc \
+    sw \
+    sd \
+    sfx \
+    sot \
+    svl \
+    svt \
+    svx \
+    svxcore \
+    test \
+    tl \
+    tk \
+    ucbhelper \
+    unotest \
+    utl \
+    vbahelper \
+    xo \
+    sw \
+    $(gb_UWINAPI) \
+))
+
+$(eval $(call gb_CppunitTest_set_include,chart2_pivot_chart_test,\
+    -I$(SRCDIR)/chart2/inc \
+    $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,chart2_pivot_chart_test))
+$(eval $(call gb_CppunitTest_use_ure,chart2_pivot_chart_test))
+$(eval $(call gb_CppunitTest_use_vcl,chart2_pivot_chart_test))
+
+$(eval $(call gb_CppunitTest_use_components,chart2_pivot_chart_test,\
+    basic/util/sb \
+    animations/source/animcore/animcore \
+    chart2/source/controller/chartcontroller \
+    chart2/source/chartcore \
+    comphelper/util/comphelp \
+    configmgr/source/configmgr \
+    dtrans/util/mcnttype \
+    dbaccess/util/dba \
+    embeddedobj/util/embobj \
+    eventattacher/source/evtatt \
+    filter/source/config/cache/filterconfig1 \
+    filter/source/odfflatxml/odfflatxml \
+    filter/source/storagefilterdetect/storagefd \
+    filter/source/xmlfilteradaptor/xmlfa \
+    filter/source/xmlfilterdetect/xmlfd \
+    forms/util/frm \
+    framework/util/fwk \
+    i18npool/util/i18npool \
+    linguistic/source/lng \
+    oox/util/oox \
+    package/source/xstor/xstor \
+    package/util/package2 \
+    sax/source/expatwrap/expwrap \
+    sc/util/sc \
+    sc/util/scd \
+    sc/util/scfilt \
+    sw/util/sw \
+    sw/util/swd \
+    sw/util/msword \
+    sd/util/sd \
+    sd/util/sdfilt \
+    sd/util/sdd \
+    $(call gb_Helper_optional,SCRIPTING, \
+	    sc/util/vbaobj) \
+    scaddins/source/analysis/analysis \
+    scaddins/source/datefunc/date \
+    scripting/source/basprov/basprov \
+    scripting/util/scriptframe \
+    sfx2/util/sfx \
+    sot/util/sot \
+    svl/source/fsstor/fsstorage \
+    svl/util/svl \
+	svtools/util/svt \
+    svx/util/svx \
+    svx/util/svxcore \
+    toolkit/util/tk \
+    ucb/source/core/ucb1 \
+    ucb/source/ucp/file/ucpfile1 \
+    ucb/source/ucp/tdoc/ucptdoc1 \
+    unotools/util/utl \
+    unoxml/source/rdf/unordf \
+    unoxml/source/service/unoxml \
+    uui/util/uui \
+    writerfilter/util/writerfilter \
+    xmloff/util/xo \
+    xmlscript/util/xmlscript \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,chart2_pivot_chart_test))
+
+# vim: set noet sw=4 ts=4:
diff --git a/chart2/Module_chart2.mk b/chart2/Module_chart2.mk
index f39140d61002..3273055d5373 100644
--- a/chart2/Module_chart2.mk
+++ b/chart2/Module_chart2.mk
@@ -34,6 +34,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,chart2,\
     CppunitTest_chart2_import \
     CppunitTest_chart2_trendcalculators \
     CppunitTest_chart2_dump \
+    CppunitTest_chart2_pivot_chart_test \
 ))
 
 ifeq ($(ENABLE_CHART_TESTS),TRUE)
diff --git a/chart2/qa/extras/PivotChartTest.cxx b/chart2/qa/extras/PivotChartTest.cxx
new file mode 100644
index 000000000000..ad98c60869da
--- /dev/null
+++ b/chart2/qa/extras/PivotChartTest.cxx
@@ -0,0 +1,244 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "charttest.hxx"
+
+#include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
+#include <com/sun/star/sheet/XDataPilotTable.hpp>
+#include <com/sun/star/sheet/XDataPilotDescriptor.hpp>
+#include <com/sun/star/sheet/XDataPilotTables.hpp>
+#include <com/sun/star/sheet/XDataPilotTablesSupplier.hpp>
+#include <com/sun/star/sheet/XSpreadsheet.hpp>
+#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
+#include <com/sun/star/sheet/XSpreadsheets.hpp>
+
+#include <rtl/strbuf.hxx>
+
+#include <algorithm>
+
+class PivotChartTest : public ChartTest
+{
+public:
+    PivotChartTest() : ChartTest()
+    {}
+
+    void testRoundtrip();
+    void testChangePivotTable();
+
+    CPPUNIT_TEST_SUITE(PivotChartTest);
+    CPPUNIT_TEST(testRoundtrip);
+    CPPUNIT_TEST(testChangePivotTable);
+    CPPUNIT_TEST_SUITE_END();
+};
+
+void lclModifyOrientation(uno::Reference<sheet::XDataPilotDescriptor> xDescriptor,
+                          OUString sFieldName,
+                          sheet::DataPilotFieldOrientation eOrientation)
+{
+    uno::Reference<container::XIndexAccess> xPilotIndexAccess(xDescriptor->getDataPilotFields(), UNO_QUERY_THROW);
+    sal_Int32 nCount = xPilotIndexAccess->getCount();
+    for (sal_Int32 i = 0; i < nCount; ++i)
+    {
+        uno::Reference<container::XNamed> xNamed(xPilotIndexAccess->getByIndex(i), UNO_QUERY_THROW);
+        OUString aName = xNamed->getName();
+        uno::Reference<beans::XPropertySet> xPropSet(xNamed, UNO_QUERY_THROW);
+        if (aName == sFieldName)
+            xPropSet->setPropertyValue("Orientation", uno::makeAny(eOrientation));
+    }
+}
+
+bool lclCheckSequence(std::vector<double> const & reference,
+                      uno::Sequence<uno::Any> const & values,
+                      double delta)
+{
+    if (reference.size() != size_t(values.getLength()))
+        return false;
+
+    for (size_t i = 0; i < reference.size(); ++i)
+    {
+        double value = values[i].get<double>();
+
+        if (std::fabs(reference[i] - value) > delta)
+        {
+            printf ("Value %f is not the same as reference %f (delta %f)\n", value, reference[i], delta);
+            return false;
+        }
+    }
+    return true;
+}
+
+void PivotChartTest::testRoundtrip()
+{
+    uno::Sequence<uno::Any> xSequence;
+    Reference<chart2::XChartDocument> xChartDoc;
+
+    load("/chart2/qa/extras/data/ods/", "PivotChart.ods");
+
+    xChartDoc = Reference<chart2::XChartDocument>(getChartDocFromSheet(1, mxComponent), uno::UNO_QUERY);
+
+    std::vector<double> aReference1 { 10162.033139, 16614.523063, 27944.146101 };
+    OUString aExpectedLabel1("Exp.");
+
+    std::vector<double> aReference2 { 101879.458079, 178636.929704, 314626.484864 };
+    OUString aExpectedLabel2("Rev.");
+
+    CPPUNIT_ASSERT(xChartDoc.is());
+    {
+        Reference<chart2::data::XDataSequence> xDataSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 0);
+        xSequence = xDataSequence->getData();
+
+        CPPUNIT_ASSERT(lclCheckSequence(aReference1, xSequence, 1E-4));
+
+        Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, 0);
+        xSequence = xLabelDataSequence->getData();
+
+        CPPUNIT_ASSERT_EQUAL(aExpectedLabel1, xSequence[0].get<OUString>());
+    }
+    {
+        Reference<chart2::data::XDataSequence> xDataSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 1);
+        xSequence = xDataSequence->getData();
+
+        CPPUNIT_ASSERT(lclCheckSequence(aReference2, xSequence, 1E-4));
+
+        Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, 1);
+        xSequence = xLabelDataSequence->getData();
+
+        CPPUNIT_ASSERT_EQUAL(aExpectedLabel2, xSequence[0].get<OUString>());
+    }
+
+    reload("calc8");
+
+    xChartDoc = Reference<chart2::XChartDocument>(getChartDocFromSheet(1, mxComponent), uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xChartDoc.is());
+    {
+        Reference<chart2::data::XDataSequence> xDataSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 0);
+        xSequence = xDataSequence->getData();
+
+        CPPUNIT_ASSERT(lclCheckSequence(aReference1, xSequence, 1E-4));
+
+        Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, 0);
+        xSequence = xLabelDataSequence->getData();
+
+        CPPUNIT_ASSERT_EQUAL(aExpectedLabel1, xSequence[0].get<OUString>());
+    }
+    {
+        Reference<chart2::data::XDataSequence> xDataSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 1);
+        xSequence = xDataSequence->getData();
+
+        CPPUNIT_ASSERT(lclCheckSequence(aReference2, xSequence, 1E-4));
+
+        Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, 1);
+        xSequence = xLabelDataSequence->getData();
+
+        CPPUNIT_ASSERT_EQUAL(aExpectedLabel2, xSequence[0].get<OUString>());
+    }
+}
+
+
+void PivotChartTest::testChangePivotTable()
+{
+    uno::Sequence<uno::Any> xSequence;
+    Reference<chart2::XChartDocument> xChartDoc;
+
+    load("/chart2/qa/extras/data/ods/", "PivotChart2.ods");
+
+    xChartDoc = Reference<chart2::XChartDocument>(getChartDocFromSheet(1, mxComponent), uno::UNO_QUERY);
+
+    CPPUNIT_ASSERT(xChartDoc.is());
+    {
+        std::vector<double> aReference { 10162.033139, 16614.523063, 27944.146101 };
+        OUString aExpectedLabel("Exp.");
+
+        Reference<chart2::data::XDataSequence> xDataSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 0);
+        xSequence = xDataSequence->getData();
+        CPPUNIT_ASSERT(lclCheckSequence(aReference, xSequence, 1E-4));
+
+        Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, 0);
+        xSequence = xLabelDataSequence->getData();
+        CPPUNIT_ASSERT_EQUAL(aExpectedLabel, xSequence[0].get<OUString>());
+    }
+    {
+        std::vector<double> aReference { 101879.458079, 178636.929704, 314626.484864 };
+        OUString aExpectedLabel("Rev.");
+
+        Reference<chart2::data::XDataSequence> xDataSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 1);
+        xSequence = xDataSequence->getData();
+        CPPUNIT_ASSERT(lclCheckSequence(aReference, xSequence, 1E-4));
+
+        Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, 1);
+        xSequence = xLabelDataSequence->getData();
+        CPPUNIT_ASSERT_EQUAL(aExpectedLabel, xSequence[0].get<OUString>());
+    }
+
+    // modify the pivot table
+
+    {
+        uno::Reference<sheet::XSpreadsheetDocument> xDoc(mxComponent, UNO_QUERY_THROW);
+        uno::Reference<container::XIndexAccess> xSheetIndexAccess(xDoc->getSheets(), UNO_QUERY_THROW);
+        uno::Any aAny = xSheetIndexAccess->getByIndex(1);
+        uno::Reference<sheet::XSpreadsheet> xSheet;
+        CPPUNIT_ASSERT(aAny >>= xSheet);
+        uno::Reference<sheet::XDataPilotTablesSupplier> xDataPilotTablesSupplier(xSheet, uno::UNO_QUERY_THROW);
+        uno::Reference<sheet::XDataPilotTables> xDataPilotTables = xDataPilotTablesSupplier->getDataPilotTables();
+        uno::Reference<sheet::XDataPilotTable> xDataPilotTable(xDataPilotTables->getByName("DataPilot1"), UNO_QUERY_THROW);
+        uno::Reference<sheet::XDataPilotDescriptor> xDataPilotDescriptor(xDataPilotTable, UNO_QUERY_THROW);
+        uno::Reference<container::XIndexAccess> xPilotIndexAccess(xDataPilotDescriptor->getDataPilotFields(), UNO_QUERY_THROW);
+
+        lclModifyOrientation(xDataPilotDescriptor, "Service Month", sheet::DataPilotFieldOrientation_ROW);
+        lclModifyOrientation(xDataPilotDescriptor, "Group Segment", sheet::DataPilotFieldOrientation_COLUMN);
+        lclModifyOrientation(xDataPilotDescriptor, "Rev.", sheet::DataPilotFieldOrientation_HIDDEN);
+    }
+
+    // check again
+
+    xChartDoc = Reference<chart2::XChartDocument>(getChartDocFromSheet(1, mxComponent), uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xChartDoc.is());
+    {
+        std::vector<double> aReference { 2855.559, 1780.326, 2208.713, 2130.064, 1187.371 };
+        OUString aExpectedLabel("Big");
+
+        Reference<chart2::data::XDataSequence> xDataSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 0);
+        xSequence = xDataSequence->getData();
+        CPPUNIT_ASSERT(lclCheckSequence(aReference, xSequence, 1E-3));
+
+        Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, 0);
+        xSequence = xLabelDataSequence->getData();
+        CPPUNIT_ASSERT_EQUAL(aExpectedLabel, xSequence[0].get<OUString>());
+    }
+    {
+        std::vector<double> aReference { 4098.908, 2527.286, 4299.716, 2362.225, 3326.389 };
+        OUString aExpectedLabel("Medium");
+
+        Reference<chart2::data::XDataSequence> xDataSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 1);
+        xSequence = xDataSequence->getData();
+        CPPUNIT_ASSERT(lclCheckSequence(aReference, xSequence, 1E-3));
+
+        Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, 1);
+        xSequence = xLabelDataSequence->getData();
+        CPPUNIT_ASSERT_EQUAL(aExpectedLabel, xSequence[0].get<OUString>());
+    }
+    {
+        std::vector<double> aReference { 4926.303, 5684.060, 4201.398, 7290.795, 5841.591 };
+        OUString aExpectedLabel("Small");
+
+        Reference<chart2::data::XDataSequence> xDataSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 2);
+        xSequence = xDataSequence->getData();
+        CPPUNIT_ASSERT(lclCheckSequence(aReference, xSequence, 1E-3));
+
+        Reference<chart2::data::XDataSequence> xLabelDataSequence = getLabelDataSequenceFromDoc(xChartDoc, 2);
+        xSequence = xLabelDataSequence->getData();
+        CPPUNIT_ASSERT_EQUAL(aExpectedLabel, xSequence[0].get<OUString>());
+    }
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(PivotChartTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/qa/extras/data/ods/PivotChart.ods b/chart2/qa/extras/data/ods/PivotChart.ods
new file mode 100644
index 000000000000..c34521e0bc52
Binary files /dev/null and b/chart2/qa/extras/data/ods/PivotChart.ods differ
diff --git a/chart2/qa/extras/data/ods/PivotChart2.ods b/chart2/qa/extras/data/ods/PivotChart2.ods
new file mode 100644
index 000000000000..c34521e0bc52
Binary files /dev/null and b/chart2/qa/extras/data/ods/PivotChart2.ods differ
commit cc0a8c929683ae477bdeb02a01845509b0f73809
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Thu Mar 30 22:53:05 2017 +0200

    xmloff: add ODF import/export for pivot charts
    
    This adds import and export for pivot charts:
    - Added loext:data-pilot-source attribute on chart:chart which
      is the internal name of the pivot table with which the pivot
      chart is associated with. If the element is present, then the
      it means the chart is a pivot chart, else it is a normal chart
    - Added service to create pivot chart data provider through UNO
    - Add new methods to XPivotChartDataProvider to create value and
      label data sequences separately from the data source, which is
      needed for pivot chart import
    - When importing defer setting the data provider until a later
      time when we know if we are creating a chart od a pivot chart
    
    Change-Id: I414203518a12d0f20ca17fe55c3af7bc683f60e2

diff --git a/include/xmloff/xmlnmspe.hxx b/include/xmloff/xmlnmspe.hxx
index ae588d28eeac..17f490ff582c 100644
--- a/include/xmloff/xmlnmspe.hxx
+++ b/include/xmloff/xmlnmspe.hxx
@@ -23,11 +23,11 @@
 #include <sal/types.h>
 
 #define XML_NAMESPACE( prefix, key ) \
-const sal_uInt16 XML_NAMESPACE_##prefix         = key; \
-const sal_uInt16 XML_NAMESPACE_##prefix##_IDX   = key;
+constexpr sal_uInt16 XML_NAMESPACE_##prefix         = key; \
+constexpr sal_uInt16 XML_NAMESPACE_##prefix##_IDX   = key;
 
 #define XML_OLD_NAMESPACE( prefix, index ) \
-const sal_uInt16 XML_OLD_NAMESPACE_##prefix##_IDX = \
+constexpr sal_uInt16 XML_OLD_NAMESPACE_##prefix##_IDX = \
     (XML_OLD_NAMESPACE_BASE+index);
 
 // current namespaces
@@ -89,7 +89,6 @@ XML_NAMESPACE_EXT( LO,          42U )
 // namespaces used in the technical preview (SO 5.2)
 XML_OLD_NAMESPACE( FO,      0U )
 XML_OLD_NAMESPACE( XLINK,   1U )
-
 XML_OLD_NAMESPACE( OFFICE,  2U )
 XML_OLD_NAMESPACE( STYLE,   3U )
 XML_OLD_NAMESPACE( TEXT,    4U )
diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index 4430d298d63b..9ab65abfd195 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -547,6 +547,7 @@ namespace xmloff { namespace token {
         XML_DATA_LABEL_NUMBER,
         XML_DATA_LABEL_SYMBOL,
         XML_DATA_LABEL_TEXT,
+        XML_DATA_PILOT_SOURCE,
         XML_DATA_PILOT_FIELD,
         XML_DATA_PILOT_GRAND_TOTAL,
         XML_DATA_PILOT_LEVEL,
diff --git a/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl b/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl
index 284d7acbc253..60c76baf889e 100644
--- a/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl
+++ b/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl
@@ -46,11 +46,41 @@ interface XPivotChartDataProvider : com::sun::star::uno::XInterface
      */
     sequence<com::sun::star::chart2::data::PivotTableFieldEntry> getDataFields();
 
-    /** associated pivot table name
+    /** get the associated pivot table name
      *
      * @since LibreOffice 5.4
      */
     string getPivotTableName();
+
+    /** set the associated pivot table name
+     *
+     * @since LibreOffice 5.4
+     */
+     void setPivotTableName([in] string sPivotTableName);
+
+    /** creates a single data sequence of values for the given data series index.
+     *
+     *  @param nIndex
+     *      index of the data series
+     *
+     *  @since LibreOffice 5.4
+     */
+    XDataSequence createDataSequenceOfValuesByIndex([in] long nIndex);
+
+    /** creates a single data sequence of label(s) for the given data series index.
+     *
+     *  @param nIndex
+     *      index of the data series
+     *
+     *  @since LibreOffice 5.4
+     */
+     XDataSequence createDataSequenceOfLabelsByIndex([in] long nIndex);
+
+    /** creates a single data sequence of categories.
+     *
+     *  @since LibreOffice 5.4
+     */
+    XDataSequence createDataSequenceOfCategories();
 };
 
 };};};};};
diff --git a/sc/inc/PivotChartDataProvider.hxx b/sc/inc/PivotChartDataProvider.hxx
index 80e37945f8b7..4f3859e74003 100644
--- a/sc/inc/PivotChartDataProvider.hxx
+++ b/sc/inc/PivotChartDataProvider.hxx
@@ -31,8 +31,6 @@
 #include <rtl/ustring.hxx>
 #include <svl/itemprop.hxx>
 
-#include "dpobject.hxx"
-
 #include <memory>
 #include <vector>
 
@@ -52,7 +50,7 @@ class PivotChartDataProvider : public PivotChartDataProvider_Base, public SfxLis
 {
 public:
 
-    explicit PivotChartDataProvider(ScDocument* pDoc, OUString const& sPivotTableName);
+    explicit PivotChartDataProvider(ScDocument* pDoc);
     virtual ~PivotChartDataProvider() override;
     virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
 
@@ -91,6 +89,14 @@ public:
 
     virtual OUString SAL_CALL getPivotTableName() override;
 
+    virtual void SAL_CALL setPivotTableName(const OUString& sPivotTableName) override;
+
+    virtual css::uno::Reference<css::chart2::data::XDataSequence> SAL_CALL
+        createDataSequenceOfValuesByIndex(sal_Int32 nIndex);
+    virtual css::uno::Reference<css::chart2::data::XDataSequence> SAL_CALL
+        createDataSequenceOfLabelsByIndex(sal_Int32 nIndex);
+    virtual css::uno::Reference<css::chart2::data::XDataSequence> SAL_CALL
+        createDataSequenceOfCategories();
 
     // XPropertySet
     virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override;
@@ -135,12 +141,11 @@ public:
 private:
 
     css::uno::Reference<css::chart2::data::XDataSource>
-        createPivotChartDataSource(OUString const & aRangeRepresentation);
+        createPivotChartValuesDataSource(OUString const & aRangeRepresentation);
     css::uno::Reference<css::chart2::data::XDataSource>
         createPivotChartCategoriesDataSource(OUString const & aRangeRepresentation, bool bOrientCol);
 
-    css::uno::Reference<css::chart2::data::XLabeledDataSequence>
-        createLabeledDataSequence(css::uno::Reference<css::uno::XComponentContext>& rContext);
+    css::uno::Reference<css::chart2::data::XLabeledDataSequence> newLabeledDataSequence();
 
     void setLabeledDataSequenceValues(css::uno::Reference<css::chart2::data::XLabeledDataSequence> & xResult,
                                       OUString const & sRoleValues, OUString const & sIdValues,
@@ -151,12 +156,14 @@ private:
                                 std::vector<PivotChartItem> const & rValues,
                                 OUString const & sRoleLabel,  OUString const & sIdLabel,
                                 std::vector<PivotChartItem> const & rLabel);
-    void createCategories(
-        ScDPSaveData* pSaveData, bool bOrientCol,
-        css::uno::Reference<css::uno::XComponentContext>& rContext,
-        std::vector<css::uno::Reference<css::chart2::data::XLabeledDataSequence>>& rOutLabeledSequences);
 
-    void collectPivotTableData(ScDPObject* pDPObject);
+    void assignLabelsToDataSequence(css::uno::Reference<css::chart2::data::XDataSequence> & rDataSequence,
+                                    size_t nIndex);
+
+    void assignValuesToDataSequence(css::uno::Reference<css::chart2::data::XDataSequence> & rDataSequence,
+                                    size_t nIndex);
+
+    void collectPivotTableData();
 
     ScDocument*        m_pDocument;
     OUString           m_sPivotTableName;
@@ -173,6 +180,10 @@ private:
     std::vector<css::chart2::data::PivotTableFieldEntry> m_aPageFields;
     std::vector<css::chart2::data::PivotTableFieldEntry> m_aDataFields;
 
+    bool m_bNeedsUpdate;
+
+    css::uno::Reference<css::uno::XComponentContext> m_xContext;
+
     std::vector<css::uno::Reference<css::util::XModifyListener>> m_aValueListeners;
 };
 
diff --git a/sc/inc/servuno.hxx b/sc/inc/servuno.hxx
index 44049dd0f98e..e81463273c49 100644
--- a/sc/inc/servuno.hxx
+++ b/sc/inc/servuno.hxx
@@ -50,7 +50,7 @@ public:
         SHEETDOCSET ,
 
         // BM
-        CHDATAPROV ,
+        CHDATAPROV , CHART_PIVOTTABLE_DATAPROVIDER,
         // formula parser
         FORMULAPARS , OPCODEMAPPER ,
         // VBA specific
diff --git a/sc/inc/unonames.hxx b/sc/inc/unonames.hxx
index 469183d18b78..6e104542f7dc 100644
--- a/sc/inc/unonames.hxx
+++ b/sc/inc/unonames.hxx
@@ -32,6 +32,7 @@
 
 #define SC_SERVICENAME_CHDATAPROV       "com.sun.star.chart2.data.DataProvider"
 #define SC_SERVICENAME_CHRANGEHILIGHT   "com.sun.star.chart2.data.RangeHighlightListener"
+#define SC_SERVICENAME_CHART_PIVOTTABLE_DATAPROVIDER "com.sun.star.chart2.data.PivotTableDataProvider"
 
 //  document
 #define SC_UNO_AREALINKS            "AreaLinks"
diff --git a/sc/source/ui/drawfunc/fuins2.cxx b/sc/source/ui/drawfunc/fuins2.cxx
index ba4a31f618fd..c2326abaa56f 100644
--- a/sc/source/ui/drawfunc/fuins2.cxx
+++ b/sc/source/ui/drawfunc/fuins2.cxx
@@ -78,6 +78,7 @@
 #include "drawview.hxx"
 #include "markdata.hxx"
 #include "gridwin.hxx"
+#include "dpobject.hxx"
 #include <memory>
 
 using namespace css;
@@ -134,9 +135,15 @@ void lcl_ChartInit(const uno::Reference <embed::XEmbeddedObject>& xObj, ScViewDa
         {
             uno::Reference<chart2::data::XDataProvider> xDataProvider;
             if (bRangeIsPivotTable)
-                xDataProvider.set(new sc::PivotChartDataProvider(&rScDoc, aRangeString));
+            {
+                std::unique_ptr<sc::PivotChartDataProvider> pPivotChartDataProvider(new sc::PivotChartDataProvider(&rScDoc));
+                pPivotChartDataProvider->setPivotTableName(aRangeString);
+                xDataProvider.set(pPivotChartDataProvider.release());
+            }
             else
+            {
                 xDataProvider.set(new ScChart2DataProvider(&rScDoc));
+            }
 
             xReceiver->attachDataProvider(xDataProvider);
 
diff --git a/sc/source/ui/unoobj/PivotChartDataProvider.cxx b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
index c6fce89c4f4a..954453193387 100644
--- a/sc/source/ui/unoobj/PivotChartDataProvider.cxx
+++ b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
@@ -70,17 +70,28 @@ uno::Reference<frame::XModel> lcl_GetXModel(ScDocument * pDoc)
     return xModel;
 }
 
+OUString lcl_identifierForData(sal_Int32 index)
+{
+    return "Data@" + OUString::number(index + 1);
+}
+
+OUString lcl_identifierForLabel(sal_Int32 index)
+{
+    return "Label@" + OUString::number(index + 1);
+}
+
 } // end anonymous namespace
 
-SC_SIMPLE_SERVICE_INFO( PivotChartDataProvider, "PivotChartDataProvider", "com.sun.star.chart2.data.DataProvider")
+SC_SIMPLE_SERVICE_INFO(PivotChartDataProvider, "PivotChartDataProvider", SC_SERVICENAME_CHART_PIVOTTABLE_DATAPROVIDER)
 
 // DataProvider ==============================================================
 
-PivotChartDataProvider::PivotChartDataProvider(ScDocument* pDoc, OUString const& sPivotTableName)
+PivotChartDataProvider::PivotChartDataProvider(ScDocument* pDoc)
     : m_pDocument(pDoc)
-    , m_sPivotTableName(sPivotTableName)
     , m_aPropSet(lcl_GetDataProviderPropertyMap())
     , m_bIncludeHiddenCells(true)
+    , m_bNeedsUpdate(true)
+    , m_xContext(comphelper::getProcessComponentContext())
 {
     if (m_pDocument)
         m_pDocument->AddUnoObject(*this);
@@ -107,6 +118,7 @@ void PivotChartDataProvider::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHin
             OUString sPivotTableName = static_cast<const ScDataPilotModifiedHint&>(rHint).GetName();
             if (sPivotTableName == m_sPivotTableName)
             {
+                m_bNeedsUpdate = true;
                 for (uno::Reference<util::XModifyListener> const & xListener : m_aValueListeners)
                 {
                     css::chart::ChartDataChangeEvent aEvent(static_cast<cppu::OWeakObject*>(this),
@@ -124,7 +136,12 @@ sal_Bool SAL_CALL PivotChartDataProvider::createDataSourcePossible(const uno::Se
     SolarMutexGuard aGuard;
     if (!m_pDocument)
         return false;
-    return true;
+
+    if (m_sPivotTableName.isEmpty())
+        return false;
+
+    ScDPCollection* pDPCollection = m_pDocument->GetDPCollection();
+    return bool(pDPCollection->GetByName(m_sPivotTableName));
 }
 
 uno::Reference<chart2::data::XDataSource> SAL_CALL
@@ -174,16 +191,18 @@ uno::Reference<chart2::data::XDataSource> SAL_CALL
     if (aRangeRepresentation == "Categories")
         xResult = createPivotChartCategoriesDataSource(aRangeRepresentation, bOrientCol);
     else
-        xResult = createPivotChartDataSource(aRangeRepresentation);
+        xResult = createPivotChartValuesDataSource(aRangeRepresentation);
 
     return xResult;
 }
 
 uno::Reference<chart2::data::XLabeledDataSequence>
-PivotChartDataProvider::createLabeledDataSequence(uno::Reference<uno::XComponentContext>& rContext)
+PivotChartDataProvider::newLabeledDataSequence()
 {
     uno::Reference<chart2::data::XLabeledDataSequence> xResult;
-    xResult.set(chart2::data::LabeledDataSequence::create(rContext), uno::UNO_QUERY_THROW);
+    if (!m_xContext.is())
+        return xResult;
+    xResult.set(chart2::data::LabeledDataSequence::create(m_xContext), uno::UNO_QUERY_THROW);
     return xResult;
 }
 
@@ -215,19 +234,17 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
                                                     OUString const & rRangeRepresentation,
                                                     bool bOrientCol)
 {
-    uno::Reference<chart2::data::XDataSource> xDataSource;
-    uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
-
-    if (!xContext.is())
-        return xDataSource;
+    if (m_bNeedsUpdate)
+        collectPivotTableData();
 
+    uno::Reference<chart2::data::XDataSource> xDataSource;
     std::vector<uno::Reference<chart2::data::XLabeledDataSequence>> aLabeledSequences;
 
     if (bOrientCol)
     {
         for (std::vector<PivotChartItem> const & rCategories : m_aCategoriesColumnOrientation)
         {
-            uno::Reference<chart2::data::XLabeledDataSequence> xResult = createLabeledDataSequence(xContext);
+            uno::Reference<chart2::data::XLabeledDataSequence> xResult = newLabeledDataSequence();
             setLabeledDataSequenceValues(xResult, "categories", "Categories", rCategories);
             aLabeledSequences.push_back(xResult);
         }
@@ -236,7 +253,7 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
     {
         for (std::vector<PivotChartItem> const & rCategories : m_aCategoriesRowOrientation)
         {
-            uno::Reference<chart2::data::XLabeledDataSequence> xResult = createLabeledDataSequence(xContext);
+            uno::Reference<chart2::data::XLabeledDataSequence> xResult = newLabeledDataSequence();
             setLabeledDataSequenceValues(xResult, "categories", "Categories", rCategories);
             aLabeledSequences.push_back(xResult);
         }
@@ -246,8 +263,11 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
     return xDataSource;
 }
 
-void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
+void PivotChartDataProvider::collectPivotTableData()
 {
+    ScDPCollection* pDPCollection = m_pDocument->GetDPCollection();
+    ScDPObject* pDPObject = pDPCollection->GetByName(m_sPivotTableName);
+
     uno::Reference<sheet::XDataPilotResults> xDPResults(pDPObject->GetSource(), uno::UNO_QUERY);
     uno::Sequence<uno::Sequence<sheet::DataResult>> xDataResultsSequence = xDPResults->getResults();
 
@@ -320,9 +340,9 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
 
         uno::Reference<container::XIndexAccess> xLevels = new ScNameToIndexAccess(xLevelsSupplier->getLevels());
 
-        for (long nLev = 0; nLev < xLevels->getCount(); nLev++)
+        for (long nLevel = 0; nLevel < xLevels->getCount(); nLevel++)
         {
-            uno::Reference<uno::XInterface> xLevel = ScUnoHelpFunctions::AnyToInterface(xLevels->getByIndex(nLev));
+            uno::Reference<uno::XInterface> xLevel = ScUnoHelpFunctions::AnyToInterface(xLevels->getByIndex(nLevel));
             uno::Reference<container::XNamed> xLevelName(xLevel, uno::UNO_QUERY);
             uno::Reference<sheet::XDataPilotMemberResults> xLevelResult(xLevel, uno::UNO_QUERY );
 
@@ -482,21 +502,65 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
             i++;
         }
     }
+
+    m_bNeedsUpdate = false;
 }
 
-uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotChartDataSource(OUString const & aRangeRepresentation)
+void PivotChartDataProvider::assignValuesToDataSequence(
+                                    uno::Reference<chart2::data::XDataSequence> & rDataSequence,
+                                    size_t nIndex)
 {
-    uno::Reference<chart2::data::XDataSource> xDataSource;
-    std::vector<uno::Reference<chart2::data::XLabeledDataSequence>> aLabeledSequences;
+    if (nIndex >= m_aDataRowVector.size())
+        return;
 
-    uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
-    if (!xContext.is())
-        return xDataSource;
+    OUString sDataID = lcl_identifierForData(nIndex);
 
-    ScDPCollection* pDPCollection = m_pDocument->GetDPCollection();
-    ScDPObject* pDPObject = pDPCollection->GetByName(m_sPivotTableName);
+    std::vector<PivotChartItem> const & rRowOfData = m_aDataRowVector[size_t(nIndex)];
+    std::unique_ptr<PivotChartDataSequence> pSequence(new PivotChartDataSequence(m_pDocument, m_sPivotTableName,
+                                                                                 sDataID, rRowOfData));
+    pSequence->setRole("values-y");
+    rDataSequence.set(uno::Reference<chart2::data::XDataSequence>(pSequence.release()));
+}
+
+void PivotChartDataProvider::assignLabelsToDataSequence(
+                                    uno::Reference<chart2::data::XDataSequence> & rDataSequence,
+                                    size_t nIndex)
+{
+    if (nIndex >= m_aLabels.size())
+        return;
+
+    OUString sLabelID = lcl_identifierForLabel(nIndex);
+
+    OUString aLabel;
+    bool bFirst = true;
+    for (PivotChartItem const & rItem : m_aLabels[size_t(nIndex)])
+    {
+        if (bFirst)
+        {
+            aLabel += rItem.m_aString;
+            bFirst = false;
+        }
+        else
+        {
+            aLabel += " - " + rItem.m_aString;
+        }
+    }
+
+    std::vector<PivotChartItem> aLabelVector { PivotChartItem(aLabel) };
+
+    std::unique_ptr<PivotChartDataSequence> pSequence(new PivotChartDataSequence(m_pDocument, m_sPivotTableName,
+                                                                                 sLabelID, aLabelVector));
+    pSequence->setRole("values-y");
+    rDataSequence.set(uno::Reference<chart2::data::XDataSequence>(pSequence.release()));
+}
+
+uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotChartValuesDataSource(OUString const & rRangeRepresentation)
+{
+    if (m_bNeedsUpdate)
+        collectPivotTableData();
 
-    collectPivotTableData(pDPObject);
+    uno::Reference<chart2::data::XDataSource> xDataSource;
+    std::vector<uno::Reference<chart2::data::XLabeledDataSequence>> aLabeledSequences;
 
     {
         std::vector<PivotChartItem> aFirstCategories;
@@ -504,7 +568,7 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
                    m_aCategoriesColumnOrientation[0].end(),
                    std::back_inserter(aFirstCategories));
 
-        uno::Reference<chart2::data::XLabeledDataSequence> xResult = createLabeledDataSequence(xContext);
+        uno::Reference<chart2::data::XLabeledDataSequence> xResult = newLabeledDataSequence();
         setLabeledDataSequenceValues(xResult, "categories", "Categories", aFirstCategories);
         aLabeledSequences.push_back(xResult);
     }
@@ -513,8 +577,8 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
         int i = 0;
         for (std::vector<PivotChartItem> const & rRowOfData : m_aDataRowVector)
         {
-            OUString aValuesId = "Data " + OUString::number(i + 1);
-            OUString aLabelsId = "Label " + OUString::number(i + 1);
+            OUString aValuesId = lcl_identifierForData(i);
+            OUString aLabelsId = lcl_identifierForLabel(i);
 
             OUString aLabel;
             bool bFirst = true;
@@ -533,7 +597,7 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
 
             std::vector<PivotChartItem> aLabelVector { PivotChartItem(aLabel) };
 
-            uno::Reference<chart2::data::XLabeledDataSequence> xResult = createLabeledDataSequence(xContext);
+            uno::Reference<chart2::data::XLabeledDataSequence> xResult = newLabeledDataSequence();
             setLabeledDataSequence(xResult, "values-y", aValuesId, rRowOfData,
                                             "values-y", aLabelsId, aLabelVector);
             aLabeledSequences.push_back(xResult);
@@ -541,7 +605,7 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
         }
     }
 
-    xDataSource.set(new PivotChartDataSource(aRangeRepresentation, aLabeledSequences));
+    xDataSource.set(new PivotChartDataSource(rRangeRepresentation, aLabeledSequences));
     return xDataSource;
 }
 
@@ -575,15 +639,14 @@ sal_Bool SAL_CALL PivotChartDataProvider::createDataSequenceByRangeRepresentatio
 {
     SolarMutexGuard aGuard;
     return false;
-
 }
 
 uno::Reference< chart2::data::XDataSequence > SAL_CALL
-    PivotChartDataProvider::createDataSequenceByRangeRepresentation(const OUString& /*aRangeRepresentation*/)
+    PivotChartDataProvider::createDataSequenceByRangeRepresentation(const OUString& /*rRangeRepresentation*/)
 {
     SolarMutexGuard aGuard;
-    uno::Reference<chart2::data::XDataSequence> xResult;
-    return xResult;
+    uno::Reference<chart2::data::XDataSequence> xDataSequence;
+    return xDataSequence;
 }
 
 uno::Reference<chart2::data::XDataSequence> SAL_CALL
@@ -629,6 +692,63 @@ OUString PivotChartDataProvider::getPivotTableName()
     return m_sPivotTableName;
 }
 
+void PivotChartDataProvider::setPivotTableName(const OUString& sPivotTableName)
+{
+    ScDPCollection* pDPCollection = m_pDocument->GetDPCollection();
+    ScDPObject* pDPObject = pDPCollection->GetByName(sPivotTableName);
+    if (pDPObject)
+        m_sPivotTableName = sPivotTableName;
+}
+
+uno::Reference<chart2::data::XDataSequence>
+PivotChartDataProvider::createDataSequenceOfValuesByIndex(sal_Int32 nIndex)
+{
+    SolarMutexGuard aGuard;
+
+    if (m_bNeedsUpdate)
+        collectPivotTableData();
+
+    uno::Reference<chart2::data::XDataSequence> xDataSequence;
+    assignValuesToDataSequence(xDataSequence, size_t(nIndex));
+    return xDataSequence;
+}
+
+uno::Reference<css::chart2::data::XDataSequence>
+PivotChartDataProvider::createDataSequenceOfLabelsByIndex(sal_Int32 nIndex)
+{
+    SolarMutexGuard aGuard;
+
+    if (m_bNeedsUpdate)
+        collectPivotTableData();
+
+    uno::Reference<chart2::data::XDataSequence> xDataSequence;
+    assignLabelsToDataSequence(xDataSequence, size_t(nIndex));
+    return xDataSequence;
+}
+
+uno::Reference<css::chart2::data::XDataSequence>
+PivotChartDataProvider::createDataSequenceOfCategories()
+{
+    SolarMutexGuard aGuard;
+
+    if (m_bNeedsUpdate)
+        collectPivotTableData();
+
+    uno::Reference<chart2::data::XDataSequence> xDataSequence;
+
+    if (m_aCategoriesColumnOrientation.empty())
+        return xDataSequence;
+
+    std::vector<PivotChartItem> const & rCategories = m_aCategoriesColumnOrientation[0];
+
+    std::unique_ptr<PivotChartDataSequence> pSequence(new PivotChartDataSequence(m_pDocument, m_sPivotTableName,
+                                                                                 "Categories", rCategories));
+    pSequence->setRole("categories");
+    xDataSequence.set(uno::Reference<chart2::data::XDataSequence>(pSequence.release()));
+
+    return xDataSequence;
+}
+
 // XModifyBroadcaster ========================================================
 
 void SAL_CALL PivotChartDataProvider::addModifyListener( const uno::Reference< util::XModifyListener >& aListener )
@@ -643,10 +763,10 @@ void SAL_CALL PivotChartDataProvider::removeModifyListener( const uno::Reference
     SolarMutexGuard aGuard;
 
     sal_uInt16 nCount = m_aValueListeners.size();
-    for (sal_uInt16 n = nCount; n--; )
+    for (sal_uInt16 n = nCount; n--;)
     {
-        uno::Reference<util::XModifyListener>& rObj = m_aValueListeners[n];
-        if (rObj == aListener)
+        uno::Reference<util::XModifyListener>& rObject = m_aValueListeners[n];
+        if (rObject == aListener)
         {
             m_aValueListeners.erase(m_aValueListeners.begin() + n);
         }
diff --git a/sc/source/ui/unoobj/servuno.cxx b/sc/source/ui/unoobj/servuno.cxx
index 6b2fac6b79e8..032fdfa9f30c 100644
--- a/sc/source/ui/unoobj/servuno.cxx
+++ b/sc/source/ui/unoobj/servuno.cxx
@@ -44,6 +44,7 @@
 #include "addruno.hxx"
 #include "chart2uno.hxx"
 #include "tokenuno.hxx"
+#include "PivotChartDataProvider.hxx"
 
 // Support creation of GraphicObjectResolver and EmbeddedObjectResolver
 #include <svx/xmleohlp.hxx>
@@ -292,6 +293,7 @@ const ProvNamesId_Type aProvNamesId[] =
     { "com.sun.star.sheet.DocumentSettings",Type::SHEETDOCSET },
 
     { SC_SERVICENAME_CHDATAPROV,            Type::CHDATAPROV },
+    { SC_SERVICENAME_CHART_PIVOTTABLE_DATAPROVIDER, Type::CHART_PIVOTTABLE_DATAPROVIDER },
     { SC_SERVICENAME_FORMULAPARS,           Type::FORMULAPARS },
     { SC_SERVICENAME_OPCODEMAPPER,          Type::OPCODEMAPPER },
     { "ooo.vba.VBAObjectModuleObjectProvider", Type::VBAOBJECTPROVIDER },
@@ -388,6 +390,7 @@ uno::Reference<uno::XInterface> ScServiceProvider::MakeInstance(
                                     Type nType, ScDocShell* pDocShell )
 {
     uno::Reference<uno::XInterface> xRet;
+
     switch (nType)
     {
         case Type::SHEET:
@@ -523,6 +526,10 @@ uno::Reference<uno::XInterface> ScServiceProvider::MakeInstance(
             if (pDocShell)
                 xRet = *new ScChart2DataProvider( &pDocShell->GetDocument() );
             break;
+        case Type::CHART_PIVOTTABLE_DATAPROVIDER:
+            if (pDocShell)
+                xRet = *new sc::PivotChartDataProvider(&pDocShell->GetDocument());
+            break;
         case Type::FORMULAPARS:
             if (pDocShell)
                 xRet.set(static_cast<sheet::XFormulaParser*>(new ScFormulaParserObj( pDocShell )));
diff --git a/xmloff/inc/SchXMLImport.hxx b/xmloff/inc/SchXMLImport.hxx
index 233ecde5b6c9..a1c3f698dca3 100644
--- a/xmloff/inc/SchXMLImport.hxx
+++ b/xmloff/inc/SchXMLImport.hxx
@@ -97,7 +97,8 @@ enum SchXMLChartAttrMap
     XML_TOK_CHART_HEIGHT,
     XML_TOK_CHART_STYLE_NAME,
     XML_TOK_CHART_COL_MAPPING,
-    XML_TOK_CHART_ROW_MAPPING
+    XML_TOK_CHART_ROW_MAPPING,
+    XML_TOK_CHART_DATA_PILOT_SOURCE,
 };
 
 enum SchXMLPlotAreaAttrTokenMap
diff --git a/xmloff/source/chart/SchXMLChartContext.cxx b/xmloff/source/chart/SchXMLChartContext.cxx
index 4ce36805398c..88420d62cdc0 100644
--- a/xmloff/source/chart/SchXMLChartContext.cxx
+++ b/xmloff/source/chart/SchXMLChartContext.cxx
@@ -52,11 +52,15 @@
 
 #include <com/sun/star/chart2/XChartDocument.hpp>
 #include <com/sun/star/chart2/data/XDataSink.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
 #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
 #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
 #include <com/sun/star/chart2/XChartTypeContainer.hpp>
 #include <com/sun/star/chart2/XTitled.hpp>
 
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/chart2/data/XDataReceiver.hpp>
+
 using namespace com::sun::star;
 using namespace ::xmloff::token;
 using com::sun::star::uno::Reference;
@@ -237,10 +241,71 @@ SchXMLChartContext::SchXMLChartContext( SchXMLImportHelper& rImpHelper,
 SchXMLChartContext::~SchXMLChartContext()
 {}
 
+void lcl_setDataProvider(uno::Reference<chart2::XChartDocument> xChartDoc, OUString const & sDataPilotSource)
+{
+    if (!xChartDoc.is())
+        return;
+
+    try
+    {
+        uno::Reference<container::XChild> xChild(xChartDoc, uno::UNO_QUERY);
+        uno::Reference<chart2::data::XDataReceiver> xDataReceiver(xChartDoc, uno::UNO_QUERY);
+        if (xChild.is() && xDataReceiver.is())
+        {
+            bool bHasOwnData = true;
+
+            Reference<lang::XMultiServiceFactory> xFact(xChild->getParent(), uno::UNO_QUERY);
+            if (xFact.is())
+            {
+                //if the parent has a number formatter we will use the numberformatter of the parent
+                Reference<util::XNumberFormatsSupplier> xNumberFormatsSupplier(xFact, uno::UNO_QUERY);
+                xDataReceiver->attachNumberFormatsSupplier(xNumberFormatsSupplier);
+
+                if (!xChartDoc->getDataProvider().is())
+                {
+                    bool bHasDataPilotSource = !sDataPilotSource.isEmpty();
+                    OUString aDataProviderServiceName("com.sun.star.chart2.data.DataProvider");
+                    if (bHasDataPilotSource)
+                        aDataProviderServiceName = "com.sun.star.chart2.data.PivotTableDataProvider";
+
+                    const uno::Sequence<OUString> aServiceNames(xFact->getAvailableServiceNames());
+
+                    if (std::find(aServiceNames.begin(), aServiceNames.end(), aDataProviderServiceName) != aServiceNames.end())
+                    {
+                        Reference<chart2::data::XDataProvider> xProvider(xFact->createInstance(aDataProviderServiceName), uno::UNO_QUERY);
+
+                        if (xProvider.is())
+                        {
+                            xDataReceiver->attachDataProvider(xProvider);
+                            if (bHasDataPilotSource)
+                            {
+                                Reference<chart2::data::XPivotChartDataProvider> xPivotChartProvider(xProvider, uno::UNO_QUERY);
+                                xPivotChartProvider->setPivotTableName(sDataPilotSource);
+                            }
+                            bHasOwnData = false;
+                        }
+                    }
+                }
+                else
+                    bHasOwnData = false;
+            }
+            // else we have no parent => we have our own data
+
+            if (bHasOwnData && ! xChartDoc->hasInternalDataProvider())
+                xChartDoc->createInternalDataProvider(false);
+        }
+    }
+    catch (const uno::Exception & rEx)
+    {
+        OString aBStr(OUStringToOString(rEx.Message, RTL_TEXTENCODING_ASCII_US));
+        SAL_INFO("xmloff.chart", "SchXMLChartContext::StartElement(): Exception caught: " << aBStr);
+    }
+}
+
 void SchXMLChartContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
 {
     // parse attributes
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
+    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetChartAttrTokenMap();
 
     uno::Reference< embed::XVisualObject > xVisualObject( mrImportHelper.GetChartDocument(), uno::UNO_QUERY);
@@ -264,10 +329,12 @@ void SchXMLChartContext::StartElement( const uno::Reference< xml::sax::XAttribut
 
         switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
         {
+            case XML_TOK_CHART_DATA_PILOT_SOURCE:
+                msDataPilotSource = aValue;
+                break;
             case XML_TOK_CHART_HREF:
                 m_aXLinkHRefAttributeToIndicateDataProvider = aValue;
                 break;
-
             case XML_TOK_CHART_CLASS:
                 {
                     OUString sClassName;
@@ -328,6 +395,11 @@ void SchXMLChartContext::StartElement( const uno::Reference< xml::sax::XAttribut
         }
     }
 
+    uno::Reference<chart::XChartDocument> xDoc = mrImportHelper.GetChartDocument();
+    uno::Reference<chart2::XChartDocument> xNewDoc(xDoc, uno::UNO_QUERY);
+
+    lcl_setDataProvider(xNewDoc, msDataPilotSource);
+
     if( aOldChartTypeName.isEmpty() )
     {
         SAL_WARN("xmloff.chart", "need a charttype to create a diagram" );
diff --git a/xmloff/source/chart/SchXMLChartContext.hxx b/xmloff/source/chart/SchXMLChartContext.hxx
index 649c9b6cc387..11b69987ac93 100644
--- a/xmloff/source/chart/SchXMLChartContext.hxx
+++ b/xmloff/source/chart/SchXMLChartContext.hxx
@@ -104,6 +104,8 @@ private:
     OUString msCategoriesAddress;
     OUString msChartAddress;
 
+    OUString msDataPilotSource;
+
     SeriesDefaultsAndStyles maSeriesDefaultsAndStyles;
     tSchXMLLSequencesPerIndex maLSequencesPerIndex;
 
diff --git a/xmloff/source/chart/SchXMLExport.cxx b/xmloff/source/chart/SchXMLExport.cxx
index 9b8c205fa038..0edf9901b381 100644
--- a/xmloff/source/chart/SchXMLExport.cxx
+++ b/xmloff/source/chart/SchXMLExport.cxx
@@ -90,6 +90,7 @@
 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
 #include <com/sun/star/chart2/data/XDataProvider.hpp>
 #include <com/sun/star/chart2/data/XDatabaseDataProvider.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
 #include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
 #include <com/sun/star/chart2/data/XTextualDataSequence.hpp>
 #include <com/sun/star/chart2/data/XNumericalDataSequence.hpp>
@@ -1213,6 +1214,13 @@ void SchXMLExportHelper_Impl::parseDocument( Reference< chart::XChartDocument >
             mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
         }
 
+        Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider(xNewDoc->getDataProvider(), uno::UNO_QUERY);
+        if (xPivotChartDataProvider.is())
+        {
+            OUString sPivotTableName = xPivotChartDataProvider->getPivotTableName();
+            mrExport.AddAttribute(XML_NAMESPACE_LO_EXT, XML_DATA_PILOT_SOURCE, sPivotTableName);
+        }
+
         OUString sChartType( xDiagram->getDiagramType() );
 
         // attributes
diff --git a/xmloff/source/chart/SchXMLImport.cxx b/xmloff/source/chart/SchXMLImport.cxx
index 5d33fc69301b..a240a9344989 100644
--- a/xmloff/source/chart/SchXMLImport.cxx
+++ b/xmloff/source/chart/SchXMLImport.cxx
@@ -249,6 +249,7 @@ const SvXMLTokenMap& SchXMLImportHelper::GetChartAttrTokenMap()
     { XML_NAMESPACE_CHART,  XML_STYLE_NAME,             XML_TOK_CHART_STYLE_NAME    },
     { XML_NAMESPACE_CHART,  XML_COLUMN_MAPPING,         XML_TOK_CHART_COL_MAPPING   },
     { XML_NAMESPACE_CHART,  XML_ROW_MAPPING,            XML_TOK_CHART_ROW_MAPPING   },
+    { XML_NAMESPACE_LO_EXT, XML_DATA_PILOT_SOURCE,      XML_TOK_CHART_DATA_PILOT_SOURCE },
     XML_TOKEN_MAP_END
 };
 
@@ -574,65 +575,24 @@ SvXMLImportContext* SchXMLImport::CreateStylesContext(
     return pStylesCtxt;
 }
 
-void SAL_CALL SchXMLImport::setTargetDocument( const uno::Reference< lang::XComponent >& xDoc )
+void SAL_CALL SchXMLImport::setTargetDocument(const uno::Reference<lang::XComponent>& xDoc)
 {
-    uno::Reference< chart2::XChartDocument > xOldDoc( GetModel(), uno::UNO_QUERY );
-    if( xOldDoc.is() && xOldDoc->hasControllersLocked() )
+    uno::Reference<chart2::XChartDocument> xOldDoc(GetModel(), uno::UNO_QUERY);
+    if (xOldDoc.is() && xOldDoc->hasControllersLocked())
         xOldDoc->unlockControllers();
 
-    SvXMLImport::setTargetDocument( xDoc );
+    SvXMLImport::setTargetDocument(xDoc);
 
-    //set data provider and number formatter
-    // try to get an XDataProvider and set it
-    // @todo: if we have our own data, we must not use the parent as data provider
-    uno::Reference< chart2::XChartDocument > xChartDoc( GetModel(), uno::UNO_QUERY );
+    uno::Reference<chart2::XChartDocument> xChartDoc(GetModel(), uno::UNO_QUERY);
 
-    if( xChartDoc.is() )
+    if (xChartDoc.is())
     try
     {
-        //prevent rebuild of view during load ( necesarry especially if loaded not via load api, which is the case for example if binary files are loaded )
+        // prevent rebuild of view during load (necesarry especially if loaded not
+        // via load api, which is the case for example if binary files are loaded)
         xChartDoc->lockControllers();
-
-        uno::Reference< container::XChild > xChild( xChartDoc, uno::UNO_QUERY );
-        uno::Reference< chart2::data::XDataReceiver > xDataReceiver( xChartDoc, uno::UNO_QUERY );
-        if( xChild.is() && xDataReceiver.is())
-        {
-            bool bHasOwnData = true;
-
-            Reference< lang::XMultiServiceFactory > xFact( xChild->getParent(), uno::UNO_QUERY );
-            if( xFact.is() )
-            {
-                //if the parent has a number formatter we will use the numberformatter of the parent
-                Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( xFact, uno::UNO_QUERY );
-                xDataReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
-
-                if ( !xChartDoc->getDataProvider().is() )
-                {
-                    const OUString aDataProviderServiceName( "com.sun.star.chart2.data.DataProvider");
-                    const uno::Sequence< OUString > aServiceNames( xFact->getAvailableServiceNames());
-                    const OUString * pBegin = aServiceNames.getConstArray();
-                    const OUString * pEnd = pBegin + aServiceNames.getLength();
-                    if( ::std::find( pBegin, pEnd, aDataProviderServiceName ) != pEnd )
-                    {
-                        Reference< chart2::data::XDataProvider > xProvider(
-                            xFact->createInstance( aDataProviderServiceName ), uno::UNO_QUERY );
-                        if( xProvider.is())
-                        {
-                            xDataReceiver->attachDataProvider( xProvider );
-                            bHasOwnData = false;
-                        }
-                    }
-                }
-                else
-                    bHasOwnData = false;
-            }
-//             else we have no parent => we have our own data
-
-            if( bHasOwnData && ! xChartDoc->hasInternalDataProvider() )
-                xChartDoc->createInternalDataProvider( false );
-        }
     }
-    catch( const uno::Exception & rEx )
+    catch (const uno::Exception & rEx)
     {
         OString aBStr(OUStringToOString(rEx.Message, RTL_TEXTENCODING_ASCII_US));
         SAL_INFO("xmloff.chart", "SchXMLChartContext::StartElement(): Exception caught: " << aBStr);
diff --git a/xmloff/source/chart/SchXMLSeries2Context.cxx b/xmloff/source/chart/SchXMLSeries2Context.cxx
index 70eda5253150..59676cd06014 100644
--- a/xmloff/source/chart/SchXMLSeries2Context.cxx
+++ b/xmloff/source/chart/SchXMLSeries2Context.cxx
@@ -30,6 +30,7 @@
 #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
 #include <com/sun/star/chart2/data/XDataSink.hpp>
 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
 
 #include <com/sun/star/chart/ChartAxisAssign.hpp>
 #include <com/sun/star/chart/ChartSymbolType.hpp>
@@ -407,20 +408,31 @@ void SchXMLSeries2Context::StartElement( const uno::Reference< xml::sax::XAttrib
                                                uno::makeAny( true ));
         }
 
+        Reference<chart2::data::XDataProvider> xDataProvider(mxNewDoc->getDataProvider());
+        Reference<chart2::data::XPivotChartDataProvider> xPivotChartProvider(xDataProvider, uno::UNO_QUERY);
+
+        Reference<chart2::data::XDataSequence> xSequenceValues;
+
         // values
-        Reference< chart2::data::XDataSequence > xSeq;
-        if( bHasRange && !m_aSeriesRange.isEmpty() )
-            xSeq = SchXMLTools::CreateDataSequence( m_aSeriesRange, mxNewDoc );
+        if (xPivotChartProvider.is()) // is pivot chart
+        {
+            xSequenceValues.set(xPivotChartProvider->createDataSequenceOfValuesByIndex(mnSeriesIndex));
+        }
+        else
+        {
+            if (bHasRange && !m_aSeriesRange.isEmpty())
+                xSequenceValues = SchXMLTools::CreateDataSequence(m_aSeriesRange, mxNewDoc);
+        }
 
-        Reference< beans::XPropertySet > xSeqProp( xSeq, uno::UNO_QUERY );
-        if( xSeqProp.is())
+        Reference<beans::XPropertySet> xSeqProp(xSequenceValues, uno::UNO_QUERY);
+        if (xSeqProp.is())
         {
             OUString aMainRole("values-y");
-            if ( maSeriesChartTypeName == "com.sun.star.chart2.BubbleChartType" )
+            if (maSeriesChartTypeName == "com.sun.star.chart2.BubbleChartType")
                 aMainRole = "values-size";
-            xSeqProp->setPropertyValue("Role", uno::makeAny( aMainRole ));
+            xSeqProp->setPropertyValue("Role", uno::makeAny(aMainRole));
         }
-        xLabeledSeq->setValues( xSeq );
+        xLabeledSeq->setValues(xSequenceValues);
 
         // register for setting local data if external data provider is not present
         maPostponedSequences.insert(
@@ -428,18 +440,24 @@ void SchXMLSeries2Context::StartElement( const uno::Reference< xml::sax::XAttrib
                 tSchXMLIndexWithPart( m_rGlobalSeriesImportInfo.nCurrentDataIndex, SCH_XML_PART_VALUES ), xLabeledSeq ));
 
         // label
-        if( !aSeriesLabelRange.isEmpty() )
+        Reference<chart2::data::XDataSequence> xSequenceLabel;
+
+        if (xPivotChartProvider.is())
         {
-            Reference< chart2::data::XDataSequence > xLabelSequence =
-                SchXMLTools::CreateDataSequence( aSeriesLabelRange, mxNewDoc );
-            xLabeledSeq->setLabel( xLabelSequence );
+            xSequenceLabel.set(xPivotChartProvider->createDataSequenceOfLabelsByIndex(mnSeriesIndex));
         }
-        else if( !aSeriesLabelString.isEmpty() )
+        else
         {
-            Reference< chart2::data::XDataSequence > xLabelSequence =
-                SchXMLTools::CreateDataSequenceWithoutConvert( aSeriesLabelString, mxNewDoc );
-            xLabeledSeq->setLabel( xLabelSequence );
+            if (!aSeriesLabelRange.isEmpty())
+            {
+                xSequenceLabel.set(SchXMLTools::CreateDataSequence(aSeriesLabelRange, mxNewDoc));
+            }
+            else if (!aSeriesLabelString.isEmpty())
+            {
+                xSequenceLabel.set(SchXMLTools::CreateDataSequenceWithoutConvert(aSeriesLabelString, mxNewDoc));
+            }
         }
+        xLabeledSeq->setLabel(xSequenceLabel);
 
         // Note: Even if we have no label, we have to register the label
         // for creation, because internal data always has labels. If
diff --git a/xmloff/source/chart/SchXMLTools.cxx b/xmloff/source/chart/SchXMLTools.cxx
index 31c1ac161b1a..2282d1dba2f0 100644
--- a/xmloff/source/chart/SchXMLTools.cxx
+++ b/xmloff/source/chart/SchXMLTools.cxx
@@ -36,6 +36,7 @@
 #include <com/sun/star/chart2/data/XDataProvider.hpp>
 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
 #include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
 #include <com/sun/star/chart2/XChartDocument.hpp>
 #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
 #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
@@ -488,11 +489,21 @@ void CreateCategories(
                                             bRangeConverted = true;
                                         }
                                     }
-                                    Reference< chart2::data::XDataSequence > xSeq(
-                                        xDataProvider->createDataSequenceByRangeRepresentation( aConvertedRange ));
-                                    xLabeledSeq->setValues( xSeq );
-                                    if( bRangeConverted )
-                                        setXMLRangePropertyAtDataSequence( xSeq, rRangeAddress );
+
+                                    Reference<chart2::data::XDataSequence> xSequence;
+                                    Reference<chart2::data::XPivotChartDataProvider> xPivotChartProvider(xDataProvider, uno::UNO_QUERY);
+                                    if (xPivotChartProvider.is())
+                                    {
+                                        xSequence.set(xPivotChartProvider->createDataSequenceOfCategories());
+                                    }
+                                    else
+                                    {
+                                        xSequence.set(xDataProvider->createDataSequenceByRangeRepresentation(aConvertedRange));
+                                        if (bRangeConverted)
+                                            setXMLRangePropertyAtDataSequence(xSequence, rRangeAddress);
+                                    }
+                                    xLabeledSeq->setValues(xSequence);
+
                                 }
                                 catch( const lang::IllegalArgumentException & ex )
                                 {
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index 5ee0ce8dfa84..166aa91b0a42 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -549,6 +549,7 @@ namespace xmloff { namespace token {
         TOKEN( "data-label-number",               XML_DATA_LABEL_NUMBER ),
         TOKEN( "data-label-symbol",               XML_DATA_LABEL_SYMBOL ),
         TOKEN( "data-label-text",                 XML_DATA_LABEL_TEXT ),
+        TOKEN( "data-pilot-source",               XML_DATA_PILOT_SOURCE ),
         TOKEN( "data-pilot-field",                XML_DATA_PILOT_FIELD ),
         TOKEN( "data-pilot-grand-total",          XML_DATA_PILOT_GRAND_TOTAL ),
         TOKEN( "data-pilot-level",                XML_DATA_PILOT_LEVEL ),
diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt
index e8878d8ec6c1..70386737e4ed 100644
--- a/xmloff/source/token/tokens.txt
+++ b/xmloff/source/token/tokens.txt
@@ -471,6 +471,7 @@ data-cell-range-address
 data-label-number
 data-label-symbol
 data-label-text
+data-pilot-source
 data-pilot-field
 data-pilot-grand-total
 data-pilot-level
@@ -3050,4 +3051,4 @@ max-numerator-digits
 zeros-numerator-digits
 zeros-denominator-digits
 integer-fraction-delimiter
-TOKEN_END_DUMMY
\ No newline at end of file
+TOKEN_END_DUMMY
commit d20ac976ba38bcf45d0323ad0447171677eb81fe
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Sat Mar 18 21:18:29 2017 +0100

    change removed include XPopupRequest for XRequestCallback
    
    Change-Id: I472ee5593977f15b144cac2f0683c8de5690af76

diff --git a/chart2/source/inc/PopupRequest.hxx b/chart2/source/inc/PopupRequest.hxx
index 4c0097f64a4e..fb98d3d9b19d 100644
--- a/chart2/source/inc/PopupRequest.hxx
+++ b/chart2/source/inc/PopupRequest.hxx
@@ -12,8 +12,8 @@
 
 #include "MutexContainer.hxx"
 #include <cppuhelper/compbase.hxx>
-#include <com/sun/star/chart2/data/XPopupRequest.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/awt/XRequestCallback.hpp>
 
 namespace chart
 {
commit 1d9a03d4edc2c3748ea105c2f8cbc1314799cbc0
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Fri Mar 17 12:38:46 2017 +0100

    chart2: check if data provider is pivot chart in VLegend
    
    Change-Id: I03f92ec2fae2e832e8e4d4d27f208741dacb88ac

diff --git a/chart2/source/view/main/VLegend.cxx b/chart2/source/view/main/VLegend.cxx
index ceffae7daad3..939ae8314cd5 100644
--- a/chart2/source/view/main/VLegend.cxx
+++ b/chart2/source/view/main/VLegend.cxx
@@ -769,10 +769,12 @@ std::vector<std::shared_ptr<VButton>> lcl_createButtons(
                        const uno::Reference< lang::XMultiServiceFactory>& xShapeFactory,
                        ChartModel& rModel, long& nUsedHeight)
 {
-    uno::Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider(rModel.getDataProvider(), uno::UNO_QUERY);
-
     std::vector<std::shared_ptr<VButton>> aButtons;
 
+    uno::Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider(rModel.getDataProvider(), uno::UNO_QUERY);
+    if (!xPivotChartDataProvider.is())
+        return aButtons;
+
     if (!xPivotChartDataProvider->getColumnFields().hasElements())
         return aButtons;
 
commit e5c8cbe1bacc8b99669aec9e6921417b1d4639f5
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Fri Mar 17 12:35:53 2017 +0100

    chart2: check if data provider is pivot chart
    
    Change-Id: Ib5e034f4d9d91a7c7b8627383e4ff3f5ae34b6bb

diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 285bc3facd26..fed132c1bda1 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -2494,6 +2494,8 @@ void lcl_createButtons(const uno::Reference< drawing::XShapes>& xPageShapes,
                        awt::Rectangle& rRemainingSpace)
 {
     uno::Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider(rModel.getDataProvider(), uno::UNO_QUERY);
+    if (!xPivotChartDataProvider.is())
+        return;
 
     uno::Reference<beans::XPropertySet> xModelPage(rModel.getPageBackground());
     awt::Size aSize(3000, 700); // size of the button
commit b0184f8178eeb9ab4f9053e3b2a5179c665b6551
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Fri Mar 10 19:50:37 2017 +0100

    remove (X)PopupRequest as it appears we won't need it
    
    XRequestCallback alone is good enough for pop-up request so we
    don't need XPopupRequest and PopupRequest.
    
    Change-Id: I4617cb3db0c90f629e27db0d1991196ce75acae4

diff --git a/chart2/inc/ChartModel.hxx b/chart2/inc/ChartModel.hxx
index 90ee82c56966..63bd12667612 100644
--- a/chart2/inc/ChartModel.hxx
+++ b/chart2/inc/ChartModel.hxx
@@ -45,6 +45,7 @@
 #include <com/sun/star/chart2/XChartTypeTemplate.hpp>
 #include <com/sun/star/container/XNameContainer.hpp>
 #include <com/sun/star/qa/XDumper.hpp>
+#include <com/sun/star/awt/XRequestCallback.hpp>
 
 // public API
 #include <com/sun/star/chart2/data/XDataProvider.hpp>
@@ -143,7 +144,7 @@ private:
     css::awt::Size                                     m_aVisualAreaSize;
     css::uno::Reference< css::frame::XModel >          m_xParent;
     css::uno::Reference< css::chart2::data::XRangeHighlighter > m_xRangeHighlighter;
-    css::uno::Reference<css::chart2::data::XPopupRequest> m_xPopupRequest;
+    css::uno::Reference<css::awt::XRequestCallback>    m_xPopupRequest;
     std::vector< GraphicObject >                            m_aGraphicObjectVector;
 
     css::uno::Reference< css::chart2::data::XDataProvider >   m_xDataProvider;
@@ -383,7 +384,7 @@ public:
     virtual void SAL_CALL attachNumberFormatsSupplier( const css::uno::Reference<
         css::util::XNumberFormatsSupplier >& xSupplier ) override;
     virtual css::uno::Reference< css::chart2::data::XRangeHighlighter > SAL_CALL getRangeHighlighter() override;
-    virtual css::uno::Reference< css::chart2::data::XPopupRequest > SAL_CALL getPopupRequest() override;
+    virtual css::uno::Reference<css::awt::XRequestCallback> SAL_CALL getPopupRequest() override;
 
     // ____ XTitled ____
     virtual css::uno::Reference< css::chart2::XTitle > SAL_CALL getTitleObject() override;
diff --git a/chart2/source/inc/PopupRequest.hxx b/chart2/source/inc/PopupRequest.hxx
index 61630f5f3861..4c0097f64a4e 100644
--- a/chart2/source/inc/PopupRequest.hxx
+++ b/chart2/source/inc/PopupRequest.hxx
@@ -21,7 +21,7 @@ namespace chart
 namespace impl
 {
 
-typedef cppu::WeakComponentImplHelper<css::chart2::data::XPopupRequest> PopupRequest_Base;
+typedef cppu::WeakComponentImplHelper<css::awt::XRequestCallback> PopupRequest_Base;
 
 }
 
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx
index d2f6c68f6361..79468714cdbe 100644
--- a/chart2/source/model/main/ChartModel.cxx
+++ b/chart2/source/model/main/ChartModel.cxx
@@ -919,7 +919,7 @@ Reference< chart2::data::XRangeHighlighter > SAL_CALL ChartModel::getRangeHighli
     return m_xRangeHighlighter;
 }
 
-Reference<chart2::data::XPopupRequest> SAL_CALL ChartModel::getPopupRequest()
+Reference<awt::XRequestCallback> SAL_CALL ChartModel::getPopupRequest()
 {
     if (!m_xPopupRequest.is())
         m_xPopupRequest.set(new PopupRequest);
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index e589c957a6be..f38e6e56408d 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -659,7 +659,6 @@ $(eval $(call gb_UnoApi_add_idlfiles_noheader,offapi,com/sun/star/chart2/data,\
 	DataSequence \
 	DataSink \
 	DataSource \
-	PopupRequest \
 	RangeHighlighter \
 	RangeHighlightListener \
 	TabularDataProviderArguments \
@@ -2060,7 +2059,6 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/chart2/data,\
 	XLabeledDataSequence2 \
 	XNumericalDataSequence \
 	XPivotChartDataProvider \
-	XPopupRequest \
 	XRangeHighlighter \
 	XRangeXMLConversion \
 	XSheetDataProvider \
diff --git a/offapi/com/sun/star/chart2/data/PopupRequest.idl b/offapi/com/sun/star/chart2/data/PopupRequest.idl
deleted file mode 100644
index f83ccc09a56b..000000000000
--- a/offapi/com/sun/star/chart2/data/PopupRequest.idl
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- */
-
-#ifndef com_sun_star_chart2_data_PopupRequest_idl
-#define com_sun_star_chart2_data_PopupRequest_idl
-
-#include <com/sun/star/chart2/data/XPopupRequest.idl>
-
-module com
-{
-module sun
-{
-module star
-{
-module chart2
-{
-module data
-{
-
-/** @since LibreOffice 5.4
- */
-service PopupRequest
-{
-    /**
-     */
-    interface XPopupRequest;
-};
-
-} ; // data
-} ; // chart2
-} ; // com
-} ; // sun
-} ; // star
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/offapi/com/sun/star/chart2/data/XDataReceiver.idl b/offapi/com/sun/star/chart2/data/XDataReceiver.idl
index abfbc830dd51..a7c853b1f9e6 100644
--- a/offapi/com/sun/star/chart2/data/XDataReceiver.idl
+++ b/offapi/com/sun/star/chart2/data/XDataReceiver.idl
@@ -92,7 +92,7 @@ interface XDataReceiver : ::com::sun::star::uno::XInterface
 
         @since LibreOffice 5.4
     */
-    XPopupRequest getPopupRequest();
+    com::sun::star::awt::XRequestCallback getPopupRequest();
 };
 
 } ; // data
diff --git a/offapi/com/sun/star/chart2/data/XPopupRequest.idl b/offapi/com/sun/star/chart2/data/XPopupRequest.idl
deleted file mode 100644
index 07116789b311..000000000000
--- a/offapi/com/sun/star/chart2/data/XPopupRequest.idl
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- */
-
-#ifndef com_sun_star_chart2_data_XPopupRequest_idl
-#define com_sun_star_chart2_data_XPopupRequest_idl
-
-#include <com/sun/star/uno/XInterface.idl>
-
-module com
-{
-module sun
-{
-module star
-{
-module chart2
-{
-module data
-{
-
-/**
-    @since LibreOffice 5.4
- */
-interface XPopupRequest : com::sun::star::awt::XRequestCallback
-{
-};
-
-} ; // data
-} ; // chart2
-} ; // com
-} ; // sun
-} ; // star
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/view/tabvwshb.cxx b/sc/source/ui/view/tabvwshb.cxx
index 2e4d17777c02..45fe79e0ec57 100644
--- a/sc/source/ui/view/tabvwshb.cxx
+++ b/sc/source/ui/view/tabvwshb.cxx
@@ -19,6 +19,7 @@
 
 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
+#include <com/sun/star/awt/XRequestCallback.hpp>
 #include <com/sun/star/awt/Rectangle.hpp>
 
 #include <com/sun/star/embed/EmbedMisc.hpp>
@@ -232,7 +233,7 @@ void ScTabViewShell::ActivateObject( SdrOle2Obj* pObj, long nVerb )
                                 new ScChartRangeSelectionListener( this ));
                             xRangeHightlighter->addSelectionChangeListener( xListener );
                         }
-                        uno::Reference<chart2::data::XPopupRequest> xPopupRequest(xDataReceiver->getPopupRequest());
+                        uno::Reference<awt::XRequestCallback> xPopupRequest(xDataReceiver->getPopupRequest());
                         if (xPopupRequest.is())
                         {
                             uno::Reference<awt::XCallback> xCallback(new PopupCallback(this, pObj));
commit eb196a7d6ea95173a71cbcdee5a3bc5c045079dc
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Fri Mar 10 19:18:14 2017 +0100

    pivotcharts: show filter pop-up from charts on field button click
    
    This adds the functionallity to show a filter pop-up (from calc)
    when clicking on row / column / page field buttons.
    
    Additionally to implement this it was needed to add a new struct
    PivotTableFieldEntry, which transports the data for field buttons
    from the data provider to chart. This was necessary as in addition
    to the field name, it is needed to transport the dimension index.
    
    Other changes are:
    - some additional data provider fixes and clean-ups
    - mouse click on field button (mouse button down / up)
    - ignore other actions when detected a click is on a field button
    - parameters for the PopupRequest callback
    - parse parameters and execute the pop-up a the desired position
    
    Change-Id: Id40ffccbce7aaaddb045eb1894d55bfe0427ee6d

diff --git a/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx b/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx
index 11939212e5cd..0db99983efa3 100644
--- a/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx
+++ b/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx
@@ -182,8 +182,13 @@ SdrObject* DrawViewWrapper::getHitObject( const Point& rPnt ) const
 
     if( pRet )
     {
-        //ignore some special shapes
+        // ignore some special shapes
         OUString aShapeName = pRet->GetName();
+
+        // return right away if it is a field button
+        if (aShapeName.startsWith("FieldButton"))
+            return pRet;
+
         if( aShapeName.match("PlotAreaIncludingAxes") || aShapeName.match("PlotAreaExcludingAxes") )
         {
             pRet->SetMarkProtect( true );
diff --git a/chart2/source/controller/inc/ChartController.hxx b/chart2/source/controller/inc/ChartController.hxx
index 02a3468365b2..2649c28e68c3 100644
--- a/chart2/source/controller/inc/ChartController.hxx
+++ b/chart2/source/controller/inc/ChartController.hxx
@@ -487,6 +487,8 @@ private:
     void executeDispatch_ToggleGridHorizontal();
     void executeDispatch_ToggleGridVertical();
 
+    void sendPopupRequest(OUString const & rCID, Rectangle aRectangle);
+
     void impl_ShapeControllerDispatch( const css::util::URL& rURL,
         const css::uno::Sequence< css::beans::PropertyValue >& rArgs );
 
diff --git a/chart2/source/controller/main/ChartController_Window.cxx b/chart2/source/controller/main/ChartController_Window.cxx
index dd08a7ef99c1..383f1b59b432 100644
--- a/chart2/source/controller/main/ChartController_Window.cxx
+++ b/chart2/source/controller/main/ChartController_Window.cxx
@@ -45,18 +45,23 @@
 #include "LegendHelper.hxx"
 #include "servicenames_charttypes.hxx"
 #include "DrawCommandDispatch.hxx"
+#include "PopupRequest.hxx"
 
 #include <com/sun/star/chart2/RelativePosition.hpp>
 #include <com/sun/star/chart2/RelativeSize.hpp>
 #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
 
 #include <com/sun/star/awt/PopupMenuDirection.hpp>
 #include <com/sun/star/frame/DispatchHelper.hpp>
 #include <com/sun/star/frame/FrameSearchFlag.hpp>
 #include <com/sun/star/frame/XPopupMenuController.hpp>
 #include <com/sun/star/util/XUpdatable.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+
 #include <comphelper/propertysequence.hxx>
 #include <comphelper/propertyvalue.hxx>
+#include <comphelper/sequence.hxx>
 
 #include <toolkit/awt/vclxmenu.hxx>
 
@@ -556,7 +561,16 @@ void ChartController::execute_MouseButtonDown( const MouseEvent& rMEvt )
     if(!pChartWindow || !pDrawViewWrapper )
         return;
 
-    Point   aMPos   = pChartWindow->PixelToLogic(rMEvt.GetPosPixel());
+    Point aMPos = pChartWindow->PixelToLogic(rMEvt.GetPosPixel());
+
+    // Check if button was clicked
+    SdrObject* pObject = pDrawViewWrapper->getHitObject(aMPos);
+    if (pObject)
+    {
+        OUString aCID = pObject->GetName();
+        if (aCID.startsWith("FieldButton"))
+            return; // Don't take any action if button was clicked
+    }
 
     if ( MOUSE_LEFT == rMEvt.GetButtons() )
     {
@@ -722,7 +736,19 @@ void ChartController::execute_MouseButtonUp( const MouseEvent& rMEvt )
         if(!pChartWindow || !pDrawViewWrapper)
             return;
 
-        Point   aMPos   = pChartWindow->PixelToLogic(rMEvt.GetPosPixel());
+        Point aMPos = pChartWindow->PixelToLogic(rMEvt.GetPosPixel());
+
+        // Check if button was clicked
+        SdrObject* pObject = pDrawViewWrapper->getHitObject(aMPos);
+        if (pObject)
+        {
+            OUString aCID = pObject->GetName();
+            if (aCID.startsWith("FieldButton"))
+            {
+                sendPopupRequest(aCID, pObject->GetCurrentBoundRect());
+                return;
+            }
+        }
 
         if(pDrawViewWrapper->IsTextEdit())
         {
@@ -1958,6 +1984,47 @@ css::uno::Reference<css::uno::XInterface> const & ChartController::getChartView(
     return m_xChartView;
 }
 
+void ChartController::sendPopupRequest(OUString const & rCID, Rectangle aRectangle)
+{
+    ChartModel* pChartModel = dynamic_cast<ChartModel*>(m_aModel->getModel().get());
+    if (!pChartModel)
+        return;
+
+    uno::Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider;
+    xPivotChartDataProvider.set(pChartModel->getDataProvider(), uno::UNO_QUERY);
+    if (!xPivotChartDataProvider.is())
+        return;
+
+    OUString sPivotTableName = xPivotChartDataProvider->getPivotTableName();
+
+    PopupRequest* pPopupRequest = dynamic_cast<PopupRequest*>(pChartModel->getPopupRequest().get());
+    if (!pPopupRequest)
+        return;
+
+    // Get dimension index from CID
+    sal_Int32 nStartPos = rCID.lastIndexOf('.');
+    nStartPos++;
+    sal_Int32 nEndPos = rCID.getLength();
+    OUString sDimensionIndex = rCID.copy(nStartPos, nEndPos - nStartPos);
+    sal_Int32 nDimensionIndex = sDimensionIndex.toInt32();
+
+    awt::Rectangle xRectangle {
+        sal_Int32(aRectangle.Left()),
+        sal_Int32(aRectangle.Top()),
+        sal_Int32(aRectangle.GetWidth()),
+        sal_Int32(aRectangle.GetHeight())
+    };
+
+    uno::Sequence<beans::PropertyValue> aCallbackData = comphelper::InitPropertySequence(
+    {
+        {"Rectangle",      uno::makeAny<awt::Rectangle>(xRectangle)},
+        {"DimensionIndex", uno::makeAny<sal_Int32>(nDimensionIndex)},
+        {"PivotTableName", uno::makeAny<OUString>(sPivotTableName)},
+    });
+
+    pPopupRequest->getCallback()->notify(uno::makeAny(aCallbackData));
+}
+
 } //namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/inc/PopupRequest.hxx b/chart2/source/inc/PopupRequest.hxx
index e564003c9e44..61630f5f3861 100644
--- a/chart2/source/inc/PopupRequest.hxx
+++ b/chart2/source/inc/PopupRequest.hxx
@@ -25,12 +25,17 @@ typedef cppu::WeakComponentImplHelper<css::chart2::data::XPopupRequest> PopupReq
 
 }
 
-class PopupRequest : public MutexContainer, public impl::PopupRequest_Base
+class OOO_DLLPUBLIC_CHARTTOOLS PopupRequest : public MutexContainer, public impl::PopupRequest_Base
 {
 public:
     explicit PopupRequest();
     virtual ~PopupRequest() override;
 
+    css::uno::Reference<css::awt::XCallback> getCallback()
+    {
+        return m_xCallback;
+    }
+
 protected:
     // ____ XRequestCallback ____
     virtual void SAL_CALL addCallback(const css::uno::Reference< ::css::awt::XCallback >& xCallback,
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 2b84075b0204..285bc3facd26 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -90,6 +90,8 @@
 #include <com/sun/star/chart2/XTitled.hpp>
 #include <com/sun/star/chart2/RelativePosition.hpp>
 #include <com/sun/star/chart2/RelativeSize.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
+#include <com/sun/star/chart2/data/PivotTableFieldEntry.hpp>
 #include <com/sun/star/drawing/FillStyle.hpp>
 #include <com/sun/star/drawing/GraphicExportFilter.hpp>
 #include <com/sun/star/drawing/LineStyle.hpp>
@@ -114,7 +116,6 @@
 #include <comphelper/classids.hxx>
 #include "servicenames_charttypes.hxx"
 
-#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
 
 #include <rtl/strbuf.hxx>
 #include <rtl/ustring.hxx>
@@ -2494,70 +2495,59 @@ void lcl_createButtons(const uno::Reference< drawing::XShapes>& xPageShapes,
 {
     uno::Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider(rModel.getDataProvider(), uno::UNO_QUERY);
 
-    uno::Sequence<OUString> aRowFields = xPivotChartDataProvider->getRowFields();
-    uno::Sequence<OUString> aPageFields = xPivotChartDataProvider->getPageFields();
-    uno::Sequence<OUString> aDataFields = xPivotChartDataProvider->getDataFields();
-
     uno::Reference<beans::XPropertySet> xModelPage(rModel.getPageBackground());
     awt::Size aSize(3000, 700); // size of the button
 
     long x = 0;
-    int nCIDIndex = 0;
 
-    if (aPageFields.hasElements())
+    if (xPivotChartDataProvider->getPageFields().hasElements())
     {
         x = 0;
-        nCIDIndex = 0;
 
-        for (OUString const & rPageField : aPageFields)
+        for (css::chart2::data::PivotTableFieldEntry const & rPageFieldEntry : xPivotChartDataProvider->getPageFields())
         {
             std::unique_ptr<VButton> pButton(new VButton);
             pButton->init(xPageShapes, xShapeFactory);
             awt::Point aNewPosition = awt::Point(rRemainingSpace.X + x + 100, rRemainingSpace.Y + 100);
-            pButton->setLabel(rPageField);
-            pButton->setCID("FieldButton.Page." + OUString::number(nCIDIndex));
+            pButton->setLabel(rPageFieldEntry.Name);
+            pButton->setCID("FieldButton.Page." + OUString::number(rPageFieldEntry.DimensionIndex));
             pButton->createShapes(aNewPosition, aSize, xModelPage);
             x += aSize.Width + 100;
-            nCIDIndex += 1;
         }
         rRemainingSpace.Y += (aSize.Height + 100 + 100);
         rRemainingSpace.Height -= (aSize.Height + 100 + 100);
     }
 
-    if (aDataFields.hasElements())
+    if (xPivotChartDataProvider->getDataFields().hasElements())
     {
         x = 200;
-        nCIDIndex = 0;
-        for (OUString const & rDataField : aDataFields)
+        for (css::chart2::data::PivotTableFieldEntry const & rDataFieldEntry : xPivotChartDataProvider->getDataFields())
         {
             std::unique_ptr<VButton> pButton(new VButton);
             pButton->init(xPageShapes, xShapeFactory);
             awt::Point aNewPosition = awt::Point(rRemainingSpace.X + x + 100, rRemainingSpace.Y + 100);
-            pButton->setLabel(rDataField);
-            pButton->setCID("FieldButton.Data." + OUString::number(nCIDIndex));
+            pButton->setLabel(rDataFieldEntry.Name);
+            pButton->setCID("FieldButton.Data." + OUString::number(rDataFieldEntry.DimensionIndex));
             pButton->createShapes(aNewPosition, aSize, xModelPage);
             x += aSize.Width + 100;
-            nCIDIndex += 1;
         }
         rRemainingSpace.Y += (aSize.Height + 100 + 100);
         rRemainingSpace.Height -= (aSize.Height + 100 + 100);
     }
 
-    if (aRowFields.hasElements())
+    if (xPivotChartDataProvider->getRowFields().hasElements())
     {
         x = 200;
-        nCIDIndex = 0;
-        for (OUString const & rRowField : aRowFields)
+        for (css::chart2::data::PivotTableFieldEntry const & rRowFieldEntry : xPivotChartDataProvider->getRowFields())
         {
             std::unique_ptr<VButton> pButton(new VButton);
             pButton->init(xPageShapes, xShapeFactory);
             awt::Point aNewPosition = awt::Point(rRemainingSpace.X + x + 100,
                                                  rRemainingSpace.Y + rRemainingSpace.Height - aSize.Height - 100);
-            pButton->setLabel(rRowField);
-            pButton->setCID("FieldButton.Column." + OUString::number(nCIDIndex));
+            pButton->setLabel(rRowFieldEntry.Name);
+            pButton->setCID("FieldButton.Row." + OUString::number(rRowFieldEntry.DimensionIndex));
             pButton->createShapes(aNewPosition, aSize, xModelPage);
             x += aSize.Width + 100;
-            nCIDIndex += 1;
         }
         rRemainingSpace.Height -= (aSize.Height + 100 + 100);
     }
diff --git a/chart2/source/view/main/VLegend.cxx b/chart2/source/view/main/VLegend.cxx
index 3688411f7748..ceffae7daad3 100644
--- a/chart2/source/view/main/VLegend.cxx
+++ b/chart2/source/view/main/VLegend.cxx
@@ -37,10 +37,11 @@
 #include <com/sun/star/chart/ChartLegendExpansion.hpp>
 #include <com/sun/star/chart2/LegendPosition.hpp>
 #include <com/sun/star/chart2/RelativePosition.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
+#include <com/sun/star/chart2/data/PivotTableFieldEntry.hpp>
 #include <rtl/ustrbuf.hxx>
 #include <svl/languageoptions.hxx>
 
-#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
 
 #include <vector>
 #include <algorithm>
@@ -769,28 +770,25 @@ std::vector<std::shared_ptr<VButton>> lcl_createButtons(
                        ChartModel& rModel, long& nUsedHeight)
 {
     uno::Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider(rModel.getDataProvider(), uno::UNO_QUERY);
-    uno::Sequence<OUString> aColumnFields = xPivotChartDataProvider->getColumnFields();
 
     std::vector<std::shared_ptr<VButton>> aButtons;
 
-    if (!aColumnFields.hasElements())
+    if (!xPivotChartDataProvider->getColumnFields().hasElements())
         return aButtons;
 
     uno::Reference<beans::XPropertySet> xModelPage(rModel.getPageBackground());
 
-    int nCIDIndex = 0;
     awt::Size aSize(2000, 700);
     int y = 100;
-    for (OUString const & sColumnField : aColumnFields)
+    for (chart2::data::PivotTableFieldEntry const & sColumnFieldEntry : xPivotChartDataProvider->getColumnFields())
     {
         std::shared_ptr<VButton> pButton(new VButton);
         aButtons.push_back(pButton);
         pButton->init(xLegendContainer, xShapeFactory);
         awt::Point aNewPosition = awt::Point(100, y);
-        pButton->setLabel(sColumnField);
-        pButton->setCID("FieldButton.Row." + OUString::number(nCIDIndex));
+        pButton->setLabel(sColumnFieldEntry.Name);
+        pButton->setCID("FieldButton.Column." + OUString::number(sColumnFieldEntry.DimensionIndex));
         pButton->createShapes(aNewPosition, aSize, xModelPage);
-        nCIDIndex += 1;
         y += aSize.Height + 100;;
     }
     nUsedHeight += y + 100;
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index a7ae86dbb654..e589c957a6be 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -88,6 +88,7 @@ $(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/chart2,\
 $(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/chart2/data,\
 	DatabaseDataProvider \
     LabeledDataSequence \
+    PivotTableFieldEntry \
 ))
 $(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/configuration,\
     ReadOnlyAccess \
diff --git a/offapi/com/sun/star/chart2/data/PivotTableFieldEntry.idl b/offapi/com/sun/star/chart2/data/PivotTableFieldEntry.idl
new file mode 100644
index 000000000000..168e8090f53b
--- /dev/null
+++ b/offapi/com/sun/star/chart2/data/PivotTableFieldEntry.idl
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+#ifndef com_sun_star_chart2_data_PivotTableFieldEntry_idl
+#define com_sun_star_chart2_data_PivotTableFieldEntry_idl
+
+module com
+{
+module sun
+{
+module star
+{
+module chart2
+{
+module data
+{
+
+/**
+ *
+ * @since LibreOffice 5.3
+ */
+struct PivotTableFieldEntry
+{
+    string Name;
+
+    long DimensionIndex;
+};
+
+}; // data
+}; // chart2
+}; // com
+}; // sun
+}; // star
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl b/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl
index 95b58d4f1783..284d7acbc253 100644
--- a/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl
+++ b/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl
@@ -11,7 +11,7 @@
 #define com_sun_star_chart2_data_XPivotChartDataProvider_idl
 
 #include <com/sun/star/uno/XInterface.idl>
-#include <com/sun/star/chart2/data/XDataSequence.idl>
+#include <com/sun/star/chart2/data/PivotTableFieldEntry.idl>
 
 module com { module sun { module star { module chart2 { module data {
 
@@ -26,25 +26,31 @@ interface XPivotChartDataProvider : com::sun::star::uno::XInterface
      *
      * @since LibreOffice 5.4
      */
-    sequence<string> getColumnFields();
+    sequence<com::sun::star::chart2::data::PivotTableFieldEntry> getColumnFields();
 
     /** names of row fields from the associated pivot table
      *
      * @since LibreOffice 5.4
      */
-    sequence<string> getRowFields();
+    sequence<com::sun::star::chart2::data::PivotTableFieldEntry> getRowFields();
 
     /** names of page fields from the associated pivot table
      *
      * @since LibreOffice 5.4
      */
-    sequence<string> getPageFields();
+    sequence<com::sun::star::chart2::data::PivotTableFieldEntry> getPageFields();
 
     /** names of data fields from the associated pivot table
      *
      * @since LibreOffice 5.4
      */
-    sequence<string> getDataFields();
+    sequence<com::sun::star::chart2::data::PivotTableFieldEntry> getDataFields();
+
+    /** associated pivot table name
+     *
+     * @since LibreOffice 5.4
+     */
+    string getPivotTableName();
 };
 
 };};};};};
diff --git a/sc/inc/PivotChartDataProvider.hxx b/sc/inc/PivotChartDataProvider.hxx
index 097fb189a58c..80e37945f8b7 100644
--- a/sc/inc/PivotChartDataProvider.hxx
+++ b/sc/inc/PivotChartDataProvider.hxx
@@ -20,6 +20,7 @@
 #include <com/sun/star/chart2/data/XDataSource.hpp>
 #include <com/sun/star/chart2/data/XDataSequence.hpp>
 #include <com/sun/star/chart2/data/XLabeledDataSequence.hpp>
+#include <com/sun/star/chart2/data/PivotTableFieldEntry.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/util/XCloneable.hpp>
@@ -79,10 +80,17 @@ public:
     virtual css::uno::Reference< css::sheet::XRangeSelection > SAL_CALL getRangeSelection() override;
 
     // XPivotChartDataProvider
-    virtual css::uno::Sequence<OUString> SAL_CALL getColumnFields() override;
-    virtual css::uno::Sequence<OUString> SAL_CALL getRowFields() override;
-    virtual css::uno::Sequence<OUString> SAL_CALL getPageFields() override;
-    virtual css::uno::Sequence<OUString> SAL_CALL getDataFields() override;
+    virtual css::uno::Sequence<css::chart2::data::PivotTableFieldEntry> SAL_CALL
+        getColumnFields() override;
+    virtual css::uno::Sequence<css::chart2::data::PivotTableFieldEntry> SAL_CALL
+        getRowFields() override;
+    virtual css::uno::Sequence<css::chart2::data::PivotTableFieldEntry> SAL_CALL
+        getPageFields() override;
+    virtual css::uno::Sequence<css::chart2::data::PivotTableFieldEntry> SAL_CALL
+        getDataFields() override;
+
+    virtual OUString SAL_CALL getPivotTableName() override;
+
 
     // XPropertySet
     virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override;
@@ -160,10 +168,10 @@ private:
     std::vector<std::vector<PivotChartItem>> m_aLabels;
     std::vector<std::vector<PivotChartItem>> m_aDataRowVector;
 
-    std::vector<OUString> m_aColumnFields;
-    std::vector<OUString> m_aRowFields;
-    std::vector<OUString> m_aPageFields;
-    std::vector<OUString> m_aDataFields;
+    std::vector<css::chart2::data::PivotTableFieldEntry> m_aColumnFields;
+    std::vector<css::chart2::data::PivotTableFieldEntry> m_aRowFields;
+    std::vector<css::chart2::data::PivotTableFieldEntry> m_aPageFields;
+    std::vector<css::chart2::data::PivotTableFieldEntry> m_aDataFields;
 
     std::vector<css::uno::Reference<css::util::XModifyListener>> m_aValueListeners;
 };
diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx
index d33303426341..885e48db5e41 100644
--- a/sc/source/ui/inc/tabview.hxx
+++ b/sc/source/ui/inc/tabview.hxx
@@ -487,7 +487,7 @@ public:
     void            ClearHighlightRanges();
 
     void            DoChartSelection( const css::uno::Sequence< css::chart2::data::HighlightedRange > & rHilightRanges );
-    void            DoDPFieldPopup(Point aPoint, Size aSize);
+    void            DoDPFieldPopup(OUString const & rPivotTableName, sal_Int32 nDimensionIndex, Point aPoint, Size aSize);
 
     long            GetGridWidth( ScHSplitPos eWhich );
     long            GetGridHeight( ScVSplitPos eWhich );
diff --git a/sc/source/ui/unoobj/PivotChartDataProvider.cxx b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
index 8b8e6ad166cc..c6fce89c4f4a 100644
--- a/sc/source/ui/unoobj/PivotChartDataProvider.cxx
+++ b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
@@ -107,9 +107,11 @@ void PivotChartDataProvider::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHin
             OUString sPivotTableName = static_cast<const ScDataPilotModifiedHint&>(rHint).GetName();
             if (sPivotTableName == m_sPivotTableName)
             {
-                for (uno::Reference<util::XModifyListener> & xListener : m_aValueListeners)
+                for (uno::Reference<util::XModifyListener> const & xListener : m_aValueListeners)
                 {
-                    css::chart::ChartDataChangeEvent aEvent(static_cast<cppu::OWeakObject*>(this), css::chart::ChartDataChangeType_ALL, 0, 0, 0, 0);
+                    css::chart::ChartDataChangeEvent aEvent(static_cast<cppu::OWeakObject*>(this),
+                                                            css::chart::ChartDataChangeType_ALL,
+                                                            0, 0, 0, 0);
                     xListener->modified(aEvent);
                 }
             }
@@ -283,11 +285,11 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
     std::vector<OUString> aDataFieldNamesVectors;
 
     std::unordered_map<OUString, OUString, OUStringHash> aDataFieldCaptionNames;
-    std::vector<OUString> aDataFieldNames;
+    std::vector<std::pair<OUString, sal_Int32>> aDataFieldPairs;
 
     sheet::DataPilotFieldOrientation eDataFieldOrientation = sheet::DataPilotFieldOrientation_HIDDEN;
 
-    for (long nDim = 0; nDim < xDims->getCount(); nDim++)
+    for (sal_Int32 nDim = 0; nDim < xDims->getCount(); nDim++)
     {
         uno::Reference<uno::XInterface> xDim = ScUnoHelpFunctions::AnyToInterface(xDims->getByIndex(nDim));
         uno::Reference<beans::XPropertySet> xDimProp(xDim, uno::UNO_QUERY);
@@ -304,44 +306,44 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
         if (eDimOrient == sheet::DataPilotFieldOrientation_HIDDEN)
             continue;
 
-        uno::Reference<container::XIndexAccess> xHiers = new ScNameToIndexAccess(xDimSupp->getHierarchies());
-        long nHierarchy = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_USEDHIERARCHY);
-        if (nHierarchy >= xHiers->getCount())
+        uno::Reference<container::XIndexAccess> xHierarchies = new ScNameToIndexAccess(xDimSupp->getHierarchies());
+        sal_Int32 nHierarchy = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_USEDHIERARCHY);
+        if (nHierarchy >= xHierarchies->getCount())
             nHierarchy = 0;
 
-        uno::Reference<uno::XInterface> xHier = ScUnoHelpFunctions::AnyToInterface(xHiers->getByIndex(nHierarchy));
+        uno::Reference<uno::XInterface> xHierarchy = ScUnoHelpFunctions::AnyToInterface(xHierarchies->getByIndex(nHierarchy));
 
-        uno::Reference<sheet::XLevelsSupplier> xHierSupp(xHier, uno::UNO_QUERY);
+        uno::Reference<sheet::XLevelsSupplier> xLevelsSupplier(xHierarchy, uno::UNO_QUERY);
 
-        if (!xHierSupp.is())
+        if (!xLevelsSupplier.is())
             continue;
 
-        uno::Reference<container::XIndexAccess> xLevels = new ScNameToIndexAccess(xHierSupp->getLevels());
+        uno::Reference<container::XIndexAccess> xLevels = new ScNameToIndexAccess(xLevelsSupplier->getLevels());
 
         for (long nLev = 0; nLev < xLevels->getCount(); nLev++)
         {
             uno::Reference<uno::XInterface> xLevel = ScUnoHelpFunctions::AnyToInterface(xLevels->getByIndex(nLev));
-            uno::Reference<container::XNamed> xLevName(xLevel, uno::UNO_QUERY);
-            uno::Reference<sheet::XDataPilotMemberResults> xLevRes(xLevel, uno::UNO_QUERY );
+            uno::Reference<container::XNamed> xLevelName(xLevel, uno::UNO_QUERY);
+            uno::Reference<sheet::XDataPilotMemberResults> xLevelResult(xLevel, uno::UNO_QUERY );
 
             bool bIsDataLayout = ScUnoHelpFunctions::GetBoolProperty(xDimProp, SC_UNO_DP_ISDATALAYOUT);
             long nDimPos = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_POSITION);
             sal_Int32 nNumberFormat = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_NUMBERFO);
 
-            if (xLevName.is() && xLevRes.is())
+            if (xLevelName.is() && xLevelResult.is())
             {
                 switch (eDimOrient)
                 {
                     case sheet::DataPilotFieldOrientation_COLUMN:
                     {
-                        m_aColumnFields.push_back(xLevName->getName());
+                        m_aColumnFields.push_back(chart2::data::PivotTableFieldEntry{xLevelName->getName(), nDim});
 
-                        uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
+                        uno::Sequence<sheet::MemberResult> aSequence = xLevelResult->getResults();
                         size_t i = 0;
                         OUString sCaption;
                         OUString sName;
-                        m_aLabels.resize(aSeq.getLength());
-                        for (sheet::MemberResult & rMember : aSeq)
+                        m_aLabels.resize(aSequence.getLength());
+                        for (sheet::MemberResult & rMember : aSequence)
                         {
                             if (rMember.Flags & sheet::MemberResultFlags::HASMEMBER ||
                                 rMember.Flags & sheet::MemberResultFlags::CONTINUE)
@@ -372,35 +374,29 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
 
                     case sheet::DataPilotFieldOrientation_ROW:
                     {
-                        m_aRowFields.push_back(xLevName->getName());
+                        m_aRowFields.push_back(chart2::data::PivotTableFieldEntry{xLevelName->getName(), nDim});
 
-                        uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
-                        m_aCategoriesRowOrientation.resize(aSeq.getLength());
+                        uno::Sequence<sheet::MemberResult> aSequence = xLevelResult->getResults();
+                        m_aCategoriesRowOrientation.resize(aSequence.getLength());
                         size_t i = 0;

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list