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

Eike Rathke erack at redhat.com
Mon Jun 22 06:06:23 PDT 2015


 sc/inc/tokenarray.hxx            |    4 ++++
 sc/source/core/tool/compiler.cxx |   13 +++++++++++++
 sc/source/core/tool/token.cxx    |    9 +++++++--
 3 files changed, 24 insertions(+), 2 deletions(-)

New commits:
commit d0255f30e34442a70665a91fa7e4b6c92f3dab1b
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Jun 22 15:03:33 2015 +0200

    TableRef: inherit RelName in generated reference if named expression
    
    Change-Id: I67621e59c6e20e7f3b5101772b5d274d8c745ce9

diff --git a/sc/inc/tokenarray.hxx b/sc/inc/tokenarray.hxx
index 0d3fa02..b36936a 100644
--- a/sc/inc/tokenarray.hxx
+++ b/sc/inc/tokenarray.hxx
@@ -52,6 +52,7 @@ class SC_DLLPUBLIC ScTokenArray : public formula::FormulaTokenArray
 
     size_t mnHashValue;
     ScFormulaVectorState meVectorState;
+    bool mbFromRangeName;
 
 public:
     ScTokenArray();
@@ -69,6 +70,9 @@ public:
 
     ScFormulaVectorState GetVectorState() const { return meVectorState;}
 
+    void SetFromRangeName( bool b ) { mbFromRangeName = b; }
+    bool IsFromRangeName() const { return mbFromRangeName; }
+
     /**
      * If the array contains at least one relative row reference or named
      * expression, it's variant. Otherwise invariant.
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 4e1cee1..30bd1e2 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -4300,6 +4300,7 @@ bool ScCompiler::HandleRange()
                 pNew->Reset();
             }
             pNew = pRangeData->GetCode()->Clone();
+            pNew->SetFromRangeName( true );
             PushTokenArray( pNew, true );
             if( pRangeData->HasReferences() )
             {
@@ -5085,6 +5086,8 @@ bool ScCompiler::HandleTableRef()
         bool bColumnRange = false;
         bool bCol1Rel = false;
         bool bCol2Rel = false;
+        bool bCol1RelName = false;
+        bool bCol2RelName = false;
         int nLevel = 0;
         if (bForwardToClose && GetTokenIfOpCode( ocTableRefOpen))
         {
@@ -5135,6 +5138,7 @@ bool ScCompiler::HandleTableRef()
                             {
                                 bColumnRange = true;
                                 bCol1Rel = p->GetSingleRef()->IsColRel();
+                                bCol1RelName = p->GetSingleRef()->IsRelName();
                                 eState = sLast;
                             }
                             else
@@ -5183,6 +5187,7 @@ bool ScCompiler::HandleTableRef()
                                     aColRange.aEnd = mpToken->GetSingleRef()->toAbs( aPos);
                                     aColRange.Justify();
                                     bCol2Rel = mpToken->GetSingleRef()->IsColRel();
+                                    bCol2RelName = mpToken->GetSingleRef()->IsRelName();
                                 }
                             }
                         }
@@ -5208,7 +5213,10 @@ bool ScCompiler::HandleTableRef()
                     if (eItem == ScTableRefToken::THIS_ROW)
                     {
                         aRefData.SetRowRel( true);
+                        if (!bCol1RelName)
+                            bCol1RelName = static_cast<ScTokenArray*>(pArr)->IsFromRangeName();
                     }
+                    aRefData.SetRelName( bCol1RelName);
                     aRefData.SetFlag3D( true);
                     if (nError)
                     {
@@ -5228,11 +5236,16 @@ bool ScCompiler::HandleTableRef()
                     aRefData.InitFlags();
                     aRefData.Ref1.SetColRel( bCol1Rel);
                     aRefData.Ref2.SetColRel( bCol2Rel);
+                    bool bRelName = bCol1RelName || bCol2RelName;
                     if (eItem == ScTableRefToken::THIS_ROW)
                     {
                         aRefData.Ref1.SetRowRel( true);
                         aRefData.Ref2.SetRowRel( true);
+                        if (!bRelName)
+                            bRelName = static_cast<ScTokenArray*>(pArr)->IsFromRangeName();
                     }
+                    aRefData.Ref1.SetRelName( bRelName);
+                    aRefData.Ref2.SetRelName( bRelName);
                     aRefData.Ref1.SetFlag3D( true);
                     if (nError)
                     {
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 45dce46..c1d31b8 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -1743,14 +1743,16 @@ bool ScTokenArray::IsValidReference( ScRange& rRange, const ScAddress& rPos ) co
 ScTokenArray::ScTokenArray() :
     FormulaTokenArray(),
     mnHashValue(0),
-    meVectorState(FormulaVectorEnabled)
+    meVectorState(FormulaVectorEnabled),
+    mbFromRangeName(false)
 {
 }
 
 ScTokenArray::ScTokenArray( const ScTokenArray& rArr ) :
     FormulaTokenArray(rArr),
     mnHashValue(rArr.mnHashValue),
-    meVectorState(rArr.meVectorState)
+    meVectorState(rArr.meVectorState),
+    mbFromRangeName(rArr.mbFromRangeName)
 {
 }
 
@@ -1762,6 +1764,7 @@ ScTokenArray& ScTokenArray::operator=( const ScTokenArray& rArr )
 {
     Clear();
     Assign( rArr );
+    mbFromRangeName = rArr.mbFromRangeName;
     return *this;
 }
 
@@ -1769,6 +1772,7 @@ void ScTokenArray::ClearScTokenArray()
 {
     Clear();
     meVectorState = FormulaVectorEnabled;
+    mbFromRangeName = false;
 }
 
 ScTokenArray* ScTokenArray::Clone() const
@@ -1781,6 +1785,7 @@ ScTokenArray* ScTokenArray::Clone() const
     p->bHyperLink = bHyperLink;
     p->mnHashValue = mnHashValue;
     p->meVectorState = meVectorState;
+    p->mbFromRangeName = mbFromRangeName;
 
     FormulaToken** pp;
     if( nLen )


More information about the Libreoffice-commits mailing list