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

TableRef: make ThisRow work in named expressions

... including reference update as named expressions don't hold RPN.

Change-Id: Ieea19e24f1dcf71d489ff0249bc7d3644e4f0d2b
(cherry picked from commit 37464e3f)
üst e9a019af
...@@ -237,7 +237,7 @@ public: ...@@ -237,7 +237,7 @@ public:
Item GetItem() const; Item GetItem() const;
void AddItem( Item ); void AddItem( Item );
void SetAreaRefRPN( formula::FormulaToken* pToken ); void SetAreaRefRPN( formula::FormulaToken* pToken );
const formula::FormulaToken* GetAreaRefRPN() const; formula::FormulaToken* GetAreaRefRPN() const;
private: private:
......
...@@ -5073,7 +5073,12 @@ bool ScCompiler::HandleTableRef() ...@@ -5073,7 +5073,12 @@ bool ScCompiler::HandleTableRef()
aRange.aEnd.SetRow( aPos.Row()); aRange.aEnd.SetRow( aPos.Row());
} }
else else
nError = errNoRef; {
nError = errNoValue;
// For *some* relative row reference in named
// expressions' thisrow special handling below.
aRange.aEnd.SetRow( aRange.aStart.Row());
}
bForwardToClose = true; bForwardToClose = true;
} }
break; break;
...@@ -5154,8 +5159,10 @@ bool ScCompiler::HandleTableRef() ...@@ -5154,8 +5159,10 @@ bool ScCompiler::HandleTableRef()
} while (eState != sStop); } while (eState != sStop);
} }
ScTokenArray* pNew = new ScTokenArray(); ScTokenArray* pNew = new ScTokenArray();
if (!nError) if (!nError || nError == errNoValue)
{ {
// The errNoValue case generates a thisrow reference that can be
// used to save named expressions in A1 syntax notation.
if (bColumnRange) if (bColumnRange)
{ {
// Limit range to specified columns. // Limit range to specified columns.
...@@ -5204,8 +5211,17 @@ bool ScCompiler::HandleTableRef() ...@@ -5204,8 +5211,17 @@ bool ScCompiler::HandleTableRef()
aRefData.SetRowRel( true); aRefData.SetRowRel( true);
} }
aRefData.SetFlag3D( true); aRefData.SetFlag3D( true);
aRefData.SetAddress( aRange.aStart, aPos); if (nError)
pTR->SetAreaRefRPN( pNew->AddSingleReference( aRefData )); {
aRefData.SetAddress( aRange.aStart, aRange.aStart);
pTR->SetAreaRefRPN( new ScSingleRefToken( aRefData)); // set reference at TableRef
pNew->Add( new FormulaErrorToken( nError)); // set error in RPN
}
else
{
aRefData.SetAddress( aRange.aStart, aPos);
pTR->SetAreaRefRPN( pNew->AddSingleReference( aRefData));
}
} }
else else
{ {
...@@ -5219,8 +5235,17 @@ bool ScCompiler::HandleTableRef() ...@@ -5219,8 +5235,17 @@ bool ScCompiler::HandleTableRef()
aRefData.Ref2.SetRowRel( true); aRefData.Ref2.SetRowRel( true);
} }
aRefData.Ref1.SetFlag3D( true); aRefData.Ref1.SetFlag3D( true);
aRefData.SetRange( aRange, aPos); if (nError)
pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData )); {
aRefData.SetRange( aRange, aRange.aStart);
pTR->SetAreaRefRPN( new ScDoubleRefToken( aRefData)); // set reference at TableRef
pNew->Add( new FormulaErrorToken( nError)); // set error in RPN
}
else
{
aRefData.SetRange( aRange, aPos);
pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData));
}
} }
} }
else else
......
This diff is collapsed.
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