[Libreoffice-commits] core.git: sc/source
Caolán McNamara
caolanm at redhat.com
Wed Aug 3 10:06:03 UTC 2016
sc/source/ui/view/tabvwsh3.cxx | 134 +++++++++++++++++++++++++++--------------
1 file changed, 91 insertions(+), 43 deletions(-)
New commits:
commit 405db7afbdba02eed9a9a4c4f22000fe623b029c
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Aug 3 09:35:50 2016 +0100
Resolves: tdf#100123 prefer notation priority in detecting range/address
i.e. try and parse whether something is a range or an address in order of
document address convention, Calc A1, Excel A1 and Excel R1C1, rather than
check if something is a range in any of those conventions before checking if it
might be an address in any of those conventions.
Change-Id: Ibb744c3eda78a80f33bdbfa5f5ddf0aa5b6361af
Reviewed-on: https://gerrit.libreoffice.org/27821
Reviewed-by: Eike Rathke <erack at redhat.com>
Tested-by: Eike Rathke <erack at redhat.com>
diff --git a/sc/source/ui/view/tabvwsh3.cxx b/sc/source/ui/view/tabvwsh3.cxx
index 67aaaf5..38a8364 100644
--- a/sc/source/ui/view/tabvwsh3.cxx
+++ b/sc/source/ui/view/tabvwsh3.cxx
@@ -69,48 +69,95 @@
#include <memory>
-static ScRefFlags lcl_ParseRange(ScRange& rScRange, const OUString& aAddress, ScDocument* pDoc)
+namespace
{
- // start with the address convention set in the document
- formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
- ScRefFlags nResult = rScRange.Parse(aAddress, pDoc, eConv);
- if ( nResult & ScRefFlags::VALID )
- return nResult;
-
- // try the default Calc (A1) address convention
- nResult = rScRange.Parse(aAddress, pDoc);
- if ( nResult & ScRefFlags::VALID )
- return nResult;
-
- // try the Excel A1 address convention
- nResult = rScRange.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_A1);
- if ( nResult & ScRefFlags::VALID )
- return nResult;
-
- // try Excel R1C1 address convention
- return rScRange.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_R1C1);
-}
+ enum class DetectFlags
+ {
+ NONE,
+ RANGE,
+ ADDRESS
+ };
-static ScRefFlags lcl_ParseAddress(ScAddress& rScAddress, const OUString& aAddress, ScDocument* pDoc)
-{
- // start with the address convention set in the document
- formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
- ScRefFlags nResult = rScAddress.Parse(aAddress, pDoc, eConv);
- if ( nResult & ScRefFlags::VALID )
- return nResult;
-
- // try the default Calc (A1) address convention
- nResult = rScAddress.Parse(aAddress, pDoc);
- if ( nResult & ScRefFlags::VALID )
- return nResult;
-
- // try the Excel A1 address convention
- nResult = rScAddress.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_A1);
- if ( nResult & ScRefFlags::VALID )
- return nResult;
-
- // try Excel R1C1 address convention
- return rScAddress.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_R1C1);
+ struct ScRefFlagsAndType
+ {
+ ScRefFlags nResult;
+ DetectFlags eDetected;
+ };
+
+ ScRefFlagsAndType lcl_ParseRangeOrAddress(ScRange& rScRange, ScAddress& rScAddress,
+ const OUString& aAddress, ScDocument* pDoc)
+ {
+ ScRefFlagsAndType aRet;
+
+ formula::FormulaGrammar::AddressConvention eConv;
+
+ // start with the address convention set in the document
+ eConv = pDoc->GetAddressConvention();
+ aRet.nResult = rScRange.Parse(aAddress, pDoc, eConv);
+ if (aRet.nResult & ScRefFlags::VALID)
+ {
+ aRet.eDetected = DetectFlags::RANGE;
+ return aRet;
+ }
+
+ aRet.nResult = rScAddress.Parse(aAddress, pDoc, eConv);
+ if (aRet.nResult & ScRefFlags::VALID)
+ {
+ aRet.eDetected = DetectFlags::ADDRESS;
+ return aRet;
+ }
+
+ // try the default Calc (A1) address convention
+ aRet.nResult = rScRange.Parse(aAddress, pDoc);
+ if (aRet.nResult & ScRefFlags::VALID)
+ {
+ aRet.eDetected = DetectFlags::RANGE;
+ return aRet;
+ }
+
+ aRet.nResult = rScAddress.Parse(aAddress, pDoc);
+ if (aRet.nResult & ScRefFlags::VALID)
+ {
+ aRet.eDetected = DetectFlags::ADDRESS;
+ return aRet;
+ }
+
+ // try the Excel A1 address convention
+ aRet.nResult = rScRange.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_A1);
+ if (aRet.nResult & ScRefFlags::VALID)
+ {
+ aRet.eDetected = DetectFlags::RANGE;
+ return aRet;
+ }
+
+ // try the Excel A1 address convention
+ aRet.nResult = rScAddress.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_A1);
+ if (aRet.nResult & ScRefFlags::VALID)
+ {
+ aRet.eDetected = DetectFlags::ADDRESS;
+ return aRet;
+ }
+
+ // try Excel R1C1 address convention
+ aRet.nResult = rScRange.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_R1C1);
+ if (aRet.nResult & ScRefFlags::VALID)
+ {
+ aRet.eDetected = DetectFlags::RANGE;
+ return aRet;
+ }
+
+ aRet.nResult = rScAddress.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_R1C1);
+ if (aRet.nResult & ScRefFlags::VALID)
+ {
+ aRet.eDetected = DetectFlags::ADDRESS;
+ return aRet;
+ }
+
+ aRet.nResult = ScRefFlags::ZERO;
+ aRet.eDetected = DetectFlags::NONE;
+
+ return aRet;
+ }
}
void ScTabViewShell::Execute( SfxRequest& rReq )
@@ -278,12 +325,13 @@ void ScTabViewShell::Execute( SfxRequest& rReq )
ScMarkData& rMark = rViewData.GetMarkData();
ScRange aScRange;
ScAddress aScAddress;
- ScRefFlags nResult = lcl_ParseRange(aScRange, aAddress, pDoc);
+ ScRefFlagsAndType aResult = lcl_ParseRangeOrAddress(aScRange, aScAddress, aAddress, pDoc);
+ ScRefFlags nResult = aResult.nResult;
SCTAB nTab = rViewData.GetTabNo();
bool bMark = true;
// Is this a range ?
- if( nResult & ScRefFlags::VALID )
+ if (aResult.eDetected == DetectFlags::RANGE)
{
if ( nResult & ScRefFlags::TAB_3D )
{
@@ -297,7 +345,7 @@ void ScTabViewShell::Execute( SfxRequest& rReq )
}
}
// Is this a cell ?
- else if ( (nResult = lcl_ParseAddress(aScAddress, aAddress, pDoc)) & ScRefFlags::VALID )
+ else if (aResult.eDetected == DetectFlags::ADDRESS)
{
if ( nResult & ScRefFlags::TAB_3D )
{
More information about the Libreoffice-commits
mailing list