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 ++++++++++
 writerperfect/source/writer/EPUBExportUIComponent.cxx |   25 ++++++++++++++++++
 writerperfect/source/writer/EPUBExportUIComponent.hxx |   14 ++++++++++
 7 files changed, 85 insertions(+)

New commits:
commit 9461b0e1385b87d2490bf9402729fb9e912395e9
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Fri Dec 9 13:53:47 2022 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Wed Dec 14 12:44:25 2022 +0000

    Make EPUB Export dialog async
    
    Change-Id: Iead5b4ff6064395fd5abbcdea73db38415dbb37c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143877
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Andras Timar <andras.ti...@collabora.com>

diff --git a/writerperfect/source/writer/EPUBExportUIComponent.cxx 
b/writerperfect/source/writer/EPUBExportUIComponent.cxx
index e8d618b99cf6..0e392ffe00ec 100644
--- a/writerperfect/source/writer/EPUBExportUIComponent.cxx
+++ b/writerperfect/source/writer/EPUBExportUIComponent.cxx
@@ -90,6 +90,31 @@ void SAL_CALL EPUBExportUIComponent::setSourceDocument(
     mxSourceDocument = xDocument;
 }
 
+void SAL_CALL EPUBExportUIComponent::setDialogTitle(const OUString& aTitle) { 
setTitle(aTitle); }
+
+void SAL_CALL EPUBExportUIComponent::startExecuteModal(
+    const css::uno::Reference<css::ui::dialogs::XDialogClosedListener>& 
xListener)
+{
+    SolarMutexGuard aSolarGuard;
+
+    if (!mxAsyncDialog)
+    {
+        if (mxSourceDocument.is())
+            mxAsyncDialog
+                = 
std::make_shared<EPUBExportDialog>(Application::GetFrameWeld(mxDialogParent),
+                                                     maFilterData, mxContext, 
mxSourceDocument);
+
+        if (!mxAsyncDialog)
+            return;
+    }
+
+    weld::DialogController::runAsync(mxAsyncDialog, [xListener](sal_Int32 
nResponse) {
+        css::ui::dialogs::DialogClosedEvent aEvent;
+        aEvent.DialogResult = nResponse;
+        xListener->dialogClosed(aEvent);
+    });
+}
+
 extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface*
 com_sun_star_comp_Writer_EPUBExportUIComponent_get_implementation(
     uno::XComponentContext* pCtx, uno::Sequence<uno::Any> const& /*rSeq*/)
diff --git a/writerperfect/source/writer/EPUBExportUIComponent.hxx 
b/writerperfect/source/writer/EPUBExportUIComponent.hxx
index 71fcc0ace168..b453a4e88096 100644
--- a/writerperfect/source/writer/EPUBExportUIComponent.hxx
+++ b/writerperfect/source/writer/EPUBExportUIComponent.hxx
@@ -12,6 +12,7 @@
 #include <com/sun/star/beans/XPropertyAccess.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp>
 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
 #include <com/sun/star/document/XExporter.hpp>
 #include <com/sun/star/awt/XWindow.hpp>
@@ -19,6 +20,11 @@
 #include <comphelper/sequenceashashmap.hxx>
 #include <cppuhelper/implbase.hxx>
 
+namespace weld
+{
+class DialogController;
+}
+
 namespace com::sun::star::uno
 {
 class XComponentContext;
@@ -30,6 +36,7 @@ namespace writerperfect
 class EPUBExportUIComponent
     : public cppu::WeakImplHelper<css::beans::XPropertyAccess, 
css::lang::XInitialization,
                                   css::lang::XServiceInfo, 
css::ui::dialogs::XExecutableDialog,
+                                  
css::ui::dialogs::XAsynchronousExecutableDialog,
                                   css::document::XExporter>
 {
 public:
@@ -49,6 +56,12 @@ public:
     void SAL_CALL setTitle(const OUString& rTitle) override;
     sal_Int16 SAL_CALL execute() override;
 
+    // XAsynchronousExecutableDialog
+    void SAL_CALL setDialogTitle(const OUString& aTitle) override;
+
+    void SAL_CALL startExecuteModal(
+        const css::uno::Reference<css::ui::dialogs::XDialogClosedListener>& 
xListener) override;
+
     // XExporter
     void SAL_CALL
     setSourceDocument(const css::uno::Reference<css::lang::XComponent>& 
xDocument) override;
@@ -65,6 +78,7 @@ private:
     css::uno::Reference<css::uno::XComponentContext> mxContext;
     css::uno::Reference<css::lang::XComponent> mxSourceDocument;
     css::uno::Reference<css::awt::XWindow> mxDialogParent;
+    std::shared_ptr<weld::DialogController> mxAsyncDialog;
 };
 
 } // namespace writerperfect
commit 1257c288a0ba03fc69e7bc29fcf05642eb91d150
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Tue Dec 6 18:23:32 2022 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Wed Dec 14 12:44:13 2022 +0000

    jsdialog: enter/leave tab page handlers
    
    Change-Id: I2cbc0fc18f716bf214db61f0729d666a1d2d172c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143741
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Pedro Silva <pedro.si...@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 2d54da18d641..ddcba84d8b71 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -461,6 +461,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 e5f3e6916d76..35c954dc9b8a 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 d56cfbc63e8e..9096e9eb027e 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
                     OString pageId = OUStringToOString(rData["data"], 
RTL_TEXTENCODING_ASCII_US);
                     int page = std::atoi(pageId.getStr());
 
+                    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 45c0781e898b..9db13c08fe9f 100644
--- a/vcl/jsdialog/jsdialogbuilder.cxx
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -1321,6 +1321,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