sc/source/ui/view/gridwin.cxx |   74 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 71 insertions(+), 3 deletions(-)

New commits:
commit 9df77234026458c28897479a6db9ff9e9c88788d
Author:     Henry Castro <hcas...@collabora.com>
AuthorDate: Thu Apr 27 17:05:09 2023 -0400
Commit:     Henry Castro <hcas...@collabora.com>
CommitDate: Sun May 21 14:01:02 2023 +0200

    lok: sc: fix layout RTL mouse selection
    
    If the Calc is in layout RTL, the edit view mouse
    selection does not change.
    
    Signed-off-by: Henry Castro <hcas...@collabora.com>
    Change-Id: I0bd2640dac3cdc96fa247c305c379b2d1a8564ee
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150757
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151974
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 9c63aafe70e0..257ca66e6e61 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -50,6 +50,7 @@
 #include <vcl/weldutils.hxx>
 #include <sot/formats.hxx>
 #include <comphelper/classids.hxx>
+#include <comphelper/scopeguard.hxx>
 
 #include <svx/svdview.hxx>
 #include <svx/svdocapt.hxx>
@@ -346,6 +347,18 @@ static bool lcl_GetHyperlinkCell(
     return bFound;
 }
 
+static void lcl_GetMirror(Point& rPoint, tools::Rectangle& rRect, const 
tools::Long nWidth)
+{
+    tools::Long nLeft = rRect.Left();
+    tools::Long nRight = rRect.Right();
+    tools::Long nMirrorPX = o3tl::convert(nWidth, o3tl::Length::twip, 
o3tl::Length::px);
+    tools::Long nMirrorMM = o3tl::convert(nWidth, o3tl::Length::twip, 
o3tl::Length::mm100);
+
+    rPoint.setX(nMirrorPX - rPoint.X());
+    rRect.SetLeft(nMirrorMM - nRight);
+    rRect.SetRight(nMirrorMM - nLeft);
+}
+
 //  WB_DIALOGCONTROL needed for UNO-Controls
 ScGridWindow::ScGridWindow( vcl::Window* pParent, ScViewData& rData, 
ScSplitPos eWhichPos )
 :           DocWindow( pParent, WB_CLIPCHILDREN | WB_DIALOGCONTROL ),
@@ -1851,7 +1864,25 @@ void ScGridWindow::HandleMouseButtonDown( const 
MouseEvent& rMEvt, MouseEventSta
 
             pScMod->SetInputMode( SC_INPUT_TABLE );
             bEEMouse = true;
-            pEditView->MouseButtonDown( rMEvt );
+
+            if (comphelper::LibreOfficeKit::isActive() && 
rDoc.IsLayoutRTL(mrViewData.GetTabNo()))
+            {
+                Point aMouse = rMEvt.GetPosPixel();
+                tools::Rectangle aOutputArea = pEditView->GetOutputArea();
+                comphelper::ScopeGuard aOutputGuard(
+                    [pEditView, aOutputArea] {
+                        pEditView->SetOutputArea(aOutputArea);
+                    });
+
+                lcl_GetMirror(aMouse, aOutputArea, 
mrViewData.getLOKVisibleArea().GetWidth());
+                pEditView->SetOutputArea(aOutputArea);
+
+                MouseEvent aEvent(aMouse, rMEvt.GetClicks(), rMEvt.GetMode(),
+                                  rMEvt.GetButtons(), rMEvt.GetModifier());
+                pEditView->MouseButtonDown( aEvent );
+            }
+            else
+                pEditView->MouseButtonDown( rMEvt );
             return;
         }
     }
@@ -2119,7 +2150,25 @@ void ScGridWindow::MouseButtonUp( const MouseEvent& 
rMEvt )
         SCCOL       nEditCol;
         SCROW       nEditRow;
         mrViewData.GetEditView( eWhich, pEditView, nEditCol, nEditRow );
-        pEditView->MouseButtonUp( rMEvt );
+
+        if (comphelper::LibreOfficeKit::isActive() && 
rDoc.IsLayoutRTL(mrViewData.GetTabNo()))
+        {
+            Point aMouse = rMEvt.GetPosPixel();
+            tools::Rectangle aOutputArea = pEditView->GetOutputArea();
+            comphelper::ScopeGuard aOutputGuard(
+                [pEditView, aOutputArea] {
+                    pEditView->SetOutputArea(aOutputArea);
+                });
+
+            lcl_GetMirror(aMouse, aOutputArea, 
mrViewData.getLOKVisibleArea().GetWidth());
+            pEditView->SetOutputArea(aOutputArea);
+
+            MouseEvent aEvent(aMouse, rMEvt.GetClicks(), rMEvt.GetMode(),
+                              rMEvt.GetButtons(), rMEvt.GetModifier());
+            pEditView->MouseButtonUp( aEvent );
+        }
+        else
+            pEditView->MouseButtonUp( rMEvt );
 
         if ( rMEvt.IsMiddle() &&
                  GetSettings().GetMouseSettings().GetMiddleButtonAction() == 
MouseMiddleButtonAction::PasteSelection )
@@ -2612,7 +2661,26 @@ void ScGridWindow::MouseMove( const MouseEvent& rMEvt )
         SCCOL       nEditCol;
         SCROW       nEditRow;
         mrViewData.GetEditView( eWhich, pEditView, nEditCol, nEditRow );
-        pEditView->MouseMove( rMEvt );
+
+        if (comphelper::LibreOfficeKit::isActive() && 
mrViewData.GetDocument().IsLayoutRTL(mrViewData.GetTabNo()))
+        {
+            Point aMouse = rMEvt.GetPosPixel();
+            tools::Rectangle aOutputArea = pEditView->GetOutputArea();
+            comphelper::ScopeGuard aOutputGuard(
+                [pEditView, aOutputArea] {
+                    pEditView->SetOutputArea(aOutputArea);
+                });
+
+            lcl_GetMirror(aMouse, aOutputArea, 
mrViewData.getLOKVisibleArea().GetWidth());
+            pEditView->SetOutputArea(aOutputArea);
+
+            MouseEvent aEvent(aMouse, rMEvt.GetClicks(), rMEvt.GetMode(),
+                              rMEvt.GetButtons(), rMEvt.GetModifier());
+
+            pEditView->MouseMove( aEvent );
+        }
+        else
+            pEditView->MouseMove( rMEvt );
         return;
     }
 

Reply via email to