summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2017-02-27 16:59:11 +0100
committerTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2017-03-30 23:52:42 +0200
commit5c7be3998ade3940cc75177ff0e91448d95f134e (patch)
tree94372830f13aa9cca98e0f24b557fe99b33b0225
parent760ea70fca602386b2ab4fbf21cde3c0f0a27835 (diff)
pivotcharts: extract and simplify pivot table data collection
Change-Id: I49b0c4d06c3401f07ab3d2857213b12f109f0d8b
-rw-r--r--sc/inc/PivotChartDataProvider.hxx5
-rw-r--r--sc/source/ui/unoobj/PivotChartDataProvider.cxx207
2 files changed, 109 insertions, 103 deletions
diff --git a/sc/inc/PivotChartDataProvider.hxx b/sc/inc/PivotChartDataProvider.hxx
index e92f84762a24..d1139a564478 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 520244c983c9..8d9b3e1458fb 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;