sc/inc/progress.hxx | 4 ++++ sc/source/core/data/column2.cxx | 17 +++++++++++++++++ sc/source/core/data/formulacell.cxx | 8 ++++++-- sc/source/core/tool/progress.cxx | 13 ++++++++----- 4 files changed, 35 insertions(+), 7 deletions(-)
New commits: commit 15f70281384da36a41dc1cbe1b5d01d4704df636 Author: Caolán McNamara <caol...@redhat.com> Date: Wed May 27 13:52:36 2015 +0100 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) Reviewed-on: https://gerrit.libreoffice.org/15926 Reviewed-by: Eike Rathke <er...@redhat.com> Tested-by: Eike Rathke <er...@redhat.com> diff --git a/sc/inc/progress.hxx b/sc/inc/progress.hxx index a658829..e14561d 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; @@ -144,6 +145,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 0f22f79..6f764c7 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> @@ -2305,10 +2306,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) @@ -2331,6 +2345,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 9190a62..d456911 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -1929,8 +1929,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 c0e4a29..a416fca 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()
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits