From d9b36a1b5071a92f442ca9facfef8e41769f8805 Mon Sep 17 00:00:00 2001
From: Christian Kandeler <christian.kandeler@nokia.com>
Date: Wed, 2 May 2012 16:03:26 +0200
Subject: [PATCH] Device support: Make device actions a little more flexible.

We give the implementors of the IDevice subclasses a litte more freedom
by not assuming a modal dialog.

Change-Id: I629a3ab7fc50a73229e6439af53f1bae0cf0259e
Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
---
 src/plugins/madde/maddedevice.cpp              | 18 ++++++++++--------
 src/plugins/madde/maddedevice.h                |  2 +-
 .../devicesupport/devicesettingswidget.cpp     |  7 ++-----
 .../projectexplorer/devicesupport/idevice.cpp  |  7 +++----
 .../projectexplorer/devicesupport/idevice.h    |  3 +--
 .../qt-s60/symbianidevice.cpp                  |  3 +--
 .../qt4projectmanager/qt-s60/symbianidevice.h  |  2 +-
 .../remotelinux/linuxdeviceconfiguration.cpp   | 18 ++++++++++--------
 .../remotelinux/linuxdeviceconfiguration.h     |  2 +-
 9 files changed, 30 insertions(+), 32 deletions(-)

diff --git a/src/plugins/madde/maddedevice.cpp b/src/plugins/madde/maddedevice.cpp
index eee242e29e6..702713d46b8 100644
--- a/src/plugins/madde/maddedevice.cpp
+++ b/src/plugins/madde/maddedevice.cpp
@@ -103,19 +103,21 @@ QString MaddeDevice::displayNameForActionId(Core::Id actionId) const
     return QString(); // Can't happen.
 }
 
-QDialog *MaddeDevice::createAction(Core::Id actionId, QWidget *parent) const
+void MaddeDevice::executeAction(Core::Id actionId, QWidget *parent)
 {
-    QTC_ASSERT(actionIds().contains(actionId), return 0);
+    QTC_ASSERT(actionIds().contains(actionId), return);
 
+    QDialog *d;
     const LinuxDeviceConfiguration::ConstPtr device
         = sharedFromThis().staticCast<const LinuxDeviceConfiguration>();
     if (actionId == Core::Id(MaddeDeviceTestActionId))
-        return new LinuxDeviceTestDialog(device, new MaddeDeviceTester, parent);
-    if (actionId == Core::Id(MaddeRemoteProcessesActionId))
-        return new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device), parent);
-    if (actionId == Core::Id(Constants::GenericDeployKeyToDeviceActionId))
-        return PublicKeyDeploymentDialog::createDialog(device, parent);
-    return 0; // Can't happen.
+        d = new LinuxDeviceTestDialog(device, new MaddeDeviceTester, parent);
+    else if (actionId == Core::Id(MaddeRemoteProcessesActionId))
+        d = new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device), parent);
+    else if (actionId == Core::Id(Constants::GenericDeployKeyToDeviceActionId))
+        d = PublicKeyDeploymentDialog::createDialog(device, parent);
+    if (d)
+        d->exec();
 }
 
 QString MaddeDevice::maddeDisplayType(const QString &type)
diff --git a/src/plugins/madde/maddedevice.h b/src/plugins/madde/maddedevice.h
index 4c83589302a..385fb012e7b 100644
--- a/src/plugins/madde/maddedevice.h
+++ b/src/plugins/madde/maddedevice.h
@@ -53,7 +53,7 @@ public:
     QString displayType() const;
     QList<Core::Id> actionIds() const;
     QString displayNameForActionId(Core::Id actionId) const;
-    QDialog *createAction(Core::Id actionId, QWidget *parent) const;
+    void executeAction(Core::Id actionId, QWidget *parent);
     ProjectExplorer::IDevice::Ptr clone() const;
     static QString maddeDisplayType(const QString &type);
 
diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp
index e496a41f883..cc11299b09f 100644
--- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp
+++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp
@@ -283,12 +283,9 @@ void DeviceSettingsWidget::clearDetails()
 
 void DeviceSettingsWidget::handleAdditionalActionRequest(int actionId)
 {
-    const IDevice::ConstPtr &device = currentDevice();
+    const IDevice::Ptr &device = m_deviceManager->mutableDeviceAt(currentIndex());
     QTC_ASSERT(device, return);
-    QDialog * const action = device->createAction(Core::Id::fromUniqueIdentifier(actionId), this);
-    if (action)
-        action->exec();
-    delete action;
+    device->executeAction(Core::Id::fromUniqueIdentifier(actionId), this);
 }
 
 } // namespace Internal
diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp
index 1f31a20ec38..5f2a4da4b34 100644
--- a/src/plugins/projectexplorer/devicesupport/idevice.cpp
+++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp
@@ -114,10 +114,9 @@
  */
 
 /*!
- * \fn QDialog *ProjectExplorer::IDevice::createAction(const QString &actionId) const
- * \brief Produces a dialog implementing the respective action. The dialog is supposed to be
- *        modal, so implementers must make sure to make whatever it does interruptible as
- *        to not needlessly block the UI.
+ * \fn void ProjectExplorer::IDevice::executeAction(Core::Id actionId, QWidget *parent)
+ * \brief Executes the respective action. This is typically done via some sort of dialog or
+ *        wizard, so a parent widget argument is provided.
  */
 
 /*!
diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h
index ad6aaba7409..905b0c6d7bf 100644
--- a/src/plugins/projectexplorer/devicesupport/idevice.h
+++ b/src/plugins/projectexplorer/devicesupport/idevice.h
@@ -41,7 +41,6 @@
 #include <QVariantMap>
 
 QT_BEGIN_NAMESPACE
-class QDialog;
 class QWidget;
 QT_END_NAMESPACE
 
@@ -83,7 +82,7 @@ public:
     virtual IDeviceWidget *createWidget() = 0;
     virtual QList<Core::Id> actionIds() const = 0;
     virtual QString displayNameForActionId(Core::Id actionId) const = 0;
-    virtual QDialog *createAction(Core::Id actionId, QWidget *parent = 0) const = 0;
+    virtual void executeAction(Core::Id actionId, QWidget *parent = 0) = 0;
 
     enum AvailabilityState { DeviceAvailable, DeviceUnavailable, DeviceAvailabilityUnknown };
     AvailabilityState availability() const;
diff --git a/src/plugins/qt4projectmanager/qt-s60/symbianidevice.cpp b/src/plugins/qt4projectmanager/qt-s60/symbianidevice.cpp
index d4f3fa39899..292e008b548 100644
--- a/src/plugins/qt4projectmanager/qt-s60/symbianidevice.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/symbianidevice.cpp
@@ -207,11 +207,10 @@ QString SymbianIDevice::displayNameForActionId(Core::Id actionId) const
     return QString();
 }
 
-QDialog *SymbianIDevice::createAction(Core::Id actionId, QWidget *parent) const
+void SymbianIDevice::executeAction(Core::Id actionId, QWidget *parent)
 {
     Q_UNUSED(actionId);
     Q_UNUSED(parent);
-    return 0;
 }
 
 QVariantMap SymbianIDevice::toMap() const
diff --git a/src/plugins/qt4projectmanager/qt-s60/symbianidevice.h b/src/plugins/qt4projectmanager/qt-s60/symbianidevice.h
index e3ee1943c25..8400b5336c1 100644
--- a/src/plugins/qt4projectmanager/qt-s60/symbianidevice.h
+++ b/src/plugins/qt4projectmanager/qt-s60/symbianidevice.h
@@ -78,7 +78,7 @@ public:
     ProjectExplorer::IDeviceWidget* createWidget();
     QList<Core::Id> actionIds() const;
     QString displayNameForActionId(Core::Id actionId) const;
-    QDialog* createAction(Core::Id actionId, QWidget*parent) const;
+    void executeAction(Core::Id actionId, QWidget*parent);
 
 protected:
     SymbianIDevice(const SymbianIDevice &other);
diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp
index 43764956bb1..e96b76da6b3 100644
--- a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp
+++ b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp
@@ -120,19 +120,21 @@ QString LinuxDeviceConfiguration::displayNameForActionId(Core::Id actionId) cons
     return QString(); // Can't happen.
 }
 
-QDialog *LinuxDeviceConfiguration::createAction(Core::Id actionId, QWidget *parent) const
+void LinuxDeviceConfiguration::executeAction(Core::Id actionId, QWidget *parent)
 {
-    QTC_ASSERT(actionIds().contains(actionId), return 0);
+    QTC_ASSERT(actionIds().contains(actionId), return);
 
+    QDialog *d;
     const LinuxDeviceConfiguration::ConstPtr device
             = sharedFromThis().staticCast<const LinuxDeviceConfiguration>();
     if (actionId == Core::Id(Constants::GenericTestDeviceActionId))
-        return new LinuxDeviceTestDialog(device, new GenericLinuxDeviceTester, parent);
-    if (actionId == Core::Id(Constants::GenericRemoteProcessesActionId))
-        return new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device, parent));
-    if (actionId == Core::Id(Constants::GenericDeployKeyToDeviceActionId))
-        return PublicKeyDeploymentDialog::createDialog(device, parent);
-    return 0; // Can't happen.
+        d = new LinuxDeviceTestDialog(device, new GenericLinuxDeviceTester, parent);
+    else if (actionId == Core::Id(Constants::GenericRemoteProcessesActionId))
+        d = new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device, parent));
+    else if (actionId == Core::Id(Constants::GenericDeployKeyToDeviceActionId))
+        d = PublicKeyDeploymentDialog::createDialog(device, parent);
+    if (d)
+        d->exec();
 }
 
 LinuxDeviceConfiguration::LinuxDeviceConfiguration() : d(new LinuxDeviceConfigurationPrivate)
diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.h b/src/plugins/remotelinux/linuxdeviceconfiguration.h
index 44da35a0d42..60c4746dbb2 100644
--- a/src/plugins/remotelinux/linuxdeviceconfiguration.h
+++ b/src/plugins/remotelinux/linuxdeviceconfiguration.h
@@ -77,7 +77,7 @@ public:
     ProjectExplorer::IDeviceWidget *createWidget();
     QList<Core::Id> actionIds() const;
     QString displayNameForActionId(Core::Id actionId) const;
-    QDialog *createAction(Core::Id actionId, QWidget *parent) const;
+    void executeAction(Core::Id actionId, QWidget *parent);
     void fromMap(const QVariantMap &map);
     ProjectExplorer::IDevice::Ptr clone() const;
 
-- 
GitLab