include/vcl/jsdialog/executor.hxx |    5 +++++
 include/vcl/toolkit/fixed.hxx     |    2 +-
 include/vcl/weld.hxx              |    2 ++
 include/vcl/wintypes.hxx          |    3 ++-
 vcl/jsdialog/executor.cxx         |   12 ++++++++++++
 vcl/source/control/fixed.cxx      |    4 ++--
 vcl/source/control/fixedhyper.cxx |    2 +-
 vcl/source/window/window.cxx      |    1 +
 8 files changed, 26 insertions(+), 5 deletions(-)

New commits:
commit 7e865aa72d56d83244bc200fbbe405fa3f9ee67f
Author:     Tomaž Vajngerl <[email protected]>
AuthorDate: Thu May 2 14:32:52 2024 +0900
Commit:     Szymon Kłos <[email protected]>
CommitDate: Thu May 2 10:00:57 2024 +0200

    jsdialog: support for LinkButton as an independent widget
    
    This adds support for the (weld)LinkButton (FixedHyperlink) as an
    independent widget and not part of FixedText to jsdialog. In addition
    add "click" event that triggers activate_link method.
    
    Change-Id: Id110b4a0fd60fc24592e00235243783d46ae4575
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166991
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Szymon Kłos <[email protected]>

diff --git a/include/vcl/jsdialog/executor.hxx 
b/include/vcl/jsdialog/executor.hxx
index b60c035d587a..ef667a70ce26 100644
--- a/include/vcl/jsdialog/executor.hxx
+++ b/include/vcl/jsdialog/executor.hxx
@@ -126,6 +126,11 @@ public:
     {
         rNotebook.m_aLeavePageHdl.Call(rPage);
     }
+
+    static bool activate_link(weld::LinkButton& rLinkButton)
+    {
+        return rLinkButton.signal_activate_link();
+    }
 };
 
 namespace jsdialog
diff --git a/include/vcl/toolkit/fixed.hxx b/include/vcl/toolkit/fixed.hxx
index 2b88e895184a..29e0b3bfdf5a 100644
--- a/include/vcl/toolkit/fixed.hxx
+++ b/include/vcl/toolkit/fixed.hxx
@@ -53,7 +53,7 @@ protected:
     virtual vcl::Window* getAccessibleRelationLabelFor() const override;
 
 public:
-    explicit        FixedText( vcl::Window* pParent, WinBits nStyle = 0 );
+    explicit FixedText(vcl::Window* pParent, WinBits nStyle = 0, WindowType 
eType = WindowType::FIXEDTEXT);
     virtual         ~FixedText() override;
     virtual void    dispose() override;
 
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index fc585bdb1071..3a58608e1902 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -1665,6 +1665,8 @@ class VCL_DLLPUBLIC RadioButton : virtual public 
CheckButton
 
 class VCL_DLLPUBLIC LinkButton : virtual public Widget
 {
+    friend class ::LOKTrigger;
+
     Link<LinkButton&, bool> m_aActivateLinkHdl;
 
 protected:
diff --git a/include/vcl/wintypes.hxx b/include/vcl/wintypes.hxx
index c025e83b0afe..d0d6208d735b 100644
--- a/include/vcl/wintypes.hxx
+++ b/include/vcl/wintypes.hxx
@@ -99,7 +99,8 @@ enum class WindowType : sal_uInt16
     HEADERBAR            ,
     VERTICALTABCONTROL   ,
     PROGRESSBAR          ,
-    LAST                 = PROGRESSBAR,
+    LINK_BUTTON,
+    LAST = LINK_BUTTON,
     // only used in vclxtoolkit.cxx
     TOOLKIT_FRAMEWINDOW        = 0x1000,
     TOOLKIT_SYSTEMCHILDWINDOW  = 0x1001,
diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx
index 7c36eb3bdc1e..3eebd350ef88 100644
--- a/vcl/jsdialog/executor.cxx
+++ b/vcl/jsdialog/executor.cxx
@@ -164,6 +164,18 @@ bool ExecuteAction(const OUString& nWindowId, const 
OUString& rWidget, StringMap
                 }
             }
         }
+        else if (sControlType == "linkbutton")
+        {
+            auto pButton = dynamic_cast<weld::LinkButton*>(pWidget);
+            if (pButton)
+            {
+                if (sAction == "click")
+                {
+                    LOKTrigger::activate_link(*pButton);
+                    return true;
+                }
+            }
+        }
         else if (sControlType == "menubutton")
         {
             auto pButton = dynamic_cast<weld::MenuButton*>(pWidget);
diff --git a/vcl/source/control/fixed.cxx b/vcl/source/control/fixed.cxx
index 068332e5b610..ce5bbf486c85 100644
--- a/vcl/source/control/fixed.cxx
+++ b/vcl/source/control/fixed.cxx
@@ -94,8 +94,8 @@ const Color& FixedText::GetCanonicalTextColor( const 
StyleSettings& _rStyle ) co
     return _rStyle.GetLabelTextColor();
 }
 
-FixedText::FixedText( vcl::Window* pParent, WinBits nStyle )
-    : Control(WindowType::FIXEDTEXT)
+FixedText::FixedText(vcl::Window* pParent, WinBits nStyle, WindowType eType)
+    : Control(eType)
     , m_nMaxWidthChars(-1)
     , m_nMinWidthChars(-1)
     , m_pMnemonicWindow(nullptr)
diff --git a/vcl/source/control/fixedhyper.cxx 
b/vcl/source/control/fixedhyper.cxx
index 5b4960d92f86..5c8e9e4a29d1 100644
--- a/vcl/source/control/fixedhyper.cxx
+++ b/vcl/source/control/fixedhyper.cxx
@@ -34,7 +34,7 @@
 using namespace css;
 
 FixedHyperlink::FixedHyperlink(vcl::Window* pParent, WinBits nWinStyle)
-    : FixedText(pParent, nWinStyle)
+    : FixedText(pParent, nWinStyle, WindowType::LINK_BUTTON)
     , m_nTextLen(0)
     , m_aOldPointer(PointerStyle::Arrow)
 {
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index b57aee6cccf1..b3585c8d80bf 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -3346,6 +3346,7 @@ std::string_view windowTypeName(WindowType nWindowType)
         case WindowType::HEADERBAR:                 return "headerbar";
         case WindowType::VERTICALTABCONTROL:        return 
"verticaltabcontrol";
         case WindowType::PROGRESSBAR:               return "progressbar";
+        case WindowType::LINK_BUTTON:               return "linkbutton";
 
         // nothing to do here, but for completeness
         case WindowType::TOOLKIT_FRAMEWINDOW:       return 
"toolkit_framewindow";

Reply via email to