summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-06-22 15:03:33 +0200
committerEike Rathke <erack@redhat.com>2015-06-22 15:24:10 +0200
commitb076c015083caaee79a43dc87e6cbf017e27ceae (patch)
treeae87c1c40a3cbb0d62f84c1e20d43b86c2475502 /sc
parent99db209005634a7342d7043485cdbef5b510e199 (diff)
TableRef: inherit RelName in generated reference if named expression
Change-Id: I67621e59c6e20e7f3b5101772b5d274d8c745ce9 (cherry picked from commit d0255f30e34442a70665a91fa7e4b6c92f3dab1b)
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/tokenarray.hxx4
-rw-r--r--sc/source/core/tool/compiler.cxx13
-rw-r--r--sc/source/core/tool/token.cxx9
3 files changed, 24 insertions, 2 deletions
diff --git a/sc/inc/tokenarray.hxx b/sc/inc/tokenarray.hxx
index 0d3fa0245f50..b36936a332e7 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 5f46ddee9d59..6585e40d8bac 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -4301,6 +4301,7 @@ bool ScCompiler::HandleRange()
pNew->Reset();
}
pNew = pRangeData->GetCode()->Clone();
+ pNew->SetFromRangeName( true );
PushTokenArray( pNew, true );
if( pRangeData->HasReferences() )
{
@@ -5086,6 +5087,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))
{
@@ -5136,6 +5139,7 @@ bool ScCompiler::HandleTableRef()
{
bColumnRange = true;
bCol1Rel = p->GetSingleRef()->IsColRel();
+ bCol1RelName = p->GetSingleRef()->IsRelName();
eState = sLast;
}
else
@@ -5184,6 +5188,7 @@ bool ScCompiler::HandleTableRef()
aColRange.aEnd = mpToken->GetSingleRef()->toAbs( aPos);
aColRange.Justify();
bCol2Rel = mpToken->GetSingleRef()->IsColRel();
+ bCol2RelName = mpToken->GetSingleRef()->IsRelName();
}
}
}
@@ -5209,7 +5214,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)
{
@@ -5229,11 +5237,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 fdc602a56524..05e5b67c1462 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 )