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 +- sc/source/core/data/documen4.cxx | 5 ----- sc/source/core/data/patattr.cxx | 6 ++++-- 12 files changed, 34 insertions(+), 34 deletions(-)
New commits: commit 423f95aa13165c2c11c2314d43b8cb1d331b5af0 Author: Noel Grandin <[email protected]> AuthorDate: Tue Sep 2 11:46:52 2025 +0200 Commit: Noel Grandin <[email protected]> CommitDate: Tue Sep 2 15:46:41 2025 +0200 tdf#168191 Incorrect labels of X-Axis in chart revert commit eeb8ca44ac7994c0552749e190a193a44c956769 Author: Noel Grandin <[email protected]> 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 <[email protected]> Tested-by: Jenkins 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 88d48496a858..3e762fcca16b 100644 --- a/chart2/source/view/axes/VCartesianCoordinateSystem.cxx +++ b/chart2/source/view/axes/VCartesianCoordinateSystem.cxx @@ -133,7 +133,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 271f3b6a26dd..3852d88e6321 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> @@ -219,6 +220,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 b330bf820a32..00c8d92c881c 100644 --- a/chart2/source/view/axes/VPolarCoordinateSystem.cxx +++ b/chart2/source/view/axes/VPolarCoordinateSystem.cxx @@ -93,7 +93,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 22fac4dac966..2aa58bb51d01 100644 --- a/chart2/source/view/inc/VCoordinateSystem.hxx +++ b/chart2/source/view/inc/VCoordinateSystem.hxx @@ -70,6 +70,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 @@ -190,6 +193,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 a93279af4517..3e941ff5a4dd 100644 --- a/chart2/source/view/main/SeriesPlotterContainer.cxx +++ b/chart2/source/view/main/SeriesPlotterContainer.cxx @@ -123,6 +123,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(); } @@ -259,8 +260,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); @@ -378,7 +378,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(); @@ -411,13 +411,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 48be4933988f..20886ba6215b 100644 --- a/chart2/source/view/main/SeriesPlotterContainer.hxx +++ b/chart2/source/view/main/SeriesPlotterContainer.hxx @@ -62,7 +62,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 commit 4834c568532ef76e156d56365d704ac68413a0b0 Author: Noel Grandin <[email protected]> AuthorDate: Tue Sep 2 11:52:38 2025 +0200 Commit: Noel Grandin <[email protected]> CommitDate: Tue Sep 2 15:46:28 2025 +0200 tdf#168159 CRASH: deleting columns and undoing revert commit 68db5b64b8db405f9e6c0368836a8ee671b46830 Author: Noel Grandin <[email protected]> Date: Sat Jun 28 16:13:53 2025 +0200 crashtesting ooo120243-1.ods and commit c8742f36fa2bdc9d23042378f5b587ccda8b54dd Author: Noel Grandin <[email protected]> Date: Thu May 22 10:18:48 2025 +0200 tdf#166684 reduce cost of CellAttributeHelper::registerAndCheck Change-Id: I4d4442c6927121e7f18e3e08eb1736fa94a896bc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190521 Tested-by: Jenkins Reviewed-by: Noel Grandin <[email protected]> diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index aee44751d406..771c4d81964a 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -804,11 +804,6 @@ const SfxItemSet* ScDocument::GetCondResult( SCCOL nCol, SCROW nRow, SCTAB nTab, aCell.assign(const_cast<ScDocument&>(*this), aPos); pCell = &aCell; } - // if the underlying cell needs evaluation, ScPatternAttr - // and ScCondFormatIndexes might end up being deleted under - // us, so we need to trigger evaluation before accessing them. - if (pCell->getType() == CELLTYPE_FORMULA) - (void)pCell->getFormula()->IsValue(); const ScPatternAttr* pPattern = GetPattern( nCol, nRow, nTab ); const ScCondFormatIndexes& rIndex = pPattern->GetItem(ATTR_CONDITIONAL).GetCondFormatData(); diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx index 08b28d8dbd7c..6f14db0c8c0c 100644 --- a/sc/source/core/data/patattr.cxx +++ b/sc/source/core/data/patattr.cxx @@ -114,10 +114,12 @@ const ScPatternAttr* CellAttributeHelper::registerAndCheck(const ScPatternAttr& return mpLastHit; } const OUString* pCandidateStyleName = rCandidate.GetStyleName(); - auto [it, itEnd] = maRegisteredCellAttributes.equal_range(pCandidateStyleName); - for (; it != itEnd; ++it) + auto it = maRegisteredCellAttributes.lower_bound(pCandidateStyleName); + for (; it != maRegisteredCellAttributes.end(); ++it) { const ScPatternAttr* pCheck = *it; + if (CompareStringPtr(pCheck->GetStyleName(), pCandidateStyleName) != 0) + break; if (ScPatternAttr::areSame(pCheck, &rCandidate)) { pCheck->mnRefCount++;
