diff options
author | Eike Rathke <erack@redhat.com> | 2015-04-08 19:00:09 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-04-08 20:45:47 +0200 |
commit | 5590bfe72bc086dcdb56eb0a998a1a52e6224097 (patch) | |
tree | 724b8238c103ed16fbf1e4035937d2ace9a646fc /sc | |
parent | 315e1cace3c1384fc37b1a36f48150f7d8afd43c (diff) |
TableRef: limit to specified columns
Change-Id: I389a0640d6ffefa1b98a9feff86c73775a7771dc
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 54 |
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 { |