include/vcl/jsdialog/executor.hxx |   15 +++++++++++++++
 include/vcl/layout.hxx            |   10 +++++-----
 include/vcl/weld.hxx              |    6 ++++++
 vcl/inc/salvtables.hxx            |    6 ++++++
 vcl/jsdialog/executor.cxx         |   26 ++++++++++++++++----------
 vcl/source/app/salvtables.cxx     |   18 ++++++++++++++++++
 6 files changed, 66 insertions(+), 15 deletions(-)

New commits:
commit c19f041f27c9a297ec20107acc89e9b1144ec070
Author:     Szymon Kłos <[email protected]>
AuthorDate: Fri Mar 31 17:12:51 2023 +0200
Commit:     Szymon Kłos <[email protected]>
CommitDate: Thu Apr 6 10:53:21 2023 +0200

    jsdialog: implemented mouse events for drawingarea
    
    Change-Id: Ieab3d9fdbcee90ccd125e84f74c06cd1d6711a9f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149953
    Tested-by: Szymon Kłos <[email protected]>
    Reviewed-by: Szymon Kłos <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150057
    Tested-by: Jenkins

diff --git a/include/vcl/jsdialog/executor.hxx 
b/include/vcl/jsdialog/executor.hxx
index 6138f156e0de..005f9f36070d 100644
--- a/include/vcl/jsdialog/executor.hxx
+++ b/include/vcl/jsdialog/executor.hxx
@@ -66,6 +66,21 @@ public:
         rDrawingArea.dblclick(rPos);
     }
 
+    static void trigger_mouse_up(weld::DrawingArea& rDrawingArea, const Point& 
rPos)
+    {
+        rDrawingArea.mouse_up(rPos);
+    }
+
+    static void trigger_mouse_down(weld::DrawingArea& rDrawingArea, const 
Point& rPos)
+    {
+        rDrawingArea.mouse_down(rPos);
+    }
+
+    static void trigger_mouse_move(weld::DrawingArea& rDrawingArea, const 
Point& rPos)
+    {
+        rDrawingArea.mouse_move(rPos);
+    }
+
     static void trigger_selected(weld::MenuButton& rButton, const OUString& 
rIdent)
     {
         rButton.signal_selected(rIdent);
diff --git a/include/vcl/layout.hxx b/include/vcl/layout.hxx
index 995b0d952ff0..507225f4d249 100644
--- a/include/vcl/layout.hxx
+++ b/include/vcl/layout.hxx
@@ -647,11 +647,6 @@ private:
     {
         m_aResizeHdl.Call(GetOutputSizePixel());
     }
-    virtual void MouseMove(const MouseEvent& rMEvt) override
-    {
-        if (!m_aMouseMotionHdl.Call(rMEvt))
-            Control::MouseMove(rMEvt);
-    }
     virtual void KeyInput(const KeyEvent& rKEvt) override
     {
         if (!m_aKeyPressHdl.Call(rKEvt))
@@ -711,6 +706,11 @@ public:
         if (!m_aMouseReleaseHdl.Call(rMEvt))
             Control::MouseButtonUp(rMEvt);
     }
+    virtual void MouseMove(const MouseEvent& rMEvt) override
+    {
+        if (!m_aMouseMotionHdl.Call(rMEvt))
+            Control::MouseMove(rMEvt);
+    }
     virtual OUString GetSurroundingText() const override;
     virtual Selection GetSurroundingTextSelection() const override;
     virtual bool DeleteSurroundingText(const Selection& rSelection) override;
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 5b763b4b253c..e9068f446d6d 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -2360,6 +2360,12 @@ private:
     virtual void click(const Point&) = 0;
 
     virtual void dblclick(const Point&){};
+
+    virtual void mouse_up(const Point&){};
+
+    virtual void mouse_down(const Point&){};
+
+    virtual void mouse_move(const Point&){};
 };
 
 enum class Placement
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index bd462ad56ccd..cbb9fce51eee 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -1341,6 +1341,12 @@ public:
     virtual void click(const Point& rPos) override;
 
     virtual void dblclick(const Point& rPos) override;
+
+    virtual void mouse_up(const Point& rPos) override;
+
+    virtual void mouse_down(const Point& rPos) override;
+
+    virtual void mouse_move(const Point& rPos) override;
 };
 
 class SalInstanceToolbar : public SalInstanceWidget, public virtual 
weld::Toolbar
diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx
index cb8dfa4d455c..eb11af9b2884 100644
--- a/vcl/jsdialog/executor.cxx
+++ b/vcl/jsdialog/executor.cxx
@@ -192,7 +192,8 @@ bool ExecuteAction(const OUString& nWindowId, const 
OUString& rWidget, StringMap
             auto pArea = dynamic_cast<weld::DrawingArea*>(pWidget);
             if (pArea)
             {
-                if (sAction == "click" || sAction == "dblclick")
+                if (sAction == "click" || sAction == "dblclick" || sAction == 
"mousemove"
+                    || sAction == "mousedown" || sAction == "mouseup")
                 {
                     OUString sClickData = rData["data"];
                     int nSeparatorPos = sClickData.indexOf(';');
@@ -205,23 +206,28 @@ bool ExecuteAction(const OUString& nWindowId, const 
OUString& rWidget, StringMap
                         if (nClickPosX.empty() || nClickPosY.empty())
                             return true;
 
-                        double posX = o3tl::toDouble(nClickPosX);
-                        double posY = o3tl::toDouble(nClickPosY);
+                        double fPosX = o3tl::toDouble(nClickPosX);
+                        double fPosY = o3tl::toDouble(nClickPosY);
                         OutputDevice& rRefDevice = pArea->get_ref_device();
                         // We send OutPutSize for the drawing area bitmap
                         // get_size_request is not necessarily updated
                         // therefore it may be incorrect.
                         Size size = rRefDevice.GetOutputSizePixel();
-                        posX = posX * size.Width();
-                        posY = posY * size.Height();
+                        fPosX = fPosX * size.Width();
+                        fPosY = fPosY * size.Height();
+
                         if (sAction == "click")
-                            LOKTrigger::trigger_click(*pArea, Point(posX, 
posY));
-                        else
-                            LOKTrigger::trigger_dblclick(*pArea, Point(posX, 
posY));
-                        return true;
+                            LOKTrigger::trigger_click(*pArea, Point(fPosX, 
fPosY));
+                        else if (sAction == "dblclick")
+                            LOKTrigger::trigger_dblclick(*pArea, Point(fPosX, 
fPosY));
+                        else if (sAction == "mouseup")
+                            LOKTrigger::trigger_mouse_up(*pArea, Point(fPosX, 
fPosY));
+                        else if (sAction == "mousedown")
+                            LOKTrigger::trigger_mouse_down(*pArea, 
Point(fPosX, fPosY));
+                        else if (sAction == "mousemove")
+                            LOKTrigger::trigger_mouse_move(*pArea, 
Point(fPosX, fPosY));
                     }
 
-                    LOKTrigger::trigger_click(*pArea, Point(10, 10));
                     return true;
                 }
                 else if (sAction == "keypress")
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 3e13d215f2cb..0b818bf2f5f4 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -6348,6 +6348,24 @@ void SalInstanceDrawingArea::dblclick(const Point& rPos)
     m_xDrawingArea->MouseButtonUp(aEvent);
 }
 
+void SalInstanceDrawingArea::mouse_up(const Point& rPos)
+{
+    MouseEvent aEvent(rPos, 0, MouseEventModifiers::NONE, MOUSE_LEFT, 0);
+    m_xDrawingArea->MouseButtonUp(aEvent);
+}
+
+void SalInstanceDrawingArea::mouse_down(const Point& rPos)
+{
+    MouseEvent aEvent(rPos, 0, MouseEventModifiers::NONE, MOUSE_LEFT, 0);
+    m_xDrawingArea->MouseButtonDown(aEvent);
+}
+
+void SalInstanceDrawingArea::mouse_move(const Point& rPos)
+{
+    MouseEvent aEvent(rPos, 0, MouseEventModifiers::NONE, MOUSE_LEFT, 0);
+    m_xDrawingArea->MouseMove(aEvent);
+}
+
 IMPL_LINK(SalInstanceDrawingArea, PaintHdl, target_and_area, aPayload, void)
 {
     m_aDrawHdl.Call(aPayload);

Reply via email to