Kaydet (Commit) 37464e3f 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
üst e0e28557
......@@ -237,7 +237,7 @@ public:
Item GetItem() const;
void AddItem( Item );
void SetAreaRefRPN( formula::FormulaToken* pToken );
const formula::FormulaToken* GetAreaRefRPN() const;
formula::FormulaToken* GetAreaRefRPN() const;
private:
......
......@@ -5072,7 +5072,12 @@ bool ScCompiler::HandleTableRef()
aRange.aEnd.SetRow( aPos.Row());
}
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;
}
break;
......@@ -5153,8 +5158,10 @@ bool ScCompiler::HandleTableRef()
} while (eState != sStop);
}
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)
{
// Limit range to specified columns.
......@@ -5203,8 +5210,17 @@ bool ScCompiler::HandleTableRef()
aRefData.SetRowRel( true);
}
aRefData.SetFlag3D( true);
aRefData.SetAddress( aRange.aStart, aPos);
pTR->SetAreaRefRPN( pNew->AddSingleReference( aRefData ));
if (nError)
{
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
{
......@@ -5218,8 +5234,17 @@ bool ScCompiler::HandleTableRef()
aRefData.Ref2.SetRowRel( true);
}
aRefData.Ref1.SetFlag3D( true);
aRefData.SetRange( aRange, aPos);
pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData ));
if (nError)
{
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
......
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