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)