[Libreoffice-commits] core.git: sc/source

Eike Rathke erack at redhat.com
Wed Jul 8 17:15:17 PDT 2015


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

New commits:
commit bf35419b68d7f100a634572236f7d593638981c8
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
    
    Change-Id: I38f69bcbb9eb550fb97b0f84bc0cb486863060b4

diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx
index d89ea62..b67cce9 100644
--- a/sc/source/core/data/documen7.cxx
+++ b/sc/source/core/data/documen7.cxx
@@ -419,6 +419,7 @@ void ScDocument::CalcFormulaTree( bool bOnlyForced, bool bProgressBar, bool bSet
         CalcAll();
     else
     {
+        ::std::vector<ScFormulaCell*> vAlwaysDirty;
         ScFormulaCell* pCell = pFormulaTree;
         while ( pCell )
         {
@@ -428,12 +429,11 @@ void ScDocument::CalcFormulaTree( bool bOnlyForced, bool bProgressBar, bool bSet
             {
                 if ( pCell->GetCode()->IsRecalcModeAlways() )
                 {
-                    // pCell is set to Dirty again!
-                    ScFormulaCell* pNext = pCell->GetNext();
-                    pCell->SetDirty();
-                    // if pNext==0 and new dependencies were appended at the end,
-                    // this does not matter since they all are bDirty
-                    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
                 {   // calculate the other single
@@ -443,6 +443,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