From df41e426ca6aa5693abb5417b1c7ab8f77381e9e Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Thu, 20 Dec 2018 14:55:26 +0000 Subject: Resolves: tdf#122219 base form writer-window doesn't honour CloseVeto properly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit just hit this with the same all-modal hammer we now use in the extension manager, a modeless dialog, with modal subdialogs run by a normal non-async subloop, turns into a modal dialog for all other toplevels Change-Id: Ia35fad7a1be2ec493011c7e4354b70231b78a7fc Reviewed-on: https://gerrit.libreoffice.org/65504 Tested-by: Jenkins Tested-by: Xisco Faulí Reviewed-by: Christian Lohmaier --- .../source/xsltdialog/xmlfiltersettingsdialog.cxx | 37 ++++++++++++++++++---- .../source/xsltdialog/xmlfiltersettingsdialog.hxx | 3 ++ 2 files changed, 34 insertions(+), 6 deletions(-) (limited to 'filter/source') diff --git a/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx b/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx index cab88b079e89..a65b5824664b 100644 --- a/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx +++ b/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx @@ -17,6 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include #include #include #include @@ -27,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -132,13 +132,36 @@ void XMLFilterSettingsDialog::dispose() ModelessDialog::dispose(); } +void XMLFilterSettingsDialog::incBusy() +{ + // lock any toplevel windows from being closed until busy is over + // ensure any dialogs are reset before entering + vcl::Window *xTopWin = Application::GetFirstTopLevelWindow(); + while (xTopWin) + { + if (xTopWin != this) + xTopWin->IncModalCount(); + xTopWin = Application::GetNextTopLevelWindow(xTopWin); + } +} + +void XMLFilterSettingsDialog::decBusy() +{ + // unlock any toplevel windows from being closed until busy is over + // ensure any dialogs are reset before entering + vcl::Window *xTopWin = Application::GetFirstTopLevelWindow(); + while (xTopWin) + { + if (xTopWin != this) + xTopWin->DecModalCount(); + xTopWin = Application::GetNextTopLevelWindow(xTopWin); + } +} + IMPL_LINK(XMLFilterSettingsDialog, ClickHdl_Impl, Button *, pButton, void ) { - // tdf#122171 block closing libreoffice until the following dialog - // is dismissed - css::uno::Reference xDesktop(css::frame::Desktop::create(mxContext)); - css::uno::Reference xFrame(xDesktop->getCurrentFrame()); - utl::CloseVeto aKeepDoc(xFrame); + // tdf#122171 block closing libreoffice until the following dialog is dismissed + incBusy(); if (m_pPBNew == pButton) { @@ -168,6 +191,8 @@ IMPL_LINK(XMLFilterSettingsDialog, ClickHdl_Impl, Button *, pButton, void ) { Close(); } + + decBusy(); } IMPL_LINK_NOARG(XMLFilterSettingsDialog, SelectionChangedHdl_Impl, SvTreeListBox*, void) diff --git a/filter/source/xsltdialog/xmlfiltersettingsdialog.hxx b/filter/source/xsltdialog/xmlfiltersettingsdialog.hxx index d6933dad425a..e1e1d82418d5 100644 --- a/filter/source/xsltdialog/xmlfiltersettingsdialog.hxx +++ b/filter/source/xsltdialog/xmlfiltersettingsdialog.hxx @@ -109,6 +109,9 @@ private: void initFilterList(); void disposeFilterList(); + void incBusy(); + void decBusy(); + bool insertOrEdit( filter_info_impl* pNewInfo, const filter_info_impl* pOldInfo = nullptr ); OUString createUniqueFilterName( const OUString& rUIName ); -- cgit v1.2.3