forked from qt-creator/qt-creator
KitChooser: Introduce virtual methods for Debugger.
Introduce virtual methods such that it is possible to write derived classes for specific KitInformation classes, allowing for filtering and setting text and tooltip. Remove debugging-specific code of KitChooser from the ProjectExplorer. Move populate() away from the constructor as not to call virtuals from it. Implement DebuggerKitChooser. It should no longer be possible to to choose an invalid kit for debugging from the debugger starter dialogs. Add a protected constructor to DeviceProcessesDialog allowing to pass a KitChooser. Change-Id: I8c683a2da7d69bfbccdc08213cb47d69a0df8b3e Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
This commit is contained in:
@@ -69,7 +69,7 @@ StartRemoteDialog::StartRemoteDialog(QWidget *parent)
|
|||||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
setWindowTitle(tr("Start Remote Analysis"));
|
setWindowTitle(tr("Start Remote Analysis"));
|
||||||
|
|
||||||
d->kitChooser = new KitChooser(this, KitChooser::RemoteDebugging);
|
d->kitChooser = new KitChooser(this);
|
||||||
d->executable = new QLineEdit(this);
|
d->executable = new QLineEdit(this);
|
||||||
d->arguments = new QLineEdit(this);
|
d->arguments = new QLineEdit(this);
|
||||||
d->workingDirectory = new QLineEdit(this);
|
d->workingDirectory = new QLineEdit(this);
|
||||||
|
|||||||
@@ -39,7 +39,6 @@
|
|||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <projectexplorer/abi.h>
|
#include <projectexplorer/abi.h>
|
||||||
#include <projectexplorer/kitchooser.h>
|
|
||||||
#include <projectexplorer/kitinformation.h>
|
#include <projectexplorer/kitinformation.h>
|
||||||
#include <utils/historycompleter.h>
|
#include <utils/historycompleter.h>
|
||||||
#include <utils/pathchooser.h>
|
#include <utils/pathchooser.h>
|
||||||
@@ -109,6 +108,36 @@ Q_DECLARE_METATYPE(Debugger::Internal::StartApplicationParameters)
|
|||||||
namespace Debugger {
|
namespace Debugger {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// DebuggerKitChooser
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DebuggerKitChooser::DebuggerKitChooser(Mode mode, QWidget *parent)
|
||||||
|
: ProjectExplorer::KitChooser(parent)
|
||||||
|
, m_hostAbi(ProjectExplorer::Abi::hostAbi())
|
||||||
|
, m_mode(mode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Match valid debuggers and restrict local debugging to compatible toolchains.
|
||||||
|
bool DebuggerKitChooser::kitMatches(const ProjectExplorer::Kit *k) const
|
||||||
|
{
|
||||||
|
if (!DebuggerKitInformation::isValidDebugger(k))
|
||||||
|
return false;
|
||||||
|
if (m_mode == LocalDebugging) {
|
||||||
|
const ProjectExplorer::ToolChain *tc = ToolChainKitInformation::toolChain(k);
|
||||||
|
return tc && tc->targetAbi().os() == m_hostAbi.os();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString DebuggerKitChooser::kitToolTip(Kit *k) const
|
||||||
|
{
|
||||||
|
return DebuggerKitInformation::userOutput(k);
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// StartApplicationParameters
|
// StartApplicationParameters
|
||||||
@@ -225,7 +254,8 @@ StartApplicationDialog::StartApplicationDialog(QWidget *parent)
|
|||||||
|
|
||||||
d->runInTerminalCheckBox = new QCheckBox(this);
|
d->runInTerminalCheckBox = new QCheckBox(this);
|
||||||
|
|
||||||
d->kitChooser = new KitChooser(this, KitChooser::LocalDebugging);
|
d->kitChooser = new DebuggerKitChooser(DebuggerKitChooser::LocalDebugging, this);
|
||||||
|
d->kitChooser->populate();
|
||||||
|
|
||||||
d->breakAtMainCheckBox = new QCheckBox(this);
|
d->breakAtMainCheckBox = new QCheckBox(this);
|
||||||
d->breakAtMainCheckBox->setText(QString());
|
d->breakAtMainCheckBox->setText(QString());
|
||||||
@@ -439,7 +469,8 @@ AttachToQmlPortDialog::AttachToQmlPortDialog(QWidget *parent)
|
|||||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
setWindowTitle(tr("Start Debugger"));
|
setWindowTitle(tr("Start Debugger"));
|
||||||
|
|
||||||
d->kitChooser = new KitChooser(this);
|
d->kitChooser = new DebuggerKitChooser(DebuggerKitChooser::RemoteDebugging, this);
|
||||||
|
d->kitChooser->populate();
|
||||||
|
|
||||||
d->portSpinBox = new QSpinBox(this);
|
d->portSpinBox = new QSpinBox(this);
|
||||||
d->portSpinBox->setMaximum(65535);
|
d->portSpinBox->setMaximum(65535);
|
||||||
|
|||||||
@@ -31,6 +31,9 @@
|
|||||||
#ifndef DEBUGGER_DIALOGS_H
|
#ifndef DEBUGGER_DIALOGS_H
|
||||||
#define DEBUGGER_DIALOGS_H
|
#define DEBUGGER_DIALOGS_H
|
||||||
|
|
||||||
|
#include <projectexplorer/kitchooser.h>
|
||||||
|
#include <projectexplorer/abi.h>
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
@@ -58,6 +61,22 @@ class StartApplicationParameters;
|
|||||||
class StartApplicationDialogPrivate;
|
class StartApplicationDialogPrivate;
|
||||||
class StartRemoteEngineDialogPrivate;
|
class StartRemoteEngineDialogPrivate;
|
||||||
|
|
||||||
|
class DebuggerKitChooser : public ProjectExplorer::KitChooser {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
enum Mode { RemoteDebugging, LocalDebugging };
|
||||||
|
|
||||||
|
explicit DebuggerKitChooser(Mode mode = RemoteDebugging, QWidget *parent = 0);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool kitMatches(const ProjectExplorer::Kit *k) const;
|
||||||
|
QString kitToolTip(ProjectExplorer::Kit *k) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const ProjectExplorer::Abi m_hostAbi;
|
||||||
|
const Mode m_mode;
|
||||||
|
};
|
||||||
|
|
||||||
class StartApplicationDialog : public QDialog
|
class StartApplicationDialog : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|||||||
@@ -1670,9 +1670,21 @@ void DebuggerPluginPrivate::attachToRunningApplication()
|
|||||||
attachToProcess(false);
|
attachToProcess(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DebuggerProcessesDialog : public ProjectExplorer::DeviceProcessesDialog {
|
||||||
|
public:
|
||||||
|
DebuggerProcessesDialog(DebuggerKitChooser::Mode m, QWidget *parent) :
|
||||||
|
ProjectExplorer::DeviceProcessesDialog(new DebuggerKitChooser(m), parent)
|
||||||
|
{
|
||||||
|
addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process"));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void DebuggerPluginPrivate::attachToProcess(bool startServerOnly)
|
void DebuggerPluginPrivate::attachToProcess(bool startServerOnly)
|
||||||
{
|
{
|
||||||
DeviceProcessesDialog *dlg = new DeviceProcessesDialog(mainWindow());
|
|
||||||
|
const DebuggerKitChooser::Mode mode = startServerOnly ?
|
||||||
|
DebuggerKitChooser::RemoteDebugging : DebuggerKitChooser::LocalDebugging;
|
||||||
|
DeviceProcessesDialog *dlg = new DebuggerProcessesDialog(mode, mainWindow());
|
||||||
dlg->addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process"));
|
dlg->addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process"));
|
||||||
dlg->showAllDevices();
|
dlg->showAllDevices();
|
||||||
if (dlg->exec() == QDialog::Rejected) {
|
if (dlg->exec() == QDialog::Rejected) {
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include "debuggerconstants.h"
|
#include "debuggerconstants.h"
|
||||||
#include "debuggercore.h"
|
#include "debuggercore.h"
|
||||||
#include "debuggerstartparameters.h"
|
#include "debuggerstartparameters.h"
|
||||||
|
#include "debuggerdialogs.h"
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <projectexplorer/abi.h>
|
#include <projectexplorer/abi.h>
|
||||||
@@ -245,7 +246,8 @@ AttachCoreDialog::AttachCoreDialog(QWidget *parent)
|
|||||||
|
|
||||||
d->settings = ICore::settings();
|
d->settings = ICore::settings();
|
||||||
|
|
||||||
d->kitChooser = new KitChooser(this);
|
d->kitChooser = new DebuggerKitChooser(DebuggerKitChooser::RemoteDebugging, this);
|
||||||
|
d->kitChooser->populate();
|
||||||
|
|
||||||
d->selectRemoteCoreButton = new QPushButton(tr("Browse..."), this);
|
d->selectRemoteCoreButton = new QPushButton(tr("Browse..."), this);
|
||||||
d->remoteCoreFileName = new QLineEdit(this);
|
d->remoteCoreFileName = new QLineEdit(this);
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ class DeviceProcessesDialogPrivate : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DeviceProcessesDialogPrivate(QWidget *parent);
|
DeviceProcessesDialogPrivate(KitChooser *chooser, QWidget *parent);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setDevice(const IDevice::ConstPtr &device);
|
void setDevice(const IDevice::ConstPtr &device);
|
||||||
@@ -124,16 +124,20 @@ public:
|
|||||||
QDialogButtonBox *buttonBox;
|
QDialogButtonBox *buttonBox;
|
||||||
};
|
};
|
||||||
|
|
||||||
DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(QWidget *parent)
|
DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(KitChooser *chooser, QWidget *parent)
|
||||||
: q(parent), acceptButton(0), buttonBox(new QDialogButtonBox(parent))
|
: q(parent), kitChooser(chooser), acceptButton(0), buttonBox(new QDialogButtonBox(parent))
|
||||||
{
|
{
|
||||||
|
q->setWindowTitle(DeviceProcessesDialog::tr("List of Processes"));
|
||||||
|
q->setWindowFlags(q->windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
|
q->setMinimumHeight(500);
|
||||||
|
|
||||||
processList = 0;
|
processList = 0;
|
||||||
|
|
||||||
processFilterLineEdit = new FilterLineEdit(q);
|
processFilterLineEdit = new FilterLineEdit(q);
|
||||||
processFilterLineEdit->setPlaceholderText(DeviceProcessesDialog::tr("Filter"));
|
processFilterLineEdit->setPlaceholderText(DeviceProcessesDialog::tr("Filter"));
|
||||||
processFilterLineEdit->setFocus(Qt::TabFocusReason);
|
processFilterLineEdit->setFocus(Qt::TabFocusReason);
|
||||||
|
|
||||||
kitChooser = new KitChooser(q);
|
kitChooser->populate();
|
||||||
|
|
||||||
procView = new QTreeView(q);
|
procView = new QTreeView(q);
|
||||||
procView->setModel(&proxyModel);
|
procView->setModel(&proxyModel);
|
||||||
@@ -295,11 +299,13 @@ DeviceProcess DeviceProcessesDialogPrivate::selectedProcess() const
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
DeviceProcessesDialog::DeviceProcessesDialog(QWidget *parent)
|
DeviceProcessesDialog::DeviceProcessesDialog(QWidget *parent)
|
||||||
: QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(this))
|
: QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(new KitChooser(this), this))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceProcessesDialog::DeviceProcessesDialog(KitChooser *chooser, QWidget *parent)
|
||||||
|
: QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(chooser, this))
|
||||||
{
|
{
|
||||||
setWindowTitle(tr("List of Processes"));
|
|
||||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
|
||||||
setMinimumHeight(500);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceProcessesDialog::~DeviceProcessesDialog()
|
DeviceProcessesDialog::~DeviceProcessesDialog()
|
||||||
|
|||||||
@@ -60,6 +60,9 @@ public:
|
|||||||
KitChooser *kitChooser() const;
|
KitChooser *kitChooser() const;
|
||||||
void logMessage(const QString &line);
|
void logMessage(const QString &line);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
DeviceProcessesDialog(KitChooser *chooser, QWidget *parent);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Internal::DeviceProcessesDialogPrivate * const d;
|
Internal::DeviceProcessesDialogPrivate * const d;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -38,42 +38,43 @@
|
|||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
|
|
||||||
KitChooser::KitChooser(QWidget *parent, unsigned flags) :
|
KitChooser::KitChooser(QWidget *parent) :
|
||||||
QComboBox(parent)
|
QComboBox(parent)
|
||||||
{
|
{
|
||||||
populate(flags);
|
|
||||||
onCurrentIndexChanged(currentIndex());
|
|
||||||
connect(this, SIGNAL(currentIndexChanged(int)), SLOT(onCurrentIndexChanged(int)));
|
connect(this, SIGNAL(currentIndexChanged(int)), SLOT(onCurrentIndexChanged(int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void KitChooser::onCurrentIndexChanged(int index)
|
void KitChooser::onCurrentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
if (Kit *kit = kitAt(index))
|
if (Kit *kit = kitAt(index))
|
||||||
setToolTip(kit->toHtml());
|
setToolTip(kitToolTip(kit));
|
||||||
else
|
else
|
||||||
setToolTip(QString());
|
setToolTip(QString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void KitChooser::populate(unsigned flags)
|
bool KitChooser::kitMatches(const Kit *k) const
|
||||||
|
{
|
||||||
|
return k->isValid();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString KitChooser::kitText(const Kit *k) const
|
||||||
|
{
|
||||||
|
return k->displayName();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString KitChooser::kitToolTip(Kit *k) const
|
||||||
|
{
|
||||||
|
return k->toHtml();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KitChooser::populate()
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
const Abi hostAbi = Abi::hostAbi();
|
|
||||||
foreach (Kit *kit, KitManager::instance()->kits()) {
|
foreach (Kit *kit, KitManager::instance()->kits()) {
|
||||||
if (!kit->isValid() && !(flags & IncludeInvalidKits))
|
if (kitMatches(kit)) {
|
||||||
continue;
|
addItem(kitText(kit), qVariantFromValue(kit->id()));
|
||||||
ToolChain *tc = ToolChainKitInformation::toolChain(kit);
|
setItemData(count() - 1, kitToolTip(kit), Qt::ToolTipRole);
|
||||||
if (!tc)
|
}
|
||||||
continue;
|
|
||||||
const Abi abi = tc->targetAbi();
|
|
||||||
if ((flags & HostAbiOnly) && hostAbi.os() != abi.os())
|
|
||||||
continue;
|
|
||||||
const QString debuggerCommand = kit->value(Core::Id("Debugger.Information")).toString();
|
|
||||||
if ((flags & HasDebugger) && debuggerCommand.isEmpty())
|
|
||||||
continue;
|
|
||||||
const QString completeBase = QFileInfo(debuggerCommand).completeBaseName();
|
|
||||||
const QString name = tr("%1 (%2)").arg(kit->displayName(), completeBase);
|
|
||||||
addItem(name, qVariantFromValue(kit->id()));
|
|
||||||
setItemData(count() - 1, kit->toHtml(), Qt::ToolTipRole);
|
|
||||||
}
|
}
|
||||||
setEnabled(count() > 1);
|
setEnabled(count() > 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,24 +47,25 @@ class PROJECTEXPLORER_EXPORT KitChooser : public QComboBox
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum Flags {
|
explicit KitChooser(QWidget *parent = 0);
|
||||||
HostAbiOnly = 0x1,
|
|
||||||
IncludeInvalidKits = 0x2,
|
|
||||||
HasDebugger = 0x4,
|
|
||||||
RemoteDebugging = IncludeInvalidKits | HasDebugger,
|
|
||||||
LocalDebugging = RemoteDebugging | HostAbiOnly
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit KitChooser(QWidget *parent, unsigned flags = 0);
|
|
||||||
|
|
||||||
void setCurrentKitId(Core::Id id);
|
void setCurrentKitId(Core::Id id);
|
||||||
Core::Id currentKitId() const;
|
Core::Id currentKitId() const;
|
||||||
|
|
||||||
Kit *currentKit() const;
|
Kit *currentKit() const;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void populate();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onCurrentIndexChanged(int index);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool kitMatches(const Kit *k) const;
|
||||||
|
virtual QString kitText(const Kit *k) const;
|
||||||
|
virtual QString kitToolTip(Kit *k) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_SLOT void onCurrentIndexChanged(int index);
|
|
||||||
void populate(unsigned flags);
|
|
||||||
Kit *kitAt(int index) const;
|
Kit *kitAt(int index) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user