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