sc/inc/columnspanset.hxx                |    2 +-
 sc/source/core/data/columnspanset.cxx   |   27 ++++++++++++++-------------
 sc/source/core/data/documen6.cxx        |    2 +-
 sc/source/core/data/listenercontext.cxx |    2 +-
 4 files changed, 17 insertions(+), 16 deletions(-)

New commits:
commit 069c0b32e2ca85340bc79a222bae57bef7d1f674
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Wed Feb 16 12:59:31 2022 +0100
Commit:     Luboš Luňák <l.lu...@collabora.com>
CommitDate: Wed Feb 16 19:52:42 2022 +0100

    clamp ColumnSpanSet::executeAction() to allocated columns
    
    It's already done by executeColumnAction() and currently existing
    actions do not need unallocated columns. This prevents allocating
    all columns e.g. when selecting a full row just because
    ScDocument::GetRangeScriptType() gets called.
    
    Change-Id: I517ce14a756be83a385968549b32d430274b8002
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129993
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>

diff --git a/sc/inc/columnspanset.hxx b/sc/inc/columnspanset.hxx
index 926f0520e8a1..d8cfc41f524b 100644
--- a/sc/inc/columnspanset.hxx
+++ b/sc/inc/columnspanset.hxx
@@ -102,7 +102,7 @@ public:
      */
     void scan(const ScDocument& rDoc, SCTAB nTab, SCCOL nCol1, SCROW nRow1, 
SCCOL nCol2, SCROW nRow2, bool bVal);
 
-    void executeAction(Action& ac) const;
+    void executeAction(ScDocument& rDoc, Action& ac) const;
     void executeColumnAction(ScDocument& rDoc, ColumnAction& ac) const;
 };
 
diff --git a/sc/source/core/data/columnspanset.cxx 
b/sc/source/core/data/columnspanset.cxx
index a38ea7fffe35..7a4d90f65652 100644
--- a/sc/source/core/data/columnspanset.cxx
+++ b/sc/source/core/data/columnspanset.cxx
@@ -142,18 +142,24 @@ void ColumnSpanSet::scan(
     }
 }
 
-void ColumnSpanSet::executeAction(Action& ac) const
+void ColumnSpanSet::executeAction(ScDocument& rDoc, Action& ac) const
 {
     for (size_t nTab = 0; nTab < maTables.size(); ++nTab)
     {
         if (maTables[nTab].empty())
             continue;
 
+        ScTable* pTab = rDoc.FetchTable(nTab);
+        if (!pTab)
+            continue;
+
         const TableType& rTab = maTables[nTab];
-        for (size_t nCol = 0; nCol < rTab.size(); ++nCol)
+        for (SCCOL nCol = 0; nCol < static_cast<SCCOL>(rTab.size()); ++nCol)
         {
             if (!rTab[nCol])
                 continue;
+            if (nCol >= pTab->GetAllocatedColumnsCount())
+                break;
 
             ac.startColumn(nTab, nCol);
             const ColumnType& rCol = *rTab[nCol];
@@ -180,22 +186,17 @@ void ColumnSpanSet::executeColumnAction(ScDocument& rDoc, 
ColumnAction& ac) cons
         if (maTables[nTab].empty())
             continue;
 
+        ScTable* pTab = rDoc.FetchTable(nTab);
+        if (!pTab)
+            continue;
+
         const TableType& rTab = maTables[nTab];
         for (SCCOL nCol = 0; nCol < static_cast<SCCOL>(rTab.size()); ++nCol)
         {
             if (!rTab[nCol])
                 continue;
-
-            ScTable* pTab = rDoc.FetchTable(nTab);
-            if (!pTab)
-                continue;
-
-            if (!rDoc.ValidCol(nCol) || nCol >= 
pTab->GetAllocatedColumnsCount())
-            {
-                // End the loop.
-                nCol = rTab.size();
-                continue;
-            }
+            if (nCol >= pTab->GetAllocatedColumnsCount())
+                break;
 
             ScColumn& rColumn = pTab->aCol[nCol];
             ac.startColumn(&rColumn);
diff --git a/sc/source/core/data/documen6.cxx b/sc/source/core/data/documen6.cxx
index df27740d5db7..49d433ffebb7 100644
--- a/sc/source/core/data/documen6.cxx
+++ b/sc/source/core/data/documen6.cxx
@@ -203,7 +203,7 @@ SvtScriptType ScDocument::GetRangeScriptType( const 
ScRangeList& rRanges )
     }
 
     ScriptTypeAggregator aAction(*this);
-    aSet.executeAction(aAction);
+    aSet.executeAction(*this, aAction);
     return aAction.getScriptType();
 }
 
diff --git a/sc/source/core/data/listenercontext.cxx 
b/sc/source/core/data/listenercontext.cxx
index d0eba36e0381..dac2380bfd04 100644
--- a/sc/source/core/data/listenercontext.cxx
+++ b/sc/source/core/data/listenercontext.cxx
@@ -71,7 +71,7 @@ void EndListeningContext::addEmptyBroadcasterPosition(SCTAB 
nTab, SCCOL nCol, SC
 void EndListeningContext::purgeEmptyBroadcasters()
 {
     PurgeListenerAction aAction(mrDoc);
-    maSet.executeAction(aAction);
+    maSet.executeAction(mrDoc, aAction);
 }
 
 PurgeListenerAction::PurgeListenerAction(ScDocument& rDoc) :

Reply via email to