sc/source/ui/inc/viewdata.hxx  |    2 +-
 sc/source/ui/view/cellsh4.cxx  |    2 +-
 sc/source/ui/view/tabview3.cxx |   18 ++++++++++++++----
 3 files changed, 16 insertions(+), 6 deletions(-)

New commits:
commit 218b73d937453d5d813a050f1216840ba71f4fe7
Author:     Hossein <hoss...@libreoffice.org>
AuthorDate: Wed Sep 6 13:00:18 2023 +0200
Commit:     Hossein <hoss...@libreoffice.org>
CommitDate: Wed Sep 6 16:27:11 2023 +0200

    tdf#154271 Fix automatic cursor/screen jump in Calc
    
    Previously, when using ctrl+end, the screen/cursor jump was done to the
    middle of the screen. In this way, the available space of the screen was
    not optimally used.
    
    In this patch, the jump is adjusted to move the cursor to the end of the
    screen, and the visible/usable space will be all of the screen.
    
    In this patch, previous behavior for showing the search results and
    other purposes other than pressing ctrl+end to jump to the last cell are
    preserved, and in those cases, the selected cell will be in the middle
    of the screen, as before.
    
    Also, in the situations that the jump is done from a cell lower or right
    of the last cell (in other words, further than the last cell), the
    behavior is preserved.
    
    Change-Id: I25f308f84f096ec271c23df75998ddeea32119ea
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156266
    Tested-by: Jenkins
    Reviewed-by: Hossein <hoss...@libreoffice.org>

diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx
index 34bc8c49c4f6..5dd60f6d266e 100644
--- a/sc/source/ui/inc/viewdata.hxx
+++ b/sc/source/ui/inc/viewdata.hxx
@@ -49,7 +49,7 @@ inline ScHSplitPos WhichH( ScSplitPos ePos );
 inline ScVSplitPos WhichV( ScSplitPos ePos );
 
 /**  Screen behavior related to cursor movements */
-enum ScFollowMode { SC_FOLLOW_NONE, SC_FOLLOW_LINE, SC_FOLLOW_FIX, 
SC_FOLLOW_JUMP };
+enum ScFollowMode { SC_FOLLOW_NONE, SC_FOLLOW_LINE, SC_FOLLOW_FIX, 
SC_FOLLOW_JUMP, SC_FOLLOW_JUMP_END };
 
 /** Mouse mode to select areas */
 enum ScRefType { SC_REFTYPE_NONE, SC_REFTYPE_REF, SC_REFTYPE_FILL,
diff --git a/sc/source/ui/view/cellsh4.cxx b/sc/source/ui/view/cellsh4.cxx
index 8cf13970bdeb..bacbf2b98f90 100644
--- a/sc/source/ui/view/cellsh4.cxx
+++ b/sc/source/ui/view/cellsh4.cxx
@@ -507,7 +507,7 @@ void ScCellShell::ExecutePage( SfxRequest& rReq )
             break;
 
         case SID_CURSORENDOFFILE:
-            pTabViewShell->MoveCursorEnd( 1, 1, SC_FOLLOW_JUMP, bSel, bKeep );
+            pTabViewShell->MoveCursorEnd( 1, 1, SC_FOLLOW_JUMP_END, bSel, 
bKeep );
             break;
 
         default:
diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx
index 9a321f73eefe..723f2b4904e0 100644
--- a/sc/source/ui/view/tabview3.cxx
+++ b/sc/source/ui/view/tabview3.cxx
@@ -959,8 +959,17 @@ void ScTabView::AlignToCursor( SCCOL nCurX, SCROW nCurY, 
ScFollowMode eMode,
         else
             nCellSizeX = nCellSizeY = 0;
         Size aScrSize = aViewData.GetScrSize();
-        tools::Long nSpaceX = ( aScrSize.Width()  - nCellSizeX ) / 2;
-        tools::Long nSpaceY = ( aScrSize.Height() - nCellSizeY ) / 2;
+
+        tools::Long nDenom;
+        if ( eMode == SC_FOLLOW_JUMP_END && nCurX > aViewData.GetRefStartX()
+            && nCurY > aViewData.GetRefStartY() )
+            nDenom = 1; // tdf#154271 Selected cell will be at the bottom 
corner
+                        // to maximize the visible/usable area
+        else
+            nDenom = 2; // Selected cell will be at the center of the screen, 
so that
+                        // it will be visible. This is useful for search 
results, etc.
+        tools::Long nSpaceX = ( aScrSize.Width()  - nCellSizeX ) / nDenom;
+        tools::Long nSpaceY = ( aScrSize.Height() - nCellSizeY ) / nDenom;
         //  nSpaceY: desired start position of cell for FOLLOW_JUMP, modified 
if dialog interferes
 
         bool bForceNew = false;     // force new calculation of JUMP position 
(vertical only)
@@ -971,7 +980,7 @@ void ScTabView::AlignToCursor( SCCOL nCurX, SCROW nCurY, 
ScFollowMode eMode,
         // if possible, put the row with the cursor above or below the dialog
         //! not if already completely visible
 
-        if ( eMode == SC_FOLLOW_JUMP )
+        if ( eMode == SC_FOLLOW_JUMP || eMode == SC_FOLLOW_JUMP_END )
         {
             weld::Window* pCare = lcl_GetCareWin( 
aViewData.GetViewShell()->GetViewFrame() );
             if (pCare)
@@ -1042,6 +1051,7 @@ void ScTabView::AlignToCursor( SCCOL nCurX, SCROW nCurY, 
ScFollowMode eMode,
         switch (eMode)
         {
             case SC_FOLLOW_JUMP:
+            case SC_FOLLOW_JUMP_END:
                 if ( nCurX < nDeltaX || nCurX >= nDeltaX+nSizeX )
                 {
                     nNewDeltaX = nCurX - aViewData.CellsAtX( nCurX, -1, 
eAlignX, static_cast<sal_uInt16>(nSpaceX) );
@@ -1521,7 +1531,7 @@ bool ScTabView::MoveCursorKeyInput( const KeyEvent& 
rKeyEvent )
     if( (nCode == KEY_HOME) || (nCode == KEY_END) )
     {
         nDX = (nCode == KEY_HOME) ? -1 : 1;
-        ScFollowMode eMode = (nCode == KEY_HOME) ? SC_FOLLOW_LINE : 
SC_FOLLOW_JUMP;
+        ScFollowMode eMode = (nCode == KEY_HOME) ? SC_FOLLOW_LINE : 
SC_FOLLOW_JUMP_END;
         switch( eModifier )
         {
             case MOD_NONE:  MoveCursorEnd( nDX, 0, eMode, bSel );   break;

Reply via email to