diff options
author | Eike Rathke <erack@redhat.com> | 2015-06-22 15:03:33 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-06-22 15:24:10 +0200 |
commit | b076c015083caaee79a43dc87e6cbf017e27ceae (patch) | |
tree | ae87c1c40a3cbb0d62f84c1e20d43b86c2475502 /sc | |
parent | 99db209005634a7342d7043485cdbef5b510e199 (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.hxx | 4 | ||||
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 13 | ||||
-rw-r--r-- | sc/source/core/tool/token.cxx | 9 |
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 ) |