sc/source/core/data/documen7.cxx | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
New commits: commit 40775ba02d714f5abb0e8486d49c225b3199a222 Author: Eike Rathke <er...@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 <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@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 );
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits