diff --git a/src/plugins/madde/maddedevice.cpp b/src/plugins/madde/maddedevice.cpp index 6a6b6062a1c29132927972cc39abee41adc45ac4..0cb4973b239bbfc72aa2ba97c481f437ae2e793a 100644 --- a/src/plugins/madde/maddedevice.cpp +++ b/src/plugins/madde/maddedevice.cpp @@ -31,8 +31,22 @@ **************************************************************************/ #include "maddedevice.h" +#include "maddedevicetester.h" +#include "maemoconstants.h" + +#include <remotelinux/linuxdevicetestdialog.h> +#include <remotelinux/publickeydeploymentdialog.h> +#include <remotelinux/remotelinuxprocessesdialog.h> +#include <remotelinux/remotelinuxprocesslist.h> +#include <remotelinux/remotelinux_constants.h> +#include <utils/qtcassert.h> + +using namespace RemoteLinux; + namespace Madde { namespace Internal { +const char MaddeDeviceTestActionId[] = "Madde.DeviceTestAction"; +const char MaddeRemoteProcessesActionId[] = "Madde.RemoteProcessesAction"; MaddeDevice::Ptr MaddeDevice::create() { @@ -64,5 +78,54 @@ ProjectExplorer::IDevice::Ptr MaddeDevice::clone() const return Ptr(new MaddeDevice(*this)); } +QString MaddeDevice::displayType() const +{ + return maddeDisplayType(type()); +} + +QStringList MaddeDevice::actionIds() const +{ + return QStringList() << QLatin1String(MaddeDeviceTestActionId) + << QLatin1String(Constants::GenericDeployKeyToDeviceActionId) + << QLatin1String(MaddeRemoteProcessesActionId); +} + +QString MaddeDevice::displayNameForActionId(const QString &actionId) const +{ + QTC_ASSERT(actionIds().contains(actionId), return QString()); + + if (actionId == QLatin1String(MaddeDeviceTestActionId)) + return tr("Test"); + if (actionId == QLatin1String(MaddeRemoteProcessesActionId)) + return tr("Remote Processes..."); + if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId)) + return tr("Deploy Public Key..."); + return QString(); // Can't happen. +} + +QDialog *MaddeDevice::createAction(const QString &actionId, QWidget *parent) const +{ + QTC_ASSERT(actionIds().contains(actionId), return 0); + + const LinuxDeviceConfiguration::ConstPtr device + = sharedFromThis().staticCast<const LinuxDeviceConfiguration>(); + if (actionId == QLatin1String(MaddeDeviceTestActionId)) + return new LinuxDeviceTestDialog(device, new MaddeDeviceTester, parent); + if (actionId == QLatin1String(MaddeRemoteProcessesActionId)) + return new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device), parent); + if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId)) + return PublicKeyDeploymentDialog::createDialog(device, parent); + return 0; // Can't happen. +} + +QString MaddeDevice::maddeDisplayType(const QString &type) +{ + if (type == QLatin1String(Maemo5OsType)) + return tr("Maemo5/Fremantle"); + if (type == QLatin1String(HarmattanOsType)) + return tr("MeeGo 1.2 Harmattan"); + return tr("Other MeeGo OS"); +} + } // namespace Internal } // namespace Madde diff --git a/src/plugins/madde/maddedevice.h b/src/plugins/madde/maddedevice.h index 3b41168ddcb6f1cb16ad68c952e5a4bc32ace7b9..217e0a26d8aa6b7a4cfeeb95d5801f3e03471d87 100644 --- a/src/plugins/madde/maddedevice.h +++ b/src/plugins/madde/maddedevice.h @@ -34,11 +34,14 @@ #include <remotelinux/linuxdeviceconfiguration.h> +#include <QCoreApplication> + namespace Madde { namespace Internal { class MaddeDevice : public RemoteLinux::LinuxDeviceConfiguration { + Q_DECLARE_TR_FUNCTIONS(MaddeDevice) public: typedef QSharedPointer<MaddeDevice> Ptr; typedef QSharedPointer<const MaddeDevice> ConstPtr; @@ -47,7 +50,12 @@ public: static Ptr create(const QString &name, const QString &type, MachineType machineType, Origin origin = ManuallyAdded, const QString &fingerprint = QString()); + QString displayType() const; + QStringList actionIds() const; + QString displayNameForActionId(const QString &actionId) const; + QDialog *createAction(const QString &actionId, QWidget *parent) const; ProjectExplorer::IDevice::Ptr clone() const; + static QString maddeDisplayType(const QString &type); private: MaddeDevice(); diff --git a/src/plugins/madde/maddedeviceconfigurationfactory.cpp b/src/plugins/madde/maddedeviceconfigurationfactory.cpp index 1087c0fd765d5a0615cfd70d19c1449741da3b60..c32b8edfdef43a1a2c31474a536c09f44e34f7c9 100644 --- a/src/plugins/madde/maddedeviceconfigurationfactory.cpp +++ b/src/plugins/madde/maddedeviceconfigurationfactory.cpp @@ -32,16 +32,9 @@ #include "maddedeviceconfigurationfactory.h" #include "maddedevice.h" -#include "maddedevicetester.h" #include "maemoconstants.h" #include "maemodeviceconfigwizard.h" -#include <remotelinux/linuxdevicetestdialog.h> -#include <remotelinux/publickeydeploymentdialog.h> -#include <remotelinux/remotelinuxprocessesdialog.h> -#include <remotelinux/remotelinuxprocesslist.h> -#include <remotelinux/remotelinux_constants.h> -#include <remotelinux/genericlinuxdeviceconfigurationwidget.h> #include <utils/qtcassert.h> using namespace ProjectExplorer; @@ -49,10 +42,6 @@ using namespace RemoteLinux; namespace Madde { namespace Internal { -namespace { -const char MaddeDeviceTestActionId[] = "Madde.DeviceTestAction"; -const char MaddeRemoteProcessesActionId[] = "Madde.RemoteProcessesAction"; -} // anonymous namespace MaddeDeviceConfigurationFactory::MaddeDeviceConfigurationFactory(QObject *parent) : IDeviceFactory(parent) @@ -69,13 +58,6 @@ IDeviceWizard *MaddeDeviceConfigurationFactory::createWizard(QWidget *parent) co return new MaemoDeviceConfigWizard(parent); } -IDeviceWidget *MaddeDeviceConfigurationFactory::createWidget(const IDevice::Ptr &device, - QWidget *parent) const -{ - return new GenericLinuxDeviceConfigurationWidget(device.staticCast<LinuxDeviceConfiguration>(), - parent); -} - IDevice::Ptr MaddeDeviceConfigurationFactory::loadDevice(const QVariantMap &map) const { QTC_ASSERT(supportsDeviceType(IDevice::typeFromMap(map)), return MaddeDevice::Ptr()); @@ -90,51 +72,5 @@ bool MaddeDeviceConfigurationFactory::supportsDeviceType(const QString &type) co || type == QLatin1String(MeeGoOsType); } -QString MaddeDeviceConfigurationFactory::displayNameForDeviceType(const QString &deviceType) const -{ - QTC_ASSERT(supportsDeviceType(deviceType), return QString()); - if (deviceType == QLatin1String(Maemo5OsType)) - return tr("Maemo5/Fremantle"); - if (deviceType == QLatin1String(HarmattanOsType)) - return tr("MeeGo 1.2 Harmattan"); - return tr("Other MeeGo OS"); -} - -QStringList MaddeDeviceConfigurationFactory::supportedDeviceActionIds() const -{ - return QStringList() << QLatin1String(MaddeDeviceTestActionId) - << QLatin1String(Constants::GenericDeployKeyToDeviceActionId) - << QLatin1String(MaddeRemoteProcessesActionId); -} - -QString MaddeDeviceConfigurationFactory::displayNameForActionId(const QString &actionId) const -{ - Q_ASSERT(supportedDeviceActionIds().contains(actionId)); - - if (actionId == QLatin1String(MaddeDeviceTestActionId)) - return tr("Test"); - if (actionId == QLatin1String(MaddeRemoteProcessesActionId)) - return tr("Remote Processes..."); - if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId)) - return tr("Deploy Public Key..."); - return QString(); // Can't happen. -} - -QDialog *MaddeDeviceConfigurationFactory::createDeviceAction(const QString &actionId, - const IDevice::ConstPtr &device, QWidget *parent) const -{ - Q_ASSERT(supportedDeviceActionIds().contains(actionId)); - - const LinuxDeviceConfiguration::ConstPtr lDevice - = device.staticCast<const LinuxDeviceConfiguration>(); - if (actionId == QLatin1String(MaddeDeviceTestActionId)) - return new LinuxDeviceTestDialog(lDevice, new MaddeDeviceTester, parent); - if (actionId == QLatin1String(MaddeRemoteProcessesActionId)) - return new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(lDevice), parent); - if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId)) - return PublicKeyDeploymentDialog::createDialog(lDevice, parent); - return 0; // Can't happen. -} - } // namespace Internal } // namespace Madde diff --git a/src/plugins/madde/maddedeviceconfigurationfactory.h b/src/plugins/madde/maddedeviceconfigurationfactory.h index cc1451bc3473dd4f4a04c4025ddb42dfa4ed53c5..e64b9a71e205d28cdcabe737fc8c4fa0e913dcb2 100644 --- a/src/plugins/madde/maddedeviceconfigurationfactory.h +++ b/src/plugins/madde/maddedeviceconfigurationfactory.h @@ -45,15 +45,8 @@ public: QString displayName() const; ProjectExplorer::IDeviceWizard *createWizard(QWidget *parent) const; - ProjectExplorer::IDeviceWidget *createWidget( - const ProjectExplorer::IDevice::Ptr &device, QWidget *parent = 0) const; ProjectExplorer::IDevice::Ptr loadDevice(const QVariantMap &map) const; bool supportsDeviceType(const QString &type) const; - QString displayNameForDeviceType(const QString &deviceType) const; - QStringList supportedDeviceActionIds() const; - QString displayNameForActionId(const QString &actionId) const; - QDialog *createDeviceAction(const QString &actionId, - const ProjectExplorer::IDevice::ConstPtr &device, QWidget *parent) const; }; } // namespace Internal diff --git a/src/plugins/madde/maemodeviceconfigwizard.cpp b/src/plugins/madde/maemodeviceconfigwizard.cpp index b33d2a03ba0eb373605e736173196a737ebdafbd..b476deb00bfda2994991eff7bd12b522b83de749 100644 --- a/src/plugins/madde/maemodeviceconfigwizard.cpp +++ b/src/plugins/madde/maemodeviceconfigwizard.cpp @@ -41,7 +41,6 @@ #include "maemoconstants.h" #include "maemoglobal.h" -#include <projectexplorer/devicesupport/devicemanager.h> #include <remotelinux/genericlinuxdeviceconfigurationwizardpages.h> #include <remotelinux/linuxdevicetestdialog.h> #include <remotelinux/sshkeydeployer.h> @@ -106,11 +105,11 @@ public: setTitle(tr("General Information")); setSubTitle(QLatin1String(" ")); // For Qt bug (background color) - m_ui->osTypeComboBox->addItem(DeviceManager::displayNameForDeviceType(QLatin1String(Maemo5OsType)), + m_ui->osTypeComboBox->addItem(MaddeDevice::maddeDisplayType(QLatin1String(Maemo5OsType)), QLatin1String(Maemo5OsType)); - m_ui->osTypeComboBox->addItem(DeviceManager::displayNameForDeviceType(QLatin1String(HarmattanOsType)), + m_ui->osTypeComboBox->addItem(MaddeDevice::maddeDisplayType(QLatin1String(HarmattanOsType)), QLatin1String(HarmattanOsType)); - m_ui->osTypeComboBox->addItem(DeviceManager::displayNameForDeviceType(QLatin1String(MeeGoOsType)), + m_ui->osTypeComboBox->addItem(MaddeDevice::maddeDisplayType(QLatin1String(MeeGoOsType)), QLatin1String(MeeGoOsType)); QButtonGroup *buttonGroup = new QButtonGroup(this); diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 4afb2132b064fda895358a55ce3e972cd3603256..667ae31e9d8edd8f40045f2a7474d65172d1afac 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -332,13 +332,6 @@ const IDeviceFactory *DeviceManager::factoryForDeviceType(const QString &type) return 0; } -QString DeviceManager::displayNameForDeviceType(const QString &type) -{ - if (const IDeviceFactory * const factory = factoryForDeviceType(type)) - return factory->displayNameForDeviceType(type); - return tr("Unknown OS"); -} - DeviceManager::DeviceManager(bool doLoad) : d(new DeviceManagerPrivate) { if (doLoad) @@ -428,4 +421,25 @@ IDevice::Id DeviceManager::unusedId() const return IDevice::invalidId(); } +IDevice::Ptr DeviceManager::fromRawPointer(IDevice *device) const +{ + foreach (const IDevice::Ptr &devPtr, d->devices) { + if (devPtr == device) + return devPtr; + } + + if (this == instance() && d->clonedInstance) + return d->clonedInstance->fromRawPointer(device); + + qWarning("%s: Device not found.", Q_FUNC_INFO); + return IDevice::Ptr(); +} + +IDevice::ConstPtr DeviceManager::fromRawPointer(const IDevice *device) const +{ + // The const_cast is safe, because we convert the Ptr back to a ConstPtr before returning it. + return fromRawPointer(const_cast<IDevice *>(device)); +} + + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.h b/src/plugins/projectexplorer/devicesupport/devicemanager.h index fd94ae0af91d8cdf41cadb4b4f9af809cb6fef4c..c48b346ffcb58e8b92a5ad2f8ccb49af62591854 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.h @@ -50,6 +50,7 @@ class PROJECTEXPLORER_EXPORT DeviceManager : public QObject { Q_OBJECT friend class Internal::DeviceSettingsWidget; + friend class IDevice; public: ~DeviceManager(); @@ -70,7 +71,6 @@ public: void removeDevice(int index); static const IDeviceFactory *factoryForDeviceType(const QString &type); - static QString displayNameForDeviceType(const QString &type); signals: void deviceAdded(const QSharedPointer<const IDevice> &device); @@ -100,6 +100,10 @@ private: static void replaceInstance(); static void removeClonedInstance(); + // For IDevice. + IDevice::Ptr fromRawPointer(IDevice *device) const; + IDevice::ConstPtr fromRawPointer(const IDevice *device) const; + static QString settingsFilePath(); static void copy(const DeviceManager *source, DeviceManager *target, bool deep); diff --git a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp index 1d87fddec168fa65ecdd06349fed5cb7c2a944a1..777e0495429bf426ededa2abe1008029da001233 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp @@ -104,10 +104,8 @@ QVariant DeviceManagerModel::data(const QModelIndex &index, int role) const return QVariant(); const IDevice::ConstPtr device = d->devices.at(index.row()); QString name = device->displayName(); - if (d->deviceManager->defaultDevice(device->type()) == device) { - name = tr("%1 (default for %2)").arg(name, - d->deviceManager->displayNameForDeviceType(device->type())); - } + if (d->deviceManager->defaultDevice(device->type()) == device) + name = tr("%1 (default for %2)").arg(name, device->displayType()); return name; } diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp index e505489ab7f6848425a1821c8261dc2e092064c1..e2f33491cbc17bbb789b0a0aed6a2a12ebc63436 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp @@ -42,6 +42,7 @@ #include <coreplugin/icore.h> #include <extensionsystem/pluginmanager.h> #include <utils/portlist.h> +#include <utils/qtcassert.h> #include <QFileInfo> #include <QRegExp> @@ -115,6 +116,7 @@ DeviceSettingsWidget::~DeviceSettingsWidget() DeviceManager::replaceInstance(); } DeviceManager::removeClonedInstance(); + delete m_configWidget; delete m_ui; } @@ -181,7 +183,7 @@ void DeviceSettingsWidget::displayCurrent() const IDevice::ConstPtr ¤t = currentDevice(); m_ui->defaultDeviceButton->setEnabled( m_deviceManager->defaultDevice(current->type()) != current); - m_ui->osTypeValueLabel->setText(DeviceManager::displayNameForDeviceType(current->type())); + m_ui->osTypeValueLabel->setText(current->displayType()); m_ui->autoDetectionValueLabel->setText(current->isAutoDetected() ? tr("Yes (fingerprint is '%1')").arg(current->fingerprint()) : tr("No")); m_nameValidator->setDisplayName(current->displayName()); @@ -234,36 +236,26 @@ void DeviceSettingsWidget::currentDeviceChanged(int index) delete m_configWidget; m_configWidget = 0; m_additionalActionButtons.clear(); - m_ui->generalGroupBox->setEnabled(false); - m_ui->osSpecificGroupBox->setEnabled(false); + QTC_ASSERT(index >= -1 && index < m_deviceManager->deviceCount(), return); if (index == -1) { m_ui->removeConfigButton->setEnabled(false); clearDetails(); m_ui->defaultDeviceButton->setEnabled(false); } else { m_ui->removeConfigButton->setEnabled(true); - const IDeviceFactory * const factory = factoryForCurrentDevice(); - if (factory) { - const QStringList &actionIds = factory->supportedDeviceActionIds(); - foreach (const QString &actionId, actionIds) { - QPushButton * const button = new QPushButton( - factory->displayNameForActionId(actionId)); - m_additionalActionButtons << button; - connect(button, SIGNAL(clicked()), m_additionalActionsMapper, SLOT(map())); - m_additionalActionsMapper->setMapping(button, actionId); - m_ui->buttonsLayout->insertWidget(m_ui->buttonsLayout->count() - 1, button); - } - if (!m_ui->osSpecificGroupBox->layout()) - new QVBoxLayout(m_ui->osSpecificGroupBox); - m_configWidget = factory->createWidget(m_deviceManager->mutableDeviceAt(currentIndex()), - m_ui->osSpecificGroupBox); - if (m_configWidget) { - m_ui->osSpecificGroupBox->layout()->addWidget(m_configWidget); - m_ui->osSpecificGroupBox->setEnabled(factory->isUserEditable()); - } - m_ui->generalGroupBox->setEnabled(factory->isUserEditable()); + const IDevice::ConstPtr device = m_deviceManager->deviceAt(index); + foreach (const QString &actionId, device->actionIds()) { + QPushButton * const button = new QPushButton(device->displayNameForActionId(actionId)); + m_additionalActionButtons << button; + connect(button, SIGNAL(clicked()), m_additionalActionsMapper, SLOT(map())); + m_additionalActionsMapper->setMapping(button, actionId); + m_ui->buttonsLayout->insertWidget(m_ui->buttonsLayout->count() - 1, button); } - m_ui->configurationComboBox->setCurrentIndex(index); + if (!m_ui->osSpecificGroupBox->layout()) + new QVBoxLayout(m_ui->osSpecificGroupBox); + m_configWidget = m_deviceManager->mutableDeviceAt(index)->createWidget(); + if (m_configWidget) + m_ui->osSpecificGroupBox->layout()->addWidget(m_configWidget); displayCurrent(); } } @@ -275,17 +267,11 @@ void DeviceSettingsWidget::clearDetails() m_ui->autoDetectionValueLabel->clear(); } -const IDeviceFactory *DeviceSettingsWidget::factoryForCurrentDevice() const -{ - Q_ASSERT(currentDevice()); - return DeviceManager::factoryForDeviceType(currentDevice()->type()); -} - void DeviceSettingsWidget::handleAdditionalActionRequest(const QString &actionId) { - const IDeviceFactory * const factory = factoryForCurrentDevice(); - Q_ASSERT(factory); - QDialog * const action = factory->createDeviceAction(actionId, currentDevice(), this); + const IDevice::ConstPtr &device = currentDevice(); + QTC_ASSERT(device, return); + QDialog * const action = device->createAction(actionId, this); if (action) action->exec(); delete action; diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.h b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.h index 3194dc407f5dfa80599d14280103be9af34be58c..51566ca95113669387d41c1f2be0f1f45eb0dfcf 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.h +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.h @@ -44,7 +44,6 @@ QT_END_NAMESPACE namespace ProjectExplorer { class IDevice; class DeviceManager; -class IDeviceFactory; class IDeviceWidget; namespace Internal { @@ -77,7 +76,6 @@ private: void clearDetails(); QString parseTestOutput(); void fillInValues(); - const IDeviceFactory *factoryForCurrentDevice() const; Ui::DeviceSettingsWidget *m_ui; DeviceManager * const m_deviceManager; diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 14c2c0e2e117dcfb63c47579e74057876f12e62a..0b93450188092557642e6d3619d013444b87dfc4 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -31,6 +31,8 @@ **************************************************************************/ #include "idevice.h" +#include "devicemanager.h" + #include <utils/qtcassert.h> #include <QString> @@ -91,7 +93,37 @@ */ /*! - * \fn ProjectExplorer::IDevice::Ptr ProjectExploer::IDevice::clone() const + * \fn QString ProjectExplorer::IDevice::displayType() const + * \brief Prints a representation of the device's type suitable for displaying to a user. + */ + +/*! + * \fn ProjectExplorer::IDeviceWidget *ProjectExplorer::IDevice::createWidget() const + * \brief Creates a widget that displays device information not part of the IDevice base class. + * The widget can also be used to let the user change these attributes. + */ + +/*! + * \fn QStringList ProjectExplorer::IDevice::actionIds() const + * \brief Returns a list of ids representing actions that can be run on this device. + * These actions will be available in the "Devices" options page. + */ + +/*! + * \fn QString ProjectExplorer::IDevice::displayNameForActionId(const QString &actionId) const + * \brief A human-readable string for the given id. Will be displayed on a button which, + * when clicked, starts the respective action. + */ + +/*! + * \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 ProjectExplorer::IDevice::Ptr ProjectExplorer::IDevice::clone() const * \brief Creates an identical copy of a device object. */ @@ -218,4 +250,14 @@ QVariantMap IDevice::toMap() const return map; } +IDevice::Ptr IDevice::sharedFromThis() +{ + return DeviceManager::instance()->fromRawPointer(this); +} + +IDevice::ConstPtr IDevice::sharedFromThis() const +{ + return DeviceManager::instance()->fromRawPointer(this); +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 047d7698d6a3db57e35c7802f448ea03a686edda..83b934fb200743f1fa1df137800b1105a971614b 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -35,10 +35,17 @@ #include <projectexplorer/projectexplorer_export.h> #include <QSharedPointer> +#include <QStringList> #include <QVariantMap> +QT_BEGIN_NAMESPACE +class QDialog; +class QWidget; +QT_END_NAMESPACE + namespace ProjectExplorer { namespace Internal { class IDevicePrivate; } +class IDeviceWidget; // See cpp file for documentation. class PROJECTEXPLORER_EXPORT IDevice @@ -62,6 +69,11 @@ public: QString fingerprint() const; Id internalId() const; + virtual QString displayType() const = 0; + virtual IDeviceWidget *createWidget() = 0; + virtual QStringList actionIds() const = 0; + virtual QString displayNameForActionId(const QString &actionId) const = 0; + virtual QDialog *createAction(const QString &actionId, QWidget *parent = 0) const = 0; virtual void fromMap(const QVariantMap &map); virtual Ptr clone() const = 0; @@ -74,6 +86,9 @@ protected: IDevice(const QString &type, Origin origin, const QString fingerprint = QString()); IDevice(const IDevice &other); + Ptr sharedFromThis(); + ConstPtr sharedFromThis() const; + virtual QVariantMap toMap() const; private: diff --git a/src/plugins/projectexplorer/devicesupport/idevicefactory.h b/src/plugins/projectexplorer/devicesupport/idevicefactory.h index b55570c98a1f2f03c7fbd7cf2bdea234b738f528..1950155697d8a2632e305ecc91a4d860cadb3775 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicefactory.h +++ b/src/plugins/projectexplorer/devicesupport/idevicefactory.h @@ -36,16 +36,13 @@ #include <projectexplorer/projectexplorer_export.h> #include <QObject> -#include <QStringList> #include <QVariantMap> QT_BEGIN_NAMESPACE -class QDialog; class QWidget; QT_END_NAMESPACE namespace ProjectExplorer { -class IDeviceWidget; class IDeviceWizard; /*! @@ -77,49 +74,11 @@ public: */ virtual IDevice::Ptr loadDevice(const QVariantMap &map) const = 0; - /*! - A widget that can configure the device this factory supports. - */ - virtual IDeviceWidget *createWidget(const IDevice::Ptr &device, QWidget *parent = 0) const = 0; - /*! Returns true iff this factory supports the given device type. */ virtual bool supportsDeviceType(const QString &type) const = 0; - /*! - Returns a human-readable string for the given device type, if this factory supports that type. - */ - virtual QString displayNameForDeviceType(const QString &type) const = 0; - - /*! - Returns a list of ids representing actions that can be run on devices - that this factory supports. These actions will be available in the "Devices" - options page. - */ - virtual QStringList supportedDeviceActionIds() const = 0; - - /*! - A human-readable string for the given id. Will be displayed on a button which, when clicked, - starts the respective action. - */ - virtual QString displayNameForActionId(const QString &actionId) const = 0; - - /*! - True iff the user should be allowed to edit the devices created by this - factory. Returns true by default. Override if your factory creates fixed configurations - for which later editing makes no sense. - */ - virtual bool isUserEditable() const { return true; } - - /*! - Produces a dialog implementing the respective action. The dialog is supposed to be - modal, so implementers must make sure to make it interruptible as to not needlessly - block the UI. - */ - virtual QDialog *createDeviceAction(const QString &actionId, const IDevice::ConstPtr &device, - QWidget *parent = 0) const = 0; - protected: IDeviceFactory(QObject *parent) : QObject(parent) { } }; diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp index 625b6bad70bb45f33df3c149aa5811d7998fd47a..4bba38569a30407b0e44d40f6a1fdd97f1ea6e69 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp @@ -32,12 +32,7 @@ #include "genericlinuxdeviceconfigurationfactory.h" #include "genericlinuxdeviceconfigurationwizard.h" -#include "genericlinuxdeviceconfigurationwidget.h" #include "linuxdeviceconfiguration.h" -#include "linuxdevicetestdialog.h" -#include "publickeydeploymentdialog.h" -#include "remotelinuxprocessesdialog.h" -#include "remotelinuxprocesslist.h" #include "remotelinux_constants.h" #include <utils/qtcassert.h> @@ -61,13 +56,6 @@ IDeviceWizard *GenericLinuxDeviceConfigurationFactory::createWizard(QWidget *par return new GenericLinuxDeviceConfigurationWizard(parent); } -IDeviceWidget *GenericLinuxDeviceConfigurationFactory::createWidget(const IDevice::Ptr &device, - QWidget *parent) const -{ - return new GenericLinuxDeviceConfigurationWidget(device.staticCast<LinuxDeviceConfiguration>(), - parent); -} - IDevice::Ptr GenericLinuxDeviceConfigurationFactory::loadDevice(const QVariantMap &map) const { QTC_ASSERT(supportsDeviceType(IDevice::typeFromMap(map)), @@ -82,46 +70,4 @@ bool GenericLinuxDeviceConfigurationFactory::supportsDeviceType(const QString &d return deviceType == QLatin1String(Constants::GenericLinuxOsType); } -QString GenericLinuxDeviceConfigurationFactory::displayNameForDeviceType(const QString &deviceType) const -{ - QTC_ASSERT(supportsDeviceType(deviceType), return QString()); - return tr("Generic Linux"); -} - -QStringList GenericLinuxDeviceConfigurationFactory::supportedDeviceActionIds() const -{ - return QStringList() << QLatin1String(Constants::GenericTestDeviceActionId) - << QLatin1String(Constants::GenericDeployKeyToDeviceActionId) - << QLatin1String(Constants::GenericRemoteProcessesActionId); -} - -QString GenericLinuxDeviceConfigurationFactory::displayNameForActionId(const QString &actionId) const -{ - QTC_ASSERT(supportedDeviceActionIds().contains(actionId), return QString()); - - if (actionId == QLatin1String(Constants::GenericTestDeviceActionId)) - return tr("Test"); - if (actionId == QLatin1String(Constants::GenericRemoteProcessesActionId)) - return tr("Remote Processes..."); - if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId)) - return tr("Deploy Public Key..."); - return QString(); // Can't happen. -} - -QDialog *GenericLinuxDeviceConfigurationFactory::createDeviceAction(const QString &actionId, - const IDevice::ConstPtr &device, QWidget *parent) const -{ - QTC_ASSERT(supportedDeviceActionIds().contains(actionId), return 0); - - const LinuxDeviceConfiguration::ConstPtr lDevice - = device.staticCast<const LinuxDeviceConfiguration>(); - if (actionId == QLatin1String(Constants::GenericTestDeviceActionId)) - return new LinuxDeviceTestDialog(lDevice, new GenericLinuxDeviceTester, parent); - if (actionId == QLatin1String(Constants::GenericRemoteProcessesActionId)) - return new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(lDevice, parent)); - if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId)) - return PublicKeyDeploymentDialog::createDialog(lDevice, parent); - return 0; // Can't happen. -} - } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.h b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.h index 193821763ee41666067b3ba72b91b68fa39acc98..c5c57c9cdffc68f00daa4a8341e1d5229655faa3 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.h +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.h @@ -48,15 +48,8 @@ public: QString displayName() const; ProjectExplorer::IDeviceWizard *createWizard(QWidget *parent) const; - ProjectExplorer::IDeviceWidget *createWidget(const ProjectExplorer::IDevice::Ptr &device, - QWidget *parent = 0) const; ProjectExplorer::IDevice::Ptr loadDevice(const QVariantMap &map) const; bool supportsDeviceType(const QString &deviceType) const; - QString displayNameForDeviceType(const QString &deviceType) const; - QStringList supportedDeviceActionIds() const; - QString displayNameForActionId(const QString &actionId) const; - QDialog *createDeviceAction(const QString &actionId, - const ProjectExplorer::IDevice::ConstPtr &device, QWidget *parent) const; }; } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp index 7ffc5e492f6fb7a2837a510175596becace896a7..849da2b794f42861e94485a2a4732806577bb5ef 100644 --- a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp +++ b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp @@ -31,6 +31,11 @@ **************************************************************************/ #include "linuxdeviceconfiguration.h" +#include "genericlinuxdeviceconfigurationwidget.h" +#include "linuxdevicetestdialog.h" +#include "publickeydeploymentdialog.h" +#include "remotelinuxprocessesdialog.h" +#include "remotelinuxprocesslist.h" #include "remotelinux_constants.h" #include <utils/portlist.h> @@ -84,6 +89,52 @@ LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::create(const QString &na return Ptr(new LinuxDeviceConfiguration(name, type, machineType, origin, fingerprint)); } +QString LinuxDeviceConfiguration::displayType() const +{ + return tr("Generic Linux"); +} + +ProjectExplorer::IDeviceWidget *LinuxDeviceConfiguration::createWidget() +{ + return new GenericLinuxDeviceConfigurationWidget(sharedFromThis() + .staticCast<LinuxDeviceConfiguration>()); +} + +QStringList LinuxDeviceConfiguration::actionIds() const +{ + return QStringList() << QLatin1String(Constants::GenericTestDeviceActionId) + << QLatin1String(Constants::GenericDeployKeyToDeviceActionId) + << QLatin1String(Constants::GenericRemoteProcessesActionId); +} + +QString LinuxDeviceConfiguration::displayNameForActionId(const QString &actionId) const +{ + QTC_ASSERT(actionIds().contains(actionId), return QString()); + + if (actionId == QLatin1String(Constants::GenericTestDeviceActionId)) + return tr("Test"); + if (actionId == QLatin1String(Constants::GenericRemoteProcessesActionId)) + return tr("Remote Processes..."); + if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId)) + return tr("Deploy Public Key..."); + return QString(); // Can't happen. +} + +QDialog *LinuxDeviceConfiguration::createAction(const QString &actionId, QWidget *parent) const +{ + QTC_ASSERT(actionIds().contains(actionId), return 0); + + const LinuxDeviceConfiguration::ConstPtr device + = sharedFromThis().staticCast<const LinuxDeviceConfiguration>(); + if (actionId == QLatin1String(Constants::GenericTestDeviceActionId)) + return new LinuxDeviceTestDialog(device, new GenericLinuxDeviceTester, parent); + if (actionId == QLatin1String(Constants::GenericRemoteProcessesActionId)) + return new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device, parent)); + if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId)) + return PublicKeyDeploymentDialog::createDialog(device, parent); + return 0; // Can't happen. +} + LinuxDeviceConfiguration::LinuxDeviceConfiguration() : d(new LinuxDeviceConfigurationPrivate) { } diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.h b/src/plugins/remotelinux/linuxdeviceconfiguration.h index c03b29bef1186ce539c6aabd72905004568eec70..ca94388dfd4c1335767007213ad0afedf548efe5 100644 --- a/src/plugins/remotelinux/linuxdeviceconfiguration.h +++ b/src/plugins/remotelinux/linuxdeviceconfiguration.h @@ -36,6 +36,8 @@ #include <projectexplorer/devicesupport/idevice.h> +#include <QCoreApplication> + namespace Utils { class SshConnectionParameters; class PortList; @@ -48,6 +50,7 @@ class LinuxDeviceConfigurationPrivate; class REMOTELINUX_EXPORT LinuxDeviceConfiguration : public ProjectExplorer::IDevice { + Q_DECLARE_TR_FUNCTIONS(LinuxDeviceConfiguration) public: typedef QSharedPointer<LinuxDeviceConfiguration> Ptr; typedef QSharedPointer<const LinuxDeviceConfiguration> ConstPtr; @@ -70,6 +73,11 @@ public: static Ptr create(const QString &name, const QString &type, MachineType machineType, Origin origin = ManuallyAdded, const QString &fingerprint = QString()); + QString displayType() const; + ProjectExplorer::IDeviceWidget *createWidget(); + QStringList actionIds() const; + QString displayNameForActionId(const QString &actionId) const; + QDialog *createAction(const QString &actionId, QWidget *parent) const; void fromMap(const QVariantMap &map); ProjectExplorer::IDevice::Ptr clone() const;