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

Kohei Yoshida kohei.yoshida at gmail.com
Mon Jul 15 20:02:02 PDT 2013


 sc/inc/address.hxx                   |    8 +
 sc/inc/refdata.hxx                   |    1 
 sc/qa/unit/ucalc_formula.cxx         |    3 
 sc/source/core/tool/compiler.cxx     |  202 ++++++++++++++++-------------------
 sc/source/core/tool/interpr1.cxx     |    8 -
 sc/source/core/tool/interpr4.cxx     |    7 -
 sc/source/core/tool/refdata.cxx      |   18 +++
 sc/source/filter/excel/xeformula.cxx |   27 ++--
 sc/source/ui/miscdlgs/anyrefdg.cxx   |    7 -
 9 files changed, 150 insertions(+), 131 deletions(-)

New commits:
commit 7acfbfbbade70a05c8ffa02fe84c1e00f7cfb480
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Mon Jul 15 23:02:02 2013 -0400

    Test all 3 UI grammars.
    
    Change-Id: I82a3a5ada193415c8b70bf2c2bfefc49fbcd7981

diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index 5d1d082..7b029de 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -116,6 +116,9 @@ void Test::testFormulaCompiler()
         const char* pOutput; FormulaGrammar::Grammar eOutputGram;
     } aTests[] = {
         { "=B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE, "[.B1]-[.$C2]+[.D$3]-[.$E$4]", FormulaGrammar::GRAM_ODFF },
+        { "=B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE, "B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE },
+        { "=B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE, "B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE_XL_A1 },
+        { "=B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE, "RC[1]-R[1]C3+R3C[3]-R4C5", FormulaGrammar::GRAM_NATIVE_XL_R1C1 },
     };
 
     for (size_t i = 0, n = SAL_N_ELEMENTS(aTests); i < n; ++i)
commit 1eb04087c64fc0c2aadff740819f3e4135b19b2b
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Mon Jul 15 22:51:29 2013 -0400

    Start replacing CalcAbsIfRel() with toAbs().
    
    To avoid changing the state of reference just to get absolute reference
    position with respect to the base position.
    
    I'm not finished with it yet.
    
    Change-Id: I4a9db6dbf74aefb0a77de927a933cf4dab94bfd5

diff --git a/sc/inc/address.hxx b/sc/inc/address.hxx
index 2f59565..84c62cb 100644
--- a/sc/inc/address.hxx
+++ b/sc/inc/address.hxx
@@ -420,6 +420,10 @@ struct ScAddressEqualFunctor
     }
 };
 
+inline bool ValidAddress( const ScAddress& rAddr )
+{
+    return ValidCol(rAddr.Col()) && ValidRow(rAddr.Row()) && ValidTab(rAddr.Tab());
+}
 
 // === ScRange ===============================================================
 
@@ -616,6 +620,10 @@ struct ScRangeEqualFunctor
     }
 };
 
+inline bool ValidRange( const ScRange& rRange )
+{
+    return ValidAddress(rRange.aStart) && ValidAddress(rRange.aEnd);
+}
 
 // === ScRangePair ===========================================================
 
diff --git a/sc/inc/refdata.hxx b/sc/inc/refdata.hxx
index 0eef078..d79590c 100644
--- a/sc/inc/refdata.hxx
+++ b/sc/inc/refdata.hxx
@@ -82,6 +82,7 @@ struct SC_DLLPUBLIC ScSingleRefData
     inline  bool ValidExternal() const;
 
     ScAddress toAbs( const ScAddress& rPos ) const;
+    void SetAddress( const ScAddress& rAddr, const ScAddress& rPos );
 
             void CalcRelFromAbs( const ScAddress& rPos );
             void CalcAbsIfRel( const ScAddress& rPos );
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 1fd1cf6..597028b 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -657,9 +657,9 @@ static OUString lcl_makeExternalNameStr(const OUString& rFile, const OUString& r
 }
 
 static bool lcl_getLastTabName( OUString& rTabName2, const OUString& rTabName1,
-                                const vector<OUString>& rTabNames, const ScComplexRefData& rRef )
+                                const vector<OUString>& rTabNames, const ScRange& rRef )
 {
-    SCsTAB nTabSpan = rRef.Ref2.nTab - rRef.Ref1.nTab;
+    SCsTAB nTabSpan = rRef.aEnd.Tab() - rRef.aStart.Tab();
     if (nTabSpan > 0)
     {
         size_t nCount = rTabNames.size();
@@ -764,15 +764,14 @@ struct ConventionOOO_A1 : public Convention_A1
     }
 
 
-    void MakeOneRefStrImpl( OUStringBuffer&    rBuffer,
-                            const ScCompiler&       rComp,
-                            const ScSingleRefData&  rRef,
-                            bool                    bForceTab,
-                            bool                    bODF ) const
+    void MakeOneRefStrImpl(
+        OUStringBuffer& rBuffer, const ScCompiler& rComp,
+        const ScSingleRefData& rRef, const ScAddress& rAbsRef,
+        bool bForceTab, bool bODF ) const
     {
         if( rRef.IsFlag3D() || bForceTab )
         {
-            if (rRef.IsTabDeleted())
+            if (!ValidTab(rAbsRef.Tab()))
             {
                 if (!rRef.IsTabRel())
                     rBuffer.append(sal_Unicode('$'));
@@ -782,7 +781,7 @@ struct ConventionOOO_A1 : public Convention_A1
             else
             {
                 String aDoc;
-                String aRefStr( MakeTabStr( rComp, rRef.nTab, aDoc ) );
+                String aRefStr(MakeTabStr(rComp, rAbsRef.Tab(), aDoc));
                 rBuffer.append(aDoc);
                 if (!rRef.IsTabRel())
                     rBuffer.append(sal_Unicode('$'));
@@ -793,16 +792,16 @@ struct ConventionOOO_A1 : public Convention_A1
             rBuffer.append(sal_Unicode('.'));
         if (!rRef.IsColRel())
             rBuffer.append(sal_Unicode('$'));
-        if ( rRef.IsColDeleted() )
+        if (!ValidCol(rAbsRef.Col()))
             rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef));
         else
-            MakeColStr(rBuffer, rRef.nCol );
+            MakeColStr(rBuffer, rAbsRef.Col());
         if (!rRef.IsRowRel())
             rBuffer.append(sal_Unicode('$'));
-        if ( rRef.IsRowDeleted() )
+        if (!ValidRow(rAbsRef.Row()))
             rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef));
         else
-            MakeRowStr( rBuffer, rRef.nRow );
+            MakeRowStr(rBuffer, rAbsRef.Row());
     }
 
 
@@ -817,23 +816,24 @@ struct ConventionOOO_A1 : public Convention_A1
         ScComplexRefData aRef( rRef );
         // In case absolute/relative positions weren't separately available:
         // transform relative to absolute!
-        aRef.Ref1.CalcAbsIfRel( rComp.GetPos() );
+        ScAddress aAbs1 = aRef.Ref1.toAbs(rComp.GetPos()), aAbs2;
         if( !bSingleRef )
-            aRef.Ref2.CalcAbsIfRel( rComp.GetPos() );
-        if (bODF && FormulaGrammar::isODFF( rComp.GetGrammar()) &&
-                (aRef.Ref1.IsColDeleted() || aRef.Ref1.IsRowDeleted() || aRef.Ref1.IsTabDeleted() ||
-                 aRef.Ref2.IsColDeleted() || aRef.Ref2.IsRowDeleted() || aRef.Ref2.IsTabDeleted()))
+            aAbs2 = aRef.Ref2.toAbs(rComp.GetPos());
+
+        if (bODF && FormulaGrammar::isODFF( rComp.GetGrammar()) && (!ValidAddress(aAbs1) || !ValidAddress(aAbs2)))
+        {
             rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef));
             // For ODFF write [#REF!], but not for PODF so apps reading ODF
             // 1.0/1.1 may have a better chance if they implemented the old
             // form.
+        }
         else
         {
-            MakeOneRefStrImpl( rBuffer, rComp, aRef.Ref1, false, bODF);
+            MakeOneRefStrImpl(rBuffer, rComp, aRef.Ref1, aAbs1, false, bODF);
             if (!bSingleRef)
             {
                 rBuffer.append(sal_Unicode(':'));
-                MakeOneRefStrImpl( rBuffer, rComp, aRef.Ref2, (aRef.Ref2.nTab != aRef.Ref1.nTab), bODF);
+                MakeOneRefStrImpl(rBuffer, rComp, aRef.Ref2, aAbs2, (aRef.Ref2.nTab != aRef.Ref1.nTab), bODF);
             }
         }
         if (bODF)
@@ -874,10 +874,12 @@ struct ConventionOOO_A1 : public Convention_A1
         return lcl_makeExternalNameStr( rFile, rName, sal_Unicode('#'), false);
     }
 
-    bool makeExternalSingleRefStr( OUStringBuffer& rBuffer, sal_uInt16 nFileId,
-                                   const String& rTabName, const ScSingleRefData& rRef,
-                                   ScExternalRefManager* pRefMgr, bool bDisplayTabName, bool bEncodeUrl ) const
+    bool makeExternalSingleRefStr(
+        OUStringBuffer& rBuffer, sal_uInt16 nFileId,
+        const String& rTabName, const ScSingleRefData& rRef, const ScAddress& rPos,
+        ScExternalRefManager* pRefMgr, bool bDisplayTabName, bool bEncodeUrl ) const
     {
+        ScAddress aAbsRef = rRef.toAbs(rPos);
         if (bDisplayTabName)
         {
             OUString aFile;
@@ -904,10 +906,10 @@ struct ConventionOOO_A1 : public Convention_A1
 
         if (!rRef.IsColRel())
             rBuffer.append(sal_Unicode('$'));
-        MakeColStr( rBuffer, rRef.nCol);
+        MakeColStr( rBuffer, aAbsRef.Col());
         if (!rRef.IsRowRel())
             rBuffer.append(sal_Unicode('$'));
-        MakeRowStr( rBuffer, rRef.nRow);
+        MakeRowStr( rBuffer, aAbsRef.Row());
 
         return true;
     }
@@ -916,9 +918,6 @@ struct ConventionOOO_A1 : public Convention_A1
                                      sal_uInt16 nFileId, const String& rTabName, const ScSingleRefData& rRef,
                                      ScExternalRefManager* pRefMgr, bool bODF ) const
     {
-        ScSingleRefData aRef(rRef);
-        aRef.CalcAbsIfRel(rCompiler.GetPos());
-
         if (bODF)
             rBuffer.append( sal_Unicode('['));
 
@@ -937,7 +936,7 @@ struct ConventionOOO_A1 : public Convention_A1
             default:
                 ;
         }
-        makeExternalSingleRefStr(rBuffer, nFileId, rTabName, aRef, pRefMgr, true, bEncodeUrl);
+        makeExternalSingleRefStr(rBuffer, nFileId, rTabName, rRef, rCompiler.GetPos(), pRefMgr, true, bEncodeUrl);
         if (bODF)
             rBuffer.append( sal_Unicode(']'));
     }
@@ -953,8 +952,7 @@ struct ConventionOOO_A1 : public Convention_A1
                                      sal_uInt16 nFileId, const String& rTabName, const ScComplexRefData& rRef,
                                      ScExternalRefManager* pRefMgr, bool bODF ) const
     {
-        ScComplexRefData aRef(rRef);
-        aRef.CalcAbsIfRel(rCompiler.GetPos());
+        ScRange aAbsRange = rRef.toAbs(rCompiler.GetPos());
 
         if (bODF)
             rBuffer.append( sal_Unicode('['));
@@ -977,13 +975,13 @@ struct ConventionOOO_A1 : public Convention_A1
 
         do
         {
-            if (!makeExternalSingleRefStr(rBuffer, nFileId, rTabName, aRef.Ref1, pRefMgr, true, bEncodeUrl))
+            if (!makeExternalSingleRefStr(rBuffer, nFileId, rTabName, rRef.Ref1, rCompiler.GetPos(), pRefMgr, true, bEncodeUrl))
                 break;
 
             rBuffer.append(sal_Unicode(':'));
 
             OUString aLastTabName;
-            bool bDisplayTabName = (aRef.Ref1.nTab != aRef.Ref2.nTab);
+            bool bDisplayTabName = (aAbsRange.aStart.Tab() != aAbsRange.aEnd.Tab());
             if (bDisplayTabName)
             {
                 // Get the name of the last table.
@@ -994,7 +992,7 @@ struct ConventionOOO_A1 : public Convention_A1
                     OSL_TRACE( "ConventionOOO_A1::makeExternalRefStrImpl: no sheet names for document ID %d", nFileId);
                 }
 
-                if (!lcl_getLastTabName(aLastTabName, rTabName, aTabNames, aRef))
+                if (!lcl_getLastTabName(aLastTabName, rTabName, aTabNames, aAbsRange))
                 {
                     OSL_FAIL( "ConventionOOO_A1::makeExternalRefStrImpl: sheet name not found");
                     // aLastTabName contains #REF!, proceed.
@@ -1003,7 +1001,7 @@ struct ConventionOOO_A1 : public Convention_A1
             else if (bODF)
                 rBuffer.append( sal_Unicode('.'));      // need at least the sheet separator in ODF
             makeExternalSingleRefStr( rBuffer, nFileId, aLastTabName,
-                    aRef.Ref2, pRefMgr, bDisplayTabName, bEncodeUrl);
+                    rRef.Ref2, rCompiler.GetPos(), pRefMgr, bDisplayTabName, bEncodeUrl);
         } while (0);
         if (bODF)
             rBuffer.append( sal_Unicode(']'));
@@ -1196,7 +1194,7 @@ struct ConventionXL
 
     static void makeExternalTabNameRange( OUStringBuffer& rBuf, const OUString& rTabName,
                                           const vector<OUString>& rTabNames,
-                                          const ScComplexRefData& rRef )
+                                          const ScRange& rRef )
     {
         OUString aLastTabName;
         if (!lcl_getLastTabName(aLastTabName, rTabName, rTabNames, rRef))
@@ -1272,14 +1270,14 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
     ConventionXL_A1() : Convention_A1( FormulaGrammar::CONV_XL_A1 ) { }
     ConventionXL_A1( FormulaGrammar::AddressConvention eConv ) : Convention_A1( eConv ) { }
 
-    void makeSingleCellStr( OUStringBuffer& rBuf, const ScSingleRefData& rRef ) const
+    void makeSingleCellStr( OUStringBuffer& rBuf, const ScSingleRefData& rRef, const ScAddress& rAbs ) const
     {
         if (!rRef.IsColRel())
             rBuf.append(sal_Unicode('$'));
-        MakeColStr(rBuf, rRef.nCol);
+        MakeColStr(rBuf, rAbs.Col());
         if (!rRef.IsRowRel())
             rBuf.append(sal_Unicode('$'));
-        MakeRowStr(rBuf, rRef.nRow);
+        MakeRowStr(rBuf, rAbs.Row());
     }
 
     void MakeRefStr( OUStringBuffer&   rBuf,
@@ -1291,11 +1289,11 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
 
         // Play fast and loose with invalid refs.  There is not much point in producing
         // Foo!A1:#REF! versus #REF! at this point
-        aRef.Ref1.CalcAbsIfRel( rComp.GetPos() );
+        ScAddress aAbs1 = aRef.Ref1.toAbs(rComp.GetPos()), aAbs2;
 
         MakeDocStr( rBuf, rComp, aRef, bSingleRef );
 
-        if( aRef.Ref1.IsColDeleted() || aRef.Ref1.IsRowDeleted() )
+        if (!ValidAddress(aAbs1))
         {
             rBuf.append(ScGlobal::GetRscString(STR_NO_REF_TABLE));
             return;
@@ -1303,22 +1301,22 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
 
         if( !bSingleRef )
         {
-            aRef.Ref2.CalcAbsIfRel( rComp.GetPos() );
-            if( aRef.Ref2.IsColDeleted() || aRef.Ref2.IsRowDeleted() )
+            aAbs2 = aRef.Ref2.toAbs(rComp.GetPos());
+            if (!ValidAddress(aAbs2))
             {
                 rBuf.append(ScGlobal::GetRscString(STR_NO_REF_TABLE));
                 return;
             }
 
-            if( aRef.Ref1.nCol == 0 && aRef.Ref2.nCol >= MAXCOL )
+            if (aAbs1.Col() == 0 && aAbs2.Col() >= MAXCOL)
             {
                 if (!aRef.Ref1.IsRowRel())
                     rBuf.append(sal_Unicode( '$' ));
-                MakeRowStr( rBuf, aRef.Ref1.nRow );
+                MakeRowStr(rBuf, aAbs1.Row());
                 rBuf.append(sal_Unicode( ':' ));
                 if (!aRef.Ref2.IsRowRel())
                     rBuf.append(sal_Unicode( '$' ));
-                MakeRowStr( rBuf, aRef.Ref2.nRow );
+                MakeRowStr(rBuf, aAbs2.Row());
                 return;
             }
 
@@ -1326,20 +1324,20 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
             {
                 if (!aRef.Ref1.IsColRel())
                     rBuf.append(sal_Unicode( '$' ));
-                MakeColStr(rBuf, aRef.Ref1.nCol );
+                MakeColStr(rBuf, aAbs1.Col());
                 rBuf.append(sal_Unicode( ':' ));
                 if (!aRef.Ref2.IsColRel())
                     rBuf.append(sal_Unicode( '$' ));
-                MakeColStr(rBuf, aRef.Ref2.nCol );
+                MakeColStr(rBuf, aAbs2.Col());
                 return;
             }
         }
 
-        makeSingleCellStr(rBuf, aRef.Ref1);
+        makeSingleCellStr(rBuf, aRef.Ref1, aAbs1);
         if (!bSingleRef)
         {
             rBuf.append(sal_Unicode( ':' ));
-            makeSingleCellStr(rBuf, aRef.Ref2);
+            makeSingleCellStr(rBuf, aRef.Ref2, aAbs2);
         }
     }
 
@@ -1392,15 +1390,12 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
         if (!pFullName)
             return;
 
-        ScSingleRefData aRef(rRef);
-        aRef.CalcAbsIfRel(rCompiler.GetPos());
-
         ConventionXL::makeExternalDocStr(
             rBuffer, *pFullName, rCompiler.GetEncodeUrlMode() == ScCompiler::ENCODE_ALWAYS);
         ScRangeStringConverter::AppendTableName(rBuffer, rTabName);
         rBuffer.append(sal_Unicode('!'));
 
-        makeSingleCellStr(rBuffer, aRef);
+        makeSingleCellStr(rBuffer, rRef, rRef.toAbs(rCompiler.GetPos()));
     }
 
     virtual void makeExternalRefStr( OUStringBuffer& rBuffer, const ScCompiler& rCompiler,
@@ -1416,19 +1411,18 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
         if (aTabNames.empty())
             return;
 
-        ScComplexRefData aRef(rRef);
-        aRef.CalcAbsIfRel(rCompiler.GetPos());
+        ScRange aAbsRef = rRef.toAbs(rCompiler.GetPos());
 
         ConventionXL::makeExternalDocStr(
             rBuffer, *pFullName, rCompiler.GetEncodeUrlMode() == ScCompiler::ENCODE_ALWAYS);
-        ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, aTabNames, aRef);
+        ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, aTabNames, aAbsRef);
         rBuffer.append(sal_Unicode('!'));
 
-        makeSingleCellStr(rBuffer, aRef.Ref1);
-        if (aRef.Ref1 != aRef.Ref2)
+        makeSingleCellStr(rBuffer, rRef.Ref1, aAbsRef.aStart);
+        if (aAbsRef.aStart != aAbsRef.aEnd)
         {
             rBuffer.append(sal_Unicode(':'));
-            makeSingleCellStr(rBuffer, aRef.Ref2);
+            makeSingleCellStr(rBuffer, rRef.Ref2, aAbsRef.aEnd);
         }
     }
 };
@@ -1449,7 +1443,7 @@ const ScCompiler::Convention * const ScCompiler::pConvXL_OOX = &ConvXL_OOX;
 //-----------------------------------------------------------------------------
 
 static void
-r1c1_add_col( OUStringBuffer &rBuf, const ScSingleRefData& rRef )
+r1c1_add_col( OUStringBuffer &rBuf, const ScSingleRefData& rRef, const ScAddress& rAbsRef )
 {
     rBuf.append( sal_Unicode( 'C' ) );
     if( rRef.IsColRel() )
@@ -1458,10 +1452,10 @@ r1c1_add_col( OUStringBuffer &rBuf, const ScSingleRefData& rRef )
             rBuf.append("[").append( OUString::number( rRef.nRelCol ) ).append("]");
     }
     else
-        rBuf.append( OUString::number( rRef.nCol + 1 ) );
+        rBuf.append( OUString::number( rAbsRef.Col() + 1 ) );
 }
 static void
-r1c1_add_row( OUStringBuffer &rBuf, const ScSingleRefData& rRef )
+r1c1_add_row( OUStringBuffer &rBuf, const ScSingleRefData& rRef, const ScAddress& rAbsRef )
 {
     rBuf.append( sal_Unicode( 'R' ) );
     if( rRef.IsRowRel() )
@@ -1472,7 +1466,7 @@ r1c1_add_row( OUStringBuffer &rBuf, const ScSingleRefData& rRef )
         }
     }
     else
-        rBuf.append( OUString::number( rRef.nRow + 1 ) );
+        rBuf.append( OUString::number( rAbsRef.Row() + 1 ) );
 }
 
 struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
@@ -1483,14 +1477,14 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
                      const ScComplexRefData& rRef,
                      bool bSingleRef ) const
     {
+        ScRange aAbsRef = rRef.toAbs(rComp.GetPos());
         ScComplexRefData aRef( rRef );
 
         MakeDocStr( rBuf, rComp, aRef, bSingleRef );
 
         // Play fast and loose with invalid refs.  There is not much point in producing
         // Foo!A1:#REF! versus #REF! at this point
-        aRef.Ref1.CalcAbsIfRel( rComp.GetPos() );
-        if( aRef.Ref1.IsColDeleted() || aRef.Ref1.IsRowDeleted() )
+        if (!ValidCol(aAbsRef.aStart.Col()) || !ValidRow(aAbsRef.aStart.Row()))
         {
             rBuf.append(ScGlobal::GetRscString(STR_NO_REF_TABLE));
             return;
@@ -1498,45 +1492,45 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
 
         if( !bSingleRef )
         {
-            aRef.Ref2.CalcAbsIfRel( rComp.GetPos() );
-            if( aRef.Ref2.IsColDeleted() || aRef.Ref2.IsRowDeleted() )
+            if (!ValidCol(aAbsRef.aEnd.Col()) || !ValidRow(aAbsRef.aEnd.Row()))
             {
                 rBuf.append(ScGlobal::GetRscString(STR_NO_REF_TABLE));
                 return;
             }
 
-            if( aRef.Ref1.nCol == 0 && aRef.Ref2.nCol >= MAXCOL )
+            if (aAbsRef.aStart.Col() == 0 && aAbsRef.aEnd.Col() >= MAXCOL)
             {
-                r1c1_add_row( rBuf,  rRef.Ref1 );
-                if( rRef.Ref1.nRow != rRef.Ref2.nRow ||
-                    rRef.Ref1.IsRowRel() != rRef.Ref2.IsRowRel() ) {
+                r1c1_add_row(rBuf,  rRef.Ref1, aAbsRef.aStart);
+                if (aAbsRef.aStart.Row() != aAbsRef.aEnd.Row() ||
+                    rRef.Ref1.IsRowRel() != rRef.Ref2.IsRowRel() )
+                {
                     rBuf.append (sal_Unicode ( ':' ) );
-                    r1c1_add_row( rBuf,  rRef.Ref2 );
+                    r1c1_add_row(rBuf,  rRef.Ref2, aAbsRef.aEnd);
                 }
                 return;
 
             }
 
-            if( aRef.Ref1.nRow == 0 && aRef.Ref2.nRow >= MAXROW )
+            if (aAbsRef.aStart.Row() == 0 && aAbsRef.aEnd.Row() >= MAXROW)
             {
-                r1c1_add_col( rBuf, rRef.Ref1 );
-                if( rRef.Ref1.nCol != rRef.Ref2.nCol ||
-                    rRef.Ref1.IsColRel() != rRef.Ref2.IsColRel() )
+                r1c1_add_col(rBuf, rRef.Ref1, aAbsRef.aStart);
+                if (aAbsRef.aStart.Col() != aAbsRef.aEnd.Col() ||
+                    rRef.Ref1.IsColRel() != rRef.Ref2.IsColRel())
                 {
                     rBuf.append (sal_Unicode ( ':' ) );
-                    r1c1_add_col( rBuf,  rRef.Ref2 );
+                    r1c1_add_col(rBuf, rRef.Ref2, aAbsRef.aEnd);
                 }
                 return;
             }
         }
 
-        r1c1_add_row( rBuf, rRef.Ref1 );
-        r1c1_add_col( rBuf, rRef.Ref1 );
+        r1c1_add_row(rBuf, rRef.Ref1, aAbsRef.aStart);
+        r1c1_add_col(rBuf, rRef.Ref1, aAbsRef.aStart);
         if (!bSingleRef)
         {
             rBuf.append (sal_Unicode ( ':' ) );
-            r1c1_add_row( rBuf, rRef.Ref2 );
-            r1c1_add_col( rBuf, rRef.Ref2 );
+            r1c1_add_row(rBuf, rRef.Ref2, aAbsRef.aEnd);
+            r1c1_add_col(rBuf, rRef.Ref2, aAbsRef.aEnd);
         }
     }
 
@@ -1592,16 +1586,15 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
         if (!pFullName)
             return;
 
-        ScSingleRefData aRef(rRef);
-        aRef.CalcAbsIfRel(rCompiler.GetPos());
+        ScAddress aAbsRef = rRef.toAbs(rCompiler.GetPos());
 
         ConventionXL::makeExternalDocStr(
             rBuffer, *pFullName, rCompiler.GetEncodeUrlMode() == ScCompiler::ENCODE_ALWAYS);
         ScRangeStringConverter::AppendTableName(rBuffer, rTabName);
         rBuffer.append(sal_Unicode('!'));
 
-        r1c1_add_row(rBuffer, aRef);
-        r1c1_add_col(rBuffer, aRef);
+        r1c1_add_row(rBuffer, rRef, aAbsRef);
+        r1c1_add_col(rBuffer, rRef, aAbsRef);
     }
 
     virtual void makeExternalRefStr( OUStringBuffer& rBuffer, const ScCompiler& rCompiler,
@@ -1617,47 +1610,46 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
         if (aTabNames.empty())
             return;
 
-        ScComplexRefData aRef(rRef);
-        aRef.CalcAbsIfRel(rCompiler.GetPos());
+        ScRange aAbsRef = rRef.toAbs(rCompiler.GetPos());
 
         ConventionXL::makeExternalDocStr(
             rBuffer, *pFullName, rCompiler.GetEncodeUrlMode() == ScCompiler::ENCODE_ALWAYS);
-        ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, aTabNames, aRef);
+        ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, aTabNames, aAbsRef);
         rBuffer.append(sal_Unicode('!'));
 
-        if (aRef.Ref2.IsColDeleted() || aRef.Ref2.IsRowDeleted())
+        if (!ValidCol(aAbsRef.aEnd.Col()) || !ValidRow(aAbsRef.aEnd.Row()))
         {
             rBuffer.append(ScGlobal::GetRscString(STR_NO_REF_TABLE));
             return;
         }
 
-        if (aRef.Ref1.nCol == 0 && aRef.Ref2.nCol >= MAXCOL)
+        if (aAbsRef.aStart.Col() == 0 && aAbsRef.aEnd.Col() >= MAXCOL)
         {
-            r1c1_add_row(rBuffer, rRef.Ref1);
-            if (rRef.Ref1.nRow != rRef.Ref2.nRow || rRef.Ref1.IsRowRel() != rRef.Ref2.IsRowRel())
+            r1c1_add_row(rBuffer, rRef.Ref1, aAbsRef.aStart);
+            if (aAbsRef.aStart.Row() != aAbsRef.aEnd.Row() || rRef.Ref1.IsRowRel() != rRef.Ref2.IsRowRel())
             {
                 rBuffer.append (sal_Unicode(':'));
-                r1c1_add_row(rBuffer, rRef.Ref2);
+                r1c1_add_row(rBuffer, rRef.Ref2, aAbsRef.aEnd);
             }
             return;
         }
 
-        if (aRef.Ref1.nRow == 0 && aRef.Ref2.nRow >= MAXROW)
+        if (aAbsRef.aStart.Row() == 0 && aAbsRef.aEnd.Row() >= MAXROW)
         {
-            r1c1_add_col(rBuffer, aRef.Ref1);
-            if (aRef.Ref1.nCol != aRef.Ref2.nCol || aRef.Ref1.IsColRel() != aRef.Ref2.IsColRel())
+            r1c1_add_col(rBuffer, rRef.Ref1, aAbsRef.aStart);
+            if (aAbsRef.aStart.Col() != aAbsRef.aEnd.Col() || rRef.Ref1.IsColRel() != rRef.Ref2.IsColRel())
             {
                 rBuffer.append (sal_Unicode(':'));
-                r1c1_add_col(rBuffer, aRef.Ref2);
+                r1c1_add_col(rBuffer, rRef.Ref2, aAbsRef.aEnd);
             }
             return;
         }
 
-        r1c1_add_row(rBuffer, aRef.Ref1);
-        r1c1_add_col(rBuffer, aRef.Ref1);
+        r1c1_add_row(rBuffer, rRef.Ref1, aAbsRef.aStart);
+        r1c1_add_col(rBuffer, rRef.Ref1, aAbsRef.aStart);
         rBuffer.append (sal_Unicode (':'));
-        r1c1_add_row(rBuffer, aRef.Ref2);
-        r1c1_add_col(rBuffer, aRef.Ref2);
+        r1c1_add_row(rBuffer, rRef.Ref2, aAbsRef.aEnd);
+        r1c1_add_col(rBuffer, rRef.Ref2, aAbsRef.aEnd);
     }
 
     virtual sal_uLong getCharTableFlags( sal_Unicode c, sal_Unicode cLast ) const
@@ -4209,8 +4201,10 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
         while( (t = static_cast<ScToken*>(pArr->GetNextColRowName())) != NULL )
         {
             ScSingleRefData& rRef = t->GetSingleRef();
-            rRef.CalcAbsIfRel( rOldPos );
-            ScAddress aNewRef( rRef.nCol + nDx, rRef.nRow + nDy, rRef.nTab + nDz );
+            ScAddress aNewRef = rRef.toAbs(rOldPos);
+            aNewRef.IncCol(nDx);
+            aNewRef.IncRow(nDy);
+            aNewRef.IncTab(nDz);
             if ( r.In( aNewRef ) )
             {   // yes, this is URM_MOVE
                 if ( ScRefUpdate::Update( pDoc, URM_MOVE, aPos,
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 6164e89..209c5ac 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -7559,10 +7559,10 @@ void ScInterpreter::ScOffset()
             String aTabName;
             ScSingleRefData aRef;
             PopExternalSingleRef(nFileId, aTabName, aRef);
-            aRef.CalcAbsIfRel(aPos);
-            nCol1 = aRef.nCol;
-            nRow1 = aRef.nRow;
-            nTab1 = aRef.nTab;
+            ScAddress aAbsRef = aRef.toAbs(aPos);
+            nCol1 = aAbsRef.Col();
+            nRow1 = aAbsRef.Row();
+            nTab1 = aAbsRef.Tab();
 
             if (nParamCount == 3 || (nColNew < 0 && nRowNew < 0))
             {
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 8688b12..d45cc2a 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -1462,8 +1462,7 @@ void ScInterpreter::PopExternalSingleRef(
         return;
     }
 
-    rRef.CalcAbsIfRel(aPos);
-    ScAddress aAddr(rRef.nCol, rRef.nRow, rRef.nTab);
+    ScAddress aAddr = rRef.toAbs(aPos);
     ScExternalRefCache::CellFormat aFmt;
     ScExternalRefCache::TokenRef xNew = pRefMgr->getSingleRefToken(
         rFileId, rTabName, aAddr, &aPos, NULL, &aFmt);
@@ -1561,9 +1560,7 @@ void ScInterpreter::GetExternalDoubleRef(
     }
 
     ScComplexRefData aData(rData);
-    aData.CalcAbsIfRel(aPos);
-    ScRange aRange(aData.Ref1.nCol, aData.Ref1.nRow, aData.Ref1.nTab,
-                   aData.Ref2.nCol, aData.Ref2.nRow, aData.Ref2.nTab);
+    ScRange aRange = aData.toAbs(aPos);
     ScExternalRefCache::TokenArrayRef pArray = pRefMgr->getDoubleRefTokens(
         nFileId, rTabName, aRange, &aPos);
 
diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx
index fa479d0..aaca903 100644
--- a/sc/source/core/tool/refdata.cxx
+++ b/sc/source/core/tool/refdata.cxx
@@ -43,6 +43,24 @@ ScAddress ScSingleRefData::toAbs( const ScAddress& rPos ) const
     return ScAddress(nRetCol, nRetRow, nRetTab);
 }
 
+void ScSingleRefData::SetAddress( const ScAddress& rAddr, const ScAddress& rPos )
+{
+    if (Flags.bColRel)
+        nRelCol = rAddr.Col() - rPos.Col();
+    else
+        nCol = rAddr.Col();
+
+    if (Flags.bRowRel)
+        nRelRow = rAddr.Row() - rPos.Row();
+    else
+        nRow = rAddr.Row();
+
+    if (Flags.bTabRel)
+        nRelTab = rAddr.Tab() - rPos.Tab();
+    else
+        nTab = rAddr.Tab();
+}
+
 void ScSingleRefData::CalcAbsIfRel( const ScAddress& rPos )
 {
     if ( Flags.bColRel )
diff --git a/sc/source/filter/excel/xeformula.cxx b/sc/source/filter/excel/xeformula.cxx
index 7065d10..97a11cb 100644
--- a/sc/source/filter/excel/xeformula.cxx
+++ b/sc/source/filter/excel/xeformula.cxx
@@ -1817,23 +1817,24 @@ void XclExpFmlaCompImpl::ConvertRefData(
     if( mxData->mpScBasePos )
     {
         // *** reference position exists (cell, matrix) - convert to absolute ***
-        rRefData.CalcAbsIfRel( *mxData->mpScBasePos );
+        ScAddress aAbs = rRefData.toAbs(*mxData->mpScBasePos);
 
         // convert column index
-        SCsCOL& rnScCol = rRefData.nCol;
-        if( bTruncMaxCol && (rnScCol == mnMaxScCol) )
-            rnScCol = mnMaxAbsCol;
-        else if( (rnScCol < 0) || (rnScCol > mnMaxAbsCol) )
-            rRefData.SetColDeleted( sal_True );
-        rXclPos.mnCol = static_cast< sal_uInt16 >( rnScCol ) & mnMaxColMask;
+        if (bTruncMaxCol && (aAbs.Col() == mnMaxScCol))
+            aAbs.SetCol(mnMaxAbsCol);
+        else if ((aAbs.Col() < 0) || (aAbs.Col() > mnMaxAbsCol))
+            rRefData.SetColDeleted(true);
+        rXclPos.mnCol = static_cast<sal_uInt16>(aAbs.Col()) & mnMaxColMask;
 
         // convert row index
-        SCsROW& rnScRow = rRefData.nRow;
-        if( bTruncMaxRow && (rnScRow == mnMaxScRow) )
-            rnScRow = mnMaxAbsRow;
-        else if( (rnScRow < 0) || (rnScRow > mnMaxAbsRow) )
-            rRefData.SetRowDeleted( sal_True );
-        rXclPos.mnRow = static_cast< sal_uInt32 >( rnScRow ) & mnMaxRowMask;
+        if (bTruncMaxRow && (aAbs.Row() == mnMaxScRow))
+            aAbs.SetRow(mnMaxAbsRow);
+        else if ((aAbs.Row() < 0) || (aAbs.Row() > mnMaxAbsRow))
+            rRefData.SetRowDeleted(true);
+        rXclPos.mnRow = static_cast<sal_uInt32>(aAbs.Row()) & mnMaxRowMask;
+
+        // Update the reference.
+        rRefData.SetAddress(aAbs, *mxData->mpScBasePos);
     }
     else
     {
diff --git a/sc/source/ui/miscdlgs/anyrefdg.cxx b/sc/source/ui/miscdlgs/anyrefdg.cxx
index ab3b534..8a3b5e3 100644
--- a/sc/source/ui/miscdlgs/anyrefdg.cxx
+++ b/sc/source/ui/miscdlgs/anyrefdg.cxx
@@ -210,15 +210,12 @@ void ScFormulaReferenceHelper::ShowFormulaReference( const XubString& rStr )
                         if(bDoubleRef)
                         {
                             ScComplexRefData aRef( pToken->GetDoubleRef() );
-                            aRef.CalcAbsIfRel( aPos );
-                            aRange.aStart.Set( aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab );
-                            aRange.aEnd.Set( aRef.Ref2.nCol, aRef.Ref2.nRow, aRef.Ref2.nTab );
+                            aRange = aRef.toAbs(aPos);
                         }
                         else
                         {
                             ScSingleRefData aRef( pToken->GetSingleRef() );
-                            aRef.CalcAbsIfRel( aPos );
-                            aRange.aStart.Set( aRef.nCol, aRef.nRow, aRef.nTab );
+                            aRange.aStart = aRef.toAbs(aPos);
                             aRange.aEnd = aRange.aStart;
                         }
                         ColorData aColName=ScRangeFindList::GetColorName(nIndex++);


More information about the Libreoffice-commits mailing list