Kaydet (Commit) 3a34f96a authored tarafından Caolán McNamara's avatar Caolán McNamara

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 e3c1a394)
üst 813faac4
......@@ -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
......
......@@ -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:
......
......@@ -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())
{
......
......@@ -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()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment