From aee8f8832bbf02dfbe62731c76e7481625c8ee19 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Wed, 22 Aug 2012 16:38:21 +0200
Subject: [PATCH] DeviceProcessDialog: Introduce methods for modal/non-modal
 use.

Add methods to be able to use the dialog as a non-modal
dialog showing a list of processes or a modal-dialog
for selecting a process.

Connect double-click to 'Accept' for the modal
case (regression from 2.5).

Change-Id: If05a1c40ee6a41135d943e9919a1250db03eeffb
Reviewed-by: hjk <qthjk@ovi.com>
---
 src/plugins/debugger/debuggerplugin.cpp       |  1 +
 .../devicesupport/deviceprocessesdialog.cpp   | 43 +++++++++++++++----
 .../devicesupport/deviceprocessesdialog.h     |  2 +
 .../devicesupport/devicesettingswidget.cpp    |  1 +
 4 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 8000bda8da6..b1d45f4e4ef 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1560,6 +1560,7 @@ void DebuggerPluginPrivate::attachToRunningApplication()
 void DebuggerPluginPrivate::attachToProcess(bool startServerOnly)
 {
     DeviceProcessesDialog *dlg = new DeviceProcessesDialog(mainWindow());
+    dlg->addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process"));
     dlg->showAllDevices();
     if (dlg->exec() == QDialog::Rejected) {
         delete dlg;
diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp
index df44ccf51a8..5c88d9b5bd1 100644
--- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp
+++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp
@@ -120,11 +120,12 @@ public:
     FilterLineEdit *processFilterLineEdit;
     QPushButton *updateListButton;
     QPushButton *killProcessButton;
-    QPushButton *attachProcessButton;
+    QPushButton *acceptButton;
+    QDialogButtonBox *buttonBox;
 };
 
 DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(QWidget *parent)
-    : q(parent)
+    : q(parent), acceptButton(0), buttonBox(new QDialogButtonBox(parent))
 {
     processList = 0;
 
@@ -150,13 +151,9 @@ DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(QWidget *parent)
 
     updateListButton = new QPushButton(DeviceProcessesDialog::tr("&Update List"), q);
     killProcessButton = new QPushButton(DeviceProcessesDialog::tr("&Kill Process"), q);
-    attachProcessButton = new QPushButton(DeviceProcessesDialog::tr("&Attach to Process"), q);
 
-    QDialogButtonBox *buttonBox = new QDialogButtonBox(q);
-    buttonBox->setStandardButtons(QDialogButtonBox::Close);
     buttonBox->addButton(updateListButton, QDialogButtonBox::ActionRole);
     buttonBox->addButton(killProcessButton, QDialogButtonBox::ActionRole);
-    buttonBox->addButton(attachProcessButton, QDialogButtonBox::AcceptRole);
 
     QFormLayout *leftColumn = new QFormLayout();
     leftColumn->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
@@ -259,8 +256,9 @@ void DeviceProcessesDialogPrivate::handleProcessKilled()
 
 void DeviceProcessesDialogPrivate::updateButtons()
 {
-    bool hasSelection = procView->selectionModel()->hasSelection();
-    attachProcessButton->setEnabled(hasSelection);
+    const bool hasSelection = procView->selectionModel()->hasSelection();
+    if (acceptButton)
+        acceptButton->setEnabled(hasSelection);
     killProcessButton->setEnabled(hasSelection);
     errorText->setVisible(!errorText->document()->isEmpty());
 }
@@ -281,6 +279,21 @@ DeviceProcess DeviceProcessesDialogPrivate::selectedProcess() const
 //
 ///////////////////////////////////////////////////////////////////////
 
+/*!
+     \class ProjectExplorer::DeviceProcessesDialog
+
+     \brief Shows a list of processes.
+
+     The dialog can be used as a
+     \list
+     \o Non-modal dialog showing a list of processes: Call addCloseButton()
+        to add a 'Close' button.
+     \o Modal dialog with an 'Accept' button to select a process: Call
+        addAcceptButton() passing the label text. This will create a
+        'Cancel' button as well.
+     \endlist
+*/
+
 DeviceProcessesDialog::DeviceProcessesDialog(QWidget *parent)
     : QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(this))
 {
@@ -294,6 +307,20 @@ DeviceProcessesDialog::~DeviceProcessesDialog()
     delete d;
 }
 
+void DeviceProcessesDialog::addAcceptButton(const QString &label)
+{
+    d->acceptButton = new QPushButton(label);
+    d->buttonBox->addButton(d->acceptButton, QDialogButtonBox::AcceptRole);
+    connect(d->procView, SIGNAL(doubleClicked(QModelIndex)),
+            d->acceptButton, SLOT(animateClick()));
+    d->buttonBox->addButton(QDialogButtonBox::Cancel);
+}
+
+void DeviceProcessesDialog::addCloseButton()
+{
+    d->buttonBox->addButton(QDialogButtonBox::Close);
+}
+
 void DeviceProcessesDialog::setDevice(const IDevice::ConstPtr &device)
 {
     d->profileChooser->hide();
diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h
index 9d11ad974df..3f7a968fa40 100644
--- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h
+++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h
@@ -51,6 +51,8 @@ class PROJECTEXPLORER_EXPORT DeviceProcessesDialog : public QDialog
 public:
     explicit DeviceProcessesDialog(QWidget *parent = 0);
     ~DeviceProcessesDialog();
+    void addAcceptButton(const QString &label);
+    void addCloseButton();
 
     void setDevice(const IDevice::ConstPtr &device);
     void showAllDevices();
diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp
index 08c628c8258..1d26187b7cc 100644
--- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp
+++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp
@@ -336,6 +336,7 @@ void DeviceSettingsWidget::handleProcessListRequested()
 {
     QTC_ASSERT(currentDevice()->canCreateProcessModel(), return);
     DeviceProcessesDialog dlg;
+    dlg.addCloseButton();
     dlg.setDevice(currentDevice());
     dlg.exec();
 }
-- 
GitLab