vcl/inc/qt5/QtFilePicker.hxx |   18 ++++++++++---
 vcl/qt5/QtFilePicker.cxx     |   57 +++++++++++++++++++++++++++++++++----------
 2 files changed, 59 insertions(+), 16 deletions(-)

New commits:
commit fa9b28c781d4d3e97f7dcf150a0e22e70289c228
Author:     Jan-Marek Glogowski <glo...@fbihome.de>
AuthorDate: Sun Oct 31 11:03:36 2021 +0100
Commit:     Jan-Marek Glogowski <glo...@fbihome.de>
CommitDate: Mon Nov 1 12:18:58 2021 +0100

    Qt picker: implement XAsynchronousExecutableDialog
    
    FWIW: most places still call FileDialogHelper::Execute instead of
    StartExecuteModal. I tested with "Insert >> Text from File...".
    
    Change-Id: I303cc89c97c8fc17015ab7831e6a324ef16a6a0b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124512
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glo...@fbihome.de>

diff --git a/vcl/inc/qt5/QtFilePicker.hxx b/vcl/inc/qt5/QtFilePicker.hxx
index c1a95f5c64a0..20ee52e83ea0 100644
--- a/vcl/inc/qt5/QtFilePicker.hxx
+++ b/vcl/inc/qt5/QtFilePicker.hxx
@@ -26,6 +26,7 @@
 #include <com/sun/star/frame/XTerminateListener.hpp>
 #include <com/sun/star/lang/XInitialization.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp>
 #include <com/sun/star/ui/dialogs/XFilePicker3.hpp>
 #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
 #include <com/sun/star/ui/dialogs/XFolderPicker2.hpp>
@@ -48,10 +49,10 @@ class QGridLayout;
 class QLabel;
 class QWidget;
 
-typedef ::cppu::WeakComponentImplHelper<css::frame::XTerminateListener, 
css::lang::XInitialization,
-                                        css::lang::XServiceInfo, 
css::ui::dialogs::XFilePicker3,
-                                        
css::ui::dialogs::XFilePickerControlAccess,
-                                        css::ui::dialogs::XFolderPicker2>
+typedef ::cppu::WeakComponentImplHelper<
+    css::frame::XTerminateListener, css::lang::XInitialization, 
css::lang::XServiceInfo,
+    css::ui::dialogs::XFilePicker3, css::ui::dialogs::XFilePickerControlAccess,
+    css::ui::dialogs::XAsynchronousExecutableDialog, 
css::ui::dialogs::XFolderPicker2>
     QtFilePicker_Base;
 
 class VCLPLUG_QT_PUBLIC QtFilePicker : public QObject, public QtFilePicker_Base
@@ -62,6 +63,7 @@ private:
     css::uno::Reference<css::uno::XComponentContext> m_context;
 
     css::uno::Reference<css::ui::dialogs::XFilePickerListener> m_xListener;
+    css::uno::Reference<css::ui::dialogs::XDialogClosedListener> 
m_xClosedListener;
 
     osl::Mutex m_aHelperMutex; ///< mutex used by the WeakComponentImplHelper
 
@@ -112,6 +114,11 @@ public:
     virtual void SAL_CALL setTitle(const OUString& rTitle) override;
     virtual sal_Int16 SAL_CALL execute() override;
 
+    // XAsynchronousExecutableDialog functions
+    virtual void SAL_CALL setDialogTitle(const OUString&) override;
+    virtual void SAL_CALL
+    startExecuteModal(const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>&) override;
+
     // XFilePicker functions
     virtual void SAL_CALL setMultiSelectionMode(sal_Bool bMode) override;
     virtual void SAL_CALL setDefaultName(const OUString& rName) override;
@@ -164,6 +171,8 @@ private:
     static void handleSetListValue(QComboBox* pQComboBox, sal_Int16 nAction,
                                    const css::uno::Any& rValue);
 
+    void prepareExecute();
+
 private Q_SLOTS:
     // emit XFilePickerListener controlStateChanged event
     void filterSelected(const QString&);
@@ -171,6 +180,7 @@ private Q_SLOTS:
     void currentChanged(const QString&);
     // (un)set automatic file extension
     virtual void updateAutomaticFileExtension();
+    void finished(int);
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/QtFilePicker.cxx b/vcl/qt5/QtFilePicker.cxx
index ca80b61ef101..3fae63fca74f 100644
--- a/vcl/qt5/QtFilePicker.cxx
+++ b/vcl/qt5/QtFilePicker.cxx
@@ -116,6 +116,8 @@ 
QtFilePicker::QtFilePicker(css::uno::Reference<css::uno::XComponentContext> cons
     // update automatic file extension when filter is changed
     connect(m_pFileDialog.get(), SIGNAL(filterSelected(const QString&)), this,
             SLOT(updateAutomaticFileExtension()));
+
+    connect(m_pFileDialog.get(), SIGNAL(finished(int)), this, 
SLOT(finished(int)));
 }
 
 QtFilePicker::~QtFilePicker()
@@ -152,18 +154,8 @@ void SAL_CALL QtFilePicker::setTitle(const OUString& title)
         [this, &title]() { m_pFileDialog->setWindowTitle(toQString(title)); });
 }
 
-sal_Int16 SAL_CALL QtFilePicker::execute()
+void QtFilePicker::prepareExecute()
 {
-    SolarMutexGuard g;
-    auto* pSalInst(static_cast<QtInstance*>(GetSalData()->m_pInstance));
-    assert(pSalInst);
-    if (!pSalInst->IsMainThread())
-    {
-        sal_uInt16 ret;
-        pSalInst->RunInMainThread([&ret, this]() { ret = execute(); });
-        return ret;
-    }
-
     QWidget* pTransientParent = m_pParentWidget;
     if (!pTransientParent)
     {
@@ -191,15 +183,56 @@ sal_Int16 SAL_CALL QtFilePicker::execute()
     m_pFileDialog->setParent(pTransientParent, m_pFileDialog->windowFlags());
     m_pFileDialog->show();
     xDesktop->addTerminateListener(this);
-    int result = m_pFileDialog->exec();
+}
+
+void QtFilePicker::finished(int nResult)
+{
+    uno::Reference<css::frame::XDesktop> 
xDesktop(css::frame::Desktop::create(m_context),
+                                                  UNO_QUERY_THROW);
     xDesktop->removeTerminateListener(this);
     m_pFileDialog->setParent(nullptr, m_pFileDialog->windowFlags());
 
+    if (m_xClosedListener.is())
+    {
+        const sal_Int16 nRet = (QFileDialog::Rejected == nResult) ? 
ExecutableDialogResults::CANCEL
+                                                                  : 
ExecutableDialogResults::OK;
+        css::ui::dialogs::DialogClosedEvent aEvent(*this, nRet);
+        m_xClosedListener->dialogClosed(aEvent);
+        m_xClosedListener.clear();
+    }
+}
+
+sal_Int16 SAL_CALL QtFilePicker::execute()
+{
+    SolarMutexGuard g;
+    auto* pSalInst(static_cast<QtInstance*>(GetSalData()->m_pInstance));
+    assert(pSalInst);
+    if (!pSalInst->IsMainThread())
+    {
+        sal_uInt16 ret;
+        pSalInst->RunInMainThread([&ret, this]() { ret = execute(); });
+        return ret;
+    }
+
+    prepareExecute();
+    int result = m_pFileDialog->exec();
+
     if (QFileDialog::Rejected == result)
         return ExecutableDialogResults::CANCEL;
     return ExecutableDialogResults::OK;
 }
 
+// XAsynchronousExecutableDialog functions
+void SAL_CALL QtFilePicker::setDialogTitle(const OUString& _rTitle) { 
setTitle(_rTitle); }
+
+void SAL_CALL
+QtFilePicker::startExecuteModal(const 
Reference<css::ui::dialogs::XDialogClosedListener>& xListener)
+{
+    m_xClosedListener = xListener;
+    prepareExecute();
+    m_pFileDialog->show();
+}
+
 void SAL_CALL QtFilePicker::setMultiSelectionMode(sal_Bool multiSelect)
 {
     SolarMutexGuard g;

Reply via email to