[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