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) :