diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-08-03 09:35:50 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-08-03 12:17:33 +0000 |
commit | 00992771455dae0eb83b8c705ae648ad3683f0ef (patch) | |
tree | f9ad0c5fea4aa3e0e39dc255e58f733c8802866e /sc | |
parent | e3ba28a55334c1eaa32714db7caad538486078fe (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>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/view/tabvwsh3.cxx | 134 |
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 ) { |