diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2021-11-23 09:55:00 +0100 |
---|---|---|
committer | Szymon Kłos <szymon.klos@collabora.com> | 2022-02-01 10:27:39 +0100 |
commit | 1f847d09246a5bd437248234ddc32f1c491acdc7 (patch) | |
tree | be7fc57c61a5cf98a6a1405c8ec33990614bc54c /vcl | |
parent | 2a5f0acacad765f2e25f2b9974b979b2b3a9d0cb (diff) |
jsdialog: correctly clean statically created message dialogs
- remember WindowId for statically created message dialogs
- remember _DIALOG_ handle for message dialogs so response
action can be done
Change-Id: I1f6c9877e20dcbed4855b32d1e89d9ce3ff12111
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125686
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Jan Holesovsky <kendy@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129169
Tested-by: Szymon Kłos <szymon.klos@collabora.com>
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/jsdialog/jsdialogbuilder.hxx | 5 | ||||
-rw-r--r-- | vcl/jsdialog/jsdialogbuilder.cxx | 32 |
2 files changed, 28 insertions, 9 deletions
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 6c773312c3d0..59462a92468c 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -218,6 +218,8 @@ class JSInstanceBuilder final : public SalInstanceBuilder, public JSDialogSender static std::map<std::string, WidgetMap>& GetLOKWeldWidgetsMap(); static void InsertWindowToMap(const std::string& nWindowId); void RememberWidget(const OString& id, weld::Widget* pWidget); + static void RememberWidget(const std::string& nWindowId, const OString& id, + weld::Widget* pWidget); static weld::Widget* FindWeldWidgetsMap(const std::string& nWindowId, const OString& rWidget); std::string getMapIdFromWindowId() const; @@ -529,6 +531,9 @@ class JSMessageDialog final : public JSWidget<SalInstanceMessageDialog, ::Messag std::unique_ptr<JSButton> m_pOK; std::unique_ptr<JSButton> m_pCancel; + // used for message dialogs created using static functions + std::string m_sWindowId; + DECL_LINK(OKHdl, weld::Button&, void); DECL_LINK(CancelHdl, weld::Button&, void); diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 8c15f50ba78d..08fd92f6a57d 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -699,12 +699,18 @@ void JSInstanceBuilder::InsertWindowToMap(const std::string& nWindowId) void JSInstanceBuilder::RememberWidget(const OString& id, weld::Widget* pWidget) { - auto it = GetLOKWeldWidgetsMap().find(getMapIdFromWindowId()); + RememberWidget(getMapIdFromWindowId(), id, pWidget); + m_aRememberedWidgets.push_back(id.getStr()); +} + +void JSInstanceBuilder::RememberWidget(const std::string& 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)); - m_aRememberedWidgets.push_back(id.getStr()); } } @@ -1098,8 +1104,15 @@ weld::MessageDialog* JSInstanceBuilder::CreateMessageDialog(weld::Widget* pParen } xMessageDialog->SetLOKTunnelingState(false); - InsertWindowToMap(std::to_string(xMessageDialog->GetLOKWindowId())); - return new JSMessageDialog(xMessageDialog, nullptr, true); + std::string sWindowId = std::to_string(xMessageDialog->GetLOKWindowId()); + InsertWindowToMap(sWindowId); + + weld::MessageDialog* pRet = new JSMessageDialog(xMessageDialog, nullptr, true); + + if (pRet) + RememberWidget(sWindowId, "__DIALOG__", pRet); + + return pRet; } JSDialog::JSDialog(JSDialogSender* pSender, ::Dialog* pDialog, SalInstanceBuilder* pBuilder, @@ -1309,12 +1322,13 @@ JSMessageDialog::JSMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* p if (pBuilder) return; + m_sWindowId = std::to_string(m_xMessageDialog->GetLOKWindowId()); + 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(std::to_string(m_xMessageDialog->GetLOKWindowId()), - pOKBtn->get_id().toUtf8(), m_pOK.get()); + JSInstanceBuilder::AddChildWidget(m_sWindowId, pOKBtn->get_id().toUtf8(), m_pOK.get()); m_pOK->connect_clicked(LINK(this, JSMessageDialog, OKHdl)); } @@ -1322,8 +1336,8 @@ JSMessageDialog::JSMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* p = dynamic_cast<::CancelButton*>(m_xMessageDialog->get_widget_for_response(RET_CANCEL))) { m_pCancel.reset(new JSButton(m_pSender, pCancelBtn, nullptr, false)); - JSInstanceBuilder::AddChildWidget(std::to_string(m_xMessageDialog->GetLOKWindowId()), - pCancelBtn->get_id().toUtf8(), m_pCancel.get()); + JSInstanceBuilder::AddChildWidget(m_sWindowId, pCancelBtn->get_id().toUtf8(), + m_pCancel.get()); m_pCancel->connect_clicked(LINK(this, JSMessageDialog, CancelHdl)); } } @@ -1331,7 +1345,7 @@ JSMessageDialog::JSMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* p JSMessageDialog::~JSMessageDialog() { if (m_pOK || m_pCancel) - JSInstanceBuilder::RemoveWindowWidget(std::to_string(m_xMessageDialog->GetLOKWindowId())); + JSInstanceBuilder::RemoveWindowWidget(m_sWindowId); } IMPL_LINK_NOARG(JSMessageDialog, OKHdl, weld::Button&, void) { response(RET_OK); } |