summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2021-10-31 11:03:36 +0100
committerJan-Marek Glogowski <glogow@fbihome.de>2021-11-01 12:18:58 +0100
commitfa9b28c781d4d3e97f7dcf150a0e22e70289c228 (patch)
tree251c7bef97ef4449d699ef2b1ffb9c39e585a984 /vcl
parenta2bc467b4c0c0da71a8c213ac61477cd7697cdc0 (diff)
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 <glogow@fbihome.de>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/qt5/QtFilePicker.hxx18
-rw-r--r--vcl/qt5/QtFilePicker.cxx57
2 files changed, 59 insertions, 16 deletions
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;