chart2/source/inc/BaseCoordinateSystem.hxx | 6 ------ chart2/source/model/main/BaseCoordinateSystem.cxx | 8 -------- chart2/source/tools/AxisHelper.cxx | 3 ++- chart2/source/view/axes/VCartesianCoordinateSystem.cxx | 2 +- chart2/source/view/axes/VCoordinateSystem.cxx | 11 +++++++++++ chart2/source/view/axes/VPolarCoordinateSystem.cxx | 2 +- chart2/source/view/inc/VCoordinateSystem.hxx | 5 +++++ chart2/source/view/main/ChartView.cxx | 2 +- chart2/source/view/main/SeriesPlotterContainer.cxx | 16 ++++++++-------- chart2/source/view/main/SeriesPlotterContainer.hxx | 2 +- 10 files changed, 30 insertions(+), 27 deletions(-)
New commits: commit fe0f5564f4755272a79334418346ecb21282649a Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Tue Sep 2 11:46:52 2025 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Wed Sep 3 14:54:15 2025 +0200 tdf#168191 Incorrect labels of X-Axis in chart revert commit eeb8ca44ac7994c0552749e190a193a44c956769 Author: Noel Grandin <noel.gran...@collabora.co.uk> Date: Fri Apr 4 10:02:06 2025 +0200 tdf#147874 slow sheet switching with large chart2 (2) Change-Id: I67dcea417be01982b769dd2bea387b4d29f0e732 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190520 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Jenkins (cherry picked from commit 423f95aa13165c2c11c2314d43b8cb1d331b5af0) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190537 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/chart2/source/inc/BaseCoordinateSystem.hxx b/chart2/source/inc/BaseCoordinateSystem.hxx index e9e6f095c541..71f226abcd51 100644 --- a/chart2/source/inc/BaseCoordinateSystem.hxx +++ b/chart2/source/inc/BaseCoordinateSystem.hxx @@ -33,8 +33,6 @@ namespace chart { class Axis; class ChartType; -class ExplicitCategoriesProvider; -class ChartModel; namespace impl { @@ -102,8 +100,6 @@ public: void setChartTypes( const std::vector< rtl::Reference< ::chart::ChartType > >& aChartTypes ); const std::vector< rtl::Reference<::chart::ChartType > > & getChartTypes2() const { return m_aChartTypes; } - ExplicitCategoriesProvider& getExplicitCategoriesProvider(ChartModel& rModel); - protected: // ____ XModifyListener ____ @@ -126,8 +122,6 @@ private: typedef std::vector< std::vector< rtl::Reference< ::chart::Axis > > > tAxisVecVecType; tAxisVecVecType m_aAllAxis; //outer sequence is the dimension; inner sequence is the axis index that indicates main or secondary axis std::vector< rtl::Reference<::chart::ChartType > > m_aChartTypes; - // cache this here so we can share it across different parts of the code, it is expensive to create - std::unique_ptr<ExplicitCategoriesProvider> mxExplicitCategoriesProvider; }; } // namespace chart diff --git a/chart2/source/model/main/BaseCoordinateSystem.cxx b/chart2/source/model/main/BaseCoordinateSystem.cxx index 607c04af0073..31473161e54e 100644 --- a/chart2/source/model/main/BaseCoordinateSystem.cxx +++ b/chart2/source/model/main/BaseCoordinateSystem.cxx @@ -24,7 +24,6 @@ #include <ModifyListenerHelper.hxx> #include <Axis.hxx> #include <ChartType.hxx> -#include <ExplicitCategoriesProvider.hxx> #include <com/sun/star/chart2/AxisType.hpp> #include <com/sun/star/container/NoSuchElementException.hpp> #include <com/sun/star/lang/IndexOutOfBoundsException.hpp> @@ -319,13 +318,6 @@ void BaseCoordinateSystem::setChartTypes( const std::vector< rtl::Reference< Cha fireModifyEvent(); } -ExplicitCategoriesProvider& BaseCoordinateSystem::getExplicitCategoriesProvider(ChartModel& rModel) -{ - if (!mxExplicitCategoriesProvider) - mxExplicitCategoriesProvider = std::make_unique<ExplicitCategoriesProvider>(this, rModel); - return *mxExplicitCategoriesProvider; -} - // ____ XModifyBroadcaster ____ void SAL_CALL BaseCoordinateSystem::addModifyListener( const Reference< util::XModifyListener >& aListener ) { diff --git a/chart2/source/tools/AxisHelper.cxx b/chart2/source/tools/AxisHelper.cxx index 51336ebc5a49..52979751186d 100644 --- a/chart2/source/tools/AxisHelper.cxx +++ b/chart2/source/tools/AxisHelper.cxx @@ -111,7 +111,8 @@ chart2::ScaleData AxisHelper::getDateCheckedScale( const rtl::Reference< Axis >& } if( aScale.AxisType == AxisType::DATE ) { - if( !xCooSys || !xCooSys->getExplicitCategoriesProvider(rModel).isDateAxis() ) + ExplicitCategoriesProvider aExplicitCategoriesProvider( xCooSys, rModel ); + if( !aExplicitCategoriesProvider.isDateAxis() ) aScale.AxisType = AxisType::CATEGORY; } return aScale; diff --git a/chart2/source/view/axes/VCartesianCoordinateSystem.cxx b/chart2/source/view/axes/VCartesianCoordinateSystem.cxx index dbaeee1788ca..81fa369c2f60 100644 --- a/chart2/source/view/axes/VCartesianCoordinateSystem.cxx +++ b/chart2/source/view/axes/VCartesianCoordinateSystem.cxx @@ -135,7 +135,7 @@ void VCartesianCoordinateSystem::createVAxisList( continue; rtl::Reference<Diagram> xDiagram(xChartDoc->getFirstChartDiagram()); - AxisProperties aAxisProperties(xAxis, &m_xCooSysModel->getExplicitCategoriesProvider(*xChartDoc), xDiagram->getDataTableRef()); + AxisProperties aAxisProperties(xAxis, getExplicitCategoriesProvider(), xDiagram->getDataTableRef()); aAxisProperties.m_nDimensionIndex = nDimensionIndex; aAxisProperties.m_bSwapXAndY = bSwapXAndY; aAxisProperties.m_bIsMainAxis = (nAxisIndex==0); diff --git a/chart2/source/view/axes/VCoordinateSystem.cxx b/chart2/source/view/axes/VCoordinateSystem.cxx index ff8b6dd0be13..1ee814c57c61 100644 --- a/chart2/source/view/axes/VCoordinateSystem.cxx +++ b/chart2/source/view/axes/VCoordinateSystem.cxx @@ -24,6 +24,7 @@ #include "VCartesianCoordinateSystem.hxx" #include "VPolarCoordinateSystem.hxx" #include <BaseCoordinateSystem.hxx> +#include <ExplicitCategoriesProvider.hxx> #include <GridProperties.hxx> #include <ChartModel.hxx> #include <ScaleAutomatism.hxx> @@ -220,6 +221,16 @@ void VCoordinateSystem::impl_adjustDimensionAndIndex( sal_Int32& rDimensionIndex rAxisIndex = 0; } +void VCoordinateSystem::setExplicitCategoriesProvider( ExplicitCategoriesProvider* pExplicitCategoriesProvider /*takes ownership*/ ) +{ + m_apExplicitCategoriesProvider.reset(pExplicitCategoriesProvider); +} + +ExplicitCategoriesProvider* VCoordinateSystem::getExplicitCategoriesProvider() +{ + return m_apExplicitCategoriesProvider.get(); +} + std::vector< ExplicitScaleData > VCoordinateSystem::getExplicitScales( sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex ) const { std::vector< ExplicitScaleData > aRet(m_aExplicitScales); diff --git a/chart2/source/view/axes/VPolarCoordinateSystem.cxx b/chart2/source/view/axes/VPolarCoordinateSystem.cxx index 99cb69430703..ab7e603009ba 100644 --- a/chart2/source/view/axes/VPolarCoordinateSystem.cxx +++ b/chart2/source/view/axes/VPolarCoordinateSystem.cxx @@ -95,7 +95,7 @@ void VPolarCoordinateSystem::createVAxisList( continue; rtl::Reference<Diagram> xDiagram(xChartDoc->getFirstChartDiagram()); - AxisProperties aAxisProperties(xAxis, &m_xCooSysModel->getExplicitCategoriesProvider(*xChartDoc), xDiagram->getDataTableRef()); + AxisProperties aAxisProperties(xAxis,getExplicitCategoriesProvider(), xDiagram->getDataTableRef()); aAxisProperties.init(); if(aAxisProperties.m_bDisplayLabels) aAxisProperties.m_nNumberFormatKey = getNumberFormatKeyForAxis(xAxis, xChartDoc); diff --git a/chart2/source/view/inc/VCoordinateSystem.hxx b/chart2/source/view/inc/VCoordinateSystem.hxx index 381f137d4c09..61dda842d02b 100644 --- a/chart2/source/view/inc/VCoordinateSystem.hxx +++ b/chart2/source/view/inc/VCoordinateSystem.hxx @@ -77,6 +77,9 @@ public: ExplicitScaleData getExplicitScale( sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex ) const; ExplicitIncrementData getExplicitIncrement( sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex ) const; + void setExplicitCategoriesProvider( ExplicitCategoriesProvider* /*takes ownership*/ ); + ExplicitCategoriesProvider* getExplicitCategoriesProvider(); + // returns a complete scale set for a given dimension and index; for example if nDimensionIndex==1 and nAxisIndex==2 you get returned the secondary x axis, main y axis and main z axis std::vector< ExplicitScaleData > getExplicitScales( sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex ) const; // returns a complete increment set for a given dimension and index; for example if nDimensionIndex==1 and nAxisIndex==2 you get returned the secondary x axis, main y axis and main z axis @@ -197,6 +200,8 @@ private: tFullExplicitScaleMap m_aSecondaryExplicitScales; tFullExplicitIncrementMap m_aSecondaryExplicitIncrements; + + std::unique_ptr< ExplicitCategoriesProvider > m_apExplicitCategoriesProvider; }; } //namespace chart diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 60192c88fdef..1b20e34939ad 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -534,7 +534,7 @@ awt::Rectangle ChartView::impl_createDiagramAndContent( const CreateShapeParam2D // - prepare list of all axis and how they are used Date aNullDate = NumberFormatterWrapper( xNumberFormatsSupplier ).getNullDate(); - rParam.mpSeriesPlotterContainer->initAxisUsageList(aNullDate, mrChartModel); + rParam.mpSeriesPlotterContainer->initAxisUsageList(aNullDate); rParam.mpSeriesPlotterContainer->doAutoScaling( mrChartModel ); rParam.mpSeriesPlotterContainer->setScalesFromCooSysToPlotter(); rParam.mpSeriesPlotterContainer->setNumberFormatsFromAxes(); diff --git a/chart2/source/view/main/SeriesPlotterContainer.cxx b/chart2/source/view/main/SeriesPlotterContainer.cxx index 01a577139da5..ac09dcc2d725 100644 --- a/chart2/source/view/main/SeriesPlotterContainer.cxx +++ b/chart2/source/view/main/SeriesPlotterContainer.cxx @@ -126,6 +126,7 @@ VCoordinateSystem* SeriesPlotterContainer::addCooSysToList( ObjectIdentifier::createParticleForCoordinateSystem(xCooSys, &rChartModel)); pVCooSys->setParticle(aCooSysParticle); + pVCooSys->setExplicitCategoriesProvider(new ExplicitCategoriesProvider(xCooSys, rChartModel)); rVCooSysList.push_back(std::move(pVCooSys)); return rVCooSysList.back().get(); } @@ -262,8 +263,7 @@ void SeriesPlotterContainer::initializeCooSysAndSeriesPlotter(ChartModel& rChart pPlotter->setNumberFormatsSupplier(xNumberFormatsSupplier); pPlotter->setColorScheme(xColorScheme); if (pVCooSys) - pPlotter->setExplicitCategoriesProvider( - &xCooSys->getExplicitCategoriesProvider(rChartModel)); + pPlotter->setExplicitCategoriesProvider(pVCooSys->getExplicitCategoriesProvider()); sal_Int32 nMissingValueTreatment = xDiagram->getCorrectedMissingValueTreatment(xChartType); @@ -381,7 +381,7 @@ bool SeriesPlotterContainer::isCategoryPositionShifted(const chart2::ScaleData& return rSourceScale.AxisType == AxisType::SERIES; } -void SeriesPlotterContainer::initAxisUsageList(const Date& rNullDate, ChartModel& rChartModel) +void SeriesPlotterContainer::initAxisUsageList(const Date& rNullDate) { m_aAxisUsageList.clear(); @@ -414,13 +414,13 @@ void SeriesPlotterContainer::initAxisUsageList(const Date& rNullDate, ChartModel // Create axis usage object for this axis. chart2::ScaleData aSourceScale = xAxis->getScaleData(); - ExplicitCategoriesProvider& rCatProvider - = xCooSys->getExplicitCategoriesProvider(rChartModel); + ExplicitCategoriesProvider* pCatProvider + = pVCooSys->getExplicitCategoriesProvider(); if (nDimIndex == 0) - AxisHelper::checkDateAxis(aSourceScale, &rCatProvider, bDateAxisAllowed); + AxisHelper::checkDateAxis(aSourceScale, pCatProvider, bDateAxisAllowed); - bool bHasComplexCat - = rCatProvider.hasComplexCategories() && bComplexCategoryAllowed; + bool bHasComplexCat = pCatProvider && pCatProvider->hasComplexCategories() + && bComplexCategoryAllowed; aSourceScale.ShiftedCategoryPosition = isCategoryPositionShifted(aSourceScale, bHasComplexCat); diff --git a/chart2/source/view/main/SeriesPlotterContainer.hxx b/chart2/source/view/main/SeriesPlotterContainer.hxx index 485d4210d646..38f3c8b909c8 100644 --- a/chart2/source/view/main/SeriesPlotterContainer.hxx +++ b/chart2/source/view/main/SeriesPlotterContainer.hxx @@ -63,7 +63,7 @@ public: * object and initialize its `aAutoScaling` member to the `ScaleData` * object of the current axis. */ - void initAxisUsageList(const Date& rNullDate, ChartModel& rChartModel); + void initAxisUsageList(const Date& rNullDate); /** * Perform automatic axis scaling and determine the amount and spacing of