diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-12-20 14:55:26 +0000 |
---|---|---|
committer | Christian Lohmaier <lohmaier+LibreOffice@googlemail.com> | 2019-01-07 16:52:02 +0100 |
commit | df41e426ca6aa5693abb5417b1c7ab8f77381e9e (patch) | |
tree | 460082c8e1f4028f08dd663a911de3030220242b /filter/source | |
parent | e3464875d4deddf51c87537299c7119c77765aa8 (diff) |
Resolves: tdf#122219 base form writer-window doesn't honour CloseVeto properly
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í <xiscofauli@libreoffice.org>
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
Diffstat (limited to 'filter/source')
-rw-r--r-- | filter/source/xsltdialog/xmlfiltersettingsdialog.cxx | 37 | ||||
-rw-r--r-- | filter/source/xsltdialog/xmlfiltersettingsdialog.hxx | 3 |
2 files changed, 34 insertions, 6 deletions
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 <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/util/XFlushable.hpp> @@ -27,7 +28,6 @@ #include <com/sun/star/ui/dialogs/TemplateDescription.hpp> #include <tools/urlobj.hxx> #include <vcl/headbar.hxx> -#include <unotools/closeveto.hxx> #include <unotools/pathoptions.hxx> #include <unotools/resmgr.hxx> #include <unotools/streamwrap.hxx> @@ -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<css::frame::XDesktop2> xDesktop(css::frame::Desktop::create(mxContext)); - css::uno::Reference<css::frame::XFrame> 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 ); |