vcl/inc/jsdialog/jsdialogbuilder.hxx | 9 +++++ vcl/jsdialog/jsdialogbuilder.cxx | 58 +++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+)
New commits: commit 94376bb8299db8dfcba6afba16de7845c647ecdd Author: Henry Castro <hcas...@collabora.com> AuthorDate: Tue Mar 2 19:09:21 2021 -0400 Commit: Szymon Kłos <szymon.k...@collabora.com> CommitDate: Tue Mar 9 13:49:51 2021 +0100 jsdialog: JSMessageDialog tweaks when builder is nullptr "CreateMessageDialog" creates the message dialog without builder, so some buttons need a click handler to close the message dialog. Change-Id: I73ac99020abfb23a1b1313468b6b0f5a8a17f039 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111852 Reviewed-by: Szymon Kłos <szymon.k...@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 24dbf8744d03..a6b8021a50b4 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -265,6 +265,9 @@ public: VclButtonsType eButtonType, const OUString& rPrimaryMessage); + static void AddChildWidget(sal_uInt64 nWindowId, const OString& id, weld::Widget* pWidget); + static void RemoveWindowWidget(sal_uInt64 nWindowId); + private: const std::string& GetTypeOfJSON(); VclPtr<vcl::Window>& GetContentWindow(); @@ -466,11 +469,17 @@ public: class JSMessageDialog : public JSWidget<SalInstanceMessageDialog, ::MessageDialog> { std::unique_ptr<JSDialogSender> m_pOwnedSender; + std::unique_ptr<JSButton> m_pOK; + std::unique_ptr<JSButton> m_pCancel; + + DECL_LINK(OKHdl, weld::Button&, void); + DECL_LINK(CancelHdl, weld::Button&, void); public: JSMessageDialog(JSDialogSender* pSender, ::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership); JSMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + virtual ~JSMessageDialog(); virtual void set_primary_text(const OUString& rText) override; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 3fd84f281ef7..b102b557002f 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -520,6 +520,25 @@ void JSInstanceBuilder::RememberWidget(const OString& id, weld::Widget* pWidget) } } +void JSInstanceBuilder::AddChildWidget(sal_uInt64 nWindowId, const OString& id, weld::Widget* pWidget) +{ + auto it = GetLOKWeldWidgetsMap().find(nWindowId); + if (it != GetLOKWeldWidgetsMap().end()) + { + it->second.erase(id); + it->second.insert(WidgetMap::value_type(id, pWidget)); + } +} + +void JSInstanceBuilder::RemoveWindowWidget(sal_uInt64 nWindowId) +{ + auto it = JSInstanceBuilder::GetLOKWeldWidgetsMap().find(nWindowId); + if (it != JSInstanceBuilder::GetLOKWeldWidgetsMap().end()) + { + JSInstanceBuilder::GetLOKWeldWidgetsMap().erase(it); + } +} + const std::string& JSInstanceBuilder::GetTypeOfJSON() { return m_sTypeOfJSON; } VclPtr<vcl::Window>& JSInstanceBuilder::GetContentWindow() @@ -810,6 +829,8 @@ weld::MessageDialog* JSInstanceBuilder::CreateMessageDialog(weld::Widget* pParen pNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_JSDIALOG, message.c_str()); } + xMessageDialog->SetLOKTunnelingState(false); + InsertWindowToMap(xMessageDialog->GetLOKWindowId()); return new JSMessageDialog(xMessageDialog, nullptr, true); } @@ -999,6 +1020,43 @@ JSMessageDialog::JSMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* p , m_pOwnedSender(new JSDialogSender(pDialog, pDialog, "dialog")) { m_pSender = m_pOwnedSender.get(); + + if (!pBuilder) + { + if(::OKButton* pOKBtn = dynamic_cast<::OKButton*>(m_xMessageDialog->get_widget_for_response(RET_OK))) + { + m_pOK.reset(new JSButton(m_pSender, pOKBtn, nullptr, false)); + JSInstanceBuilder::AddChildWidget(m_xMessageDialog->GetLOKWindowId(), + pOKBtn->get_id().toUtf8(), + m_pOK.get()); + m_pOK->connect_clicked(LINK(this, JSMessageDialog, OKHdl)); + } + + if(::CancelButton* pCancelBtn = dynamic_cast<::CancelButton*>(m_xMessageDialog->get_widget_for_response(RET_CANCEL))) + { + m_pCancel.reset(new JSButton(m_pSender, pCancelBtn, nullptr, false)); + JSInstanceBuilder::AddChildWidget(m_xMessageDialog->GetLOKWindowId(), + pCancelBtn->get_id().toUtf8(), + m_pCancel.get()); + m_pCancel->connect_clicked(LINK(this, JSMessageDialog, CancelHdl)); + } + } +} + +JSMessageDialog::~JSMessageDialog() +{ + if (m_pOK || m_pCancel) + JSInstanceBuilder::RemoveWindowWidget(m_xMessageDialog->GetLOKWindowId()); +} + +IMPL_LINK_NOARG(JSMessageDialog, OKHdl, weld::Button&, void) +{ + response(RET_OK); +} + +IMPL_LINK_NOARG(JSMessageDialog, CancelHdl, weld::Button&, void) +{ + response(RET_CANCEL); } void JSMessageDialog::set_primary_text(const OUString& rText) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits