sc/source/ui/view/viewdata.cxx |  133 +++++++++++++++++++++++------------------
 1 file changed, 76 insertions(+), 57 deletions(-)

New commits:
commit 3526b7c0db27cb8e333d30813b79982873aa4501
Author: Marco Cecchetti <marco.cecche...@collabora.com>
Date:   Sat Apr 15 11:37:51 2017 +0200

    LOK - Calc: Selecting cells to the left/top does not work properly
    
    This patch fix a regression of commit
    4b39183c5740067cc31c006214cb24b81ee0f98c "LOK - Calc: make computation
    of cell cursor position faster"
    
    The problem occurs when bAllowNeg is false.
    At present should be safe, in the LOK case, to assume that
    GetPosX(eWhichX) and GetPosY(eWhichX) are always 0.
    
    In the end we could always find the screen position for the left-top
    cell position and subtract it from the final screen position values.
    
    Change-Id: I7d4bf24cb57757e7ac05fcde48ade9feec56aba7
    Reviewed-on: https://gerrit.libreoffice.org/36562
    Reviewed-by: Jan Holesovsky <ke...@collabora.com>
    Tested-by: Jan Holesovsky <ke...@collabora.com>

diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index e1e24280e8b9..87a77ad4692d 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -1879,90 +1879,109 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW 
nWhereY, ScSplitPos eWhich,
     sal_uInt16 nTSize;
     bool bIsTiledRendering = comphelper::LibreOfficeKit::isActive();
 
-    SCCOL   nPosX = GetPosX(eWhichX);
-    SCCOL   nX;
 
-    long nScrPosX=0;
-    if (bIsTiledRendering)
+    SCCOL nPosX = GetPosX(eWhichX);
+    long nScrPosX = 0;
+
+    if (bAllowNeg || nWhereX >= nPosX)
     {
-        const auto& rNearest = 
pThisTab->aWidthHelper.getNearestByIndex(nWhereX - 1);
-        nPosX = rNearest.first + 1;
-        nScrPosX = rNearest.second;
-    }
+        SCROW nStartPosX = nPosX;
+        if (bIsTiledRendering)
+        {
+            OSL_ENSURE(nPosX == 0, "Unsupported case.");
+            const auto& rNearest = 
pThisTab->aWidthHelper.getNearestByIndex(nWhereX - 1);
+            nStartPosX = rNearest.first + 1;
+            nScrPosX = rNearest.second;
+        }
 
-    if (nWhereX >= nPosX)
-        for (nX = nPosX; nX < nWhereX && (bAllowNeg || bIsTiledRendering || 
nScrPosX <= aScrSize.Width()); nX++)
+        if (nWhereX >= nStartPosX)
         {
-            if ( nX > MAXCOL )
-                nScrPosX = 0x7FFFFFFF;
-            else
+            for (SCCOL nX = nStartPosX; nX < nWhereX && (bAllowNeg || 
bIsTiledRendering || nScrPosX <= aScrSize.Width()); nX++)
             {
-                nTSize = pDoc->GetColWidth( nX, nTabNo );
-                if (nTSize)
+                if ( nX > MAXCOL )
+                    nScrPosX = 0x7FFFFFFF;
+                else
                 {
-                    long nSizeXPix = ToPixel( nTSize, nPPTX );
-                    nScrPosX += nSizeXPix;
+                    nTSize = pDoc->GetColWidth( nX, nTabNo );
+                    if (nTSize)
+                    {
+                        long nSizeXPix = ToPixel( nTSize, nPPTX );
+                        nScrPosX += nSizeXPix;
+                    }
                 }
             }
         }
-    else if (bAllowNeg)
-        for (nX=nPosX; nX>nWhereX;)
+        else
         {
-            --nX;
-            nTSize = pDoc->GetColWidth( nX, nTabNo );
-            if (nTSize)
+            for (SCCOL nX = nStartPosX; nX > nWhereX;)
             {
-                long nSizeXPix = ToPixel( nTSize, nPPTX );
-                nScrPosX -= nSizeXPix;
+                --nX;
+                nTSize = pDoc->GetColWidth( nX, nTabNo );
+                if (nTSize)
+                {
+                    long nSizeXPix = ToPixel( nTSize, nPPTX );
+                    nScrPosX -= nSizeXPix;
+                }
             }
         }
 
-    SCROW   nPosY = GetPosY(eWhichY);
-    SCROW   nY;
+    }
+
+
+    SCROW nPosY = GetPosY(eWhichY);
+    long nScrPosY = 0;
 
-    long nScrPosY=0;
-    if (bIsTiledRendering)
+    if (bAllowNeg || nWhereY >= nPosY)
     {
-        const auto& rNearest = 
pThisTab->aHeightHelper.getNearestByIndex(nWhereY - 1);
-        nPosY = rNearest.first + 1;
-        nScrPosY = rNearest.second;
-    }
+        SCROW nStartPosY = nPosY;
+        if (bIsTiledRendering)
+        {
+            OSL_ENSURE(nPosY == 0, "Unsupported case.");
+            const auto& rNearest = 
pThisTab->aHeightHelper.getNearestByIndex(nWhereY - 1);
+            nStartPosY = rNearest.first + 1;
+            nScrPosY = rNearest.second;
+        }
 
-    if (nWhereY >= nPosY)
-        for (nY = nPosY; nY < nWhereY && (bAllowNeg || bIsTiledRendering || 
nScrPosY <= aScrSize.Height()); nY++)
+        if (nWhereY >= nStartPosY)
         {
-            if ( nY > MAXROW )
-                nScrPosY = 0x7FFFFFFF;
-            else
+            for (SCROW nY = nStartPosY; nY < nWhereY && (bAllowNeg || 
bIsTiledRendering || nScrPosY <= aScrSize.Height()); nY++)
             {
-                nTSize = pDoc->GetRowHeight( nY, nTabNo );
-                if (nTSize)
-                {
-                    long nSizeYPix = ToPixel( nTSize, nPPTY );
-                    nScrPosY += nSizeYPix;
-                }
-                else if ( nY < MAXROW )
+                if ( nY > MAXROW )
+                    nScrPosY = 0x7FFFFFFF;
+                else
                 {
-                    // skip multiple hidden rows (forward only for now)
-                    SCROW nNext = pDoc->FirstVisibleRow(nY + 1, MAXROW, 
nTabNo);
-                    if ( nNext > MAXROW )
-                        nY = MAXROW;
-                    else
-                        nY = nNext - 1;     // +=nDir advances to next visible 
row
+                    nTSize = pDoc->GetRowHeight( nY, nTabNo );
+                    if (nTSize)
+                    {
+                        long nSizeYPix = ToPixel( nTSize, nPPTY );
+                        nScrPosY += nSizeYPix;
+                    }
+                    else if ( nY < MAXROW )
+                    {
+                        // skip multiple hidden rows (forward only for now)
+                        SCROW nNext = pDoc->FirstVisibleRow(nY + 1, MAXROW, 
nTabNo);
+                        if ( nNext > MAXROW )
+                            nY = MAXROW;
+                        else
+                            nY = nNext - 1;     // +=nDir advances to next 
visible row
+                    }
                 }
             }
         }
-    else if (bAllowNeg)
-        for (nY=nPosY; nY>nWhereY;)
+        else
         {
-            --nY;
-            nTSize = pDoc->GetRowHeight( nY, nTabNo );
-            if (nTSize)
+            for (SCROW nY = nStartPosY; nY > nWhereY;)
             {
-                long nSizeYPix = ToPixel( nTSize, nPPTY );
-                nScrPosY -= nSizeYPix;
+                --nY;
+                nTSize = pDoc->GetRowHeight( nY, nTabNo );
+                if (nTSize)
+                {
+                    long nSizeYPix = ToPixel( nTSize, nPPTY );
+                    nScrPosY -= nSizeYPix;
+                }
             }
         }
+    }
 
     if ( pDoc->IsLayoutRTL( nTabNo ) )
     {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to