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

Kohei Yoshida kohei.yoshida at gmail.com
Tue Jul 16 20:30:32 PDT 2013


 sc/inc/address.hxx               |    1 
 sc/source/core/inc/refupdat.hxx  |   32 +++--
 sc/source/core/tool/address.cxx  |   18 ++
 sc/source/core/tool/compiler.cxx |  114 +++++++++---------
 sc/source/core/tool/refupdat.cxx |  242 +++++++++++++++++++++------------------
 5 files changed, 229 insertions(+), 178 deletions(-)

New commits:
commit d944f0a90527452f0ad15ff3151b295407643908
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Tue Jul 16 23:31:51 2013 -0400

    More on removing CalcAbsIfRel().
    
    One test fails. I'll look into that next.
    
    Change-Id: I4a40104187a73953769740fd47d7a917c83bf337

diff --git a/sc/inc/address.hxx b/sc/inc/address.hxx
index 84c62cb..2a38827 100644
--- a/sc/inc/address.hxx
+++ b/sc/inc/address.hxx
@@ -507,6 +507,7 @@ public:
     SC_DLLPUBLIC void Justify();
     SC_DLLPUBLIC void ExtendTo( const ScRange& rRange );
     SC_DLLPUBLIC bool Intersects( const ScRange& ) const;    // do two ranges intersect?
+    void PutInOrder();
     inline bool operator==( const ScRange& r ) const;
     inline bool operator!=( const ScRange& r ) const;
     inline bool operator<( const ScRange& r ) const;
diff --git a/sc/source/core/inc/refupdat.hxx b/sc/source/core/inc/refupdat.hxx
index 1d9f4c2..8252005 100644
--- a/sc/source/core/inc/refupdat.hxx
+++ b/sc/source/core/inc/refupdat.hxx
@@ -58,17 +58,31 @@ public:
                                 sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz,
                                 ScBigRange& rWhat );
 
-    /// Before calling, the absolute references must be up-to-date!
-    static ScRefUpdateRes Update( ScDocument* pDoc,
-                                  UpdateRefMode eUpdateRefMode,
-                                  const ScAddress& rPos, const ScRange& rRange,
-                                  SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
-                                  ScComplexRefData& rRef, WhatType eWhat = ALL );
+    /**
+     * Update range reference in response to row / column insertion / removal,
+     * copy-n-pasting of formula cell, moving of cells etc.
+     *
+     * @param pDoc
+     * @param eUpdateRefMode
+     * @param rPos position of formula cell that has the range reference.
+     * @param rRange range of cells being shifted.
+     * @param nDx
+     * @param nDy
+     * @param nDz
+     * @param rRef range reference object
+     * @param eWhat
+     *
+     * @return ScRefUpdateRes
+     */
+    static ScRefUpdateRes Update(
+        ScDocument* pDoc, UpdateRefMode eUpdateRefMode, const ScAddress& rPos,
+        const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
+        ScComplexRefData& rRef, ScRange& rRefRange, WhatType eWhat = ALL );
 
     /// Before calling, the absolute references must be up-to-date!
-    static ScRefUpdateRes Move( ScDocument* pDoc, const ScAddress& rPos,
-                                SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
-                                ScComplexRefData& rRef, bool bWrap, bool bAbsolute );
+    static ScRefUpdateRes Move(
+        ScDocument* pDoc, const ScAddress& rPos, SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
+        ScComplexRefData& rRef, ScRange& rRefRange, bool bWrap, bool bAbsolute );
 
     static void MoveRelWrap( ScDocument* pDoc, const ScAddress& rPos,
                              SCCOL nMaxCol, SCROW nMaxRow, ScComplexRefData& rRef );
diff --git a/sc/source/core/tool/address.cxx b/sc/source/core/tool/address.cxx
index e21aa19..33c653e 100644
--- a/sc/source/core/tool/address.cxx
+++ b/sc/source/core/tool/address.cxx
@@ -1337,6 +1337,24 @@ bool ScRange::Intersects( const ScRange& r ) const
         );
 }
 
+void ScRange::PutInOrder()
+{
+    SCCOL nCol1 = aStart.Col(), nCol2 = aEnd.Col();
+    SCROW nRow1 = aStart.Row(), nRow2 = aEnd.Row();
+    SCTAB nTab1 = aStart.Tab(), nTab2 = aEnd.Tab();
+
+    ::PutInOrder(nCol1, nCol2);
+    ::PutInOrder(nRow1, nRow2);
+    ::PutInOrder(nTab1, nTab2);
+
+    aStart.SetCol(nCol1);
+    aStart.SetRow(nRow1);
+    aStart.SetTab(nTab1);
+
+    aEnd.SetCol(nCol2);
+    aEnd.SetRow(nRow2);
+    aEnd.SetTab(nTab2);
+}
 
 void ScRange::Justify()
 {
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index cd5cef0..494ed65 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -4206,13 +4206,16 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
             aNewRef.IncRow(nDy);
             aNewRef.IncTab(nDz);
             if ( r.In( aNewRef ) )
-            {   // yes, this is URM_MOVE
-                if ( ScRefUpdate::Update( pDoc, URM_MOVE, aPos,
-                        r, nDx, nDy, nDz,
-                        SingleDoubleRefModifier( rRef ).Ref() )
-                        != UR_NOTHING
-                    )
+            {
+                SingleDoubleRefModifier aMod(rRef);
+                ScComplexRefData& rRef2 = aMod.Ref();
+                ScRange aRefRange = rRef2.toAbs(rOldPos);
+                // yes, this is URM_MOVE
+                if (ScRefUpdate::Update(pDoc, URM_MOVE, aPos, r, nDx, nDy, nDz, rRef2, aRefRange) != UR_NOTHING)
+                {
+                    rRef2.SetRange(aRefRange, rOldPos);
                     rChanged = true;
+                }
             }
         }
         // Check for SharedFormulas.
@@ -4296,29 +4299,30 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
                     break;
                 case svSingleRef:
                 {
-                    t->CalcAbsIfRel( rOldPos );
                     SingleDoubleRefModifier aRefMod(t->GetSingleRef());
                     ScComplexRefData& rRef = aRefMod.Ref();
-                    if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef) != UR_NOTHING)
+                    ScRange aRefRange = rRef.toAbs(rOldPos);
+                    if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange) != UR_NOTHING)
+                    {
+                        rRef.SetRange(aRefRange, rOldPos);
                         rChanged = true;
+                    }
                 }
                 break;
                 default:
                 {
                     ScComplexRefData& rRef = t->GetDoubleRef();
-                    ScRange aAbs = rRef.toAbs(rOldPos);
-                    SCCOL nCols = aAbs.aEnd.Col() - aAbs.aStart.Col();
-                    SCROW nRows = aAbs.aEnd.Row() - aAbs.aStart.Row();
-                    SCTAB nTabs = aAbs.aEnd.Tab() - aAbs.aStart.Tab();
-                    t->CalcAbsIfRel( rOldPos );
-                    if ( ScRefUpdate::Update( pDoc, eUpdateRefMode,
-                                aPos, r, nDx, nDy, nDz,
-                                t->GetDoubleRef()) != UR_NOTHING)
+                    ScRange aRefRange = rRef.toAbs(rOldPos);
+                    SCCOL nCols = aRefRange.aEnd.Col() - aRefRange.aStart.Col();
+                    SCROW nRows = aRefRange.aEnd.Row() - aRefRange.aStart.Row();
+                    SCTAB nTabs = aRefRange.aEnd.Tab() - aRefRange.aStart.Tab();
+                    if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange) != UR_NOTHING)
                     {
+                        rRef.SetRange(aRefRange, rOldPos);
                         rChanged = true;
-                        if (rRef.Ref2.nCol - rRef.Ref1.nCol != nCols ||
-                                rRef.Ref2.nRow - rRef.Ref1.nRow != nRows ||
-                                rRef.Ref2.nTab - rRef.Ref1.nTab != nTabs)
+                        if (aRefRange.aEnd.Col() - aRefRange.aStart.Col() != nCols ||
+                            aRefRange.aEnd.Row() - aRefRange.aStart.Row() != nRows ||
+                            aRefRange.aEnd.Tab() - aRefRange.aStart.Tab() != nTabs)
                             rRefSizeChanged = true;
                     }
                 }
@@ -4335,38 +4339,35 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
         {
             ScSingleRefData& rRef = t->GetSingleRef();
             SingleDoubleRefModifier aMod( rRef );
-            if ( rRef.IsRelName() )
+            if (!rRef.IsRelName())
             {
-                ScRefUpdate::MoveRelWrap( pDoc, aPos, MAXCOL, MAXROW, aMod.Ref() );
-                rChanged = true;
-            }
-            else
-            {
-                aMod.Ref().CalcAbsIfRel( rOldPos );
-                if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
-                            r, nDx, nDy, nDz, aMod.Ref() )
-                        != UR_NOTHING
-                    )
+                ScComplexRefData& rRef2 = aMod.Ref();
+                ScRange aRefRange = rRef2.toAbs(rOldPos);
+                if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef2, aRefRange) != UR_NOTHING)
+                {
+                    rRef2.SetRange(aRefRange, rOldPos);
                     rChanged = true;
+                }
             }
         }
         else
         {
             ScComplexRefData& rRef = t->GetDoubleRef();
-            SCCOL nCols = rRef.Ref2.nCol - rRef.Ref1.nCol;
-            SCROW nRows = rRef.Ref2.nRow - rRef.Ref1.nRow;
-            SCTAB nTabs = rRef.Ref2.nTab - rRef.Ref1.nTab;
+            ScRange aRefRange = rRef.toAbs(rOldPos);
+            SCCOL nCols = aRefRange.aEnd.Col() - aRefRange.aStart.Col();
+            SCROW nRows = aRefRange.aEnd.Row() - aRefRange.aStart.Row();
+            SCTAB nTabs = aRefRange.aEnd.Tab() - aRefRange.aStart.Tab();
             if ( rRef.Ref1.IsRelName() || rRef.Ref2.IsRelName() )
             {
-                ScRefUpdate::MoveRelWrap( pDoc, aPos, MAXCOL, MAXROW, rRef );
-                rChanged = true;
+                // do nothing
             }
-            else if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef) != UR_NOTHING)
+            else if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange) != UR_NOTHING)
             {
+                rRef.SetRange(aRefRange, rOldPos);
                 rChanged = true;
-                if (rRef.Ref2.nCol - rRef.Ref1.nCol != nCols ||
-                        rRef.Ref2.nRow - rRef.Ref1.nRow != nRows ||
-                        rRef.Ref2.nTab - rRef.Ref1.nTab != nTabs)
+                if (aRefRange.aEnd.Col() - aRefRange.aStart.Col() != nCols ||
+                    aRefRange.aEnd.Row() - aRefRange.aStart.Row() != nRows ||
+                    aRefRange.aEnd.Tab() - aRefRange.aStart.Tab() != nTabs)
                 {
                     rRefSizeChanged = true;
                 }
@@ -4410,11 +4411,12 @@ bool ScCompiler::UpdateNameReference(UpdateRefMode eUpdateRefMode,
         }
         if (bUpdate)
         {
-            rRef.CalcAbsIfRel( aPos);
-            if (ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos, r,
-                        nDx, nDy, nDz, rRef, ScRefUpdate::ABSOLUTE)
-                    != UR_NOTHING )
+            ScRange aRefRange = rRef.toAbs(aPos);
+            if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange, ScRefUpdate::ABSOLUTE) != UR_NOTHING)
+            {
+                rRef.SetRange(aRefRange, aPos);
                 rChanged = true;
+            }
         }
     }
     return bRelRef;
@@ -4435,52 +4437,48 @@ void ScCompiler::UpdateSharedFormulaReference( UpdateRefMode eUpdateRefMode,
         {
             if( t->GetType() != svIndex )   // it may be a DB area!!!
             {
-                t->CalcAbsIfRel( rOldPos );
                 // Absolute references have been already adjusted in the named
                 // shared formula itself prior to breaking the shared formula
                 // and calling this function. Don't readjust them again.
                 SingleDoubleRefModifier aMod( *t );
                 ScComplexRefData& rRef = aMod.Ref();
                 ScComplexRefData aBkp = rRef;
-                ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
-                                            r, nDx, nDy, nDz, rRef );
+                ScRange aRefRange = rRef.toAbs(rOldPos);
+                ScRange aBkpRange = aRefRange;
+                ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange);
+                rRef.SetRange(aRefRange, rOldPos);
+
                 // restore absolute parts
                 if ( !aBkp.Ref1.IsColRel() )
                 {
-                    rRef.Ref1.nCol = aBkp.Ref1.nCol;
-                    rRef.Ref1.nRelCol = aBkp.Ref1.nRelCol;
+                    rRef.Ref1.nCol = aBkpRange.aStart.Col();
                     rRef.Ref1.SetColDeleted( aBkp.Ref1.IsColDeleted() );
                 }
                 if ( !aBkp.Ref1.IsRowRel() )
                 {
-                    rRef.Ref1.nRow = aBkp.Ref1.nRow;
-                    rRef.Ref1.nRelRow = aBkp.Ref1.nRelRow;
+                    rRef.Ref1.nRow = aBkpRange.aStart.Row();
                     rRef.Ref1.SetRowDeleted( aBkp.Ref1.IsRowDeleted() );
                 }
                 if ( !aBkp.Ref1.IsTabRel() )
                 {
-                    rRef.Ref1.nTab = aBkp.Ref1.nTab;
-                    rRef.Ref1.nRelTab = aBkp.Ref1.nRelTab;
+                    rRef.Ref1.nTab = aBkpRange.aStart.Tab();
                     rRef.Ref1.SetTabDeleted( aBkp.Ref1.IsTabDeleted() );
                 }
                 if ( t->GetType() == svDoubleRef )
                 {
                     if ( !aBkp.Ref2.IsColRel() )
                     {
-                        rRef.Ref2.nCol = aBkp.Ref2.nCol;
-                        rRef.Ref2.nRelCol = aBkp.Ref2.nRelCol;
+                        rRef.Ref2.nCol = aBkpRange.aEnd.Col();
                         rRef.Ref2.SetColDeleted( aBkp.Ref2.IsColDeleted() );
                     }
                     if ( !aBkp.Ref2.IsRowRel() )
                     {
-                        rRef.Ref2.nRow = aBkp.Ref2.nRow;
-                        rRef.Ref2.nRelRow = aBkp.Ref2.nRelRow;
+                        rRef.Ref2.nRow = aBkpRange.aEnd.Row();
                         rRef.Ref2.SetRowDeleted( aBkp.Ref2.IsRowDeleted() );
                     }
                     if ( !aBkp.Ref2.IsTabRel() )
                     {
-                        rRef.Ref2.nTab = aBkp.Ref2.nTab;
-                        rRef.Ref2.nRelTab = aBkp.Ref2.nRelTab;
+                        rRef.Ref2.nTab = aBkpRange.aEnd.Tab();
                         rRef.Ref2.SetTabDeleted( aBkp.Ref2.IsTabDeleted() );
                     }
                 }
diff --git a/sc/source/core/tool/refupdat.cxx b/sc/source/core/tool/refupdat.cxx
index c4e493d..8ad478b 100644
--- a/sc/source/core/tool/refupdat.cxx
+++ b/sc/source/core/tool/refupdat.cxx
@@ -481,20 +481,20 @@ ScRefUpdateRes ScRefUpdate::Update( UpdateRefMode eUpdateRefMode,
 }
 
 
-ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
-                                    const ScAddress& rPos, const ScRange& r,
-                                    SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
-                                    ScComplexRefData& rRef, WhatType eWhat )
+ScRefUpdateRes ScRefUpdate::Update(
+    ScDocument* pDoc, UpdateRefMode eMode, const ScAddress& rPos, const ScRange& rRange,
+    SCsCOL nDx, SCsROW nDy, SCsTAB nDz, ScComplexRefData& rRef, ScRange& rRefRange,
+    WhatType eWhat )
 {
     ScRefUpdateRes eRet = UR_NOTHING;
 
     // Range that shifted.
-    SCCOL nCol1 = r.aStart.Col();
-    SCROW nRow1 = r.aStart.Row();
-    SCTAB nTab1 = r.aStart.Tab();
-    SCCOL nCol2 = r.aEnd.Col();
-    SCROW nRow2 = r.aEnd.Row();
-    SCTAB nTab2 = r.aEnd.Tab();
+    SCCOL nCol1 = rRange.aStart.Col();
+    SCROW nRow1 = rRange.aStart.Row();
+    SCTAB nTab1 = rRange.aStart.Tab();
+    SCCOL nCol2 = rRange.aEnd.Col();
+    SCROW nRow2 = rRange.aEnd.Row();
+    SCTAB nTab2 = rRange.aEnd.Tab();
 
     if( eMode == URM_INSDEL )
     {
@@ -506,12 +506,12 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
             ( pChangeTrack ? pChangeTrack->IsInDeleteUndo() : false );
 
         // Store the old reference range.
-        SCCOL nOldCol1 = rRef.Ref1.nCol;
-        SCROW nOldRow1 = rRef.Ref1.nRow;
-        SCTAB nOldTab1 = rRef.Ref1.nTab;
-        SCCOL nOldCol2 = rRef.Ref2.nCol;
-        SCROW nOldRow2 = rRef.Ref2.nRow;
-        SCTAB nOldTab2 = rRef.Ref2.nTab;
+        SCCOL nOldCol1 = rRefRange.aStart.Col();
+        SCROW nOldRow1 = rRefRange.aStart.Row();
+        SCTAB nOldTab1 = rRefRange.aStart.Tab();
+        SCCOL nOldCol2 = rRefRange.aEnd.Col();
+        SCROW nOldRow2 = rRefRange.aEnd.Row();
+        SCTAB nOldTab2 = rRefRange.aEnd.Tab();
 
         bool bRef1ColDel = rRef.Ref1.IsColDeleted();
         bool bRef2ColDel = rRef.Ref2.IsColDeleted();
@@ -521,30 +521,31 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
         bool bRef2TabDel = rRef.Ref2.IsTabDeleted();
 
         if (nDx &&
-            ((nRow1 <= rRef.Ref1.nRow && rRef.Ref2.nRow <= nRow2) || (bRef1RowDel || bRef2RowDel)) &&
-            ((nTab1 <= rRef.Ref1.nTab && rRef.Ref2.nTab <= nTab2) || (bRef1TabDel || bRef2TabDel)))
+            ((nRow1 <= rRefRange.aStart.Row() && rRefRange.aEnd.Row() <= nRow2) || (bRef1RowDel || bRef2RowDel)) &&
+            ((nTab1 <= rRefRange.aStart.Tab() && rRefRange.aEnd.Tab() <= nTab2) || (bRef1TabDel || bRef2TabDel)))
         {
             // Shift in the column direction, reference range has at least one
             // deleted row or sheet, and the reference range is within the
             // shifted region.
-            bool bExp = (bExpand && !bInDeleteUndo && IsExpand( rRef.Ref1.nCol,
-                rRef.Ref2.nCol, nCol1, nDx ));
-            bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat ==
-                        ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsColRel()));
-            bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat ==
-                        ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsColRel()));
-            if ( lcl_MoveRefPart( rRef.Ref1.nCol, bRef1ColDel, bDo1,
-                                  rRef.Ref2.nCol, bRef2ColDel, bDo2,
+            bool bExp = (bExpand && !bInDeleteUndo && IsExpand(rRefRange.aStart.Col(), rRefRange.aEnd.Col(), nCol1, nDx));
+            bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat == ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsColRel()));
+            bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat == ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsColRel()));
+            SCCOL nRefCol1 = rRefRange.aStart.Col(), nRefCol2 = rRefRange.aEnd.Col();
+            if ( lcl_MoveRefPart(nRefCol1, bRef1ColDel, bDo1,
+                                 nRefCol2, bRef2ColDel, bDo2,
                                   nCol1, nCol2, nDx, MAXCOL ) )
             {
+                rRefRange.aStart.SetCol(nRefCol1);
+                rRefRange.aEnd.SetCol(nRefCol2);
+
                 eRet = UR_UPDATED;
                 if ( bInDeleteUndo && (bRef1ColDel || bRef2ColDel) )
                 {
-                    if ( bRef1ColDel && nCol1 <= rRef.Ref1.nCol &&
-                            rRef.Ref1.nCol <= nCol1 + nDx )
+                    if (bRef1ColDel &&
+                        nCol1 <= rRefRange.aStart.Col() && rRefRange.aStart.Col() <= nCol1 + nDx)
                         rRef.Ref1.SetColDeleted( false );
-                    if ( bRef2ColDel && nCol1 <= rRef.Ref2.nCol &&
-                            rRef.Ref2.nCol <= nCol1 + nDx )
+                    if (bRef2ColDel &&
+                        nCol1 <= rRefRange.aEnd.Col() && rRefRange.aEnd.Col() <= nCol1 + nDx)
                         rRef.Ref2.SetColDeleted( false );
                 }
                 else
@@ -557,36 +558,39 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
             }
             if ( bExp )
             {
-                Expand( rRef.Ref1.nCol, rRef.Ref2.nCol, nCol1, nDx );
+                nRefCol1 = rRefRange.aStart.Col();
+                nRefCol2 = rRefRange.aEnd.Col();
+                Expand(nRefCol1, nRefCol2, nCol1, nDx);
+                rRefRange.aStart.SetCol(nRefCol1);
+                rRefRange.aEnd.SetCol(nRefCol2);
+
                 eRet = UR_UPDATED;
             }
         }
 
         if (nDy &&
-            ((nCol1 <= rRef.Ref1.nCol && rRef.Ref2.nCol <= nCol2) || (bRef1ColDel || bRef2ColDel)) &&
-            ((nTab1 <= rRef.Ref1.nTab && rRef.Ref2.nTab <= nTab2) || (bRef1TabDel || bRef2TabDel)))
+            ((nCol1 <= rRefRange.aStart.Col() && rRefRange.aEnd.Col() <= nCol2) || (bRef1ColDel || bRef2ColDel)) &&
+            ((nTab1 <= rRefRange.aStart.Tab() && rRefRange.aEnd.Tab() <= nTab2) || (bRef1TabDel || bRef2TabDel)))
         {
             // Shift in the row direction, reference range has at least one
             // deleted column or sheet, and the reference range is within the
             // shifted region.
-            bool bExp = (bExpand && !bInDeleteUndo && IsExpand( rRef.Ref1.nRow,
-                rRef.Ref2.nRow, nRow1, nDy ));
+            bool bExp = (bExpand && !bInDeleteUndo && IsExpand(rRefRange.aStart.Row(), rRefRange.aEnd.Row(), nRow1, nDy));
             bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat ==
                         ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsRowRel()));
             bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat ==
                         ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsRowRel()));
-            if ( lcl_MoveRefPart( rRef.Ref1.nRow, bRef1RowDel, bDo1,
-                                rRef.Ref2.nRow, bRef2RowDel, bDo2,
-                                nRow1, nRow2, nDy, MAXROW ) )
+            SCROW nRefRow1 = rRefRange.aStart.Row(), nRefRow2 = rRefRange.aEnd.Row();
+            if (lcl_MoveRefPart(nRefRow1, bRef1RowDel, bDo1, nRefRow2, bRef2RowDel, bDo2, nRow1, nRow2, nDy, MAXROW))
             {
+                rRefRange.aStart.SetRow(nRefRow1);
+                rRefRange.aEnd.SetRow(nRefRow2);
                 eRet = UR_UPDATED;
                 if ( bInDeleteUndo && (bRef1RowDel || bRef2RowDel) )
                 {
-                    if ( bRef1RowDel && nRow1 <= rRef.Ref1.nRow &&
-                            rRef.Ref1.nRow <= nRow1 + nDy )
+                    if (bRef1RowDel && nRow1 <= rRefRange.aStart.Row() && rRefRange.aStart.Row() <= nRow1 + nDy)
                         rRef.Ref1.SetRowDeleted( false );
-                    if ( bRef2RowDel && nRow1 <= rRef.Ref2.nRow &&
-                            rRef.Ref2.nRow <= nRow1 + nDy )
+                    if (bRef2RowDel && nRow1 <= rRefRange.aEnd.Row() && rRefRange.aEnd.Row() <= nRow1 + nDy)
                         rRef.Ref2.SetRowDeleted( false );
                 }
                 else
@@ -599,37 +603,40 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
             }
             if ( bExp )
             {
-                Expand( rRef.Ref1.nRow, rRef.Ref2.nRow, nRow1, nDy );
+                nRefRow1 = rRefRange.aStart.Row();
+                nRefRow2 = rRefRange.aEnd.Row();
+                Expand(nRefRow1, nRefRow2, nRow1, nDy);
+                rRefRange.aStart.SetRow(nRefRow1);
+                rRefRange.aEnd.SetRow(nRefRow2);
                 eRet = UR_UPDATED;
             }
         }
 
         if (nDz &&
-            ((nCol1 <= rRef.Ref1.nCol && rRef.Ref2.nCol <= nCol2) || (bRef1ColDel || bRef2ColDel)) &&
-            ((nRow1 <= rRef.Ref1.nRow && rRef.Ref2.nRow <= nRow2) || (bRef1RowDel || bRef2RowDel)))
+            ((nCol1 <= rRefRange.aStart.Col() && rRefRange.aEnd.Col() <= nCol2) || (bRef1ColDel || bRef2ColDel)) &&
+            ((nRow1 <= rRefRange.aStart.Row() && rRefRange.aEnd.Row() <= nRow2) || (bRef1RowDel || bRef2RowDel)))
         {
             // Shift in the sheet direction, reference range has at least one
             // deleted column or row, and the reference range is within the
             // shifted region.
-            bool bExp = (bExpand && !bInDeleteUndo && IsExpand( rRef.Ref1.nTab,
-                rRef.Ref2.nTab, nTab1, nDz ));
+            bool bExp = (bExpand && !bInDeleteUndo && IsExpand(rRefRange.aStart.Tab(), rRefRange.aEnd.Tab(), nTab1, nDz));
             SCTAB nMaxTab = pDoc->GetTableCount() - 1;
             bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat ==
                         ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsTabRel()));
             bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat ==
                         ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsTabRel()));
-            if ( lcl_MoveRefPart( rRef.Ref1.nTab, bRef1TabDel, bDo1,
-                                  rRef.Ref2.nTab, bRef2TabDel, bDo2,
-                                  nTab1, nTab2, nDz, nMaxTab ) )
+
+            SCTAB nRefTab1 = rRefRange.aStart.Tab(), nRefTab2 = rRefRange.aEnd.Tab();
+            if (lcl_MoveRefPart(nRefTab1, bRef1TabDel, bDo1, nRefTab2, bRef2TabDel, bDo2, nTab1, nTab2, nDz, nMaxTab))
             {
+                rRefRange.aStart.SetTab(nRefTab1);
+                rRefRange.aEnd.SetTab(nRefTab2);
                 eRet = UR_UPDATED;
                 if ( bInDeleteUndo && (bRef1TabDel || bRef2TabDel) )
                 {
-                    if ( bRef1TabDel && nTab1 <= rRef.Ref1.nTab &&
-                            rRef.Ref1.nTab <= nTab1 + nDz )
+                    if (bRef1TabDel && nTab1 <= rRefRange.aStart.Tab() && rRefRange.aStart.Tab() <= nTab1 + nDz)
                         rRef.Ref1.SetTabDeleted( false );
-                    if ( bRef2TabDel && nTab1 <= rRef.Ref2.nTab &&
-                            rRef.Ref2.nTab <= nTab1 + nDz )
+                    if (bRef2TabDel && nTab1 <= rRefRange.aEnd.Tab() && rRefRange.aEnd.Tab() <= nTab1 + nDz)
                         rRef.Ref2.SetTabDeleted( false );
                 }
                 else
@@ -642,73 +649,68 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
             }
             if ( bExp )
             {
-                Expand( rRef.Ref1.nTab, rRef.Ref2.nTab, nTab1, nDz );
+                nRefTab1 = rRefRange.aStart.Tab();
+                nRefTab2 = rRefRange.aEnd.Tab();
+                Expand(nRefTab1, nRefTab2, nTab1, nDz);
+                rRefRange.aStart.SetTab(nRefTab1);
+                rRefRange.aEnd.SetTab(nRefTab2);
                 eRet = UR_UPDATED;
             }
         }
         if ( eRet == UR_NOTHING )
         {
-            if (nOldCol1 != rRef.Ref1.nCol
-             || nOldRow1 != rRef.Ref1.nRow
-             || nOldTab1 != rRef.Ref1.nTab
-             || nOldCol2 != rRef.Ref2.nCol
-             || nOldRow2 != rRef.Ref2.nRow
-             || nOldTab2 != rRef.Ref2.nTab
+            if (nOldCol1 != rRefRange.aStart.Col()
+             || nOldRow1 != rRefRange.aStart.Row()
+             || nOldTab1 != rRefRange.aStart.Tab()
+             || nOldCol2 != rRefRange.aEnd.Col()
+             || nOldRow2 != rRefRange.aEnd.Row()
+             || nOldTab2 != rRefRange.aEnd.Tab()
                 )
                 // Reference has changed, but the flag has not been set !?
                 eRet = UR_UPDATED;
         }
-        if (eWhat != ScRefUpdate::ABSOLUTE)
-            rRef.CalcRelFromAbs( rPos );
     }
     else if( eMode == URM_MOVE )
     {
         // Move
-        if ( rRef.Ref1.nCol >= nCol1-nDx
-          && rRef.Ref1.nRow >= nRow1-nDy
-          && rRef.Ref1.nTab >= nTab1-nDz
-          && rRef.Ref2.nCol <= nCol2-nDx
-          && rRef.Ref2.nRow <= nRow2-nDy
-          && rRef.Ref2.nTab <= nTab2-nDz )
+        if ( rRefRange.aStart.Col() >= nCol1-nDx
+          && rRefRange.aStart.Row() >= nRow1-nDy
+          && rRefRange.aStart.Tab() >= nTab1-nDz
+          && rRefRange.aEnd.Col() <= nCol2-nDx
+          && rRefRange.aEnd.Row() <= nRow2-nDy
+          && rRefRange.aEnd.Tab() <= nTab2-nDz )
         {
-            eRet = Move( pDoc, rPos, nDx, nDy, nDz, rRef, false, true );        // immer verschieben
+            eRet = Move(pDoc, rPos, nDx, nDy, nDz, rRef, rRefRange, false, true);        // immer verschieben
         }
-        else if ( nDz && r.In( rPos ) )
+        else if ( nDz && rRange.In( rPos ) )
         {
             rRef.Ref1.SetFlag3D( true );
             rRef.Ref2.SetFlag3D( true );
             eRet = UR_UPDATED;
-            if (eWhat != ScRefUpdate::ABSOLUTE)
-                rRef.CalcRelFromAbs( rPos );
         }
-        else if (eWhat != ScRefUpdate::ABSOLUTE)
-            rRef.CalcRelFromAbs( rPos );
     }
-    else if( eMode == URM_COPY && r.In( rPos ) )
+    else if( eMode == URM_COPY && rRange.In( rPos ) )
     {
-        eRet = Move( pDoc, rPos, nDx, nDy, nDz, rRef, false, false );       // nur relative
+        eRet = Move(pDoc, rPos, nDx, nDy, nDz, rRef, rRefRange, false, false);       // nur relative
         // sollte nicht mehr verwendet werden muessen
     }
-    else if (eWhat != ScRefUpdate::ABSOLUTE)
-    {
-        rRef.CalcRelFromAbs( rPos );
-    }
+
     return eRet;
 }
 
 
-ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
-                                  SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
-                                  ScComplexRefData& rRef, bool bWrap, bool bAbsolute )
+ScRefUpdateRes ScRefUpdate::Move(
+    ScDocument* pDoc, const ScAddress& rPos, SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
+    ScComplexRefData& rRef, ScRange& rRefRange, bool bWrap, bool bAbsolute )
 {
     ScRefUpdateRes eRet = UR_NOTHING;
 
-    SCCOL oldCol1 = rRef.Ref1.nCol;
-    SCROW oldRow1 = rRef.Ref1.nRow;
-    SCTAB oldTab1 = rRef.Ref1.nTab;
-    SCCOL oldCol2 = rRef.Ref2.nCol;
-    SCROW oldRow2 = rRef.Ref2.nRow;
-    SCTAB oldTab2 = rRef.Ref2.nTab;
+    SCCOL nOldCol1 = rRef.Ref1.nCol;
+    SCROW nOldRow1 = rRef.Ref1.nRow;
+    SCTAB nOldTab1 = rRef.Ref1.nTab;
+    SCCOL nOldCol2 = rRef.Ref2.nCol;
+    SCROW nOldRow2 = rRef.Ref2.nRow;
+    SCTAB nOldTab2 = rRef.Ref2.nTab;
 
     bool bCut1, bCut2;
     if ( nDx )
@@ -716,17 +718,25 @@ ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
         bCut1 = bCut2 = false;
         if( bAbsolute || rRef.Ref1.IsColRel() )
         {
+            SCCOL nRefCol1 = rRefRange.aStart.Col();
             if( bWrap )
-                lcl_MoveItWrap( rRef.Ref1.nCol, nDx, MAXCOL );
+            {
+                lcl_MoveItWrap(nRefCol1, nDx, MAXCOL);
+            }
             else
-                bCut1 = lcl_MoveItCut( rRef.Ref1.nCol, nDx, MAXCOL );
+            {
+                bCut1 = lcl_MoveItCut(nRefCol1, nDx, MAXCOL);
+            }
+            rRefRange.aStart.SetCol(nRefCol1);
         }
         if( bAbsolute || rRef.Ref2.IsColRel() )
         {
+            SCCOL nRefCol2 = rRefRange.aEnd.Col();
             if( bWrap )
-                lcl_MoveItWrap( rRef.Ref2.nCol, nDx, MAXCOL );
+                lcl_MoveItWrap(nRefCol2, nDx, MAXCOL);
             else
-                bCut2 = lcl_MoveItCut( rRef.Ref2.nCol, nDx, MAXCOL );
+                bCut2 = lcl_MoveItCut(nRefCol2, nDx, MAXCOL);
+            rRefRange.aEnd.SetCol(nRefCol2);
         }
         if ( bCut1 || bCut2 )
             eRet = UR_UPDATED;
@@ -741,17 +751,21 @@ ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
         bCut1 = bCut2 = false;
         if( bAbsolute || rRef.Ref1.IsRowRel() )
         {
+            SCROW nRefRow1 = rRefRange.aStart.Row();
             if( bWrap )
-                lcl_MoveItWrap( rRef.Ref1.nRow, nDy, MAXROW );
+                lcl_MoveItWrap(nRefRow1, nDy, MAXROW);
             else
-                bCut1 = lcl_MoveItCut( rRef.Ref1.nRow, nDy, MAXROW );
+                bCut1 = lcl_MoveItCut(nRefRow1, nDy, MAXROW);
+            rRefRange.aStart.SetRow(nRefRow1);
         }
         if( bAbsolute || rRef.Ref2.IsRowRel() )
         {
+            SCROW nRefRow2 = rRefRange.aEnd.Row();
             if( bWrap )
-                lcl_MoveItWrap( rRef.Ref2.nRow, nDy, MAXROW );
+                lcl_MoveItWrap(nRefRow2, nDy, MAXROW);
             else
-                bCut2 = lcl_MoveItCut( rRef.Ref2.nRow, nDy, MAXROW );
+                bCut2 = lcl_MoveItCut(nRefRow2, nDy, MAXROW);
+            rRefRange.aEnd.SetRow(nRefRow2);
         }
         if ( bCut1 || bCut2 )
             eRet = UR_UPDATED;
@@ -767,19 +781,23 @@ ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
         SCsTAB nMaxTab = (SCsTAB) pDoc->GetTableCount() - 1;
         if( bAbsolute || rRef.Ref1.IsTabRel() )
         {
+            SCTAB nRefTab1 = rRefRange.aStart.Tab();
             if( bWrap )
-                lcl_MoveItWrap( rRef.Ref1.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
+                lcl_MoveItWrap(nRefTab1, nDz, static_cast<SCTAB>(nMaxTab));
             else
-                bCut1 = lcl_MoveItCut( rRef.Ref1.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
-            rRef.Ref1.SetFlag3D( rPos.Tab() != rRef.Ref1.nTab );
+                bCut1 = lcl_MoveItCut(nRefTab1, nDz, static_cast<SCTAB>(nMaxTab));
+            rRefRange.aStart.SetTab(nRefTab1);
+            rRef.Ref1.SetFlag3D(rPos.Tab() != rRefRange.aStart.Tab());
         }
         if( bAbsolute || rRef.Ref2.IsTabRel() )
         {
+            SCTAB nRefTab2 = rRefRange.aEnd.Tab();
             if( bWrap )
-                lcl_MoveItWrap( rRef.Ref2.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
+                lcl_MoveItWrap(nRefTab2, nDz, static_cast<SCTAB>(nMaxTab));
             else
-                bCut2 = lcl_MoveItCut( rRef.Ref2.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
-            rRef.Ref2.SetFlag3D( rPos.Tab() != rRef.Ref2.nTab );
+                bCut2 = lcl_MoveItCut(nRefTab2, nDz, static_cast<SCTAB>(nMaxTab));
+            rRefRange.aEnd.SetTab(nRefTab2);
+            rRef.Ref2.SetFlag3D(rPos.Tab() != rRefRange.aEnd.Tab());
         }
         if ( bCut1 || bCut2 )
             eRet = UR_UPDATED;
@@ -792,18 +810,20 @@ ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
 
     if ( eRet == UR_NOTHING )
     {
-        if (oldCol1 != rRef.Ref1.nCol
-         || oldRow1 != rRef.Ref1.nRow
-         || oldTab1 != rRef.Ref1.nTab
-         || oldCol2 != rRef.Ref2.nCol
-         || oldRow2 != rRef.Ref2.nRow
-         || oldTab2 != rRef.Ref2.nTab
+        if (nOldCol1 != rRef.Ref1.nCol
+         || nOldRow1 != rRef.Ref1.nRow
+         || nOldTab1 != rRef.Ref1.nTab
+         || nOldCol2 != rRef.Ref2.nCol
+         || nOldRow2 != rRef.Ref2.nRow
+         || nOldTab2 != rRef.Ref2.nTab
             )
             eRet = UR_UPDATED;
     }
     if ( bWrap && eRet != UR_NOTHING )
+    {
         rRef.PutInOrder();
-    rRef.CalcRelFromAbs( rPos );
+        rRefRange.PutInOrder();
+    }
     return eRet;
 }
 


More information about the Libreoffice-commits mailing list