From 2816ccbd37ad3e8b91e580312fabbd50da928b1b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= <thorbjorn.lindeijer@nokia.com>
Date: Mon, 17 May 2010 16:18:34 +0200
Subject: [PATCH] Don't allow opening the same generic project multiple times

Quick fix by copying code also found in Qt4 and QML project managers.
Would be better to have some common solution...

Task-number: QTCREATORBUG-1383
---
 .../genericprojectmanager.cpp                 | 20 ++++++++++++++-----
 .../genericprojectmanager.h                   |  2 +-
 .../qt4projectmanager/qt4projectmanager.cpp   |  2 +-
 .../qt4projectmanager/qt4projectmanager.h     |  2 +-
 4 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.cpp b/src/plugins/genericprojectmanager/genericprojectmanager.cpp
index 0ad966a7306..5f5737bf65e 100644
--- a/src/plugins/genericprojectmanager/genericprojectmanager.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectmanager.cpp
@@ -32,8 +32,11 @@
 #include "genericproject.h"
 
 #include <coreplugin/icore.h>
+#include <coreplugin/messagemanager.h>
 #include <coreplugin/uniqueidmanager.h>
+#include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/session.h>
 
 #include <QtDebug>
 
@@ -60,14 +63,21 @@ QString Manager::mimeType() const
 
 ProjectExplorer::Project *Manager::openProject(const QString &fileName)
 {
-    QFileInfo fileInfo(fileName);
+    if (!QFileInfo(fileName).isFile())
+        return 0;
 
-    if (fileInfo.isFile()) {
-        GenericProject *project = new GenericProject(this, fileName);
-        return project;
+    ProjectExplorer::ProjectExplorerPlugin *projectExplorer = ProjectExplorer::ProjectExplorerPlugin::instance();
+    foreach (ProjectExplorer::Project *pi, projectExplorer->session()->projects()) {
+        if (fileName == pi->file()->fileName()) {
+            Core::MessageManager *messageManager = Core::ICore::instance()->messageManager();
+            messageManager->printToOutputPanePopup(tr("Failed opening project '%1': Project already open")
+                                                   .arg(QDir::toNativeSeparators(fileName)));
+            return 0;
+        }
     }
 
-    return 0;
+    GenericProject *project = new GenericProject(this, fileName);
+    return project;
 }
 
 void Manager::registerProject(GenericProject *project)
diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.h b/src/plugins/genericprojectmanager/genericprojectmanager.h
index 6e213afc77d..1b99f008d17 100644
--- a/src/plugins/genericprojectmanager/genericprojectmanager.h
+++ b/src/plugins/genericprojectmanager/genericprojectmanager.h
@@ -37,7 +37,7 @@ namespace Internal {
 
 class GenericProject;
 
-class Manager: public ProjectExplorer::IProjectManager
+class Manager : public ProjectExplorer::IProjectManager
 {
     Q_OBJECT
 
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
index 1ec86aa4eac..d3342b30e91 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
@@ -181,7 +181,7 @@ QString Qt4Manager::mimeType() const
     return QLatin1String(Qt4ProjectManager::Constants::PROFILE_MIMETYPE);
 }
 
-ProjectExplorer::Project* Qt4Manager::openProject(const QString &fileName)
+ProjectExplorer::Project *Qt4Manager::openProject(const QString &fileName)
 {
     Core::MessageManager *messageManager = Core::ICore::instance()->messageManager();
 
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.h b/src/plugins/qt4projectmanager/qt4projectmanager.h
index 199c4b98ee2..2235a17f536 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager.h
+++ b/src/plugins/qt4projectmanager/qt4projectmanager.h
@@ -79,7 +79,7 @@ public:
     int projectLanguage() const;
 
     virtual QString mimeType() const;
-    ProjectExplorer::Project* openProject(const QString &fileName);
+    ProjectExplorer::Project *openProject(const QString &fileName);
 
     // Context information used in the slot implementations
     ProjectExplorer::Node *contextNode() const;
-- 
GitLab