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;