summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-08-03 09:35:50 +0100
committerCaolán McNamara <caolanm@redhat.com>2016-08-03 12:17:33 +0000
commit00992771455dae0eb83b8c705ae648ad3683f0ef (patch)
treef9ad0c5fea4aa3e0e39dc255e58f733c8802866e
parente3ba28a55334c1eaa32714db7caad538486078fe (diff)
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. Reviewed-on: https://gerrit.libreoffice.org/27821 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com> Backported. Conflicts: sc/source/ui/view/tabvwsh3.cxx Change-Id: Ibb744c3eda78a80f33bdbfa5f5ddf0aa5b6361af Reviewed-on: https://gerrit.libreoffice.org/27825 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r--sc/source/ui/view/tabvwsh3.cxx134
1 files changed, 91 insertions, 43 deletions
diff --git a/sc/source/ui/view/tabvwsh3.cxx b/sc/source/ui/view/tabvwsh3.cxx
index 4fd9a5c303c7..4771771ed096 100644
--- a/sc/source/ui/view/tabvwsh3.cxx
+++ b/sc/source/ui/view/tabvwsh3.cxx
@@ -69,48 +69,95 @@
#include <memory>
-static sal_uInt16 lcl_ParseRange(ScRange& rScRange, const OUString& aAddress, ScDocument* pDoc, sal_uInt16 /* nSlot */)
+namespace
{
- // start with the address convention set in the document
- formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
- sal_uInt16 nResult = rScRange.Parse(aAddress, pDoc, eConv);
- if ( (nResult & SCA_VALID) )
- return nResult;
-
- // try the default Calc (A1) address convention
- nResult = rScRange.Parse(aAddress, pDoc);
- if ( (nResult & SCA_VALID) )
- return nResult;
-
- // try the Excel A1 address convention
- nResult = rScRange.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_A1);
- if ( (nResult & SCA_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 sal_uInt16 lcl_ParseAddress(ScAddress& rScAddress, const OUString& aAddress, ScDocument* pDoc, sal_uInt16 /* nSlot */)
-{
- // start with the address convention set in the document
- formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
- sal_uInt16 nResult = rScAddress.Parse(aAddress, pDoc, eConv);
- if ( (nResult & SCA_VALID) )
- return nResult;
-
- // try the default Calc (A1) address convention
- nResult = rScAddress.Parse(aAddress, pDoc);
- if ( (nResult & SCA_VALID) )
- return nResult;
-
- // try the Excel A1 address convention
- nResult = rScAddress.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_A1);
- if ( (nResult & SCA_VALID) )
- return nResult;
-
- // try Excel R1C1 address convention
- return rScAddress.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_R1C1);
+ struct ScRefFlagsAndType
+ {
+ sal_uInt16 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 & SCA_VALID)
+ {
+ aRet.eDetected = DetectFlags::RANGE;
+ return aRet;
+ }
+
+ aRet.nResult = rScAddress.Parse(aAddress, pDoc, eConv);
+ if (aRet.nResult & SCA_VALID)
+ {
+ aRet.eDetected = DetectFlags::ADDRESS;
+ return aRet;
+ }
+
+ // try the default Calc (A1) address convention
+ aRet.nResult = rScRange.Parse(aAddress, pDoc);
+ if (aRet.nResult & SCA_VALID)
+ {
+ aRet.eDetected = DetectFlags::RANGE;
+ return aRet;
+ }
+
+ aRet.nResult = rScAddress.Parse(aAddress, pDoc);
+ if (aRet.nResult & SCA_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 & SCA_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 & SCA_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 & SCA_VALID)
+ {
+ aRet.eDetected = DetectFlags::RANGE;
+ return aRet;
+ }
+
+ aRet.nResult = rScAddress.Parse(aAddress, pDoc, formula::FormulaGrammar::CONV_XL_R1C1);
+ if (aRet.nResult & SCA_VALID)
+ {
+ aRet.eDetected = DetectFlags::ADDRESS;
+ return aRet;
+ }
+
+ aRet.nResult = 0;
+ 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;
- sal_uInt16 nResult = lcl_ParseRange(aScRange, aAddress, pDoc, nSlot);
+ ScRefFlagsAndType aResult = lcl_ParseRangeOrAddress(aScRange, aScAddress, aAddress, pDoc);
+ sal_uInt16 nResult = aResult.nResult;
SCTAB nTab = rViewData.GetTabNo();
bool bMark = true;
// Is this a range ?
- if( nResult & SCA_VALID )
+ if (aResult.eDetected == DetectFlags::RANGE)
{
if ( nResult & SCA_TAB_3D )
{
@@ -297,7 +345,7 @@ void ScTabViewShell::Execute( SfxRequest& rReq )
}
}
// Is this a cell ?
- else if ( (nResult = lcl_ParseAddress(aScAddress, aAddress, pDoc, nSlot)) & SCA_VALID )
+ else if (aResult.eDetected == DetectFlags::ADDRESS)
{
if ( nResult & SCA_TAB_3D )
{