diff options
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/scopetools.hxx | 1 | ||||
-rw-r--r-- | sc/source/core/data/table4.cxx | 21 |
2 files changed, 22 insertions, 0 deletions
diff --git a/sc/inc/scopetools.hxx b/sc/inc/scopetools.hxx index dd060615db67..eb2941f15777 100644 --- a/sc/inc/scopetools.hxx +++ b/sc/inc/scopetools.hxx @@ -82,6 +82,7 @@ class DelayStartListeningFormulaCells 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 b18752ca3a8a..c8f533c65708 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 @@ void ScTable::FillAuto( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, 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; |