[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - sc/source

Kohei Yoshida kohei.yoshida at gmail.com
Wed Jul 17 20:27:41 PDT 2013


 sc/source/core/data/formulacell.cxx |   17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

New commits:
commit 7dbd20530e95e77a3d7f850d832fed8be883220e
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Wed Jul 17 23:26:53 2013 -0400

    Revert "old position == current position during cell insertion / deletion."
    
    This reverts commit 58df2af4afd82cb23e29de6623a58da3fb3f53f5.
    
    Conflicts:
    	sc/source/core/data/formulacell.cxx
    
    Change-Id: I9bb1b3eef426e02dcbe83c850c34e520be381c71

diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 1bafd7b..f74231a 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -2229,17 +2229,21 @@ bool ScFormulaCell::UpdateReferenceOnShift(
         // Just in case...
         return false;
 
+    bool bCellStateChanged = false;
     ScAddress aUndoPos( aPos );         // position for undo cell in pUndoDoc
     if ( pUndoCellPos )
         aUndoPos = *pUndoCellPos;
+    ScAddress aOldPos( aPos );
 
     if (rCxt.maRange.In(aPos))
     {
         // This formula cell itself is being shifted during cell range
         // insertion or deletion. Update its position.
         aPos.Move(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta);
-        if (xGroup && xGroup->mnStart == aPos.Row())
+        if (xGroup && xGroup->mnStart == aOldPos.Row())
             xGroup->mnStart += rCxt.mnRowDelta;
+
+        bCellStateChanged = aPos != aOldPos;
     }
 
     // Check presence of any references or column row names.
@@ -2257,9 +2261,8 @@ bool ScFormulaCell::UpdateReferenceOnShift(
     if (!bHasRefs && !bOnRefMove)
         // This formula cell contains no references, nor needs recalculating
         // on reference update. Bail out.
-        return false;
+        return bCellStateChanged;
 
-    bool bCellStateChanged = false;
     boost::scoped_ptr<ScTokenArray> pOldCode;
     if (pUndoDoc)
         pOldCode.reset(pCode->Clone());
@@ -2274,7 +2277,7 @@ bool ScFormulaCell::UpdateReferenceOnShift(
         ScCompiler aComp(pDocument, aPos, *pCode);
         aComp.SetGrammar(pDocument->GetGrammar());
         aComp.UpdateReference(
-            URM_INSDEL, aPos, rCxt.maRange, rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta,
+            URM_INSDEL, aOldPos, rCxt.maRange, rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta,
             bValChanged, bRefSizeChanged);
         bRangeModified = aComp.HasModifiedRange();
     }
@@ -2283,7 +2286,7 @@ bool ScFormulaCell::UpdateReferenceOnShift(
 
     if (bOnRefMove)
         // Cell may reference itself, e.g. ocColumn, ocRow without parameter
-        bOnRefMove = bValChanged;
+        bOnRefMove = (bValChanged || (aPos != aOldPos));
 
     bool bColRowNameCompile = false;
     bool bHasRelName = false;
@@ -2295,7 +2298,7 @@ bool ScFormulaCell::UpdateReferenceOnShift(
         // Upon Insert ColRowNames have to be recompiled in case the
         // insertion occurs right in front of the range.
         if (bHasColRowNames)
-            bColRowNameCompile = checkCompileColRowName(rCxt, *pDocument, *pCode, aPos, aPos, bValChanged);
+            bColRowNameCompile = checkCompileColRowName(rCxt, *pDocument, *pCode, aOldPos, aPos, bValChanged);
 
         ScChangeTrack* pChangeTrack = pDocument->GetChangeTrack();
         bInDeleteUndo = (pChangeTrack && pChangeTrack->IsInDeleteUndo());
@@ -2308,7 +2311,7 @@ bool ScFormulaCell::UpdateReferenceOnShift(
                 || (bValChanged && (bInDeleteUndo || bRefSizeChanged)) || bHasRelName);
 
         if ( bNewListening )
-            EndListeningTo(pDocument, pOldCode.get(), aPos);
+            EndListeningTo(pDocument, pOldCode.get(), aOldPos);
     }
 
     bool bNeedDirty = false;


More information about the Libreoffice-commits mailing list