summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-03-06 23:22:45 +0100
committerEike Rathke <erack@redhat.com>2015-03-07 00:24:46 +0100
commit333f8a76341f5b4921e89012d133007503e49612 (patch)
tree58c29cd6ba39db06a46156e3c0d580afb6e050dd /sc
parent40c9a46b78b8919aae82dd9b94774d63bb9cb4e6 (diff)
first stab at handling table[] all range
Change-Id: I608cf04cf4b0b991f4a45a868566faeae5be77c9
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/tool/compiler.cxx20
1 files changed, 19 insertions, 1 deletions
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 0ab8f9ba40b2..dce91710c386 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -3931,6 +3931,17 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula )
{
static_cast<ScTokenArray*>(pArr)->MergeRangeReference( aPos);
}
+ else if (eLastOp == ocDBArea && pNewToken->GetOpCode() == ocTableRefOpen)
+ {
+ sal_uInt16 nIdx = pArr->GetLen() - 1;
+ const FormulaToken* pPrev = pArr->PeekPrev( nIdx);
+ if (pPrev && pPrev->GetOpCode() == ocDBArea)
+ {
+ // pPrev may be dead hereafter.
+ static_cast<ScTokenArray*>(pArr)->ReplaceToken( 1,
+ new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::ALL));
+ }
+ }
eLastOp = maRawToken.GetOpCode();
if ( bAutoCorrect )
aCorrectedFormula += aCorrectedSymbol;
@@ -4664,12 +4675,19 @@ bool ScCompiler::HandleTableRef()
aRange.aEnd.SetTab(aRange.aStart.Tab());
ScTokenArray* pNew = new ScTokenArray();
ScTableRefToken::Item eItem = pTR->GetItem();
+ bool bGotToken = false;
if (eItem == ScTableRefToken::ALL)
{
ScComplexRefData aRefData;
aRefData.InitFlags();
aRefData.SetRange(aRange, aPos);
pNew->AddDoubleReference( aRefData );
+ // Optional [] (or [#All]) may follow.
+ if ((bGotToken = GetToken()) && mpToken->GetOpCode() == ocTableRefOpen)
+ {
+ if ((bGotToken = GetToken()) && mpToken->GetOpCode() == ocTableRefClose)
+ bGotToken = false; // get next token below
+ }
}
else
{
@@ -4678,7 +4696,7 @@ bool ScCompiler::HandleTableRef()
}
PushTokenArray( pNew, true );
pNew->Reset();
- return GetToken();
+ return bGotToken ? true : GetToken();
}
return true;
}