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++;

Reply via email to