[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - sc/source

Eike Rathke erack at redhat.com
Thu Jul 9 09:20:14 PDT 2015


 sc/source/core/data/documen7.cxx |   20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

New commits:
commit 40775ba02d714f5abb0e8486d49c225b3199a222
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jul 9 00:18:04 2015 +0200

    Resolves: tdf#84762 collect all recalc-always cells before setting any dirty
    
    (cherry picked from commit bf35419b68d7f100a634572236f7d593638981c8)
    
    Conflicts:
    	sc/source/core/data/documen7.cxx
    
    Change-Id: I38f69bcbb9eb550fb97b0f84bc0cb486863060b4
    Reviewed-on: https://gerrit.libreoffice.org/16872
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx
index 6429fa5..ea06c2a 100644
--- a/sc/source/core/data/documen7.cxx
+++ b/sc/source/core/data/documen7.cxx
@@ -410,6 +410,7 @@ void ScDocument::CalcFormulaTree( bool bOnlyForced, bool bProgressBar, bool bSet
         CalcAll();
     else
     {
+        ::std::vector<ScFormulaCell*> vAlwaysDirty;
         ScFormulaCell* pCell = pFormulaTree;
         while ( pCell )
         {
@@ -419,12 +420,11 @@ void ScDocument::CalcFormulaTree( bool bOnlyForced, bool bProgressBar, bool bSet
             {
                 if ( pCell->GetCode()->IsRecalcModeAlways() )
                 {
-                    // pCell wird im SetDirty neu angehaengt!
-                    ScFormulaCell* pNext = pCell->GetNext();
-                    pCell->SetDirty();
-                    // falls pNext==0 und neue abhaengige hinten angehaengt
-                    // wurden, so macht das nichts, da die alle bDirty sind
-                    pCell = pNext;
+                    // pCell and dependents are to be set dirty again, collect
+                    // them first and broadcast afterwards to not break the
+                    // FormulaTree chain here.
+                    vAlwaysDirty.push_back( pCell);
+                    pCell = pCell->GetNext();
                 }
                 else
                 {   // andere simpel berechnen
@@ -434,6 +434,14 @@ void ScDocument::CalcFormulaTree( bool bOnlyForced, bool bProgressBar, bool bSet
                 }
             }
         }
+        for (::std::vector<ScFormulaCell*>::iterator it( vAlwaysDirty.begin()), itEnd( vAlwaysDirty.end());
+                it != itEnd; ++it)
+        {
+            pCell = *it;
+            if (!pCell->GetDirty())
+                pCell->SetDirty();
+        }
+
         bool bProgress = !bOnlyForced && nFormulaCodeInTree && bProgressBar;
         if ( bProgress )
             ScProgress::CreateInterpretProgress( this, true );


More information about the Libreoffice-commits mailing list