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/65503
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx b/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx
index 39b3dfe..44a2dd3 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>
@@ -133,13 +133,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)
    {
@@ -169,6 +192,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 d6933da..e1e1d82 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 );