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 3ad0984f25fe4ad955c4797281b4b5284176732e
Author:     Szymon Kłos <[email protected]>
AuthorDate: Fri Mar 31 17:12:51 2023 +0200
Commit:     Szymon Kłos <[email protected]>
CommitDate: Mon Apr 3 21:07:45 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]>

diff --git a/include/vcl/jsdialog/executor.hxx 
b/include/vcl/jsdialog/executor.hxx
index 40214fb465af..1a1ad61030d7 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 OString& 
rIdent)
     {
         rButton.signal_selected(rIdent);
diff --git a/include/vcl/layout.hxx b/include/vcl/layout.hxx
index f5090b24eac2..fd9dfe7bdce6 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 1a1e5ab4a223..b87af80565ab 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -2356,6 +2356,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 efc5e07e3ae7..ea302ef1e4c3 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -1332,6 +1332,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 72ae39c9c457..a178d60fc2c3 100644
--- a/vcl/jsdialog/executor.cxx
+++ b/vcl/jsdialog/executor.cxx
@@ -193,7 +193,8 @@ bool ExecuteAction(const std::string& nWindowId, const 
OString& rWidget, StringM
             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(';');
@@ -206,23 +207,28 @@ bool ExecuteAction(const std::string& nWindowId, const 
OString& rWidget, StringM
                         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 20a53926ee3a..629f77cd7d4d 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -6331,6 +6331,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