diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2021-11-23 09:55:00 +0100 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2022-02-14 11:25:40 +0100 |
commit | 045e922a36b8f037f2df9361d9dee7d5eefd4cae (patch) | |
tree | aa020864a1524159e21062693a2f07ae2695a55d /vcl | |
parent | a57e842b7a098d2124de487c1f156497c1d5b359 (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 270015f726c7..944917c7baff 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -219,6 +219,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 836402fd4a72..9dca9a8fc487 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -702,12 +702,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()); } } @@ -1101,8 +1107,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, @@ -1307,12 +1320,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)); } @@ -1320,8 +1334,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)); } } @@ -1329,7 +1343,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); } |