From a81b79fe9eabd3027cff5c20ae479ca005206455 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Thu, 28 May 2009 13:22:23 +0200
Subject: [PATCH] Add Qt versions detected from Symbian SDKs

---
 .../qt4projectmanager/qt-s60/s60manager.cpp   | 52 +++++++++++++++++++
 .../qt4projectmanager/qt-s60/s60manager.h     |  3 +-
 .../qt4projectmanager/qtversionmanager.cpp    | 14 ++++-
 .../qt4projectmanager/qtversionmanager.h      | 10 ++--
 4 files changed, 71 insertions(+), 8 deletions(-)

diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
index 7ecf320fa2b..ed0f9e40c56 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
@@ -31,11 +31,16 @@
 
 #include "s60devices.h"
 #include "s60devicespreferencepane.h"
+#include "qtversionmanager.h"
 
 #include <extensionsystem/pluginmanager.h>
 
 using namespace Qt4ProjectManager::Internal;
 
+namespace {
+static const char *S60_AUTODETECTION_SOURCE = "QTS60";
+}
+
 S60Manager::S60Manager(QObject *parent)
         : QObject(parent),
         m_devices(new S60Devices(this)),
@@ -44,6 +49,7 @@ S60Manager::S60Manager(QObject *parent)
     m_devices->detectQtForDevices();
     ExtensionSystem::PluginManager::instance()
             ->addObject(m_devicesPreferencePane);
+    updateQtVersions();
 }
 
 S60Manager::~S60Manager()
@@ -51,3 +57,49 @@ S60Manager::~S60Manager()
     ExtensionSystem::PluginManager::instance()
             ->removeObject(m_devicesPreferencePane);
 }
+
+void S60Manager::updateQtVersions()
+{
+    // This assumes that the QtVersionManager has already read
+    // the Qt versions from the settings
+    QtVersionManager *versionManager = QtVersionManager::instance();
+    QList<QtVersion *> versions = versionManager->versions();
+    QList<QtVersion *> handledVersions;
+    QList<QtVersion *> versionsToAdd;
+    foreach (const S60Devices::Device &device, m_devices->devices()) {
+        if (device.qt.isEmpty()) // no Qt version found for this sdk
+            continue;
+        QtVersion *deviceVersion = 0;
+        // look if we have a respective Qt version already
+        foreach (QtVersion *version, versions) {
+            if (version->isAutodetected()
+                    && version->autodetectionSource().startsWith(S60_AUTODETECTION_SOURCE)
+                    && version->autodetectionSource().mid(QString(S60_AUTODETECTION_SOURCE).length()+1) == device.id) {
+                deviceVersion = version;
+                break;
+            }
+        }
+        if (deviceVersion) {
+            deviceVersion->setName(QString("%1 (Qt %2)").arg(device.id, deviceVersion->qtVersionString()));
+            deviceVersion->setPath(device.qt);
+            handledVersions.append(deviceVersion);
+        } else {
+            deviceVersion = new QtVersion(QString("%1 (Qt %2)").arg(device.id), device.qt,
+                                          true, QString("%1.%2").arg(S60_AUTODETECTION_SOURCE, device.id));
+            deviceVersion->setName(deviceVersion->name().arg(deviceVersion->qtVersionString()));
+            versionsToAdd.append(deviceVersion);
+        }
+    }
+    // remove old autodetected versions
+    foreach (QtVersion *version, versions) {
+        if (version->isAutodetected()
+                && version->autodetectionSource().startsWith(S60_AUTODETECTION_SOURCE)
+                && !handledVersions.contains(version)) {
+            versionManager->removeVersion(version);
+        }
+    }
+    // add new versions
+    foreach (QtVersion *version, versionsToAdd) {
+        versionManager->addVersion(version);
+    }
+}
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.h b/src/plugins/qt4projectmanager/qt-s60/s60manager.h
index 265d57f034e..2b34c044659 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60manager.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.h
@@ -46,8 +46,7 @@ class S60Manager : public QObject
 public:
     S60Manager(QObject *parent = 0);
     ~S60Manager();
-
-    S60Devices *devices() const { return m_devices; }
+    void updateQtVersions();
 
 private:
     S60Devices *m_devices;
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 64310b1b82c..75199be531a 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -143,6 +143,14 @@ void QtVersionManager::addVersion(QtVersion *version)
     writeVersionsIntoSettings();
 }
 
+void QtVersionManager::removeVersion(QtVersion *version)
+{
+    m_versions.removeAll(version);
+    emit qtVersionsChanged();
+    writeVersionsIntoSettings();
+    delete version;
+}
+
 void QtVersionManager::updateDocumentation()
 {
     Help::HelpManager *helpManager
@@ -387,9 +395,11 @@ QtVersion::QtVersion(const QString &name, const QString &path, int id,
     setPath(path);
 }
 
-QtVersion::QtVersion(const QString &name, const QString &path)
+QtVersion::QtVersion(const QString &name, const QString &path,
+                     bool isAutodetected, const QString &autodetectionSource)
     : m_name(name),
-    m_isAutodetected(false),
+    m_isAutodetected(isAutodetected),
+    m_autodetectionSource(autodetectionSource),
     m_hasDebuggingHelper(false),
     m_mkspecUpToDate(false),
     m_versionInfoUpToDate(false),
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h
index debaf9b4eb5..b9a1b051eb8 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.h
+++ b/src/plugins/qt4projectmanager/qtversionmanager.h
@@ -46,10 +46,10 @@ class Qt4ProjectManagerPlugin;
 
 class QtVersion
 {
-    friend class Internal::QtOptionsPageWidget; //for changing name and path
     friend class QtVersionManager;
 public:
-    QtVersion(const QString &name, const QString &path);
+    QtVersion(const QString &name, const QString &path,
+              bool isAutodetected = false, const QString &autodetectionSource = QString());
     QtVersion(const QString &name, const QString &path, int id,
               bool isAutodetected = false, const QString &autodetectionSource = QString());
     QtVersion()
@@ -74,6 +74,9 @@ public:
     QString qmakeCXX() const;
     ProjectExplorer::ToolChain *toolChain() const;
 
+    void setName(const QString &name);
+    void setPath(const QString &path);
+
     QString qtVersionString() const;
     // Returns the PREFIX, BINPREFIX, DOCPREFIX and similar information
     QHash<QString,QString> versionInfo() const;
@@ -117,8 +120,6 @@ public:
 private:
     static int getUniqueId();
     // Also used by QtOptionsPageWidget
-    void setName(const QString &name);
-    void setPath(const QString &path);
     void updateSourcePath();
     void updateMkSpec() const;
     void updateVersionInfo() const;
@@ -180,6 +181,7 @@ public:
     QtVersion *qtVersionForDirectory(const QString &directory);
     // Used by the projectloadwizard
     void addVersion(QtVersion *version);
+    void removeVersion(QtVersion *version);
 
     // Static Methods
     static QtVersion::QmakeBuildConfig scanMakefileForQmakeConfig(const QString &directory, QtVersion::QmakeBuildConfig defaultBuildConfig);
-- 
GitLab