[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