Rebased ref, commits from common ancestor:
commit 85f9f06f5904b57a23a56416e4477bb5f6703369
Author: Tomaž Vajngerl <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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
_______________________________________________
Libreoffice-commits mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits