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:05:42 +0200 |
commit | d0255f30e34442a70665a91fa7e4b6c92f3dab1b (patch) | |
tree | 6d44a44f9cf6886cce93933aa36a2c6bfccb2417 /sc | |
parent | aade27554d427649810f5635133519cadfa8002f (diff) |
TableRef: inherit RelName in generated reference if named expression
Change-Id: I67621e59c6e20e7f3b5101772b5d274d8c745ce9
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 4e1cee1aa30d..30bd1e2bee14 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 45dce46ad984..c1d31b8bf662 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 ) |