diff options
author | Caolán McNamara <caolanm@redhat.com> | 2015-05-27 13:52:36 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-05-27 13:55:38 +0100 |
commit | 3a34f96a16ad3063302670a57a1ed508302e3ffb (patch) | |
tree | 44bc8c005d663a5b882c0b5458c73b1ef93a5dae | |
parent | 813faac457bb9bd76d826cfc2ae4bf61f6e583b4 (diff) |
Resolves: tdf#91416 setting progress -> resize -> destroy formula context
i.e. setting progress triggers ScTabView::DoResize and an InterpretVisible and
InterpretDirtyCells which resets the mpFormulaGroupCxt that the current rCxt
points to, which is bad, so disable progress for the duration of the GetResult
loop
Change-Id: I8e88cee4dd2308ef61dee934d300a38978833703
(cherry picked from commit e3c1a394a00cef416a81b89b6d5c204891abb286)
-rw-r--r-- | sc/inc/progress.hxx | 4 | ||||
-rw-r--r-- | sc/source/core/data/column2.cxx | 17 | ||||
-rw-r--r-- | sc/source/core/data/formulacell.cxx | 8 | ||||
-rw-r--r-- | sc/source/core/tool/progress.cxx | 13 |
4 files changed, 35 insertions, 7 deletions
diff --git a/sc/inc/progress.hxx b/sc/inc/progress.hxx index d65c9b56ce37..340c4c18655f 100644 --- a/sc/inc/progress.hxx +++ b/sc/inc/progress.hxx @@ -49,6 +49,7 @@ private: static bool bAllowInterpretProgress; static ScDocument* pInterpretDoc; static bool bIdleWasEnabled; + bool bEnabled; SfxProgress* pProgress; @@ -143,6 +144,9 @@ public: return pProgress->GetState(); return 0; } + bool Enabled() const { return bEnabled; } + void Disable() { bEnabled = false; } + void Enable() { bEnabled = true; } }; #endif diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index eca99eb4e32d..566c13997e88 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -43,6 +43,7 @@ #include "formulagroup.hxx" #include "listenercontext.hxx" #include "mtvcellfunc.hxx" +#include "progress.hxx" #include "scmatrix.hxx" #include <rowheightcontext.hxx> @@ -2306,10 +2307,23 @@ bool appendToBlock( sc::formula_block::iterator itData, itDataEnd; getBlockIterators<sc::formula_block>(it, nLenRemain, itData, itDataEnd); + /* tdf#91416 setting progress in triggers a resize of the window + and so ScTabView::DoResize and an InterpretVisible and + InterpretDirtyCells which resets the mpFormulaGroupCxt that + the current rCxt points to, which is bad, so disable progress + during GetResult + */ + ScProgress *pProgress = ScProgress::GetInterpretProgress(); + bool bTempDisableProgress = pProgress && pProgress->Enabled(); + if (bTempDisableProgress) + pProgress->Disable(); + for (; itData != itDataEnd; ++itData, ++nPos) { ScFormulaCell& rFC = **itData; + sc::FormulaResultValue aRes = rFC.GetResult(); + if (aRes.meType == sc::FormulaResultValue::Invalid || aRes.mnError) { if (aRes.mnError == ScErrorCodes::errCircularReference) @@ -2332,6 +2346,9 @@ bool appendToBlock( (*rColArray.mpNumArray)[nPos] = aRes.mfValue; } } + + if (bTempDisableProgress) + pProgress->Enable(); } break; case sc::element_type_empty: diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index 3e8e160bf9bd..33499badc26a 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -1931,8 +1931,12 @@ void ScFormulaCell::InterpretTail( ScInterpretTailParameter eTailParam ) } // Reschedule slows the whole thing down considerably, thus only execute on percent change - ScProgress::GetInterpretProgress()->SetStateCountDownOnPercent( - pDocument->GetFormulaCodeInTree()/MIN_NO_CODES_PER_PROGRESS_UPDATE ); + ScProgress *pProgress = ScProgress::GetInterpretProgress(); + if (pProgress && pProgress->Enabled()) + { + pProgress->SetStateCountDownOnPercent( + pDocument->GetFormulaCodeInTree()/MIN_NO_CODES_PER_PROGRESS_UPDATE ); + } switch (p->GetVolatileType()) { diff --git a/sc/source/core/tool/progress.cxx b/sc/source/core/tool/progress.cxx index ed5dcdcc2ccd..e533986480b9 100644 --- a/sc/source/core/tool/progress.cxx +++ b/sc/source/core/tool/progress.cxx @@ -70,8 +70,9 @@ static bool lcl_HasControllersLocked( SfxObjectShell& rObjSh ) return false; } -ScProgress::ScProgress( SfxObjectShell* pObjSh, const OUString& rText, - sal_uLong nRange, bool bAllDocs, bool bWait ) +ScProgress::ScProgress(SfxObjectShell* pObjSh, const OUString& rText, + sal_uLong nRange, bool bAllDocs, bool bWait) + : bEnabled(true) { if ( pGlobalProgress || SfxProgress::GetActiveProgress( NULL ) ) @@ -114,9 +115,11 @@ ScProgress::ScProgress( SfxObjectShell* pObjSh, const OUString& rText, } } -ScProgress::ScProgress() : - pProgress( NULL ) -{ // DummyInterpret +ScProgress::ScProgress() + : bEnabled(true) + , pProgress(NULL) +{ + // DummyInterpret } ScProgress::~ScProgress() |