Kaydet (Commit) b076c015 authored tarafından Eike Rathke's avatar Eike Rathke

TableRef: inherit RelName in generated reference if named expression

Change-Id: I67621e59c6e20e7f3b5101772b5d274d8c745ce9
(cherry picked from commit d0255f30)
üst 99db2090
...@@ -52,6 +52,7 @@ class SC_DLLPUBLIC ScTokenArray : public formula::FormulaTokenArray ...@@ -52,6 +52,7 @@ class SC_DLLPUBLIC ScTokenArray : public formula::FormulaTokenArray
size_t mnHashValue; size_t mnHashValue;
ScFormulaVectorState meVectorState; ScFormulaVectorState meVectorState;
bool mbFromRangeName;
public: public:
ScTokenArray(); ScTokenArray();
...@@ -69,6 +70,9 @@ public: ...@@ -69,6 +70,9 @@ public:
ScFormulaVectorState GetVectorState() const { return meVectorState;} 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 * If the array contains at least one relative row reference or named
* expression, it's variant. Otherwise invariant. * expression, it's variant. Otherwise invariant.
......
...@@ -4301,6 +4301,7 @@ bool ScCompiler::HandleRange() ...@@ -4301,6 +4301,7 @@ bool ScCompiler::HandleRange()
pNew->Reset(); pNew->Reset();
} }
pNew = pRangeData->GetCode()->Clone(); pNew = pRangeData->GetCode()->Clone();
pNew->SetFromRangeName( true );
PushTokenArray( pNew, true ); PushTokenArray( pNew, true );
if( pRangeData->HasReferences() ) if( pRangeData->HasReferences() )
{ {
...@@ -5086,6 +5087,8 @@ bool ScCompiler::HandleTableRef() ...@@ -5086,6 +5087,8 @@ bool ScCompiler::HandleTableRef()
bool bColumnRange = false; bool bColumnRange = false;
bool bCol1Rel = false; bool bCol1Rel = false;
bool bCol2Rel = false; bool bCol2Rel = false;
bool bCol1RelName = false;
bool bCol2RelName = false;
int nLevel = 0; int nLevel = 0;
if (bForwardToClose && GetTokenIfOpCode( ocTableRefOpen)) if (bForwardToClose && GetTokenIfOpCode( ocTableRefOpen))
{ {
...@@ -5136,6 +5139,7 @@ bool ScCompiler::HandleTableRef() ...@@ -5136,6 +5139,7 @@ bool ScCompiler::HandleTableRef()
{ {
bColumnRange = true; bColumnRange = true;
bCol1Rel = p->GetSingleRef()->IsColRel(); bCol1Rel = p->GetSingleRef()->IsColRel();
bCol1RelName = p->GetSingleRef()->IsRelName();
eState = sLast; eState = sLast;
} }
else else
...@@ -5184,6 +5188,7 @@ bool ScCompiler::HandleTableRef() ...@@ -5184,6 +5188,7 @@ bool ScCompiler::HandleTableRef()
aColRange.aEnd = mpToken->GetSingleRef()->toAbs( aPos); aColRange.aEnd = mpToken->GetSingleRef()->toAbs( aPos);
aColRange.Justify(); aColRange.Justify();
bCol2Rel = mpToken->GetSingleRef()->IsColRel(); bCol2Rel = mpToken->GetSingleRef()->IsColRel();
bCol2RelName = mpToken->GetSingleRef()->IsRelName();
} }
} }
} }
...@@ -5209,7 +5214,10 @@ bool ScCompiler::HandleTableRef() ...@@ -5209,7 +5214,10 @@ bool ScCompiler::HandleTableRef()
if (eItem == ScTableRefToken::THIS_ROW) if (eItem == ScTableRefToken::THIS_ROW)
{ {
aRefData.SetRowRel( true); aRefData.SetRowRel( true);
if (!bCol1RelName)
bCol1RelName = static_cast<ScTokenArray*>(pArr)->IsFromRangeName();
} }
aRefData.SetRelName( bCol1RelName);
aRefData.SetFlag3D( true); aRefData.SetFlag3D( true);
if (nError) if (nError)
{ {
...@@ -5229,11 +5237,16 @@ bool ScCompiler::HandleTableRef() ...@@ -5229,11 +5237,16 @@ bool ScCompiler::HandleTableRef()
aRefData.InitFlags(); aRefData.InitFlags();
aRefData.Ref1.SetColRel( bCol1Rel); aRefData.Ref1.SetColRel( bCol1Rel);
aRefData.Ref2.SetColRel( bCol2Rel); aRefData.Ref2.SetColRel( bCol2Rel);
bool bRelName = bCol1RelName || bCol2RelName;
if (eItem == ScTableRefToken::THIS_ROW) if (eItem == ScTableRefToken::THIS_ROW)
{ {
aRefData.Ref1.SetRowRel( true); aRefData.Ref1.SetRowRel( true);
aRefData.Ref2.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); aRefData.Ref1.SetFlag3D( true);
if (nError) if (nError)
{ {
......
...@@ -1743,14 +1743,16 @@ bool ScTokenArray::IsValidReference( ScRange& rRange, const ScAddress& rPos ) co ...@@ -1743,14 +1743,16 @@ bool ScTokenArray::IsValidReference( ScRange& rRange, const ScAddress& rPos ) co
ScTokenArray::ScTokenArray() : ScTokenArray::ScTokenArray() :
FormulaTokenArray(), FormulaTokenArray(),
mnHashValue(0), mnHashValue(0),
meVectorState(FormulaVectorEnabled) meVectorState(FormulaVectorEnabled),
mbFromRangeName(false)
{ {
} }
ScTokenArray::ScTokenArray( const ScTokenArray& rArr ) : ScTokenArray::ScTokenArray( const ScTokenArray& rArr ) :
FormulaTokenArray(rArr), FormulaTokenArray(rArr),
mnHashValue(rArr.mnHashValue), mnHashValue(rArr.mnHashValue),
meVectorState(rArr.meVectorState) meVectorState(rArr.meVectorState),
mbFromRangeName(rArr.mbFromRangeName)
{ {
} }
...@@ -1762,6 +1764,7 @@ ScTokenArray& ScTokenArray::operator=( const ScTokenArray& rArr ) ...@@ -1762,6 +1764,7 @@ ScTokenArray& ScTokenArray::operator=( const ScTokenArray& rArr )
{ {
Clear(); Clear();
Assign( rArr ); Assign( rArr );
mbFromRangeName = rArr.mbFromRangeName;
return *this; return *this;
} }
...@@ -1769,6 +1772,7 @@ void ScTokenArray::ClearScTokenArray() ...@@ -1769,6 +1772,7 @@ void ScTokenArray::ClearScTokenArray()
{ {
Clear(); Clear();
meVectorState = FormulaVectorEnabled; meVectorState = FormulaVectorEnabled;
mbFromRangeName = false;
} }
ScTokenArray* ScTokenArray::Clone() const ScTokenArray* ScTokenArray::Clone() const
...@@ -1781,6 +1785,7 @@ ScTokenArray* ScTokenArray::Clone() const ...@@ -1781,6 +1785,7 @@ ScTokenArray* ScTokenArray::Clone() const
p->bHyperLink = bHyperLink; p->bHyperLink = bHyperLink;
p->mnHashValue = mnHashValue; p->mnHashValue = mnHashValue;
p->meVectorState = meVectorState; p->meVectorState = meVectorState;
p->mbFromRangeName = mbFromRangeName;
FormulaToken** pp; FormulaToken** pp;
if( nLen ) if( nLen )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment