sc/source/ui/view/tabvwsh3.cxx | 134 +++++++++++++++++++++++++++-------------- 1 file changed, 91 insertions(+), 43 deletions(-)
New commits: commit 405db7afbdba02eed9a9a4c4f22000fe623b029c Author: Caolán McNamara <caol...@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 <er...@redhat.com> Tested-by: Eike Rathke <er...@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 ) {
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits