delay and batch calls to StartListeningFormulaCells() (tdf#132165)
This is pretty much the same as tdf#133302.
Change-Id: I5325b90601f503e572faefc455a38e0f5b055bbf
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96560
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
diff --git a/sc/inc/scopetools.hxx b/sc/inc/scopetools.hxx
index dd06061..eb2941f 100644
--- a/sc/inc/scopetools.hxx
+++ b/sc/inc/scopetools.hxx
@@ -82,6 +82,7 @@
public:
DelayStartListeningFormulaCells(ScColumn& column, bool delay);
DelayStartListeningFormulaCells(ScColumn& column);
DelayStartListeningFormulaCells(const DelayStartListeningFormulaCells&) = delete;
~DelayStartListeningFormulaCells();
void set();
};
diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx
index b18752c..c8f533c 100644
--- a/sc/source/core/data/table4.cxx
+++ b/sc/source/core/data/table4.cxx
@@ -45,9 +45,11 @@
#include <conditio.hxx>
#include <editutil.hxx>
#include <listenercontext.hxx>
#include <scopetools.hxx>
#include <math.h>
#include <memory>
#include <list>
#define D_MAX_LONG_ double(0x7fffffff)
@@ -592,6 +594,25 @@
if (pProgress)
nProgress = pProgress->GetState();
// Avoid possible repeated calls to StartListeningFormulaCells() (tdf#132165).
std::list< sc::DelayStartListeningFormulaCells > delayStartListening;
SCCOL delayStartColumn, delayEndColumn;
if(bVertical)
{
delayStartColumn = std::min( nOStart, nOEnd );
delayEndColumn = std::max( nOStart, nOEnd );
}
else
{
delayStartColumn = std::min( nIStart, nIEnd );
delayEndColumn = std::max( nIStart, nIEnd );
}
for( SCROW col = delayStartColumn; col <= delayEndColumn; ++col )
{
if( ScColumn* column = FetchColumn( col ))
delayStartListening.emplace_back( *column, true );
}
// execute
sal_uLong nActFormCnt = 0;