include/vcl/jsdialog/executor.hxx    |   10 ++++++++++
 include/vcl/weld.hxx                 |    2 ++
 vcl/inc/jsdialog/jsdialogbuilder.hxx |   17 +++++++++++++++++
 vcl/jsdialog/executor.cxx            |    3 +++
 vcl/jsdialog/jsdialogbuilder.cxx     |   14 ++++++++++++++
 5 files changed, 46 insertions(+)

New commits:
commit cc067789ab7fd67bdd6f6ba8ce53a6580a56d7ff
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Tue Dec 6 18:23:32 2022 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Dec 16 19:49:56 2022 +0000

    jsdialog: enter/leave tab page handlers
    
    (cherry picked from commit 1257c288a0ba03fc69e7bc29fcf05642eb91d150)
    
    Change-Id: I2cbc0fc18f716bf214db61f0729d666a1d2d172c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144344
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/include/vcl/jsdialog/executor.hxx 
b/include/vcl/jsdialog/executor.hxx
index 6e388a6a3f79..9bccad3f1865 100644
--- a/include/vcl/jsdialog/executor.hxx
+++ b/include/vcl/jsdialog/executor.hxx
@@ -72,6 +72,16 @@ public:
     {
         rArea.m_aCommandHdl.Call(rCmd);
     }
+
+    static void enter_page(weld::Notebook& rNotebook, const OString& rPage)
+    {
+        rNotebook.m_aEnterPageHdl.Call(rPage);
+    }
+
+    static void leave_page(weld::Notebook& rNotebook, const OString& rPage)
+    {
+        rNotebook.m_aLeavePageHdl.Call(rPage);
+    }
 };
 
 namespace jsdialog
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 3bcbc0a7a08d..c9273bf4743b 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -463,6 +463,8 @@ public:
 
 class VCL_DLLPUBLIC Notebook : virtual public Widget
 {
+    friend class ::LOKTrigger;
+
 protected:
     Link<const OString&, bool> m_aLeavePageHdl;
     Link<const OString&, void> m_aEnterPageHdl;
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx 
b/vcl/inc/jsdialog/jsdialogbuilder.hxx
index 291fd24babb7..564309a72626 100644
--- a/vcl/inc/jsdialog/jsdialogbuilder.hxx
+++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx
@@ -534,6 +534,12 @@ public:
 
 class JSNotebook final : public JSWidget<SalInstanceNotebook, ::TabControl>
 {
+    Link<const OString&, bool> m_aLeavePageOverridenHdl;
+    Link<const OString&, void> m_aEnterPageOverridenHdl;
+
+    DECL_LINK(LeaveHdl, const OString&, bool);
+    DECL_LINK(EnterHdl, const OString&, bool);
+
 public:
     JSNotebook(JSDialogSender* pSender, ::TabControl* pControl, 
SalInstanceBuilder* pBuilder,
                bool bTakeOwnership);
@@ -545,6 +551,17 @@ public:
     virtual void remove_page(const OString& rIdent) override;
 
     virtual void insert_page(const OString& rIdent, const OUString& rLabel, 
int nPos) override;
+
+    void connect_leave_page(const Link<const OString&, bool>& rLink)
+    {
+        m_aLeavePageHdl = LINK(this, JSNotebook, LeaveHdl);
+        m_aLeavePageOverridenHdl = rLink;
+    }
+    void connect_enter_page(const Link<const OString&, void>& rLink)
+    {
+        m_aLeavePageHdl = LINK(this, JSNotebook, EnterHdl);
+        m_aEnterPageOverridenHdl = rLink;
+    }
 };
 
 class JSSpinButton final : public JSWidget<SalInstanceSpinButton, 
::FormattedField>
diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx
index 51dcca8f5d16..acd0e084ae76 100644
--- a/vcl/jsdialog/executor.cxx
+++ b/vcl/jsdialog/executor.cxx
@@ -91,7 +91,10 @@ bool ExecuteAction(const std::string& nWindowId, const 
OString& rWidget, StringM
                 {
                     sal_Int32 page = o3tl::toInt32(rData["data"]);
 
+                    OString aCurrentPage = pNotebook->get_current_page_ident();
+                    LOKTrigger::leave_page(*pNotebook, aCurrentPage);
                     pNotebook->set_current_page(page);
+                    LOKTrigger::enter_page(*pNotebook, 
pNotebook->get_page_ident(page));
 
                     return true;
                 }
diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx
index da30834b0568..51566201638d 100644
--- a/vcl/jsdialog/jsdialogbuilder.cxx
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -1315,6 +1315,20 @@ void JSComboBox::set_active(int pos)
 
 bool JSComboBox::changed_by_direct_pick() const { return true; }
 
+IMPL_LINK(JSNotebook, LeaveHdl, const OString&, rPage, bool)
+{
+    m_aLeavePageOverridenHdl.Call(rPage);
+    sendFullUpdate();
+    return true;
+}
+
+IMPL_LINK(JSNotebook, EnterHdl, const OString&, rPage, bool)
+{
+    m_aEnterPageOverridenHdl.Call(rPage);
+    sendFullUpdate();
+    return true;
+}
+
 JSNotebook::JSNotebook(JSDialogSender* pSender, ::TabControl* pControl,
                        SalInstanceBuilder* pBuilder, bool bTakeOwnership)
     : JSWidget<SalInstanceNotebook, ::TabControl>(pSender, pControl, pBuilder, 
bTakeOwnership)

Reply via email to