From e4351cd32492f1c616cb6d587e752a2e201ee34e Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Fri, 24 Jun 2011 09:49:34 +0200
Subject: [PATCH] Qt4BaseTargetFactory: Expose list of generic 'features' for a
 target

Replace the isMobileTarget, supportsShadowBuilds methods by a
generic targetFeatures method which exposes features as a set of
strings.

Change-Id: I2ac99ff5a82280316071efaa140cd7ea35b21374
Reviewed-on: http://codereview.qt.nokia.com/692
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
---
 .../qt-desktop/qt4desktoptargetfactory.cpp    | 12 +++---------
 .../qt-desktop/qt4desktoptargetfactory.h      |  3 +--
 .../qt-desktop/qt4simulatortargetfactory.cpp  | 12 +++---------
 .../qt-desktop/qt4simulatortargetfactory.h    |  3 +--
 .../qt-s60/qt4symbiantargetfactory.cpp        | 11 ++---------
 .../qt-s60/qt4symbiantargetfactory.h          |  4 ++--
 .../qt4projectmanager/qt4basetargetfactory.h  |  3 +--
 .../qt4projectmanagerconstants.h              |  5 +++++
 src/plugins/qt4projectmanager/qt4target.cpp   | 14 +++++++++-----
 .../wizards/abstractmobileappwizard.cpp       |  2 +-
 .../wizards/mobileappwizard.cpp               |  1 -
 .../qt4projectmanager/wizards/qtwizard.cpp    |  6 +++++-
 .../wizards/targetsetuppage.cpp               | 17 +++++++++++------
 .../wizards/targetsetuppage.h                 |  7 +++----
 .../remotelinux/qt4maemotargetfactory.cpp     | 19 +++++++------------
 .../remotelinux/qt4maemotargetfactory.h       |  3 +--
 16 files changed, 55 insertions(+), 67 deletions(-)

diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
index 48de0fff08f..c708daa32fe 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
@@ -156,16 +156,10 @@ ProjectExplorer::Target *Qt4DesktopTargetFactory::create(ProjectExplorer::Projec
     return create(parent, id, infos);
 }
 
-bool Qt4DesktopTargetFactory::isMobileTarget(const QString &id)
+QSet<QString> Qt4DesktopTargetFactory::targetFeatures(const QString & /*id*/) const
 {
-    Q_UNUSED(id)
-    return false;
-}
-
-bool Qt4DesktopTargetFactory::supportsShadowBuilds(const QString &id)
-{
-    Q_UNUSED(id);
-    return true;
+    return QSet<QString>() << Constants::DESKTOP_TARGETFEATURE_ID
+                           << Constants::SHADOWBUILD_TARGETFEATURE_ID;
 }
 
 ProjectExplorer::Target *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos)
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h
index 416cb0d7191..55e784c3e0e 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h
@@ -56,8 +56,7 @@ public:
 
     Qt4TargetSetupWidget *createTargetSetupWidget(const QString &id, const QString &proFilePath, const QtSupport::QtVersionNumber &minimumQtVersion, bool importEnabled, QList<BuildConfigurationInfo> importInfos);
     QString buildNameForId(const QString &id) const;
-    bool isMobileTarget(const QString &id);
-    bool supportsShadowBuilds(const QString &id);
+    QSet<QString> targetFeatures(const QString &id) const;
     ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const QString &id);
     ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos);
 
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
index 474a2eb0457..fe5178444df 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
@@ -123,16 +123,10 @@ ProjectExplorer::Target *Qt4SimulatorTargetFactory::restore(ProjectExplorer::Pro
     return 0;
 }
 
-bool Qt4SimulatorTargetFactory::isMobileTarget(const QString &id)
+QSet<QString> Qt4SimulatorTargetFactory::targetFeatures(const QString & /*id*/) const
 {
-    Q_UNUSED(id)
-    return true;
-}
-
-bool Qt4SimulatorTargetFactory::supportsShadowBuilds(const QString &id)
-{
-    Q_UNUSED(id);
-    return true;
+    return QSet<QString>() << Constants::MOBILE_TARGETFEATURE_ID
+                           << Constants::SHADOWBUILD_TARGETFEATURE_ID;
 }
 
 ProjectExplorer::Target *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h
index b0860e417e6..dadac9b0617 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h
@@ -56,10 +56,9 @@ public:
     ProjectExplorer::Target *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
 
     bool supportsTargetId(const QString &id) const;
+    QSet<QString> targetFeatures(const QString &id) const;
 
-    bool isMobileTarget(const QString &id);
     QString buildNameForId(const QString &id) const;
-    bool supportsShadowBuilds(const QString &id);
     ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const QString &id);
     ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos);
 };
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
index cfd029d4f6c..5e86f249d05 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
@@ -175,16 +175,9 @@ QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurati
     return tmp;
 }
 
-bool Qt4SymbianTargetFactory::isMobileTarget(const QString &id)
+QSet<QString> Qt4SymbianTargetFactory::targetFeatures(const QString & /*id*/) const
 {
-    Q_UNUSED(id)
-    return true;
-}
-
-bool Qt4SymbianTargetFactory::supportsShadowBuilds(const QString &id)
-{
-    Q_UNUSED(id);
-    return false;
+    return QSet<QString>() << Constants::MOBILE_TARGETFEATURE_ID;
 }
 
 ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h
index 74145f5e9a5..92617456a38 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h
+++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h
@@ -60,8 +60,8 @@ public:
     QString shadowBuildDirectory(const QString &profilePath, const QString &id, const QString &suffix);
     QList<ProjectExplorer::Task> reportIssues(const QString &proFile);
     QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtSupport::QtVersionNumber &minimumQtVersion);
-    bool isMobileTarget(const QString &id);
-    bool supportsShadowBuilds(const QString &id);
+
+    QSet<QString> targetFeatures(const QString &id) const;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt4basetargetfactory.h b/src/plugins/qt4projectmanager/qt4basetargetfactory.h
index b8f813959d7..5a0301e7680 100644
--- a/src/plugins/qt4projectmanager/qt4basetargetfactory.h
+++ b/src/plugins/qt4projectmanager/qt4basetargetfactory.h
@@ -75,8 +75,7 @@ public:
     /// only used in the TargetSetupPage
     virtual QIcon iconForId(const QString &id) const = 0;
 
-    virtual bool isMobileTarget(const QString &id) = 0;
-    virtual bool supportsShadowBuilds(const QString &id) = 0;
+    virtual QSet<QString> targetFeatures(const QString &id) const = 0;
 
     virtual ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const QString &id) = 0;
     virtual ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos) = 0;
diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
index 7d22f278516..23ae39e175a 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
+++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
@@ -92,6 +92,11 @@ const char * const HARMATTAN_DEVICE_TARGET_ID = "Qt4ProjectManager.Target.Harmat
 const char * const MEEGO_DEVICE_TARGET_ID = "Qt4ProjectManager.Target.MeegoDeviceTarget";
 const char * const QT_SIMULATOR_TARGET_ID = "Qt4ProjectManager.Target.QtSimulatorTarget";
 
+// Target Features
+const char * const MOBILE_TARGETFEATURE_ID = "Qt4ProjectManager.TargetFeature.Mobile";
+const char * const DESKTOP_TARGETFEATURE_ID = "Qt4ProjectManager.TargetFeature.Desktop";
+const char * const SHADOWBUILD_TARGETFEATURE_ID = "Qt4ProjectManager.TargetFeature.ShadowBuild";
+
 // Tool chains:
 const char * const GCCE_TOOLCHAIN_ID = "Qt4ProjectManager.ToolChain.GCCE";
 const char * const MAEMO_TOOLCHAIN_ID = "Qt4ProjectManager.ToolChain.Maemo";
diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp
index 5cd90d4613e..28d523a3bce 100644
--- a/src/plugins/qt4projectmanager/qt4target.cpp
+++ b/src/plugins/qt4projectmanager/qt4target.cpp
@@ -38,6 +38,7 @@
 #include "qt4project.h"
 #include "qt4basetargetfactory.h"
 #include "qt4projectconfigwidget.h"
+#include "qt4projectmanagerconstants.h"
 
 #include <coreplugin/icore.h>
 #include <extensionsystem/pluginmanager.h>
@@ -91,11 +92,14 @@ Qt4TargetSetupWidget *Qt4BaseTargetFactory::createTargetSetupWidget(const QStrin
     QList<BuildConfigurationInfo> infos = this->availableBuildConfigurations(id, proFilePath, number);
     if (infos.isEmpty())
         return 0;
-    Qt4DefaultTargetSetupWidget *widget = new Qt4DefaultTargetSetupWidget(this, id, proFilePath,  infos,
-                                                                          number,  importEnabled && supportsShadowBuilds(id),
-                                                                          importInfos,
-                                                                          supportsShadowBuilds(id) ? Qt4DefaultTargetSetupWidget::ENABLE :
-                                                                                                     Qt4DefaultTargetSetupWidget::DISABLE);
+    const bool supportsShadowBuilds
+            = targetFeatures(id).contains(Constants::SHADOWBUILD_TARGETFEATURE_ID);
+    Qt4DefaultTargetSetupWidget *widget
+            = new Qt4DefaultTargetSetupWidget(this, id, proFilePath, infos, number,
+                                              importEnabled && supportsShadowBuilds, importInfos,
+                                              (supportsShadowBuilds
+                                               ? Qt4DefaultTargetSetupWidget::ENABLE
+                                               : Qt4DefaultTargetSetupWidget::DISABLE));
     return widget;
 }
 
diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp
index a79d6c1962f..5bdf18bcdc3 100644
--- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp
@@ -64,7 +64,7 @@ AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent, co
     , m_harmattanItem(0)
 {
     m_targetsPage = new TargetSetupPage;
-    m_targetsPage->setPreferMobile(true);
+    m_targetsPage->setPreferredFeatures(QSet<QString>() << Constants::MOBILE_TARGETFEATURE_ID);
     m_targetsPage->setMinimumQtVersion(minimumQtVersionNumber);
     resize(900, 450);
 
diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp
index 53330761c7e..fb1f00801c5 100644
--- a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp
@@ -105,7 +105,6 @@ Core::BaseFileWizardParameters MobileAppWizard::parameters()
 AbstractMobileAppWizardDialog *MobileAppWizard::createWizardDialogInternal(QWidget *parent) const
 {
     m_d->wizardDialog = new MobileAppWizardDialog(parent);
-    m_d->wizardDialog->targetsPage()->setPreferMobile(true);
     return m_d->wizardDialog;
 }
 
diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp
index 03f45d14b48..d9f65bc98f9 100644
--- a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp
@@ -244,7 +244,11 @@ int BaseQt4ProjectWizardDialog::addTargetSetupPage(QSet<QString> targets, bool m
     m_targets = targets;
     resize(900, 450);
 
-    m_targetSetupPage->setPreferMobile(mobile);
+    if (mobile) {
+        m_targetSetupPage->setPreferredFeatures(QSet<QString>() << Constants::MOBILE_TARGETFEATURE_ID);
+    } else {
+        m_targetSetupPage->setPreferredFeatures(QSet<QString>() << Constants::DESKTOP_TARGETFEATURE_ID);
+    }
 
     if (id >= 0)
         setPage(id, m_targetSetupPage);
diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp
index accac9f0442..8711555a168 100644
--- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp
+++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp
@@ -53,7 +53,6 @@ using namespace Qt4ProjectManager;
 
 TargetSetupPage::TargetSetupPage(QWidget *parent) :
     QWizardPage(parent),
-    m_preferMobile(false),
     m_importSearch(false),
     m_spacer(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding)),
     m_ui(new Internal::Ui::TargetSetupPage)
@@ -98,9 +97,9 @@ bool TargetSetupPage::isComplete() const
     return false;
 }
 
-void TargetSetupPage::setPreferMobile(bool mobile)
+void TargetSetupPage::setPreferredFeatures(const QSet<QString> &featureIds)
 {
-    m_preferMobile = mobile;
+    m_preferredFeatures = featureIds;
 }
 
 void TargetSetupPage::setMinimumQtVersion(const QtSupport::QtVersionNumber &number)
@@ -124,9 +123,15 @@ void TargetSetupPage::setupWidgets()
             Qt4TargetSetupWidget *widget =
                     factory->createTargetSetupWidget(id, m_proFilePath, m_minimumQtVersionNumber, m_importSearch, infos);
             if (widget) {
-                bool selectTarget = (m_preferMobile == factory->isMobileTarget(id) && m_importInfos.isEmpty())
-                        || !infos.isEmpty();
-                widget->setTargetSelected(selectTarget) ;
+                bool selectTarget = false;
+                if (!m_importInfos.isEmpty()) {
+                    selectTarget = !infos.isEmpty();
+                } else {
+                    if (!m_preferredFeatures.isEmpty()) {
+                        selectTarget = factory->targetFeatures(id).contains(m_preferredFeatures);
+                    }
+                }
+                widget->setTargetSelected(selectTarget);
                 atLeastOneTargetSelected |= selectTarget;
                 m_widgets.insert(id, widget);
                 m_factories.insert(widget, factory);
diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h
index 16823fbc711..a33177ce6e9 100644
--- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h
+++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h
@@ -72,10 +72,9 @@ public:
     /// Initializes the TargetSetupPage
     /// \note The import information is gathered in initializePage(), make sure that the right proFilePath is set before
     void initializePage();
-    /// Changes the default set of checked targets. For mobile Symbian, maemo5, simulator is checked
-    /// For non mobile, destkop is checked
+    /// Changes the default set of checked targets.
     /// call this before \sa initializePage()
-    void setPreferMobile(bool mobile);
+    void setPreferredFeatures(const QSet<QString> &featureIds);
     /// Sets the minimum qt version
     /// calls this before \sa initializePage()
     void setMinimumQtVersion(const QtSupport::QtVersionNumber &number);
@@ -96,7 +95,7 @@ private:
     void setupWidgets();
     void deleteWidgets();
 
-    bool m_preferMobile;
+    QSet<QString> m_preferredFeatures;
     bool m_importSearch;
     QtSupport::QtVersionNumber m_minimumQtVersionNumber;
     QString m_proFilePath;
diff --git a/src/plugins/remotelinux/qt4maemotargetfactory.cpp b/src/plugins/remotelinux/qt4maemotargetfactory.cpp
index 969ca8fd33c..b8661d1c992 100644
--- a/src/plugins/remotelinux/qt4maemotargetfactory.cpp
+++ b/src/plugins/remotelinux/qt4maemotargetfactory.cpp
@@ -158,20 +158,15 @@ QString Qt4MaemoTargetFactory::shadowBuildDirectory(const QString &profilePath,
 #endif
 }
 
-bool Qt4MaemoTargetFactory::isMobileTarget(const QString &id)
+QSet<QString> Qt4MaemoTargetFactory::targetFeatures(const QString & /*id*/) const
 {
-    Q_UNUSED(id)
-    return true;
-}
-
-bool Qt4MaemoTargetFactory::supportsShadowBuilds(const QString &id)
-{
-    Q_UNUSED(id);
-#ifdef Q_OS_WIN
-    return false;
-#else
-    return true;
+    QSet<QString> features;
+    features << Qt4ProjectManager::Constants::MOBILE_TARGETFEATURE_ID;
+#ifndef Q_OS_WIN
+    features << Qt4ProjectManager::Constants::SHADOWBUILD_TARGETFEATURE_ID;
 #endif
+
+    return features;
 }
 
 ProjectExplorer::Target *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
diff --git a/src/plugins/remotelinux/qt4maemotargetfactory.h b/src/plugins/remotelinux/qt4maemotargetfactory.h
index 05b49f152bf..592131d5039 100644
--- a/src/plugins/remotelinux/qt4maemotargetfactory.h
+++ b/src/plugins/remotelinux/qt4maemotargetfactory.h
@@ -62,8 +62,7 @@ public:
     ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const QString &id,
         const QList<Qt4ProjectManager::BuildConfigurationInfo> &infos);
 
-    bool isMobileTarget(const QString &id);
-    bool supportsShadowBuilds(const QString &id);
+    QSet<QString> targetFeatures(const QString &id) const;
 };
 
 } // namespace Internal
-- 
GitLab