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

Reply via email to