summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-04-08 19:00:09 +0200
committerEike Rathke <erack@redhat.com>2015-04-08 20:45:47 +0200
commit5590bfe72bc086dcdb56eb0a998a1a52e6224097 (patch)
tree724b8238c103ed16fbf1e4035937d2ace9a646fc /sc
parent315e1cace3c1384fc37b1a36f48150f7d8afd43c (diff)
TableRef: limit to specified columns
Change-Id: I389a0640d6ffefa1b98a9feff86c73775a7771dc
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/tool/compiler.cxx54
1 files changed, 49 insertions, 5 deletions
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index ea752c305e88..b838e323ee9c 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -4921,12 +4921,56 @@ bool ScCompiler::HandleTableRef()
{
if (bColumnRange)
{
- /* TODO: limit range to specified columns */
+ // Limit range to specified columns.
+ ScRange aColRange( ScAddress::INITIALIZE_INVALID );
+ switch (mpToken->GetType())
+ {
+ case svSingleRef:
+ {
+ ScAddress aRef( mpToken->GetSingleRef()->toAbs( aPos));
+ aColRange.aStart = aColRange.aEnd = aRef;
+ }
+ break;
+ case svDoubleRef:
+ {
+ aColRange = mpToken->GetDoubleRef()->toAbs( aPos);
+ }
+ break;
+ default:
+ ; // nothing
+ }
+ if (aColRange.aStart.Row() != aRange.aStart.Row() && aColRange.aEnd.Row() != aRange.aStart.Row())
+ aRange = ScRange( ScAddress::INITIALIZE_INVALID);
+ else
+ {
+ aColRange.aEnd.SetRow( aRange.aEnd.Row());
+ aRange = aRange.Intersection( aColRange);
+ }
+ }
+ if (aRange.IsValid())
+ {
+ ScComplexRefData aRefData;
+ aRefData.InitFlags();
+ aRefData.SetRange( aRange, aPos);
+ pNew->AddDoubleReference( aRefData );
+ }
+ else
+ {
+ SetError( errNoRef);
+ }
+ if (bColumnRange)
+ {
+ if ((bGotToken = GetToken()) && mpToken->GetOpCode() == ocTableRefClose)
+ {
+ if ((bGotToken = GetToken()) && mpToken->GetOpCode() == ocTableRefClose)
+ bGotToken = false; // get next token below in return
+ }
+ else
+ {
+ SetError( errPair);
+ bGotToken = false; // get next token below in return
+ }
}
- ScComplexRefData aRefData;
- aRefData.InitFlags();
- aRefData.SetRange( aRange, aPos);
- pNew->AddDoubleReference( aRefData );
}
else
{