summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorSzymon Kłos <szymon.klos@collabora.com>2021-11-23 09:55:00 +0100
committerAndras Timar <andras.timar@collabora.com>2022-02-14 11:25:40 +0100
commit045e922a36b8f037f2df9361d9dee7d5eefd4cae (patch)
treeaa020864a1524159e21062693a2f07ae2695a55d /vcl
parenta57e842b7a098d2124de487c1f156497c1d5b359 (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.hxx5
-rw-r--r--vcl/jsdialog/jsdialogbuilder.cxx32
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); }