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

New commits:
commit cdf604f95c132f0f88ce31b002d47d1abd731d50
Author:     Henry Castro <hcas...@collabora.com>
AuthorDate: Thu Apr 27 17:05:09 2023 -0400
Commit:     Henry Castro <hcas...@collabora.com>
CommitDate: Tue May 2 21:04:44 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

diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 47370ee4f4a4..266790951ded 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -48,6 +48,7 @@
 #include <vcl/weldutils.hxx>
 #include <sot/formats.hxx>
 #include <comphelper/classids.hxx>
+#include <comphelper/scopeguard.hxx>
 
 #include <svx/drawitem.hxx>
 #include <svx/svdview.hxx>
@@ -345,6 +346,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 ),
@@ -1878,7 +1891,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;
         }
     }
@@ -2139,7 +2170,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 )
@@ -2632,7 +2681,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