summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2022-04-19 14:24:46 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2022-04-19 18:13:10 +0200
commitfd2ca9607431fc6ca49e37ab6fef228aa72da5f9 (patch)
tree3d0b361783659e3541433c848b5601e160fb21b1
parent6500106dff0f0cd86f509ffd01542aab77c21596 (diff)
tdf#148635 cache some chart stuff
cache some intermediate stuff that it does a handful of times when finishing a chart - halves the time taken Change-Id: I75c5621844d4309b64e64219a7c9e2bcd344ce36 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133173 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r--chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx21
-rw-r--r--sc/inc/chart2uno.hxx4
-rw-r--r--sc/source/ui/unoobj/chart2uno.cxx21
3 files changed, 33 insertions, 13 deletions
diff --git a/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx b/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx
index 4327297360d4..9c7a2b5342f7 100644
--- a/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx
+++ b/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx
@@ -1118,7 +1118,8 @@ public:
private: //member
std::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
- mutable Any m_aOuterValue;
+ mutable Any m_aOuterValue;
+ mutable bool m_bDetectedRangeSegmentation { false };
};
}
@@ -1172,15 +1173,19 @@ Any WrappedDataRowSourceProperty::getPropertyValue( const Reference< beans::XPro
bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping;
- if( DataSourceHelper::detectRangeSegmentation(
- m_spChart2ModelContact->getDocumentModel(), aRangeString, aSequenceMapping, bUseColumns
- , bFirstCellAsLabel, bHasCategories ) )
+ if (!m_bDetectedRangeSegmentation)
{
- css::chart::ChartDataRowSource eChartDataRowSource = css::chart::ChartDataRowSource_ROWS;
- if(bUseColumns)
- eChartDataRowSource = css::chart::ChartDataRowSource_COLUMNS;
+ if( DataSourceHelper::detectRangeSegmentation(
+ m_spChart2ModelContact->getDocumentModel(), aRangeString, aSequenceMapping, bUseColumns
+ , bFirstCellAsLabel, bHasCategories ) )
+ {
+ css::chart::ChartDataRowSource eChartDataRowSource = css::chart::ChartDataRowSource_ROWS;
+ if(bUseColumns)
+ eChartDataRowSource = css::chart::ChartDataRowSource_COLUMNS;
- m_aOuterValue <<= eChartDataRowSource;
+ m_aOuterValue <<= eChartDataRowSource;
+ }
+ m_bDetectedRangeSegmentation = true;
}
return m_aOuterValue;
diff --git a/sc/inc/chart2uno.hxx b/sc/inc/chart2uno.hxx
index a5e4f53b032f..72a6374be739 100644
--- a/sc/inc/chart2uno.hxx
+++ b/sc/inc/chart2uno.hxx
@@ -147,6 +147,10 @@ private:
ScDocument* m_pDocument;
SfxItemPropertySet m_aPropSet;
bool m_bIncludeHiddenCells;
+ css::uno::Reference< css::chart2::data::XDataSource > mxCachedDataSource;
+ css::uno::Sequence< css::beans::PropertyValue > maCachedArguments;
+ css::uno::Sequence< css::beans::PropertyValue > maCreateDataSourceArguments;
+ css::uno::Reference< css::chart2::data::XDataSource > mxCreatedDataSource;
};
// DataSource
diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx
index adc244bacc78..9ca2e73bd4ec 100644
--- a/sc/source/ui/unoobj/chart2uno.cxx
+++ b/sc/source/ui/unoobj/chart2uno.cxx
@@ -1403,7 +1403,11 @@ ScChart2DataProvider::createDataSource(
if ( ! m_pDocument )
throw uno::RuntimeException();
- uno::Reference< chart2::data::XDataSource> xResult;
+ // This is expensive to compute and we get called more than once, so cache
+ if (maCreateDataSourceArguments == aArguments)
+ return mxCreatedDataSource;
+ maCreateDataSourceArguments = aArguments;
+
bool bLabel = true;
bool bCategories = false;
bool bOrientCol = true;
@@ -1490,7 +1494,7 @@ ScChart2DataProvider::createDataSource(
const Chart2PositionMap* pChartMap = aChPositioner.getPositionMap();
if (!pChartMap)
// No chart position map instance. Bail out.
- return xResult;
+ return mxCreatedDataSource;
rtl::Reference<ScChart2DataSource> pDS;
::std::vector< uno::Reference< chart2::data::XLabeledDataSequence > > aSeqs;
@@ -1568,8 +1572,8 @@ ScChart2DataProvider::createDataSource(
}
}
- xResult.set( pDS );
- return xResult;
+ mxCreatedDataSource.set(pDS);
+ return mxCreatedDataSource;
}
namespace
@@ -1761,6 +1765,10 @@ std::pair<OUString, OUString> constructKey(const uno::Reference< chart2::data::X
uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArguments(
const uno::Reference< chart2::data::XDataSource >& xDataSource )
{
+ // Cache these because this is expensive to compute and we get called more than once
+ if (xDataSource == mxCachedDataSource)
+ return maCachedArguments;
+
::std::vector< beans::PropertyValue > aResult;
bool bRowSourceDetected = false;
bool bFirstCellAsLabel = false;
@@ -2026,7 +2034,10 @@ uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArgum
}
}
- return comphelper::containerToSequence( aResult );
+ mxCachedDataSource = xDataSource;
+ maCachedArguments = comphelper::containerToSequence( aResult );
+
+ return maCachedArguments;
}
sal_Bool SAL_CALL ScChart2DataProvider::createDataSequenceByRangeRepresentationPossible( const OUString& aRangeRepresentation )