sc/source/core/tool/compiler.cxx |   88 ++++++++++++++++++++++++++++-----------
 1 file changed, 65 insertions(+), 23 deletions(-)

New commits:
commit 7511c2af96f9b0a6830c64d6a80cb4d6c8e7af8f
Author: Eike Rathke <er...@redhat.com>
Date:   Fri Jun 26 17:43:36 2015 +0200

    tdf#44419 display entire column/row references as A:A/1:1
    
    ... if both anchors of the other axis are absolute. Now that we can
    parse them as of commit 0c8778ce1df92ca3bc2a8dd2f64568fb257e9e39 (and
    follow-up 4091b4fbdce40262eba46ab94653287b1fd928e8).
    
    Change-Id: Ie67127fe2d7546e7e598ee1a4d89133c08222262
    (cherry picked from commit eeea41e2e726dd5d69cd323909e1666efb9de472)

diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index ec2e796..ad5b0ec 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -763,12 +763,25 @@ struct ConventionOOO_A1 : public Convention_A1
         rBuf.append('.');
     }
 
+    enum SingletonDisplay
+    {
+        SINGLETON_NONE,
+        SINGLETON_COL,
+        SINGLETON_ROW
+    };
+
     static void MakeOneRefStrImpl(
         OUStringBuffer& rBuffer,
         const OUString& rErrRef, const std::vector<OUString>& rTabNames,
         const ScSingleRefData& rRef, const ScAddress& rAbsRef,
-        bool bForceTab, bool bODF )
+        bool bForceTab, bool bODF, SingletonDisplay eSingletonDisplay )
     {
+        // For ODF override singleton so earlier releases still can read what
+        // we write now as of 2015-06-26.
+        /* TODO: we may want to change that in future in a few releases. */
+        if (bODF)
+            eSingletonDisplay = SINGLETON_NONE;
+
         if( rRef.IsFlag3D() || bForceTab )
         {
             if (!ValidTab(rAbsRef.Tab()) || rRef.IsTabDeleted())
@@ -787,18 +800,45 @@ struct ConventionOOO_A1 : public Convention_A1
         }
         else if (bODF)
             rBuffer.append('.');
-        if (!rRef.IsColRel())
-            rBuffer.append('$');
-        if (!ValidCol(rAbsRef.Col()) || rRef.IsColDeleted())
-            rBuffer.append(rErrRef);
-        else
-            MakeColStr(rBuffer, rAbsRef.Col());
-        if (!rRef.IsRowRel())
-            rBuffer.append('$');
-        if (!ValidRow(rAbsRef.Row()) || rRef.IsRowDeleted())
-            rBuffer.append(rErrRef);
-        else
-            MakeRowStr(rBuffer, rAbsRef.Row());
+
+        if (eSingletonDisplay != SINGLETON_ROW)
+        {
+            if (!rRef.IsColRel())
+                rBuffer.append('$');
+            if (!ValidCol(rAbsRef.Col()) || rRef.IsColDeleted())
+                rBuffer.append(rErrRef);
+            else
+                MakeColStr(rBuffer, rAbsRef.Col());
+        }
+
+        if (eSingletonDisplay != SINGLETON_COL)
+        {
+            if (!rRef.IsRowRel())
+                rBuffer.append('$');
+            if (!ValidRow(rAbsRef.Row()) || rRef.IsRowDeleted())
+                rBuffer.append(rErrRef);
+            else
+                MakeRowStr(rBuffer, rAbsRef.Row());
+        }
+    }
+
+    static SingletonDisplay getSingletonDisplay( const ScAddress& rAbs1, const 
ScAddress& rAbs2,
+            const ScComplexRefData& rRef )
+    {
+        // If any part is error, display as such.
+        if (!ValidCol(rAbs1.Col()) || rRef.Ref1.IsColDeleted() || 
!ValidRow(rAbs1.Row()) || rRef.Ref1.IsRowDeleted() ||
+            !ValidCol(rAbs2.Col()) || rRef.Ref2.IsColDeleted() || 
!ValidRow(rAbs2.Row()) || rRef.Ref2.IsRowDeleted())
+            return SINGLETON_NONE;
+
+        // A:A or $A:$A or A:$A or $A:A, both row anchors must be absolute.
+        if (rAbs1.Row() == 0 && rAbs2.Row() == MAXROW && !rRef.Ref1.IsRowRel() 
&& !rRef.Ref2.IsRowRel())
+            return SINGLETON_COL;
+
+        // 1:1 or $1:$1 or 1:$1 or $1:1, both column anchors must be absolute.
+        if (rAbs1.Col() == 0 && rAbs2.Col() == MAXCOL && !rRef.Ref1.IsColRel() 
&& !rRef.Ref2.IsColRel())
+            return SINGLETON_ROW;
+
+        return SINGLETON_NONE;
     }
 
     virtual void makeRefStr( OUStringBuffer&   rBuffer,
@@ -809,18 +849,19 @@ struct ConventionOOO_A1 : public Convention_A1
                      bool bSingleRef,
                      bool /*bFromRangeName*/ ) const SAL_OVERRIDE
     {
-        ScComplexRefData aRef( rRef );
         // In case absolute/relative positions weren't separately available:
         // transform relative to absolute!
-        ScAddress aAbs1 = aRef.Ref1.toAbs(rPos), aAbs2;
+        ScAddress aAbs1 = rRef.Ref1.toAbs(rPos), aAbs2;
         if( !bSingleRef )
-            aAbs2 = aRef.Ref2.toAbs(rPos);
+            aAbs2 = rRef.Ref2.toAbs(rPos);
 
-        MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref1, aAbs1, 
false, false);
+        SingletonDisplay eSingleton = bSingleRef ? SINGLETON_NONE : 
getSingletonDisplay( aAbs1, aAbs2, rRef);
+        MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref1, aAbs1, 
false, false, eSingleton);
         if (!bSingleRef)
         {
             rBuffer.append(':');
-            MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref2, aAbs2, 
aAbs1.Tab() != aAbs2.Tab(), false);
+            MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref2, aAbs2, 
aAbs1.Tab() != aAbs2.Tab(), false,
+                    eSingleton);
         }
     }
 
@@ -964,12 +1005,11 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1
                      bool /*bFromRangeName*/ ) const SAL_OVERRIDE
     {
         rBuffer.append('[');
-        ScComplexRefData aRef( rRef );
         // In case absolute/relative positions weren't separately available:
         // transform relative to absolute!
-        ScAddress aAbs1 = aRef.Ref1.toAbs(rPos), aAbs2;
+        ScAddress aAbs1 = rRef.Ref1.toAbs(rPos), aAbs2;
         if( !bSingleRef )
-            aAbs2 = aRef.Ref2.toAbs(rPos);
+            aAbs2 = rRef.Ref2.toAbs(rPos);
 
         if (FormulaGrammar::isODFF(eGram) && (!ValidAddress(aAbs1) || 
!ValidAddress(aAbs2)))
         {
@@ -980,11 +1020,13 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1
         }
         else
         {
-            MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref1, aAbs1, 
false, true);
+            SingletonDisplay eSingleton = bSingleRef ? SINGLETON_NONE : 
getSingletonDisplay( aAbs1, aAbs2, rRef);
+            MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref1, aAbs1, 
false, true, eSingleton);
             if (!bSingleRef)
             {
                 rBuffer.append(':');
-                MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, aRef.Ref2, 
aAbs2, aAbs1.Tab() != aAbs2.Tab(), true);
+                MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref2, 
aAbs2, aAbs1.Tab() != aAbs2.Tab(), true,
+                        eSingleton);
             }
         }
         rBuffer.append(']');
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to