[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - sc/inc sc/source
Caolán McNamara
caolanm at redhat.com
Mon Jun 15 02:56:52 PDT 2015
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 <caolanm at 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 <erack at redhat.com>
Tested-by: Eike Rathke <erack at 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()
More information about the Libreoffice-commits
mailing list