[Libreoffice-commits] core.git: Branch 'feature/pivotcharts' - 442 commits - accessibility/inc accessibility/source android/source animations/source avmedia/source basctl/source basegfx/source basic/qa basic/source bin/gbuild-to-ide bin/update_pch bridges/inc bridges/source canvas/source chart2/inc chart2/source cli_ure/source comphelper/source compilerplugins/clang config_host/config_global.h.in config_host.mk.in configmgr/source configure.ac connectivity/source cppcanvas/source cppuhelper/source cppu/source cpputools/source cui/source cui/uiconfig dbaccess/Module_dbaccess.mk dbaccess/source desktop/GeneratedPackage_desktop_unopackages_install.mk desktop/inc desktop/Module_desktop.mk desktop/Package_desktop_install.mk desktop/qa desktop/scripts desktop/source desktop/test distro-configs/LibreOfficeOssFuzz.conf download.lst dtrans/source editeng/source embeddedobj/source extensions/source external/clucene external/firebird external/gpgme external/lcms2 external/libassuan external/libgpg-error ext ernal/Module_external.mk external/mysqlcppconn external/neon external/python33 external/redland extras/source filter/inc filter/qa filter/source forms/source fpicker/source framework/inc framework/qa framework/source helpcontent2 hwpfilter/source i18nlangtag/source i18npool/inc i18npool/qa i18npool/source i18nutil/source icon-themes/breeze icon-themes/breeze_dark icon-themes/breeze_svg icon-themes/galaxy idlc/inc idl/inc include/basegfx include/basic include/canvas include/codemaker include/com include/comphelper include/connectivity include/cppu include/cppuhelper include/dbaccess include/drawinglayer include/editeng include/filter include/formula include/i18nlangtag include/i18nutil include/jvmaccess include/jvmfwk include/LibreOfficeKit include/o3tl include/oox include/osl include/rtl include/sal include/salhelper include/sax include/sfx2 include/store include/svl include/svtools include/svx include/systools include/toolkit include/tools include/typelib include/uno include/unotoo ls include/vbahelper include/vcl include/xmloff include/xmlreader include/xmlscript include/xmlsecurity ios/experimental io/source jvmfwk/plugins jvmfwk/source l10ntools/source librelogo/source libreofficekit/qa libreofficekit/README lingucomponent/source linguistic/source lotuswordpro/qa lotuswordpro/source Makefile.fetch Makefile.in mysqlc/source odk/CustomTarget_build-examples.mk odk/examples offapi/com offapi/org offapi/type_reference offapi/UnoApi_offapi.mk officecfg/registry onlineupdate/source oox/inc oox/Library_oox.mk oox/source package/inc postprocess/Rdb_services.mk pyuno/source qadevOOo/runner qadevOOo/tests readlicense_oo/license registry/source reportbuilder/java reportdesign/inc reportdesign/source RepositoryExternal.mk Repository.mk rsc/inc sal/inc sal/Library_sal.mk sal/osl sal/qa sal/rtl sal/textenc sax/source scaddins/idl scaddins/source sccomp/qa schema/odf1.0 sc/inc sc/Library_sc.mk sc/Module_sc.mk scp2/Module_scp2.mk sc/qa scripting/source sc/source sc/UITest_c onditional_format.mk sdext/source sd/inc sd/qa sd/source sd/uiconfig sfx2/Library_sfx.mk sfx2/source shell/source slideshow/source smoketest/com solenv/bin solenv/CompilerTest_compilerplugins_clang.mk solenv/gbuild solenv/qa soltools/mkdepend sot/source starmath/inc starmath/qa starmath/source stoc/source store/source svgio/source svl/qa svl/source svtools/source svtools/uiconfig svx/inc svx/source sw/CppunitTest_sw_odfimport.mk sw/CppunitTest_sw_ww8import.mk sw/inc sw/qa sw/README sw/sdi sw/source sw/uiconfig sw/UIConfig_swriter.mk toolkit/qa toolkit/source tools/source translations ucbhelper/source ucb/source udkapi/com uitest/calc_tests uitest/impress_tests uitest/libreoffice uitest/uitest uitest/writer_tests unotest/source unotools/source vbahelper/source vcl/commonfuzzer.mk vcl/CustomTarget_nativecode.mk vcl/Executable_lwpfuzzer.mk vcl/headless vcl/inc vcl/Module_vcl.mk vcl/opengl vcl/osx vcl/qa vcl/quartz vcl/README.GDIMetaFile vcl/source vcl/unx vcl/win vcl/workben winaccessi bility/source windows/README windows/soffice.sln windows/soffice.vcxproj wizards/com wizards/source writerfilter/source xmlhelp/source xmloff/inc xmloff/source xmlscript/source xmlsecurity/Executable_pdfverify.mk xmlsecurity/inc xmlsecurity/Library_xmlsecurity.mk xmlsecurity/Library_xsec_gpg.mk xmlsecurity/Module_xmlsecurity.mk xmlsecurity/qa xmlsecurity/README xmlsecurity/source xmlsecurity/util
Tomaž Vajngerl
tomaz.vajngerl at collabora.co.uk
Tue Mar 7 16:03:13 UTC 2017
Rebased ref, commits from common ancestor:
commit ed16cd7ba4baacd1fa8f297286d802037bcabf8b
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Tue Mar 7 16:53:27 2017 +0100
charts: add field buttons if we have the pivot table data
In ChartView (and VLegend) check if the data provider is a pivot
chart data provider and get the pivot table field names to create
the buttons on the UI.
Change-Id: I08faaa17c953f0f40180e1ac1b0cb1dc6471607e
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 12fc658..54b1297 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -113,6 +113,8 @@
#include <comphelper/classids.hxx>
#include "servicenames_charttypes.hxx"
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
+
#include <rtl/strbuf.hxx>
#include <rtl/ustring.hxx>
@@ -2489,35 +2491,29 @@ void lcl_createButtons(const uno::Reference< drawing::XShapes>& xPageShapes,
ChartModel& rModel,
awt::Rectangle& rRemainingSpace)
{
- uno::Reference<beans::XPropertySet> xModelPage(rModel.getPageBackground());
+ uno::Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider(rModel.getDataProvider(), uno::UNO_QUERY);
-// TODO: Get this from the PivotTable
- std::vector<OUString> aPageFields {
-// "Subdivision", "Subdivision2"
- };
- std::vector<OUString> aDataFields {
-// "Sum - Revenue", "Sum - Expenses"
- };
- std::vector<OUString> aColumnFields {
-// "Group Segment", "Group Segment 2"
- };
+ 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.empty())
+ if (aPageFields.hasElements())
{
x = 0;
nCIDIndex = 0;
- for (OUString const & aPageField : aPageFields)
+ for (OUString const & rPageField : aPageFields)
{
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(aPageField);
+ pButton->setLabel(rPageField);
pButton->setCID("PageFieldButton." + OUString::number(nCIDIndex));
pButton->createShapes(aNewPosition, aSize, xModelPage);
x += aSize.Width + 100;
@@ -2527,16 +2523,16 @@ void lcl_createButtons(const uno::Reference< drawing::XShapes>& xPageShapes,
rRemainingSpace.Height -= (aSize.Height + 100 + 100);
}
- if (!aDataFields.empty())
+ if (aDataFields.hasElements())
{
x = 200;
nCIDIndex = 0;
- for (OUString const & aDataField : aDataFields)
+ for (OUString const & rDataField : aDataFields)
{
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(aDataField);
+ pButton->setLabel(rDataField);
pButton->setCID("DataFieldButton." + OUString::number(nCIDIndex));
pButton->createShapes(aNewPosition, aSize, xModelPage);
x += aSize.Width + 100;
@@ -2546,17 +2542,17 @@ void lcl_createButtons(const uno::Reference< drawing::XShapes>& xPageShapes,
rRemainingSpace.Height -= (aSize.Height + 100 + 100);
}
- if (!aColumnFields.empty())
+ if (aRowFields.hasElements())
{
x = 200;
nCIDIndex = 0;
- for (OUString const & aColumnField : aColumnFields)
+ for (OUString const & rRowField : aRowFields)
{
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(aColumnField);
+ pButton->setLabel(rRowField);
pButton->setCID("ColumnFieldButton." + OUString::number(nCIDIndex));
pButton->createShapes(aNewPosition, aSize, xModelPage);
x += aSize.Width + 100;
diff --git a/chart2/source/view/main/VLegend.cxx b/chart2/source/view/main/VLegend.cxx
index 5cddb57..b79c95a 100644
--- a/chart2/source/view/main/VLegend.cxx
+++ b/chart2/source/view/main/VLegend.cxx
@@ -40,6 +40,8 @@
#include <rtl/ustrbuf.hxx>
#include <svl/languageoptions.hxx>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
+
#include <vector>
#include <algorithm>
@@ -766,14 +768,12 @@ std::vector<std::shared_ptr<VButton>> lcl_createButtons(
const uno::Reference< lang::XMultiServiceFactory>& xShapeFactory,
ChartModel& rModel, long& nUsedHeight)
{
-// TODO: get this info from the Pivot Table
- std::vector<OUString> aRowFields {
-// "Service Months"
- };
+ 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 (aRowFields.empty())
+ if (!aColumnFields.hasElements())
return aButtons;
uno::Reference<beans::XPropertySet> xModelPage(rModel.getPageBackground());
@@ -781,13 +781,13 @@ std::vector<std::shared_ptr<VButton>> lcl_createButtons(
int nCIDIndex = 0;
awt::Size aSize(2000, 700);
- for (OUString const & sRowField : aRowFields)
+ for (OUString const & sColumnField : aColumnFields)
{
std::shared_ptr<VButton> pButton(new VButton);
aButtons.push_back(pButton);
pButton->init(xLegendContainer, xShapeFactory);
awt::Point aNewPosition = awt::Point(100, 100);
- pButton->setLabel(sRowField);
+ pButton->setLabel(sColumnField);
pButton->setCID("RowFieldButton." + OUString::number(nCIDIndex));
pButton->createShapes(aNewPosition, aSize, xModelPage);
nCIDIndex += 1;
commit e53a8dfc24728990c59a354a864f0d932a6b882b
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Tue Mar 7 16:50:48 2017 +0100
charts: use isDataFromSpreadsheet check in creation wizard
Change-Id: I6f4ee2639a3102f4390c6d97491244ede67abc59
diff --git a/chart2/source/controller/dialogs/dlg_CreationWizard.cxx b/chart2/source/controller/dialogs/dlg_CreationWizard.cxx
index 07a03b0..b4beb73 100644
--- a/chart2/source/controller/dialogs/dlg_CreationWizard.cxx
+++ b/chart2/source/controller/dialogs/dlg_CreationWizard.cxx
@@ -77,10 +77,7 @@ CreationWizard::CreationWizard(vcl::Window* pParent, const uno::Reference<frame:
aSize.Width() += aAdditionalRoadmapSize.Width();
this->SetSizePixel(aSize);
- uno::Reference<chart2::XChartDocument> xChartDoc(m_xChartModel, uno::UNO_QUERY);
- bool bHasOwnData = (xChartDoc.is() && xChartDoc->hasInternalDataProvider());
-
- if(bHasOwnData)
+ if (!m_pDialogModel->getModel().isDataFromSpreadsheet())
{
enableState(STATE_SIMPLE_RANGE, false);
enableState(STATE_DATA_SERIES, false);
commit 8043a6478386171d573a00519ac4763b5ed8aa8a
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Tue Mar 7 16:48:24 2017 +0100
clean-up code in chart creation wizard
Change-Id: I990dba44d4ce3d3f0538b6038133c289980fa315
diff --git a/chart2/source/controller/dialogs/dlg_CreationWizard.cxx b/chart2/source/controller/dialogs/dlg_CreationWizard.cxx
index 501272f..07a03b0 100644
--- a/chart2/source/controller/dialogs/dlg_CreationWizard.cxx
+++ b/chart2/source/controller/dialogs/dlg_CreationWizard.cxx
@@ -33,10 +33,10 @@
#define CHART_WIZARD_PAGEWIDTH 250
#define CHART_WIZARD_PAGEHEIGHT 170
+using namespace css;
+
namespace chart
{
-using namespace ::com::sun::star;
-
#define PATH_FULL 1
#define STATE_FIRST 0
#define STATE_CHARTTYPE STATE_FIRST
@@ -45,41 +45,45 @@ using namespace ::com::sun::star;
#define STATE_OBJECTS 3
#define STATE_LAST STATE_OBJECTS
-CreationWizard::CreationWizard( vcl::Window* pParent, const uno::Reference< frame::XModel >& xChartModel
- , const uno::Reference< uno::XComponentContext >& xContext )
- : svt::RoadmapWizard( pParent )
+CreationWizard::CreationWizard(vcl::Window* pParent, const uno::Reference<frame::XModel>& xChartModel,
+ const uno::Reference<uno::XComponentContext>& xContext)
+ : svt::RoadmapWizard(pParent)
, m_xChartModel(xChartModel,uno::UNO_QUERY)
- , m_xCC( xContext )
+ , m_xComponentContext(xContext)
, m_pTemplateProvider(nullptr)
, m_nLastState(STATE_LAST)
- , m_aTimerTriggeredControllerLock( xChartModel )
- , m_bCanTravel( true )
+ , m_aTimerTriggeredControllerLock(xChartModel)
+ , m_bCanTravel(true)
{
- m_pDialogModel.reset( new DialogModel( m_xChartModel, m_xCC ));
- defaultButton( WizardButtonFlags::FINISH );
+ m_pDialogModel.reset(new DialogModel(m_xChartModel, m_xComponentContext));
+ defaultButton(WizardButtonFlags::FINISH);
this->setTitleBase(SCH_RESSTR(STR_DLG_CHART_WIZARD));
- declarePath( PATH_FULL
- , {STATE_CHARTTYPE
- , STATE_SIMPLE_RANGE
- , STATE_DATA_SERIES
- , STATE_OBJECTS}
- );
- this->SetRoadmapHelpId( HID_SCH_WIZARD_ROADMAP );
- this->SetRoadmapInteractive( true );
- Size aAdditionalRoadmapSize( LogicToPixel( Size( 85, 0 ), MapUnit::MapAppFont ) );
+ WizardPath aPath = {
+ STATE_CHARTTYPE,
+ STATE_SIMPLE_RANGE,
+ STATE_DATA_SERIES,
+ STATE_OBJECTS
+ };
+
+ declarePath(PATH_FULL, aPath);
+
+ this->SetRoadmapHelpId(HID_SCH_WIZARD_ROADMAP);
+ this->SetRoadmapInteractive(true);
+
+ Size aAdditionalRoadmapSize(LogicToPixel(Size(85, 0), MapUnit::MapAppFont));
Size aSize(LogicToPixel(Size(CHART_WIZARD_PAGEWIDTH, CHART_WIZARD_PAGEHEIGHT), MapUnit::MapAppFont));
aSize.Width() += aAdditionalRoadmapSize.Width();
- this->SetSizePixel( aSize );
+ this->SetSizePixel(aSize);
- uno::Reference< chart2::XChartDocument > xChartDoc( m_xChartModel, uno::UNO_QUERY );
+ uno::Reference<chart2::XChartDocument> xChartDoc(m_xChartModel, uno::UNO_QUERY);
bool bHasOwnData = (xChartDoc.is() && xChartDoc->hasInternalDataProvider());
- if( bHasOwnData )
+ if(bHasOwnData)
{
- this->enableState( STATE_SIMPLE_RANGE, false );
- this->enableState( STATE_DATA_SERIES, false );
+ enableState(STATE_SIMPLE_RANGE, false);
+ enableState(STATE_DATA_SERIES, false);
}
// Call ActivatePage, to create and activate the first page
@@ -117,15 +121,17 @@ VclPtr<TabPage> CreationWizard::createPage(WizardState nState)
break;
case STATE_OBJECTS:
{
- pRet = VclPtr<TitlesAndObjectsTabPage>::Create(this,m_xChartModel,m_xCC);
+ pRet = VclPtr<TitlesAndObjectsTabPage>::Create(this,m_xChartModel, m_xComponentContext);
m_aTimerTriggeredControllerLock.startTimer();
}
break;
default:
break;
}
- if(pRet)
- pRet->SetText(OUString());//remove title of pages to not get them in the wizard title
+
+ if (pRet)
+ pRet->SetText(OUString()); //remove title of pages to not get them in the wizard title
+
return pRet;
}
diff --git a/chart2/source/controller/inc/dlg_CreationWizard.hxx b/chart2/source/controller/inc/dlg_CreationWizard.hxx
index fed0190..a1fed3c 100644
--- a/chart2/source/controller/inc/dlg_CreationWizard.hxx
+++ b/chart2/source/controller/inc/dlg_CreationWizard.hxx
@@ -24,57 +24,56 @@
#include "TabPageNotifiable.hxx"
#include <com/sun/star/chart2/XChartDocument.hpp>
-#include <svtools/roadmapwizard.hxx>
#include <com/sun/star/uno/XComponentContext.hpp>
+#include <svtools/roadmapwizard.hxx>
+
#include <memory>
namespace chart
{
-class RangeChooserTabPage;
-class DataSourceTabPage;
class DialogModel;
class ChartTypeTemplateProvider;
class CreationWizard : public svt::RoadmapWizard, public TabPageNotifiable
{
public:
- CreationWizard( vcl::Window* pParent,
- const css::uno::Reference< css::frame::XModel >& xChartModel
- , const css::uno::Reference< css::uno::XComponentContext >& xContext );
+ CreationWizard(vcl::Window* pParent,
+ const css::uno::Reference<css::frame::XModel>& xChartModel,
+ const css::uno::Reference<css::uno::XComponentContext>& xContext);
CreationWizard() = delete;
virtual ~CreationWizard() override;
// TabPageNotifiable
- virtual void setInvalidPage( TabPage * pTabPage ) override;
- virtual void setValidPage( TabPage * pTabPage ) override;
+ virtual void setInvalidPage(TabPage * pTabPage) override;
+ virtual void setValidPage(TabPage * pTabPage) override;
protected:
- virtual bool leaveState( WizardState _nState ) override;
- virtual WizardState determineNextState(WizardState nCurrentState) const override;
- virtual void enterState(WizardState nState) override;
+ virtual bool leaveState( WizardState _nState ) override;
+ virtual WizardState determineNextState(WizardState nCurrentState) const override;
+ virtual void enterState(WizardState nState) override;
- virtual OUString getStateDisplayName( WizardState nState ) const override;
+ virtual OUString getStateDisplayName(WizardState nState) const override;
private:
virtual VclPtr<TabPage> createPage(WizardState nState) override;
- css::uno::Reference< css::chart2::XChartDocument > m_xChartModel;
- css::uno::Reference< css::uno::XComponentContext> m_xCC;
- ChartTypeTemplateProvider* m_pTemplateProvider;
+ css::uno::Reference<css::chart2::XChartDocument> m_xChartModel;
+ css::uno::Reference<css::uno::XComponentContext> m_xComponentContext;
+ ChartTypeTemplateProvider* m_pTemplateProvider;
std::unique_ptr<DialogModel> m_pDialogModel;
WizardState m_nLastState;
- TimerTriggeredControllerLock m_aTimerTriggeredControllerLock;
+ TimerTriggeredControllerLock m_aTimerTriggeredControllerLock;
-// RangeChooserTabPage * m_pRangeChooserTabPage;
-// DataSourceTabPage * m_pDataSourceTabPage;
- bool m_bCanTravel;
+ bool m_bCanTravel;
};
+
} //namespace chart
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 37ae36863db12893029fd199506cfaf97a3b0154
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Tue Mar 7 16:42:24 2017 +0100
pivotcharts: Check the data provider on pivot table update
Change-Id: I8ae0756357c18c9fc0b0af64e8e3acb36e1a8564
diff --git a/chart2/source/model/main/ChartModel_Persistence.cxx b/chart2/source/model/main/ChartModel_Persistence.cxx
index da7ba9c..945bd39 100644
--- a/chart2/source/model/main/ChartModel_Persistence.cxx
+++ b/chart2/source/model/main/ChartModel_Persistence.cxx
@@ -46,6 +46,8 @@
#include <com/sun/star/io/XSeekable.hpp>
#include <com/sun/star/ucb/CommandFailedException.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
+
#include <ucbhelper/content.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <vcl/cvtgrf.hxx>
@@ -709,11 +711,11 @@ void SAL_CALL ChartModel::removeModifyListener(
// util::XModifyListener
void SAL_CALL ChartModel::modified( const lang::EventObject& rEvenObject)
{
- uno::Reference<chart2::data::XDataProvider> xDataProvider(rEvenObject.Source, uno::UNO_QUERY);
- if (xDataProvider.is())
+ uno::Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider(rEvenObject.Source, uno::UNO_QUERY);
+ if (xPivotChartDataProvider.is())
{
lockControllers();
- Reference<frame::XModel> xModel(this);
+ uno::Reference<chart2::data::XDataProvider> xDataProvider(xPivotChartDataProvider, uno::UNO_QUERY);
try
{
uno::Sequence<beans::PropertyValue> aArguments =
commit 053dedb1c696ec950942923e6d73d6835cd3fc89
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Tue Mar 7 16:38:07 2017 +0100
chart model: checks if data provider is pivot table or sheet
Change-Id: I5f71004f15b72e6d0ef6bef30ee5814f31e4b1e7
diff --git a/chart2/inc/ChartModel.hxx b/chart2/inc/ChartModel.hxx
index 04e3be2..d6123bd 100644
--- a/chart2/inc/ChartModel.hxx
+++ b/chart2/inc/ChartModel.hxx
@@ -469,6 +469,10 @@ public:
void setTimeBasedRange(sal_Int32 nStart, sal_Int32 nEnd);
+ bool isDataFromSpreadsheet();
+
+ bool isDataFromPivotTable();
+
#if HAVE_FEATURE_OPENGL
OpenGLWindow* getOpenGLWindow() { return mpOpenGLWindow;}
#endif
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx
index a8dae67..b1faf4b 100644
--- a/chart2/source/model/main/ChartModel.cxx
+++ b/chart2/source/model/main/ChartModel.cxx
@@ -38,6 +38,7 @@
#include <vcl/openglwin.hxx>
#include <com/sun/star/chart/ChartDataRowSource.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
#include <comphelper/processfactory.hxx>
#include <cppuhelper/supportsservice.hxx>
@@ -1358,6 +1359,17 @@ void ChartModel::update()
#endif
}
+bool ChartModel::isDataFromSpreadsheet()
+{
+ return !isDataFromPivotTable() && !hasInternalDataProvider();
+}
+
+bool ChartModel::isDataFromPivotTable()
+{
+ uno::Reference<chart2::data::XPivotChartDataProvider> xPivotChartDataProvider(m_xDataProvider, uno::UNO_QUERY);
+ return xPivotChartDataProvider.is();
+}
+
} // namespace chart
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
commit f97bd0c422952fd258eeee2434b930d23239ec50
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Tue Mar 7 16:34:14 2017 +0100
Pivot chart specific data provider to get pivot table output data
Change-Id: I6e1c4320316e7dcfad5b1de5d55403cfebd01a29
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index 7ae02d6..840c191 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -2065,6 +2065,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/chart2/data,\
XLabeledDataSequence \
XLabeledDataSequence2 \
XNumericalDataSequence \
+ XPivotChartDataProvider \
XPopupRequest \
XRangeHighlighter \
XRangeXMLConversion \
diff --git a/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl b/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl
new file mode 100644
index 0000000..95b58d4
--- /dev/null
+++ b/offapi/com/sun/star/chart2/data/XPivotChartDataProvider.idl
@@ -0,0 +1,54 @@
+/* -*- 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_XPivotChartDataProvider_idl
+#define com_sun_star_chart2_data_XPivotChartDataProvider_idl
+
+#include <com/sun/star/uno/XInterface.idl>
+#include <com/sun/star/chart2/data/XDataSequence.idl>
+
+module com { module sun { module star { module chart2 { module data {
+
+/**
+ * Data provider specific for pivot chart data.
+ *
+ * @since LibreOffice 5.4
+ */
+interface XPivotChartDataProvider : com::sun::star::uno::XInterface
+{
+ /** names of column fields from the associated pivot table
+ *
+ * @since LibreOffice 5.4
+ */
+ sequence<string> getColumnFields();
+
+ /** names of row fields from the associated pivot table
+ *
+ * @since LibreOffice 5.4
+ */
+ sequence<string> getRowFields();
+
+ /** names of page fields from the associated pivot table
+ *
+ * @since LibreOffice 5.4
+ */
+ sequence<string> getPageFields();
+
+ /** names of data fields from the associated pivot table
+ *
+ * @since LibreOffice 5.4
+ */
+ sequence<string> getDataFields();
+};
+
+};};};};};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/PivotChartDataProvider.hxx b/sc/inc/PivotChartDataProvider.hxx
index 1c2df5a..097fb18 100644
--- a/sc/inc/PivotChartDataProvider.hxx
+++ b/sc/inc/PivotChartDataProvider.hxx
@@ -16,6 +16,7 @@
#include "types.hxx"
#include <com/sun/star/chart2/data/XDataProvider.hpp>
+#include <com/sun/star/chart2/data/XPivotChartDataProvider.hpp>
#include <com/sun/star/chart2/data/XDataSource.hpp>
#include <com/sun/star/chart2/data/XDataSequence.hpp>
#include <com/sun/star/chart2/data/XLabeledDataSequence.hpp>
@@ -40,6 +41,7 @@ namespace sc
class PivotChartItem;
typedef cppu::WeakImplHelper<css::chart2::data::XDataProvider,
+ css::chart2::data::XPivotChartDataProvider,
css::beans::XPropertySet,
css::lang::XServiceInfo,
css::util::XModifyBroadcaster>
@@ -76,6 +78,12 @@ 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;
+
// XPropertySet
virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override;
@@ -152,6 +160,11 @@ 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::uno::Reference<css::util::XModifyListener>> m_aValueListeners;
};
diff --git a/sc/source/ui/unoobj/PivotChartDataProvider.cxx b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
index 37becaf..8b8e6ad 100644
--- a/sc/source/ui/unoobj/PivotChartDataProvider.cxx
+++ b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
@@ -249,6 +249,15 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
uno::Reference<sheet::XDataPilotResults> xDPResults(pDPObject->GetSource(), uno::UNO_QUERY);
uno::Sequence<uno::Sequence<sheet::DataResult>> xDataResultsSequence = xDPResults->getResults();
+ m_aCategoriesColumnOrientation.clear();
+ m_aCategoriesRowOrientation.clear();
+ m_aLabels.clear();
+ m_aDataRowVector.clear();
+ m_aColumnFields.clear();
+ m_aRowFields.clear();
+ m_aPageFields.clear();
+ m_aDataFields.clear();
+
double fNan;
rtl::math::setNan(&fNan);
@@ -273,6 +282,9 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
std::unordered_map<OUString, sal_Int32, OUStringHash> aDataFieldNumberFormatMap;
std::vector<OUString> aDataFieldNamesVectors;
+ std::unordered_map<OUString, OUString, OUStringHash> aDataFieldCaptionNames;
+ std::vector<OUString> aDataFieldNames;
+
sheet::DataPilotFieldOrientation eDataFieldOrientation = sheet::DataPilotFieldOrientation_HIDDEN;
for (long nDim = 0; nDim < xDims->getCount(); nDim++)
@@ -322,6 +334,8 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
{
case sheet::DataPilotFieldOrientation_COLUMN:
{
+ m_aColumnFields.push_back(xLevName->getName());
+
uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
size_t i = 0;
OUString sCaption;
@@ -344,16 +358,22 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
if (bIsDataLayout)
{
+ // Remember data fields to determine the number format of data
aDataFieldNamesVectors.push_back(sName);
eDataFieldOrientation = sheet::DataPilotFieldOrientation_COLUMN;
+ // Remember the caption name
+ aDataFieldCaptionNames[rMember.Name] = rMember.Caption;
}
i++;
}
}
- break;
}
+ break;
+
case sheet::DataPilotFieldOrientation_ROW:
{
+ m_aRowFields.push_back(xLevName->getName());
+
uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
m_aCategoriesRowOrientation.resize(aSeq.getLength());
size_t i = 0;
@@ -396,18 +416,31 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
if (bIsDataLayout)
{
+ // Remember data fields to determine the number format of data
aDataFieldNamesVectors.push_back(sName);
eDataFieldOrientation = sheet::DataPilotFieldOrientation_ROW;
+ // Remember the caption name
+ aDataFieldCaptionNames[rMember.Name] = rMember.Caption;
}
i++;
}
}
- break;
}
+ break;
+
+ case sheet::DataPilotFieldOrientation_PAGE:
+ {
+ m_aPageFields.push_back(xLevName->getName());
+ }
+ break;
+
case sheet::DataPilotFieldOrientation_DATA:
{
aDataFieldNumberFormatMap[xLevName->getName()] = nNumberFormat;
+ aDataFieldNames.push_back(xLevName->getName());
}
+ break;
+
default:
break;
}
@@ -415,6 +448,11 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
}
}
+ for (OUString const & rName : aDataFieldNames)
+ {
+ m_aDataFields.push_back(aDataFieldCaptionNames[rName]);
+ }
+
// Apply number format to the data
if (eDataFieldOrientation == sheet::DataPilotFieldOrientation_ROW)
{
@@ -448,11 +486,6 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotChartDataSource(OUString const & aRangeRepresentation)
{
- m_aCategoriesColumnOrientation.clear();
- m_aCategoriesRowOrientation.clear();
- m_aLabels.clear();
- m_aDataRowVector.clear();
-
uno::Reference<chart2::data::XDataSource> xDataSource;
std::vector<uno::Reference<chart2::data::XLabeledDataSequence>> aLabeledSequences;
@@ -570,6 +603,26 @@ uno::Reference<sheet::XRangeSelection> SAL_CALL PivotChartDataProvider::getRange
return xResult;
}
+uno::Sequence<OUString> PivotChartDataProvider::getColumnFields()
+{
+ return comphelper::containerToSequence(m_aColumnFields);
+}
+
+uno::Sequence<OUString> PivotChartDataProvider::getRowFields()
+{
+ return comphelper::containerToSequence(m_aRowFields);
+}
+
+uno::Sequence<OUString> PivotChartDataProvider::getPageFields()
+{
+ return comphelper::containerToSequence(m_aPageFields);
+}
+
+uno::Sequence<OUString> PivotChartDataProvider::getDataFields()
+{
+ return comphelper::containerToSequence(m_aDataFields);
+}
+
// XModifyBroadcaster ========================================================
void SAL_CALL PivotChartDataProvider::addModifyListener( const uno::Reference< util::XModifyListener >& aListener )
commit c2db9e60e3256888f9ccb0dfe2787a5597524628
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Wed Mar 1 22:40:09 2017 +0100
pivotcharts: collect and set the number format for the data
Change-Id: I5eb2e9b9cb5abb798b99a23cfa16d790ff62ff08
diff --git a/sc/inc/PivotChartDataProvider.hxx b/sc/inc/PivotChartDataProvider.hxx
index d1139a5..1c2df5a 100644
--- a/sc/inc/PivotChartDataProvider.hxx
+++ b/sc/inc/PivotChartDataProvider.hxx
@@ -150,6 +150,7 @@ private:
std::vector<std::vector<PivotChartItem>> m_aCategoriesColumnOrientation;
std::vector<std::vector<PivotChartItem>> m_aCategoriesRowOrientation;
std::vector<std::vector<PivotChartItem>> m_aLabels;
+ std::vector<std::vector<PivotChartItem>> m_aDataRowVector;
std::vector<css::uno::Reference<css::util::XModifyListener>> m_aValueListeners;
};
diff --git a/sc/source/ui/unoobj/PivotChartDataProvider.cxx b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
index 8d9b3e1..37becaf 100644
--- a/sc/source/ui/unoobj/PivotChartDataProvider.cxx
+++ b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
@@ -41,6 +41,8 @@
#include <com/sun/star/chart/ChartDataChangeEvent.hpp>
+#include <unordered_map>
+
using namespace css;
namespace sc
@@ -244,9 +246,35 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
{
+ uno::Reference<sheet::XDataPilotResults> xDPResults(pDPObject->GetSource(), uno::UNO_QUERY);
+ uno::Sequence<uno::Sequence<sheet::DataResult>> xDataResultsSequence = xDPResults->getResults();
+
+ double fNan;
+ rtl::math::setNan(&fNan);
+
+ for (uno::Sequence<sheet::DataResult> const & xDataResults : xDataResultsSequence)
+ {
+ size_t nIndex = 0;
+ for (sheet::DataResult const & rDataResult : xDataResults)
+ {
+ if (rDataResult.Flags == 0 || rDataResult.Flags & css::sheet::DataResultFlags::HASDATA)
+ {
+ if (nIndex >= m_aDataRowVector.size())
+ m_aDataRowVector.resize(nIndex + 1);
+ m_aDataRowVector[nIndex].push_back(PivotChartItem(rDataResult.Flags ? rDataResult.Value : fNan, 0));
+ }
+ nIndex++;
+ }
+ }
+
uno::Reference<sheet::XDimensionsSupplier> xDimensionsSupplier(pDPObject->GetSource());
uno::Reference<container::XIndexAccess> xDims = new ScNameToIndexAccess(xDimensionsSupplier->getDimensions());
+ std::unordered_map<OUString, sal_Int32, OUStringHash> aDataFieldNumberFormatMap;
+ std::vector<OUString> aDataFieldNamesVectors;
+
+ sheet::DataPilotFieldOrientation eDataFieldOrientation = sheet::DataPilotFieldOrientation_HIDDEN;
+
for (long nDim = 0; nDim < xDims->getCount(); nDim++)
{
uno::Reference<uno::XInterface> xDim = ScUnoHelpFunctions::AnyToInterface(xDims->getByIndex(nDim));
@@ -261,11 +289,9 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
ScUnoHelpFunctions::GetEnumProperty(xDimProp, SC_UNO_DP_ORIENTATION,
sheet::DataPilotFieldOrientation_HIDDEN));
- long nDimPos = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_POSITION);
- sal_Int32 nNumberFormat = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_NUMBERFO);
-
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())
@@ -286,6 +312,10 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
uno::Reference<container::XNamed> xLevName(xLevel, uno::UNO_QUERY);
uno::Reference<sheet::XDataPilotMemberResults> xLevRes(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())
{
switch (eDimOrient)
@@ -294,7 +324,8 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
{
uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
size_t i = 0;
- OUString sValue;
+ OUString sCaption;
+ OUString sName;
m_aLabels.resize(aSeq.getLength());
for (sheet::MemberResult & rMember : aSeq)
{
@@ -302,12 +333,20 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
rMember.Flags & sheet::MemberResultFlags::CONTINUE)
{
if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
- sValue = rMember.Caption;
+ {
+ sCaption = rMember.Caption;
+ sName = rMember.Name;
+ }
if (size_t(nDimPos) >= m_aLabels[i].size())
m_aLabels[i].resize(nDimPos + 1);
- m_aLabels[i][nDimPos] = PivotChartItem(sValue);
+ m_aLabels[i][nDimPos] = PivotChartItem(sCaption);
+ if (bIsDataLayout)
+ {
+ aDataFieldNamesVectors.push_back(sName);
+ eDataFieldOrientation = sheet::DataPilotFieldOrientation_COLUMN;
+ }
i++;
}
}
@@ -318,6 +357,7 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
m_aCategoriesRowOrientation.resize(aSeq.getLength());
size_t i = 0;
+ OUString sName;
for (sheet::MemberResult & rMember : aSeq)
{
if (rMember.Flags & sheet::MemberResultFlags::HASMEMBER ||
@@ -326,17 +366,24 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
std::unique_ptr<PivotChartItem> pItem;
double fValue = rMember.Value;
-
if (rtl::math::isNan(fValue))
{
- OUString sValue;
- if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
- sValue = rMember.Caption;
- pItem.reset(new PivotChartItem(sValue));
+ if (rMember.Flags & sheet::MemberResultFlags::CONTINUE)
+ {
+ pItem.reset(new PivotChartItem(""));
+ }
+ else
+ {
+ sName = rMember.Name;
+ pItem.reset(new PivotChartItem(rMember.Caption));
+ }
}
else
{
- pItem.reset(new PivotChartItem(fValue, nNumberFormat));
+ if (rMember.Flags & sheet::MemberResultFlags::CONTINUE)
+ pItem.reset(new PivotChartItem());
+ else
+ pItem.reset(new PivotChartItem(fValue, nNumberFormat));
}
if (size_t(nDimPos) >= m_aCategoriesColumnOrientation.size())
@@ -347,17 +394,56 @@ void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
m_aCategoriesRowOrientation[i].resize(nDimPos + 1);
m_aCategoriesRowOrientation[i][nDimPos] = *pItem;
+ if (bIsDataLayout)
+ {
+ aDataFieldNamesVectors.push_back(sName);
+ eDataFieldOrientation = sheet::DataPilotFieldOrientation_ROW;
+ }
i++;
}
}
break;
}
+ case sheet::DataPilotFieldOrientation_DATA:
+ {
+ aDataFieldNumberFormatMap[xLevName->getName()] = nNumberFormat;
+ }
default:
break;
}
}
}
}
+
+ // Apply number format to the data
+ if (eDataFieldOrientation == sheet::DataPilotFieldOrientation_ROW)
+ {
+ for (std::vector<PivotChartItem> & rDataRow : m_aDataRowVector)
+ {
+ size_t i = 0;
+ for (PivotChartItem & rItem : rDataRow)
+ {
+ OUString sName = aDataFieldNamesVectors[i];
+ sal_Int32 nNumberFormat = aDataFieldNumberFormatMap[sName];
+ rItem.m_nNumberFormat = nNumberFormat;
+ i++;
+ }
+ }
+ }
+ else if (eDataFieldOrientation == sheet::DataPilotFieldOrientation_COLUMN)
+ {
+ size_t i = 0;
+ for (std::vector<PivotChartItem> & rDataRow : m_aDataRowVector)
+ {
+ OUString sName = aDataFieldNamesVectors[i];
+ sal_Int32 nNumberFormat = aDataFieldNumberFormatMap[sName];
+ for (PivotChartItem & rItem : rDataRow)
+ {
+ rItem.m_nNumberFormat = nNumberFormat;
+ }
+ i++;
+ }
+ }
}
uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotChartDataSource(OUString const & aRangeRepresentation)
@@ -365,6 +451,7 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
m_aCategoriesColumnOrientation.clear();
m_aCategoriesRowOrientation.clear();
m_aLabels.clear();
+ m_aDataRowVector.clear();
uno::Reference<chart2::data::XDataSource> xDataSource;
std::vector<uno::Reference<chart2::data::XLabeledDataSequence>> aLabeledSequences;
@@ -378,8 +465,6 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
collectPivotTableData(pDPObject);
- uno::Reference<sheet::XDataPilotResults> xDPResults(pDPObject->GetSource(), uno::UNO_QUERY);
-
{
std::vector<PivotChartItem> aFirstCategories;
std::copy (m_aCategoriesColumnOrientation[0].begin(),
@@ -392,35 +477,11 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
}
{
- uno::Sequence<uno::Sequence<sheet::DataResult>> xDataResultsSequence = xDPResults->getResults();
-
- std::vector<std::vector<PivotChartItem>> aDataRowVector;
-
- double fNan;
- rtl::math::setNan(&fNan);
-
- for (uno::Sequence<sheet::DataResult> const & xDataResults : xDataResultsSequence)
- {
- size_t nIndex = 0;
- for (sheet::DataResult const & rDataResult : xDataResults)
- {
- if (rDataResult.Flags == 0 || rDataResult.Flags & css::sheet::DataResultFlags::HASDATA)
- {
-
- if (nIndex >= aDataRowVector.size())
- aDataRowVector.resize(nIndex + 1);
- aDataRowVector[nIndex].push_back(PivotChartItem(rDataResult.Flags ? rDataResult.Value : fNan, 0));
- }
- nIndex++;
- }
- }
-
int i = 0;
-
- for (std::vector<PivotChartItem> const & rDataRow : aDataRowVector)
+ for (std::vector<PivotChartItem> const & rRowOfData : m_aDataRowVector)
{
- OUString aValuesId = "Data " + OUString::number(i);
- OUString aLabelsId = "Label " + OUString::number(i);
+ OUString aValuesId = "Data " + OUString::number(i + 1);
+ OUString aLabelsId = "Label " + OUString::number(i + 1);
OUString aLabel;
bool bFirst = true;
@@ -440,7 +501,7 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
std::vector<PivotChartItem> aLabelVector { PivotChartItem(aLabel) };
uno::Reference<chart2::data::XLabeledDataSequence> xResult = createLabeledDataSequence(xContext);
- setLabeledDataSequence(xResult, "values-y", aValuesId, rDataRow,
+ setLabeledDataSequence(xResult, "values-y", aValuesId, rRowOfData,
"values-y", aLabelsId, aLabelVector);
aLabeledSequences.push_back(xResult);
i++;
commit 2408a5d49e51e1b929ee9da1cdb7192475d4907a
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Wed Mar 1 22:36:41 2017 +0100
pivotcharts: modify the pivot chart when the pivot table changes
Change-Id: I971e8bf90aaf2363adf3aa530b2cc8fd02abd273
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx
index fe8ada3..a8dae67 100644
--- a/chart2/source/model/main/ChartModel.cxx
+++ b/chart2/source/model/main/ChartModel.cxx
@@ -63,6 +63,7 @@
#include <com/sun/star/drawing/XShapes.hpp>
#include <com/sun/star/document/DocumentProperties.hpp>
#include <com/sun/star/chart2/XTimeBased.hpp>
+#include <com/sun/star/util/XModifyBroadcaster.hpp>
#include <svl/zforlist.hxx>
@@ -746,7 +747,7 @@ Reference< chart2::data::XDataSource > ChartModel::impl_createDefaultData()
xIni->initialize(aArgs);
}
//create data
- uno::Sequence< beans::PropertyValue > aArgs( 4 );
+ uno::Sequence<beans::PropertyValue> aArgs(4);
aArgs[0] = beans::PropertyValue(
"CellRangeRepresentation", -1,
uno::Any( OUString("all") ), beans::PropertyState_DIRECT_VALUE );
@@ -818,6 +819,12 @@ void SAL_CALL ChartModel::attachDataProvider( const uno::Reference< chart2::data
}
}
+ uno::Reference<util::XModifyBroadcaster> xModifyBroadcaster(xDataProvider, uno::UNO_QUERY);
+ if (xModifyBroadcaster.is())
+ {
+ xModifyBroadcaster->addModifyListener(this);
+ }
+
m_xDataProvider.set( xDataProvider );
m_xInternalDataProvider.clear();
diff --git a/chart2/source/model/main/ChartModel_Persistence.cxx b/chart2/source/model/main/ChartModel_Persistence.cxx
index c19aeaf..da7ba9c 100644
--- a/chart2/source/model/main/ChartModel_Persistence.cxx
+++ b/chart2/source/model/main/ChartModel_Persistence.cxx
@@ -22,8 +22,10 @@
#include "macros.hxx"
#include "ChartViewHelper.hxx"
#include "ChartModelHelper.hxx"
+#include "DataSourceHelper.hxx"
#include "AxisHelper.hxx"
#include "ThreeDHelper.hxx"
+#include "DiagramHelper.hxx"
#include <com/sun/star/chart2/LegendPosition.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
@@ -49,6 +51,7 @@
#include <vcl/cvtgrf.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/storagehelper.hxx>
+#include <comphelper/sequence.hxx>
#include <vcl/svapp.hxx>
#include <vcl/settings.hxx>
@@ -704,10 +707,35 @@ void SAL_CALL ChartModel::removeModifyListener(
}
// util::XModifyListener
-void SAL_CALL ChartModel::modified( const lang::EventObject& )
+void SAL_CALL ChartModel::modified( const lang::EventObject& rEvenObject)
{
- if( m_nInLoad == 0 )
- setModified( true );
+ uno::Reference<chart2::data::XDataProvider> xDataProvider(rEvenObject.Source, uno::UNO_QUERY);
+ if (xDataProvider.is())
+ {
+ lockControllers();
+ Reference<frame::XModel> xModel(this);
+ try
+ {
+ uno::Sequence<beans::PropertyValue> aArguments =
+ DataSourceHelper::createArguments("PivotChart", uno::Sequence<sal_Int32>(), true, true, true);
+
+ Reference<chart2::data::XDataSource> xDataSource(xDataProvider->createDataSource(aArguments));
+ Reference<lang::XMultiServiceFactory> xFactory(getChartTypeManager(), uno::UNO_QUERY);
+ Reference<chart2::XDiagram> xDiagram(getFirstDiagram());
+
+ DiagramHelper::tTemplateWithServiceName aTemplateAndService = DiagramHelper::getTemplateForDiagram(xDiagram, xFactory);
+ css::uno::Reference<css::chart2::XChartTypeTemplate> xChartTypeTemplate(aTemplateAndService.first);
+ xChartTypeTemplate->changeDiagramData(xDiagram, xDataSource, aArguments);
+ }
+ catch (const uno::Exception & ex)
+ {
+ ASSERT_EXCEPTION(ex);
+ }
+ unlockControllers();
+ }
+
+ if (m_nInLoad == 0)
+ setModified(true);
}
// lang::XEventListener (base of util::XModifyListener)
commit 60636b83f6520f6b53fda0f1445ea553b7a88fb7
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Tue Feb 28 11:04:53 2017 +0100
pivotcharts: insert a pivot chart if cursor is in a pivot table
Change-Id: I9fbde8e26cf10e68ff7a886e982b7ac1e5d7ef70
diff --git a/sc/source/ui/drawfunc/fuins2.cxx b/sc/source/ui/drawfunc/fuins2.cxx
index e9e6304..ba4a31f 100644
--- a/sc/source/ui/drawfunc/fuins2.cxx
+++ b/sc/source/ui/drawfunc/fuins2.cxx
@@ -63,8 +63,7 @@
#include <com/sun/star/chart/ChartDataRowSource.hpp>
#include <cppuhelper/bootstrap.hxx>
-using namespace ::com::sun::star;
-
+#include "PivotChartDataProvider.hxx"
#include "chart2uno.hxx"
#include "fuinsert.hxx"
#include "tabvwsh.hxx"
@@ -81,16 +80,20 @@ using namespace ::com::sun::star;
#include "gridwin.hxx"
#include <memory>
-namespace {
+using namespace css;
+
+namespace
+{
-void lcl_ChartInit( const uno::Reference < embed::XEmbeddedObject >& xObj, ScViewData* pViewData,
- const OUString& rRangeParam )
+void lcl_ChartInit(const uno::Reference <embed::XEmbeddedObject>& xObj, ScViewData* pViewData,
+ const OUString& rRangeParam, bool bRangeIsPivotTable)
{
ScDocShell* pDocShell = pViewData->GetDocShell();
ScDocument& rScDoc = pDocShell->GetDocument();
- OUString aRangeString( rRangeParam );
- if ( aRangeString.isEmpty() )
+ OUString aRangeString(rRangeParam);
+
+ if (aRangeString.isEmpty() && !bRangeIsPivotTable)
{
SCCOL nCol1 = 0;
SCROW nRow1 = 0;
@@ -118,7 +121,7 @@ void lcl_ChartInit( const uno::Reference < embed::XEmbeddedObject >& xObj, ScVie
}
}
- if ( !aRangeString.isEmpty() )
+ if (!aRangeString.isEmpty())
{
// connect to Calc data (if no range string, leave chart alone, with its own data)
@@ -129,8 +132,13 @@ void lcl_ChartInit( const uno::Reference < embed::XEmbeddedObject >& xObj, ScVie
OSL_ASSERT( xReceiver.is());
if( xReceiver.is() )
{
- uno::Reference< chart2::data::XDataProvider > xDataProvider = new ScChart2DataProvider( &rScDoc );
- xReceiver->attachDataProvider( xDataProvider );
+ uno::Reference<chart2::data::XDataProvider> xDataProvider;
+ if (bRangeIsPivotTable)
+ xDataProvider.set(new sc::PivotChartDataProvider(&rScDoc, aRangeString));
+ else
+ xDataProvider.set(new ScChart2DataProvider(&rScDoc));
+
+ xReceiver->attachDataProvider(xDataProvider);
uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( pDocShell->GetModel(), uno::UNO_QUERY );
xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
@@ -329,7 +337,7 @@ FuInsertOLE::FuInsertOLE(ScTabViewShell* pViewSh, vcl::Window* pWin, ScDrawView*
// Chart initialisieren ?
if ( SvtModuleOptions().IsChart() && SotExchange::IsChart( SvGlobalName( xObj->getClassID() ) ) )
- lcl_ChartInit( xObj, &pViewSh->GetViewData(), OUString() );
+ lcl_ChartInit(xObj, &pViewSh->GetViewData(), OUString(), false);
ScViewData& rData = pViewSh->GetViewData();
@@ -393,7 +401,7 @@ FuInsertChart::FuInsertChart(ScTabViewShell* pViewSh, vcl::Window* pWin, ScDrawV
SdrModel* pDoc, SfxRequest& rReq)
: FuPoor(pViewSh, pWin, pViewP, pDoc, rReq)
{
- const SfxItemSet* pReqArgs = rReq.GetArgs();
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
if( ! rReq.IsAPI() )
rReq.Done();
@@ -405,6 +413,7 @@ FuInsertChart::FuInsertChart(ScTabViewShell* pViewSh, vcl::Window* pWin, ScDrawV
// get range
OUString aRangeString;
+ bool bRangeIsPivotTable = false;
ScRange aPositionRange; // cell range for chart positioning
ScMarkData aMark = pViewSh->GetViewData().GetMarkData();
if( pReqArgs )
@@ -417,35 +426,46 @@ FuInsertChart::FuInsertChart(ScTabViewShell* pViewSh, vcl::Window* pWin, ScDrawV
}
else
{
- bool bAutomaticMark = false;
- if ( !aMark.IsMarked() && !aMark.IsMultiMarked() )
+ ScDocument* pDocument = pViewSh->GetViewData().GetDocument();
+ ScDPObject* pObject = pDocument->GetDPAtCursor(pViewSh->GetViewData().GetCurX(),
+ pViewSh->GetViewData().GetCurY(),
+ pViewSh->GetViewData().GetTabNo());
+ if (pObject)
{
- pViewSh->GetViewData().GetView()->MarkDataArea();
- bAutomaticMark = true;
+ aRangeString = pObject->GetName();
+ bRangeIsPivotTable = true;
}
+ else
+ {
+ bool bAutomaticMark = false;
+ if ( !aMark.IsMarked() && !aMark.IsMultiMarked() )
+ {
+ pViewSh->GetViewData().GetView()->MarkDataArea();
+ bAutomaticMark = true;
+ }
- ScMarkData aMultiMark( aMark );
- aMultiMark.MarkToMulti();
+ ScMarkData aMultiMark( aMark );
+ aMultiMark.MarkToMulti();
- ScRangeList aRanges;
- aMultiMark.FillRangeListWithMarks( &aRanges, false );
- OUString aStr;
- ScDocument* pDocument = pViewSh->GetViewData().GetDocument();
- aRanges.Format( aStr, ScRefFlags::RANGE_ABS_3D, pDocument, pDocument->GetAddressConvention() );
- aRangeString = aStr;
+ ScRangeList aRanges;
+ aMultiMark.FillRangeListWithMarks( &aRanges, false );
+ OUString aStr;
+ aRanges.Format( aStr, ScRefFlags::RANGE_ABS_3D, pDocument, pDocument->GetAddressConvention() );
+ aRangeString = aStr;
- // get "total" range for positioning
- if ( !aRanges.empty() )
- {
- aPositionRange = *aRanges[ 0 ];
- for ( size_t i = 1, nCount = aRanges.size(); i < nCount; ++i )
+ // get "total" range for positioning
+ if ( !aRanges.empty() )
{
- aPositionRange.ExtendTo( *aRanges[ i ] );
+ aPositionRange = *aRanges[ 0 ];
+ for ( size_t i = 1, nCount = aRanges.size(); i < nCount; ++i )
+ {
+ aPositionRange.ExtendTo( *aRanges[ i ] );
+ }
}
- }
- if(bAutomaticMark)
- pViewSh->GetViewData().GetView()->Unmark();
+ if(bAutomaticMark)
+ pViewSh->GetViewData().GetView()->Unmark();
+ }
}
// adapted old code
@@ -568,7 +588,7 @@ FuInsertChart::FuInsertChart(ScTabViewShell* pViewSh, vcl::Window* pWin, ScDrawV
}
}
- lcl_ChartInit( xObj, &rData, aRangeString ); // set source range, auto-detect column/row headers
+ lcl_ChartInit(xObj, &rData, aRangeString, bRangeIsPivotTable); // set source range, auto-detect column/row headers
// Objekt-Position
commit 40e8bffd807e395bf071ba2c800212a9dbcc1199
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Mon Feb 27 16:59:11 2017 +0100
pivotcharts: extract and simplify pivot table data collection
Change-Id: I49b0c4d06c3401f07ab3d2857213b12f109f0d8b
diff --git a/sc/inc/PivotChartDataProvider.hxx b/sc/inc/PivotChartDataProvider.hxx
index e92f847..d1139a5 100644
--- a/sc/inc/PivotChartDataProvider.hxx
+++ b/sc/inc/PivotChartDataProvider.hxx
@@ -29,7 +29,7 @@
#include <rtl/ustring.hxx>
#include <svl/itemprop.hxx>
-#include "dpsave.hxx"
+#include "dpobject.hxx"
#include <memory>
#include <vector>
@@ -140,6 +140,8 @@ private:
css::uno::Reference<css::uno::XComponentContext>& rContext,
std::vector<css::uno::Reference<css::chart2::data::XLabeledDataSequence>>& rOutLabeledSequences);
+ void collectPivotTableData(ScDPObject* pDPObject);
+
ScDocument* m_pDocument;
OUString m_sPivotTableName;
SfxItemPropertySet m_aPropSet;
@@ -147,6 +149,7 @@ private:
std::vector<std::vector<PivotChartItem>> m_aCategoriesColumnOrientation;
std::vector<std::vector<PivotChartItem>> m_aCategoriesRowOrientation;
+ std::vector<std::vector<PivotChartItem>> m_aLabels;
std::vector<css::uno::Reference<css::util::XModifyListener>> m_aValueListeners;
};
diff --git a/sc/source/ui/unoobj/PivotChartDataProvider.cxx b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
index 520244c..8d9b3e1 100644
--- a/sc/source/ui/unoobj/PivotChartDataProvider.cxx
+++ b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
@@ -36,8 +36,6 @@
#include <com/sun/star/sheet/MemberResultFlags.hpp>
#include "dpobject.hxx"
-#include "dpsave.hxx"
-#include "pivot.hxx"
#include "hints.hxx"
@@ -244,27 +242,11 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
return xDataSource;
}
-uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotChartDataSource(OUString const & aRangeRepresentation)
+void PivotChartDataProvider::collectPivotTableData(ScDPObject* pDPObject)
{
- m_aCategoriesColumnOrientation.clear();
- m_aCategoriesRowOrientation.clear();
-
- uno::Reference<chart2::data::XDataSource> xDataSource;
- std::vector<uno::Reference<chart2::data::XLabeledDataSequence>> aLabeledSequences;
-
- uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
- if (!xContext.is())
- return xDataSource;
-
- ScDPCollection* pDPCollection = m_pDocument->GetDPCollection();
- ScDPObject* pDPObject = pDPCollection->GetByName(m_sPivotTableName);
-
uno::Reference<sheet::XDimensionsSupplier> xDimensionsSupplier(pDPObject->GetSource());
- uno::Reference<sheet::XDataPilotResults> xDPResults(xDimensionsSupplier, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xDims = new ScNameToIndexAccess(xDimensionsSupplier->getDimensions());
- std::vector<std::vector<PivotChartItem>> m_aLabels;
-
for (long nDim = 0; nDim < xDims->getCount(); nDim++)
{
uno::Reference<uno::XInterface> xDim = ScUnoHelpFunctions::AnyToInterface(xDims->getByIndex(nDim));
@@ -272,110 +254,131 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
uno::Reference<container::XNamed> xDimName(xDim, uno::UNO_QUERY);
uno::Reference<sheet::XHierarchiesSupplier> xDimSupp(xDim, uno::UNO_QUERY);
- if (xDimProp.is() && xDimSupp.is())
- {
- sheet::DataPilotFieldOrientation eDimOrient = sheet::DataPilotFieldOrientation(
- ScUnoHelpFunctions::GetEnumProperty(xDimProp, SC_UNO_DP_ORIENTATION,
- sheet::DataPilotFieldOrientation_HIDDEN));
+ if (!xDimProp.is() || !xDimSupp.is())
+ continue;
- long nDimPos = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_POSITION);
- sal_Int32 nNumberFormat = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_NUMBERFO);
+ sheet::DataPilotFieldOrientation eDimOrient = sheet::DataPilotFieldOrientation(
+ ScUnoHelpFunctions::GetEnumProperty(xDimProp, SC_UNO_DP_ORIENTATION,
+ sheet::DataPilotFieldOrientation_HIDDEN));
- if (eDimOrient != sheet::DataPilotFieldOrientation_HIDDEN)
- {
- uno::Reference<container::XIndexAccess> xHiers = new ScNameToIndexAccess(xDimSupp->getHierarchies());
- long nHierarchy = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_USEDHIERARCHY);
- if (nHierarchy >= xHiers->getCount())
- nHierarchy = 0;
+ long nDimPos = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_POSITION);
+ sal_Int32 nNumberFormat = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_NUMBERFO);
+
+ 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())
+ nHierarchy = 0;
+
+ uno::Reference<uno::XInterface> xHier = ScUnoHelpFunctions::AnyToInterface(xHiers->getByIndex(nHierarchy));
+
+ uno::Reference<sheet::XLevelsSupplier> xHierSupp(xHier, uno::UNO_QUERY);
+
+ if (!xHierSupp.is())
+ continue;
- uno::Reference<uno::XInterface> xHier = ScUnoHelpFunctions::AnyToInterface(xHiers->getByIndex(nHierarchy));
+ uno::Reference<container::XIndexAccess> xLevels = new ScNameToIndexAccess(xHierSupp->getLevels());
- uno::Reference<sheet::XLevelsSupplier> xHierSupp(xHier, uno::UNO_QUERY);
- if (xHierSupp.is())
+ 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 );
+
+ if (xLevName.is() && xLevRes.is())
+ {
+ switch (eDimOrient)
{
- uno::Reference<container::XIndexAccess> xLevels = new ScNameToIndexAccess(xHierSupp->getLevels());
- long nLevCount = xLevels->getCount();
- for (long nLev = 0; nLev < nLevCount; nLev++)
+ case sheet::DataPilotFieldOrientation_COLUMN:
{
+ uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
+ size_t i = 0;
+ OUString sValue;
+ m_aLabels.resize(aSeq.getLength());
+ for (sheet::MemberResult & rMember : aSeq)
+ {
+ if (rMember.Flags & sheet::MemberResultFlags::HASMEMBER ||
+ rMember.Flags & sheet::MemberResultFlags::CONTINUE)
+ {
+ if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
+ sValue = rMember.Caption;
+
+ if (size_t(nDimPos) >= m_aLabels[i].size())
+ m_aLabels[i].resize(nDimPos + 1);
+ m_aLabels[i][nDimPos] = PivotChartItem(sValue);
- 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 );
- if (xLevName.is() && xLevRes.is())
+ i++;
+ }
+ }
+ break;
+ }
+ case sheet::DataPilotFieldOrientation_ROW:
+ {
+ uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
+ m_aCategoriesRowOrientation.resize(aSeq.getLength());
+ size_t i = 0;
+ for (sheet::MemberResult & rMember : aSeq)
{
- switch (eDimOrient)
+ if (rMember.Flags & sheet::MemberResultFlags::HASMEMBER ||
+ rMember.Flags & sheet::MemberResultFlags::CONTINUE)
{
- case sheet::DataPilotFieldOrientation_COLUMN:
+ std::unique_ptr<PivotChartItem> pItem;
+
+ double fValue = rMember.Value;
+
+ if (rtl::math::isNan(fValue))
{
- uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
- size_t i = 0;
OUString sValue;
- m_aLabels.resize(aSeq.getLength());
- for (sheet::MemberResult & rMember : aSeq)
- {
- if (rMember.Flags & sheet::MemberResultFlags::HASMEMBER ||
- rMember.Flags & sheet::MemberResultFlags::CONTINUE)
- {
- if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
- sValue = rMember.Caption;
-
- if (size_t(nDimPos) >= m_aLabels[i].size())
- m_aLabels[i].resize(nDimPos + 1);
- m_aLabels[i][nDimPos] = PivotChartItem(sValue);
-
- i++;
- }
- }
- break;
+ if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
+ sValue = rMember.Caption;
+ pItem.reset(new PivotChartItem(sValue));
}
- case sheet::DataPilotFieldOrientation_ROW:
+ else
{
- uno::Sequence<sheet::MemberResult> aSeq = xLevRes->getResults();
- m_aCategoriesRowOrientation.resize(aSeq.getLength());
- size_t i = 0;
- for (sheet::MemberResult & rMember : aSeq)
- {
- if (rMember.Flags & sheet::MemberResultFlags::HASMEMBER ||
- rMember.Flags & sheet::MemberResultFlags::CONTINUE)
- {
- std::unique_ptr<PivotChartItem> pItem;
-
- double fValue = rMember.Value;
-
- if (rtl::math::isNan(fValue))
- {
- OUString sValue;
- if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
- sValue = rMember.Caption;
- pItem.reset(new PivotChartItem(sValue));
- }
- else
- {
- pItem.reset(new PivotChartItem(fValue, nNumberFormat));
- }
-
- if (size_t(nDimPos) >= m_aCategoriesColumnOrientation.size())
- m_aCategoriesColumnOrientation.resize(nDimPos + 1);
- m_aCategoriesColumnOrientation[nDimPos].push_back(*pItem);
-
- if (size_t(nDimPos) >= m_aCategoriesRowOrientation[i].size())
- m_aCategoriesRowOrientation[i].resize(nDimPos + 1);
- m_aCategoriesRowOrientation[i][nDimPos] = *pItem;
-
- i++;
- }
- }
- break;
+ pItem.reset(new PivotChartItem(fValue, nNumberFormat));
}
- default:
- break;
+
+ if (size_t(nDimPos) >= m_aCategoriesColumnOrientation.size())
+ m_aCategoriesColumnOrientation.resize(nDimPos + 1);
+ m_aCategoriesColumnOrientation[nDimPos].push_back(*pItem);
+
+ if (size_t(nDimPos) >= m_aCategoriesRowOrientation[i].size())
+ m_aCategoriesRowOrientation[i].resize(nDimPos + 1);
+ m_aCategoriesRowOrientation[i][nDimPos] = *pItem;
+
+ i++;
}
}
+ break;
}
+ default:
+ break;
}
}
}
}
+}
+
+uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotChartDataSource(OUString const & aRangeRepresentation)
+{
+ m_aCategoriesColumnOrientation.clear();
+ m_aCategoriesRowOrientation.clear();
+ m_aLabels.clear();
+
+ uno::Reference<chart2::data::XDataSource> xDataSource;
+ std::vector<uno::Reference<chart2::data::XLabeledDataSequence>> aLabeledSequences;
+
+ uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
+ if (!xContext.is())
+ return xDataSource;
+
+ ScDPCollection* pDPCollection = m_pDocument->GetDPCollection();
+ ScDPObject* pDPObject = pDPCollection->GetByName(m_sPivotTableName);
+
+ collectPivotTableData(pDPObject);
+
+ uno::Reference<sheet::XDataPilotResults> xDPResults(pDPObject->GetSource(), uno::UNO_QUERY);
{
std::vector<PivotChartItem> aFirstCategories;
commit f0284b535cf91292e21b4dff9a6e5e9559bebb51
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Mon Feb 27 16:43:10 2017 +0100
pivotcharts: set the correct number format for categories
Change-Id: I54980c3fbf37816c77fee549fe8b9728ae76ba28
diff --git a/sc/inc/PivotChartDataSequence.hxx b/sc/inc/PivotChartDataSequence.hxx
index c6655bb..6f4cc7c 100644
--- a/sc/inc/PivotChartDataSequence.hxx
+++ b/sc/inc/PivotChartDataSequence.hxx
@@ -51,25 +51,29 @@ struct PivotChartItem
double m_fValue;
OUString m_aString;
bool m_bIsValue;
+ sal_uInt32 m_nNumberFormat;
explicit PivotChartItem()
: m_fValue(0.0)
, m_aString()
, m_bIsValue(true)
+ , m_nNumberFormat(0)
{
rtl::math::setNan(&m_fValue);
}
- explicit PivotChartItem(double fValue)
+ explicit PivotChartItem(double fValue, sal_uInt32 nNumberFormat)
: m_fValue(fValue)
, m_aString()
, m_bIsValue(true)
+ , m_nNumberFormat(nNumberFormat)
{}
explicit PivotChartItem(OUString const & rString)
: m_fValue(0.0)
, m_aString(rString)
, m_bIsValue(false)
+ , m_nNumberFormat(0)
{
rtl::math::setNan(&m_fValue);
}
diff --git a/sc/source/ui/unoobj/PivotChartDataProvider.cxx b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
index c5b9e40..520244c 100644
--- a/sc/source/ui/unoobj/PivotChartDataProvider.cxx
+++ b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
@@ -279,6 +279,7 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
sheet::DataPilotFieldOrientation_HIDDEN));
long nDimPos = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_POSITION);
+ sal_Int32 nNumberFormat = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_NUMBERFO);
if (eDimOrient != sheet::DataPilotFieldOrientation_HIDDEN)
{
@@ -337,17 +338,29 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
if (rMember.Flags & sheet::MemberResultFlags::HASMEMBER ||
rMember.Flags & sheet::MemberResultFlags::CONTINUE)
{
- OUString sValue;
- if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
- sValue = rMember.Caption;
+ std::unique_ptr<PivotChartItem> pItem;
+
+ double fValue = rMember.Value;
+
+ if (rtl::math::isNan(fValue))
+ {
+ OUString sValue;
+ if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
+ sValue = rMember.Caption;
+ pItem.reset(new PivotChartItem(sValue));
+ }
+ else
+ {
+ pItem.reset(new PivotChartItem(fValue, nNumberFormat));
+ }
if (size_t(nDimPos) >= m_aCategoriesColumnOrientation.size())
m_aCategoriesColumnOrientation.resize(nDimPos + 1);
- m_aCategoriesColumnOrientation[nDimPos].push_back(PivotChartItem(sValue));
+ m_aCategoriesColumnOrientation[nDimPos].push_back(*pItem);
if (size_t(nDimPos) >= m_aCategoriesRowOrientation[i].size())
m_aCategoriesRowOrientation[i].resize(nDimPos + 1);
- m_aCategoriesRowOrientation[i][nDimPos] = PivotChartItem(sValue);
+ m_aCategoriesRowOrientation[i][nDimPos] = *pItem;
i++;
}
@@ -393,7 +406,7 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
if (nIndex >= aDataRowVector.size())
aDataRowVector.resize(nIndex + 1);
- aDataRowVector[nIndex].push_back(PivotChartItem(rDataResult.Flags ? rDataResult.Value : fNan));
+ aDataRowVector[nIndex].push_back(PivotChartItem(rDataResult.Flags ? rDataResult.Value : fNan, 0));
}
nIndex++;
}
diff --git a/sc/source/ui/unoobj/PivotChartDataSequence.cxx b/sc/source/ui/unoobj/PivotChartDataSequence.cxx
index 477d1cb..6d68db9 100644
--- a/sc/source/ui/unoobj/PivotChartDataSequence.cxx
+++ b/sc/source/ui/unoobj/PivotChartDataSequence.cxx
@@ -150,10 +150,19 @@ uno::Sequence<OUString> SAL_CALL PivotChartDataSequence::generateLabel(chart2::d
return aSeq;
}
-sal_Int32 SAL_CALL PivotChartDataSequence::getNumberFormatKeyByIndex(sal_Int32 /*nIndex*/)
+sal_Int32 SAL_CALL PivotChartDataSequence::getNumberFormatKeyByIndex(sal_Int32 nIndex)
{
SolarMutexGuard aGuard;
- return 0;
+ if (nIndex == -1 && !m_aData.empty())
+ {
+ return m_aData[0].m_nNumberFormat;
+ }
+ else if (nIndex < 0 && size_t(nIndex) >= m_aData.size())
+ {
+ SAL_WARN("sc.ui", "Passed invalid index to getNumberFormatKeyByIndex(). Will return default value '0'.");
+ return 0;
+ }
+ return m_aData[size_t(nIndex)].m_nNumberFormat;
}
// XCloneable ================================================================
commit 4563fa831bd489bc695e6b95796bd4e81c775588
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Mon Feb 27 16:39:25 2017 +0100
fix warnings, clean-up and remove unused thing
Change-Id: Ia2061663fe1ee87bc37d9a20766ef0363caa21be
diff --git a/sc/inc/PivotChartDataSequence.hxx b/sc/inc/PivotChartDataSequence.hxx
index c3f6dd2..c6655bb 100644
--- a/sc/inc/PivotChartDataSequence.hxx
+++ b/sc/inc/PivotChartDataSequence.hxx
@@ -78,7 +78,8 @@ struct PivotChartItem
class PivotChartDataSequence : public PivotChartDataSequence_Base, public SfxListener
{
public:
- explicit PivotChartDataSequence(ScDocument* pDocument, OUString const & sPivotTableName, OUString const & sID, std::vector<PivotChartItem> const & rColumnData);
+ explicit PivotChartDataSequence(ScDocument* pDocument, OUString const & sPivotTableName, OUString const & sID,
+ std::vector<PivotChartItem> const & rData);
virtual ~PivotChartDataSequence() override;
PivotChartDataSequence(const PivotChartDataSequence&) = delete;
@@ -163,7 +164,7 @@ private:
ScDocument* m_pDocument;
OUString m_sPivotTableName;
OUString m_aID;
- std::vector<PivotChartItem> m_aColumnData;
+ std::vector<PivotChartItem> m_aData;
css::uno::Sequence<OUString> m_aShortSideLabels;
css::uno::Sequence<OUString> m_aLongSideLabels;
SfxItemPropertySet m_aPropSet;
diff --git a/sc/source/ui/unoobj/PivotChartDataProvider.cxx b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
index d3be6e4..c5b9e40 100644
--- a/sc/source/ui/unoobj/PivotChartDataProvider.cxx
+++ b/sc/source/ui/unoobj/PivotChartDataProvider.cxx
@@ -209,78 +209,25 @@ void PivotChartDataProvider::setLabeledDataSequence(uno::Reference<chart2::data:
xResult->setLabel(uno::Reference<chart2::data::XDataSequence>(pLabelSequence.release()));
}
-
-enum class ArrangeDirection
-{
- COLUMNS,
- ROWS
-};
-
-void lclArrange(std::vector<std::vector<PivotChartItem>>& rResult,
- std::vector<std::vector<OUString>>& rInput,
- std::vector<OUString>& rPath,
- size_t index, ArrangeDirection eDirection)
+uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotChartCategoriesDataSource(
+ OUString const & rRangeRepresentation,
+ bool bOrientCol)
{
- if (index >= rInput.size() - 1)
- {
- if (eDirection == ArrangeDirection::COLUMNS)
- {
- for (OUString const & rLabel : rInput[index])
- {
- rPath[index] = rLabel;
-
- size_t i = 0;
- rResult.resize(rPath.size());
- for (auto it = rPath.begin(); it != rPath.end(); ++it)
- {
- OUString const & rEach = *it;
- rResult[i].push_back(PivotChartItem(rEach));
- i++;
- }
- }
- }
- else if (eDirection == ArrangeDirection::ROWS)
- {
- size_t i = 0;
- for (OUString const & rLabel : rInput[index])
- {
- rResult.resize(rInput[index].size());
+ uno::Reference<chart2::data::XDataSource> xDataSource;
+ uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
- rPath[index] = rLabel;
+ if (!xContext.is())
+ return xDataSource;
- for (auto it = rPath.begin(); it != rPath.end(); ++it)
- {
- OUString const & rEach = *it;
- rResult[i].push_back(PivotChartItem(rEach));
- }
- i++;
- }
- }
- }
- else
- {
- for (OUString const & rLabel : rInput[index])
- {
- rPath[index] = rLabel;
- lclArrange(rResult, rInput, rPath, index + 1, eDirection);
- }
- }
-}
+ std::vector<uno::Reference<chart2::data::XLabeledDataSequence>> aLabeledSequences;
-void PivotChartDataProvider::createCategories(
- ScDPSaveData* pSaveData, bool bOrientCol,
- uno::Reference<uno::XComponentContext>& xContext,
- std::vector<uno::Reference<chart2::data::XLabeledDataSequence>>& rOutLabeledSequences)
-{
- ArrangeDirection eDirection = bOrientCol ? ArrangeDirection::COLUMNS
- : ArrangeDirection::ROWS;
if (bOrientCol)
{
for (std::vector<PivotChartItem> const & rCategories : m_aCategoriesColumnOrientation)
{
uno::Reference<chart2::data::XLabeledDataSequence> xResult = createLabeledDataSequence(xContext);
setLabeledDataSequenceValues(xResult, "categories", "Categories", rCategories);
- rOutLabeledSequences.push_back(xResult);
+ aLabeledSequences.push_back(xResult);
}
}
else
@@ -289,27 +236,11 @@ void PivotChartDataProvider::createCategories(
{
uno::Reference<chart2::data::XLabeledDataSequence> xResult = createLabeledDataSequence(xContext);
setLabeledDataSequenceValues(xResult, "categories", "Categories", rCategories);
- rOutLabeledSequences.push_back(xResult);
+ aLabeledSequences.push_back(xResult);
}
}
-}
-
-uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotChartCategoriesDataSource(OUString const & aRangeRepresentation, bool bOrientCol)
-{
- uno::Reference<chart2::data::XDataSource> xDataSource;
- uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
- if (!xContext.is())
- return xDataSource;
-
- std::vector<uno::Reference<chart2::data::XLabeledDataSequence>> aLabeledSequences;
- ScDPCollection* pDPs = m_pDocument->GetDPCollection();
- ScDPObject* pDPObject = pDPs->GetByName(m_sPivotTableName);
- ScDPSaveData* pSaveData = pDPObject->GetSaveData();
-
- createCategories(pSaveData, bOrientCol, xContext, aLabeledSequences);
-
- xDataSource.set(new PivotChartDataSource(aRangeRepresentation, aLabeledSequences));
+ xDataSource.set(new PivotChartDataSource(rRangeRepresentation, aLabeledSequences));
return xDataSource;
}
@@ -348,9 +279,6 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
sheet::DataPilotFieldOrientation_HIDDEN));
long nDimPos = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_POSITION);
- bool bIsDataLayout = ScUnoHelpFunctions::GetBoolProperty(xDimProp, SC_UNO_DP_ISDATALAYOUT);
- bool bHasHiddenMember = ScUnoHelpFunctions::GetBoolProperty(xDimProp, SC_UNO_DP_HAS_HIDDEN_MEMBER);
- sal_Int32 nNumberFormat = ScUnoHelpFunctions::GetLongProperty(xDimProp, SC_UNO_DP_NUMBERFO);
if (eDimOrient != sheet::DataPilotFieldOrientation_HIDDEN)
{
@@ -370,12 +298,10 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
{
uno::Reference<uno::XInterface> xLevel = ScUnoHelpFunctions::AnyToInterface(xLevels->getByIndex(nLev));
- uno::Reference<container::XNamed> xLevNam(xLevel, uno::UNO_QUERY);
+ uno::Reference<container::XNamed> xLevName(xLevel, uno::UNO_QUERY);
uno::Reference<sheet::XDataPilotMemberResults> xLevRes(xLevel, uno::UNO_QUERY );
- if (xLevNam.is() && xLevRes.is())
+ if (xLevName.is() && xLevRes.is())
{
- OUString aName = xLevNam->getName();
-
switch (eDimOrient)
{
case sheet::DataPilotFieldOrientation_COLUMN:
@@ -392,7 +318,7 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
sValue = rMember.Caption;
- if (nDimPos >= m_aLabels[i].size())
+ if (size_t(nDimPos) >= m_aLabels[i].size())
m_aLabels[i].resize(nDimPos + 1);
m_aLabels[i][nDimPos] = PivotChartItem(sValue);
@@ -415,11 +341,11 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
if (!(rMember.Flags & sheet::MemberResultFlags::CONTINUE))
sValue = rMember.Caption;
- if (nDimPos >= m_aCategoriesColumnOrientation.size())
+ if (size_t(nDimPos) >= m_aCategoriesColumnOrientation.size())
m_aCategoriesColumnOrientation.resize(nDimPos + 1);
m_aCategoriesColumnOrientation[nDimPos].push_back(PivotChartItem(sValue));
- if (nDimPos >= m_aCategoriesRowOrientation[i].size())
+ if (size_t(nDimPos) >= m_aCategoriesRowOrientation[i].size())
m_aCategoriesRowOrientation[i].resize(nDimPos + 1);
m_aCategoriesRowOrientation[i][nDimPos] = PivotChartItem(sValue);
@@ -459,7 +385,6 @@ uno::Reference<chart2::data::XDataSource> PivotChartDataProvider::createPivotCha
for (uno::Sequence<sheet::DataResult> const & xDataResults : xDataResultsSequence)
{
-
size_t nIndex = 0;
for (sheet::DataResult const & rDataResult : xDataResults)
{
@@ -536,26 +461,23 @@ uno::Sequence<beans::PropertyValue> SAL_CALL PivotChartDataProvider::detectArgum
return aArguments;
}
-sal_Bool SAL_CALL PivotChartDataProvider::createDataSequenceByRangeRepresentationPossible(const OUString& aRangeRepresentation)
+sal_Bool SAL_CALL PivotChartDataProvider::createDataSequenceByRangeRepresentationPossible(const OUString& /*aRangeRepresentation*/)
{
SolarMutexGuard aGuard;
- if (!m_pDocument)
- return false;
- return true;
+ return false;
}
uno::Reference< chart2::data::XDataSequence > SAL_CALL
- PivotChartDataProvider::createDataSequenceByRangeRepresentation(const OUString& aRangeRepresentation)
+ PivotChartDataProvider::createDataSequenceByRangeRepresentation(const OUString& /*aRangeRepresentation*/)
{
SolarMutexGuard aGuard;
uno::Reference<chart2::data::XDataSequence> xResult;
-
return xResult;
}
uno::Reference<chart2::data::XDataSequence> SAL_CALL
- PivotChartDataProvider::createDataSequenceByValueArray(const OUString& aRole,
- const OUString& aRangeRepresentation)
+ PivotChartDataProvider::createDataSequenceByValueArray(const OUString& /*aRole*/,
+ const OUString& /*aRangeRepresentation*/)
{
return uno::Reference<chart2::data::XDataSequence>();
}
diff --git a/sc/source/ui/unoobj/PivotChartDataSequence.cxx b/sc/source/ui/unoobj/PivotChartDataSequence.cxx
index c30f514..477d1cb 100644
--- a/sc/source/ui/unoobj/PivotChartDataSequence.cxx
+++ b/sc/source/ui/unoobj/PivotChartDataSequence.cxx
@@ -38,11 +38,12 @@ const SfxItemPropertyMapEntry* lcl_GetDataSequencePropertyMap()
return aDataSequencePropertyMap_Impl;
}
-PivotChartDataSequence::PivotChartDataSequence(ScDocument* pDocument, OUString const & sPivotTableName, OUString const & sID, std::vector<PivotChartItem> const & rColumnData)
+PivotChartDataSequence::PivotChartDataSequence(ScDocument* pDocument, OUString const & sPivotTableName, OUString const & sID,
+ std::vector<PivotChartItem> const & rData)
: m_pDocument(pDocument)
, m_sPivotTableName(sPivotTableName)
, m_aID(sID)
- , m_aColumnData(rColumnData)
+ , m_aData(rData)
, m_aShortSideLabels()
, m_aLongSideLabels()
, m_aPropSet(lcl_GetDataSequencePropertyMap())
@@ -74,10 +75,10 @@ uno::Sequence<uno::Any> SAL_CALL PivotChartDataSequence::getData()
if (!m_pDocument)
throw uno::RuntimeException();
- uno::Sequence<uno::Any> aSeq(m_aColumnData.size());
+ uno::Sequence<uno::Any> aSeq(m_aData.size());
size_t i = 0;
- for (PivotChartItem const & rItem : m_aColumnData)
+ for (PivotChartItem const & rItem : m_aData)
{
if (rItem.m_bIsValue)
aSeq[i] = uno::makeAny<double>(rItem.m_fValue);
@@ -96,10 +97,10 @@ uno::Sequence<double> SAL_CALL PivotChartDataSequence::getNumericalData()
if (!m_pDocument)
throw uno::RuntimeException();
- uno::Sequence<double> aSeq(m_aColumnData.size());
+ uno::Sequence<double> aSeq(m_aData.size());
size_t i = 0;
- for (PivotChartItem const & rItem : m_aColumnData)
+ for (PivotChartItem const & rItem : m_aData)
{
aSeq[i] = rItem.m_fValue;
i++;
@@ -115,10 +116,10 @@ uno::Sequence<OUString> SAL_CALL PivotChartDataSequence::getTextualData()
if (!m_pDocument)
throw uno::RuntimeException();
- uno::Sequence<OUString> aSeq(m_aColumnData.size());
+ uno::Sequence<OUString> aSeq(m_aData.size());
size_t i = 0;
- for (PivotChartItem const & rItem : m_aColumnData)
+ for (PivotChartItem const & rItem : m_aData)
{
if (!rItem.m_bIsValue)
aSeq[i] = rItem.m_aString;
@@ -162,7 +163,7 @@ uno::Reference<util::XCloneable> SAL_CALL PivotChartDataSequence::createClone()
SolarMutexGuard aGuard;
std::unique_ptr<PivotChartDataSequence> pClone;
- pClone.reset(new PivotChartDataSequence(m_pDocument, m_sPivotTableName, m_aID, m_aColumnData));
+ pClone.reset(new PivotChartDataSequence(m_pDocument, m_sPivotTableName, m_aID, m_aData));
pClone->setRole(m_aRole);
pClone->setShortSideLabels(m_aShortSideLabels);
pClone->setLongSideLabels(m_aLongSideLabels);
commit 4d97a3093ad2d802aba8b5f525c93cf695a1b07f
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Sun Feb 26 22:48:06 2017 +0100
sc: Pivot chart specific data provider
Adds a pivot chart specific data provider which uses provides the
data from a pivot table to the associated chart.
Change-Id: Ifbc5511645ef7ca8f6ff39095f74f76892a0d7bd
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index 9068e50..14ddec0 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -573,6 +573,9 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
sc/source/ui/unoobj/notesuno \
sc/source/ui/unoobj/optuno \
sc/source/ui/unoobj/pageuno \
+ sc/source/ui/unoobj/PivotChartDataProvider \
+ sc/source/ui/unoobj/PivotChartDataSource \
+ sc/source/ui/unoobj/PivotChartDataSequence \
sc/source/ui/unoobj/servuno \
sc/source/ui/unoobj/shapeuno \
sc/source/ui/unoobj/srchuno \
diff --git a/sc/inc/PivotChartDataProvider.hxx b/sc/inc/PivotChartDataProvider.hxx
new file mode 100644
index 0000000..e92f847
--- /dev/null
+++ b/sc/inc/PivotChartDataProvider.hxx
@@ -0,0 +1,158 @@
+/* -*- 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 INCLUDED_SC_INC_PIVOTCHARTDATAPROVIDER_HXX
+#define INCLUDED_SC_INC_PIVOTCHARTDATAPROVIDER_HXX
+
+#include "cellsuno.hxx"
+#include "externalrefmgr.hxx"
+#include "types.hxx"
+
+#include <com/sun/star/chart2/data/XDataProvider.hpp>
+#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/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/util/XCloneable.hpp>
+#include <com/sun/star/util/XModifyBroadcaster.hpp>
+
+#include <svl/lstner.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <rtl/ustring.hxx>
+#include <svl/itemprop.hxx>
+
+#include "dpsave.hxx"
+
+#include <memory>
+#include <vector>
+
+namespace sc
+{
+
+class PivotChartItem;
+
+typedef cppu::WeakImplHelper<css::chart2::data::XDataProvider,
+ css::beans::XPropertySet,
+ css::lang::XServiceInfo,
+ css::util::XModifyBroadcaster>
+ PivotChartDataProvider_Base;
+
+class PivotChartDataProvider : public PivotChartDataProvider_Base, public SfxListener
+{
+public:
+
+ explicit PivotChartDataProvider(ScDocument* pDoc, OUString const& sPivotTableName);
+ virtual ~PivotChartDataProvider() override;
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+ // XDataProvider
+ virtual sal_Bool SAL_CALL createDataSourcePossible(const css::uno::Sequence<css::beans::PropertyValue>& aArguments) override;
+
+ virtual css::uno::Reference<
+ css::chart2::data::XDataSource > SAL_CALL createDataSource(
+ const css::uno::Sequence< css::beans::PropertyValue >& aArguments ) override;
+
+ virtual css::uno::Sequence<
+ css::beans::PropertyValue > SAL_CALL detectArguments(
+ const css::uno::Reference< css::chart2::data::XDataSource >& xDataSource ) override;
+
+ virtual sal_Bool SAL_CALL createDataSequenceByRangeRepresentationPossible(
+ const OUString& aRangeRepresentation ) override;
+
+ virtual css::uno::Reference<
+ css::chart2::data::XDataSequence > SAL_CALL createDataSequenceByRangeRepresentation(
+ const OUString& aRangeRepresentation ) override;
+
+ virtual css::uno::Reference<css::chart2::data::XDataSequence> SAL_CALL
+ createDataSequenceByValueArray( const OUString& aRole, const OUString& aRangeRepresentation ) override;
+
+ virtual css::uno::Reference< css::sheet::XRangeSelection > SAL_CALL getRangeSelection() override;
+
+ // XPropertySet
+ virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override;
+
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener>& xListener) override;
+
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener>& rListener) override;
+
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener>& rListener) override;
+
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener>& rListener) override;
+
+ // XModifyBroadcaster
+ virtual void SAL_CALL addModifyListener(
+ const css::uno::Reference<css::util::XModifyListener>& aListener) override;
+
+ virtual void SAL_CALL removeModifyListener(
+ const css::uno::Reference<css::util::XModifyListener>& aListener) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+
+ virtual sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override;
+
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+
+ css::uno::Reference<css::chart2::data::XDataSource>
+ createPivotChartDataSource(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);
+
+ void setLabeledDataSequenceValues(css::uno::Reference<css::chart2::data::XLabeledDataSequence> & xResult,
+ OUString const & sRoleValues, OUString const & sIdValues,
+ std::vector<PivotChartItem> const & rValues);
+
+ void setLabeledDataSequence(css::uno::Reference<css::chart2::data::XLabeledDataSequence> & xResult,
+ OUString const & sRoleValues, OUString const & sIdValues,
+ 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);
+
+ ScDocument* m_pDocument;
+ OUString m_sPivotTableName;
+ SfxItemPropertySet m_aPropSet;
+ bool m_bIncludeHiddenCells;
+
+ std::vector<std::vector<PivotChartItem>> m_aCategoriesColumnOrientation;
+ std::vector<std::vector<PivotChartItem>> m_aCategoriesRowOrientation;
+
+ std::vector<css::uno::Reference<css::util::XModifyListener>> m_aValueListeners;
+};
+
+}
+
+#endif // INCLUDED_SC_INC_PIVOTCHARTDATAPROVIDER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/PivotChartDataSequence.hxx b/sc/inc/PivotChartDataSequence.hxx
new file mode 100644
index 0000000..c3f6dd2
--- /dev/null
+++ b/sc/inc/PivotChartDataSequence.hxx
@@ -0,0 +1,178 @@
+/* -*- 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 INCLUDED_SC_INC_PIVOTCHARTDATASEQUENCE_HXX
+#define INCLUDED_SC_INC_PIVOTCHARTDATASEQUENCE_HXX
+
+#include <com/sun/star/chart2/data/XDataProvider.hpp>
+#include <com/sun/star/chart2/data/XDataSequence.hpp>
+#include <com/sun/star/chart2/data/XTextualDataSequence.hpp>
+#include <com/sun/star/chart2/data/XNumericalDataSequence.hpp>
+#include <com/sun/star/chart2/data/XLabeledDataSequence.hpp>
+#include <com/sun/star/chart2/data/DataSequenceRole.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/util/XCloneable.hpp>
+#include <com/sun/star/util/XModifyBroadcaster.hpp>
+
+#include <com/sun/star/sheet/XDataPilotResults.hpp>
+
+#include <svl/lstner.hxx>
+#include <svl/itemprop.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <rtl/math.hxx>
+
+#include "unonames.hxx"
+#include "document.hxx"
+
+#include "dpsave.hxx"
+
+namespace sc
+{
+
+typedef cppu::WeakImplHelper<css::chart2::data::XDataSequence,
+ css::chart2::data::XTextualDataSequence,
+ css::chart2::data::XNumericalDataSequence,
+ css::util::XCloneable,
+ css::util::XModifyBroadcaster,
+ css::beans::XPropertySet,
+ css::lang::XServiceInfo>
+ PivotChartDataSequence_Base;
+
+struct PivotChartItem
+{
+ double m_fValue;
+ OUString m_aString;
+ bool m_bIsValue;
+
+ explicit PivotChartItem()
+ : m_fValue(0.0)
+ , m_aString()
+ , m_bIsValue(true)
+ {
+ rtl::math::setNan(&m_fValue);
+ }
+
+ explicit PivotChartItem(double fValue)
+ : m_fValue(fValue)
+ , m_aString()
+ , m_bIsValue(true)
+ {}
+
+ explicit PivotChartItem(OUString const & rString)
+ : m_fValue(0.0)
+ , m_aString(rString)
+ , m_bIsValue(false)
+ {
+ rtl::math::setNan(&m_fValue);
+ }
+};
+
+class PivotChartDataSequence : public PivotChartDataSequence_Base, public SfxListener
+{
+public:
+ explicit PivotChartDataSequence(ScDocument* pDocument, OUString const & sPivotTableName, OUString const & sID, std::vector<PivotChartItem> const & rColumnData);
+
+ virtual ~PivotChartDataSequence() override;
+ PivotChartDataSequence(const PivotChartDataSequence&) = delete;
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list