From 7b6eb2c47e6eba094802d8a45dfbc2d170cd92b5 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Thu, 12 Mar 2009 13:50:43 +0100
Subject: [PATCH] Added a way to change the tool chain.

---
 .../genericprojectmanager/genericproject.cpp  | 35 ++++++++++++-------
 .../genericprojectmanager/genericproject.h    | 10 ++++--
 .../genericprojectnodes.cpp                   |  6 ----
 .../genericprojectnodes.h                     |  4 ---
 src/plugins/projectexplorer/toolchain.cpp     |  8 +++++
 src/plugins/projectexplorer/toolchain.h       |  1 +
 6 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index f6e33ee5cad..2c473b9ec6d 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -40,13 +40,14 @@
 
 #include <cpptools/cppmodelmanagerinterface.h>
 
-#include <QtDebug>
-#include <QDir>
-#include <QSettings>
+#include <QtCore/QtDebug>
+#include <QtCore/QDir>
+#include <QtCore/QSettings>
+#include <QtCore/QProcess>
 
-#include <QProcess>
-#include <QFormLayout>
-#include <QMainWindow>
+#include <QtGui/QFormLayout>
+#include <QtGui/QMainWindow>
+#include <QtGui/QComboBox>
 
 using namespace GenericProjectManager;
 using namespace GenericProjectManager::Internal;
@@ -81,8 +82,6 @@ void GenericProject::refresh()
 
     _rootNode->refresh();
 
-    setToolChain(_rootNode->toolChainId());
-
     CppTools::CppModelManagerInterface *modelManager =
         ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
 
@@ -123,6 +122,8 @@ void GenericProject::setToolChain(const QString &toolChainId)
 
     qDebug() << Q_FUNC_INFO;
 
+    _toolChainId = toolChainId;
+
     delete _toolChain;
     _toolChain = 0;
 
@@ -143,7 +144,6 @@ void GenericProject::setToolChain(const QString &toolChainId)
     } else if (toolChainId == QLatin1String("gcc") || toolChainId == QLatin1String("icc")) {
         const QLatin1String qmake_cxx("g++"); // ### FIXME
         _toolChain = ToolChain::createGccToolChain(qmake_cxx);
-
     }
 }
 
@@ -170,6 +170,9 @@ QString GenericProject::buildParser(const QString &buildConfiguration) const
     return QString();
 }
 
+QString GenericProject::toolChainId() const
+{ return _toolChainId; }
+
 QString GenericProject::name() const
 {
     qDebug() << Q_FUNC_INFO;
@@ -248,7 +251,7 @@ QList<ProjectExplorer::BuildStepConfigWidget*> GenericProject::subConfigWidgets(
      makeStep()->setBuildTarget(buildConfiguration, "all", true);
  }
 
-ProjectExplorer::ProjectNode *GenericProject::rootProjectNode() const
+GenericProjectNode *GenericProject::rootProjectNode() const
 {
     qDebug() << Q_FUNC_INFO;
 
@@ -306,8 +309,7 @@ void GenericProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsRead
     if (toolChainId.isEmpty())
         toolChainId = QLatin1String("gcc");
 
-    toolChainId = toolChainId.toLower(); // ### move
-    _rootNode->setToolChainId(toolChainId);
+    setToolChain(toolChainId.toLower()); // ### move
 
     const QStringList includePaths = reader.restoreValue(QLatin1String("includePaths")).toStringList();
     _rootNode->setIncludePaths(includePaths);
@@ -319,7 +321,7 @@ void GenericProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter
 
     Project::saveSettingsImpl(writer);
 
-    writer.saveValue("toolChain", _rootNode->toolChainId());
+    writer.saveValue("toolChain", _toolChainId);
     writer.saveValue("includePaths", _rootNode->includePaths());
 }
 
@@ -339,6 +341,13 @@ GenericBuildSettingsWidget::GenericBuildSettingsWidget(GenericProject *project)
     fl->addRow("Build directory:", _pathChooser);
 
     connect(_pathChooser, SIGNAL(changed()), this, SLOT(buildDirectoryChanged()));
+
+    QComboBox *toolChainChooser = new QComboBox;
+    toolChainChooser->addItems(ProjectExplorer::ToolChain::supportedToolChains());
+    toolChainChooser->setCurrentIndex(toolChainChooser->findText(_project->toolChainId()));
+    fl->addRow("Tool chain:", toolChainChooser);
+
+    connect(toolChainChooser, SIGNAL(activated(QString)), _project, SLOT(setToolChain(QString)));
 }
 
 GenericBuildSettingsWidget::~GenericBuildSettingsWidget()
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index 3a9bcb2bf82..1673a494f67 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -69,15 +69,18 @@ public:
     virtual QList<ProjectExplorer::BuildStepConfigWidget*> subConfigWidgets();
 
     virtual void newBuildConfiguration(const QString &buildConfiguration);
-    virtual ProjectExplorer::ProjectNode *rootProjectNode() const;
+    virtual GenericProjectNode *rootProjectNode() const;
     virtual QStringList files(FilesMode fileMode) const;
 
-    void setToolChain(const QString &toolChainId);
-
     QStringList targets() const;
     MakeStep *makeStep() const;
     QString buildParser(const QString &buildConfiguration) const;
 
+    QString toolChainId() const;
+
+public Q_SLOTS:
+    void setToolChain(const QString &toolChainId);
+
 private:
     void refresh();
 
@@ -93,6 +96,7 @@ private:
 
     GenericProjectNode* _rootNode;
     ProjectExplorer::ToolChain *_toolChain;
+    QString _toolChainId;
 };
 
 class GenericProjectFile : public Core::IFile
diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
index 59739982bad..fb1261fd4e5 100644
--- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
@@ -234,12 +234,6 @@ void GenericProjectNode::setIncludePaths(const QStringList &includePaths)
 QStringList GenericProjectNode::defines() const
 { return _defines; }
 
-QString GenericProjectNode::toolChainId() const
-{ return _toolChainId; }
-
-void GenericProjectNode::setToolChainId(const QString &toolChainId)
-{ _toolChainId = toolChainId; }
-
 bool GenericProjectNode::hasTargets() const
 {
     qDebug() << Q_FUNC_INFO;
diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.h b/src/plugins/genericprojectmanager/genericprojectnodes.h
index 891debda744..5298cb54389 100644
--- a/src/plugins/genericprojectmanager/genericprojectnodes.h
+++ b/src/plugins/genericprojectmanager/genericprojectnodes.h
@@ -69,9 +69,6 @@ public:
 
     void refresh();
 
-    QString toolChainId() const;
-    void setToolChainId(const QString &toolChainId);
-
     QStringList includePaths() const;
     void setIncludePaths(const QStringList &includePaths);
 
@@ -89,7 +86,6 @@ private:
     QStringList _generated;
     QStringList _includePaths;
     QStringList _defines;
-    QString _toolChainId;
 
     QHash<QString, FolderNode *> _folderByName;
 };
diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp
index 2d0fcc5dc25..0d3a2d850d9 100644
--- a/src/plugins/projectexplorer/toolchain.cpp
+++ b/src/plugins/projectexplorer/toolchain.cpp
@@ -59,6 +59,14 @@ QStringList ToolChain::availableMSVCVersions()
     return versions;
 }
 
+QStringList ToolChain::supportedToolChains()
+{
+    return QStringList() << QLatin1String("gcc")
+                         << QLatin1String("mingw")
+                         << QLatin1String("msvc")
+                         << QLatin1String("wince");
+}
+
 GccToolChain::GccToolChain(const QString &gcc)
     : m_gcc(gcc)
 {
diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h
index 0e7e16c5ffd..aeaa45fe7df 100644
--- a/src/plugins/projectexplorer/toolchain.h
+++ b/src/plugins/projectexplorer/toolchain.h
@@ -62,6 +62,7 @@ public:
     static ToolChain *createMSVCToolChain(const QString &name);
     static ToolChain *createWinCEToolChain(const QString &name, const QString &platform);
     static QStringList availableMSVCVersions();
+    static QStringList supportedToolChains();
 
 protected:
     virtual bool equals(ToolChain *other) const = 0;
-- 
GitLab