diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 98aeb73ace3b6debbf525add246a1e65aa63e5d8..2465347aba5f1921d7f2857a7a1bb93e14ec48f4 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -80,7 +80,6 @@ CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName) m_fileName(fileName), m_rootNode(new CMakeProjectNode(m_fileName)), m_insideFileChanged(false), - m_targetFactory(new CMakeTargetFactory(this)), m_lastEditor(0) { m_file = new CMakeFile(this, fileName); @@ -454,11 +453,6 @@ Core::IFile *CMakeProject::file() const return m_file; } -CMakeTargetFactory *CMakeProject::targetFactory() const -{ - return m_targetFactory; -} - CMakeManager *CMakeProject::projectManager() const { return m_manager; @@ -500,7 +494,10 @@ bool CMakeProject::fromMap(const QVariantMap &map) bool hasUserFile = activeTarget(); if (!hasUserFile) { - CMakeTarget *t = targetFactory()->create(this, QLatin1String(DEFAULT_CMAKE_TARGET_ID)); + CMakeTargetFactory *factory = + ExtensionSystem::PluginManager::instance()->getObject<CMakeTargetFactory>(); + CMakeTarget *t = factory->create(this, QLatin1String(DEFAULT_CMAKE_TARGET_ID)); + Q_ASSERT(t); Q_ASSERT(t->activeBuildConfiguration()); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 8e0007c00471cd166816a7420f298ed8f1e759fa..b3cefd8234032e7e88cca2da9296f1f8b421e5f9 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -78,7 +78,6 @@ public: QString displayName() const; QString id() const; Core::IFile *file() const; - CMakeTargetFactory *targetFactory() const; CMakeManager *projectManager() const; CMakeTarget *activeTarget() const; @@ -142,7 +141,6 @@ private: ProjectExplorer::FileWatcher *m_watcher; bool m_insideFileChanged; QSet<QString> m_watchedFiles; - CMakeTargetFactory *m_targetFactory; QFuture<void> m_codeModelFuture; QMap<QString, CMakeUiCodeModelSupport *> m_uiCodeModelSupport; diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp index acdbb0afe5d2fd3d6d66e678bffed63788c73aa2..588938f716b2b6c11663decf444c288f7d199fe0 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp @@ -33,6 +33,7 @@ #include "cmakeeditorfactory.h" #include "makestep.h" #include "cmakeprojectconstants.h" +#include "cmaketarget.h" #include <coreplugin/icore.h> #include <coreplugin/mimedatabase.h> @@ -67,6 +68,7 @@ bool CMakeProjectPlugin::initialize(const QStringList & /*arguments*/, QString * = new TextEditor::TextEditorActionHandler(CMakeProjectManager::Constants::C_CMAKEEDITOR); addAutoReleasedObject(new CMakeEditorFactory(manager, editorHandler)); + addAutoReleasedObject(new CMakeTargetFactory); return true; } diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 7c9a1db5993c1ae430dc638c9fb39917c31ac411..4a6aa82f56cf043ce4f72645242ea6ddb3268a6a 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -64,7 +64,6 @@ const char * const TOOLCHAIN_KEY("GenericProjectManager.GenericProject.Toolchain GenericProject::GenericProject(Manager *manager, const QString &fileName) : m_manager(manager), m_fileName(fileName), - m_targetFactory(new GenericTargetFactory(this)), m_toolChain(0) { QFileInfo fileInfo(m_fileName); @@ -90,11 +89,6 @@ GenericProject::~GenericProject() delete m_toolChain; } -GenericTargetFactory *GenericProject::targetFactory() const -{ - return m_targetFactory; -} - GenericTarget *GenericProject::activeTarget() const { return static_cast<GenericTarget *>(Project::activeTarget()); @@ -444,8 +438,11 @@ bool GenericProject::fromMap(const QVariantMap &map) } // Add default setup: - if (targets().isEmpty()) - addTarget(targetFactory()->create(this, QLatin1String(GENERIC_DESKTOP_TARGET_ID))); + if (targets().isEmpty()) { + GenericTargetFactory *factory = + ExtensionSystem::PluginManager::instance()->getObject<GenericTargetFactory>(); + addTarget(factory->create(this, QLatin1String(GENERIC_DESKTOP_TARGET_ID))); + } ToolChainType type = static_cast<ProjectExplorer::ToolChainType> diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index 7971d85998c263b8ff2de44c32bf35f528acf181..6e1eb7f81f02711ea02fdaecb51cb8ce78aada3b 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -57,7 +57,6 @@ namespace Internal { class GenericBuildConfiguration; class GenericProject; class GenericTarget; -class GenericTargetFactory; class GenericMakeStep; class GenericProjectFile; @@ -76,7 +75,6 @@ public: QString displayName() const; QString id() const; Core::IFile *file() const; - GenericTargetFactory *targetFactory() const; ProjectExplorer::IProjectManager *projectManager() const; GenericTarget *activeTarget() const; @@ -130,7 +128,6 @@ private: QString m_configFileName; GenericProjectFile *m_file; QString m_projectName; - GenericTargetFactory *m_targetFactory; QStringList m_rawFileList; QStringList m_files; diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.cpp b/src/plugins/genericprojectmanager/genericprojectplugin.cpp index faa627266a5356fb24e0ac936e25a44badb31b43..5184b7b83b84b1228137ed6f4d20022a0b10f1a4 100644 --- a/src/plugins/genericprojectmanager/genericprojectplugin.cpp +++ b/src/plugins/genericprojectmanager/genericprojectplugin.cpp @@ -33,6 +33,7 @@ #include "genericprojectconstants.h" #include "genericprojectfileseditor.h" #include "genericmakestep.h" +#include "generictarget.h" #include <coreplugin/icore.h> #include <coreplugin/mimedatabase.h> @@ -78,6 +79,7 @@ bool GenericProjectPlugin::initialize(const QStringList &, QString *errorMessage addAutoReleasedObject(manager); addAutoReleasedObject(new GenericMakeStepFactory); addAutoReleasedObject(new GenericProjectWizard); + addAutoReleasedObject(new GenericTargetFactory); return true; } diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 9b2f4f0e78bc5f9785681195f2b13185c869995e..2a515bb7b45551c6b1168045920a97e0d9e65fc2 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -276,7 +276,19 @@ bool Project::fromMap(const QVariantMap &map) qWarning() << key << "was not found in data."; return false; } - Target *t(targetFactory()->restore(this, map.value(key).toMap())); + QVariantMap targetMap = map.value(key).toMap(); + + QList<ITargetFactory *> factories = + ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>(); + + Target *t = 0; + foreach (ITargetFactory *factory, factories) { + if (factory->canRestore(this, targetMap)) { + t = factory->restore(this, targetMap); + break; + } + } + if (!t) { qWarning() << "Restoration of a target failed! (Continuing)"; continue; diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index b907a921bb70c5aebdc4212e4535d72cc507b4f1..97005649e42927dc3f4b98489d2e075b2d62450c 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -94,8 +94,6 @@ public: void setActiveTarget(Target *target); Target *target(const QString &id) const; - virtual ITargetFactory *targetFactory() const = 0; - void saveSettings(); bool restoreSettings(); diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 6de64ac273015ba8d58c9b68aee0724937f0d97e..f1d00aac9e2ba8555ad46b0e663319eae91d5ef6 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -200,7 +200,17 @@ void TargetSettingsPanelWidget::currentTargetChanged(int targetIndex, int subInd void TargetSettingsPanelWidget::addTarget(QAction *action) { QString id = action->data().toString(); - Target *target(m_project->targetFactory()->create(m_project, id)); + QList<ITargetFactory *> factories = + ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>(); + + Target *target = 0; + foreach (ITargetFactory *fac, factories) { + if (fac->canCreate(m_project, id)) { + target = fac->create(m_project, id); + break; + } + } + if (!target) return; m_project->addTarget(target); @@ -267,8 +277,20 @@ void TargetSettingsPanelWidget::updateTargetAddAndRemoveButtons() m_addMenu->clear(); + QList<ITargetFactory *> factories = + ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>(); + foreach (const QString &id, m_project->possibleTargetIds()) { - QString displayName = m_project->targetFactory()->displayNameForId(id); + QString displayName; + foreach (ITargetFactory *fac, factories) { + if (fac->supportsTargetId(id)) { + displayName = fac->displayNameForId(id); + break; + } + } + if (displayName.isEmpty()) + continue; + QAction *action = new QAction(displayName, m_addMenu); action->setData(QVariant(id)); bool added = false; diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 29c1c103697ae191708f253e40fa93b7e5409dbd..bb43ea94fd70690f7771bb18fc21cc44360636ed 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -32,6 +32,7 @@ #include "qmlprojectmanagerconstants.h" #include "fileformat/qmlprojectitem.h" #include "qmlprojectrunconfiguration.h" +#include "qmlprojecttarget.h" #include <coreplugin/icore.h> #include <coreplugin/messagemanager.h> @@ -51,8 +52,7 @@ QmlProject::QmlProject(Internal::Manager *manager, const QString &fileName) : m_manager(manager), m_fileName(fileName), m_modelManager(ExtensionSystem::PluginManager::instance()->getObject<QmlJS::ModelManagerInterface>()), - m_fileWatcher(new ProjectExplorer::FileWatcher(this)), - m_targetFactory(new Internal::QmlProjectTargetFactory(this)) + m_fileWatcher(new ProjectExplorer::FileWatcher(this)) { setSupportedTargetIds(QSet<QString>() << QLatin1String(Constants::QML_VIEWER_TARGET_ID)); QFileInfo fileInfo(m_fileName); @@ -238,11 +238,6 @@ QList<ProjectExplorer::BuildConfigWidget*> QmlProject::subConfigWidgets() return QList<ProjectExplorer::BuildConfigWidget*>(); } -Internal::QmlProjectTargetFactory *QmlProject::targetFactory() const -{ - return m_targetFactory; -} - Internal::QmlProjectTarget *QmlProject::activeTarget() const { return static_cast<Internal::QmlProjectTarget *>(Project::activeTarget()); @@ -264,7 +259,9 @@ bool QmlProject::fromMap(const QVariantMap &map) return false; if (targets().isEmpty()) { - Internal::QmlProjectTarget *target(targetFactory()->create(this, QLatin1String(Constants::QML_VIEWER_TARGET_ID))); + Internal::QmlProjectTargetFactory *factory + = ExtensionSystem::PluginManager::instance()->getObject<Internal::QmlProjectTargetFactory>(); + Internal::QmlProjectTarget *target = factory->create(this, QLatin1String(Constants::QML_VIEWER_TARGET_ID)); addTarget(target); } diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index b895982b2f20ef6da337fe49263b99f124a092b6..0f663eef18bb6b18d5858eaa18a2785e86f86b69 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -72,7 +72,6 @@ public: QString id() const; Core::IFile *file() const; Internal::Manager *projectManager() const; - Internal::QmlProjectTargetFactory *targetFactory() const; Internal::QmlProjectTarget *activeTarget() const; QList<ProjectExplorer::Project *> dependsOn(); @@ -127,8 +126,6 @@ private: ProjectExplorer::FileWatcher *m_fileWatcher; Internal::QmlProjectNode *m_rootNode; - Internal::QmlProjectTargetFactory *m_targetFactory; - }; } // namespace QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp b/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp index f79b7c433f6952e998b3849518946890f124df6f..000f92e0cff6b51519b5234da7d6068b1336548a 100644 --- a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp @@ -132,13 +132,13 @@ QmlProjectTarget *QmlProjectTargetFactory::create(ProjectExplorer::Project *pare if (!canCreate(parent, id)) return 0; QmlProject *qmlproject(static_cast<QmlProject *>(parent)); - QmlProjectTarget *t(new QmlProjectTarget(qmlproject)); + QmlProjectTarget *target = new QmlProjectTarget(qmlproject); // Add RunConfiguration (QML does not have BuildConfigurations) - QmlProjectRunConfiguration *runConf(new QmlProjectRunConfiguration(t)); - t->addRunConfiguration(runConf); + QmlProjectRunConfiguration *runConf = new QmlProjectRunConfiguration(target); + target->addRunConfiguration(runConf); - return t; + return target; } bool QmlProjectTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 6e43de33aff7a76ba1e68f20117d22a2b8103a7a..689340d7afa4af671858c8ff53ce356dbd9f53c0 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -249,7 +249,6 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) : m_manager(manager), m_rootProjectNode(0), m_nodesWatcher(new Internal::Qt4NodesWatcher(this)), - m_targetFactory(new Qt4TargetFactory(this)), m_fileInfo(new Qt4ProjectFile(this, fileName, this)), m_projectFiles(new Qt4ProjectFiles), m_proFileOption(0), @@ -355,11 +354,6 @@ bool Qt4Project::fromMap(const QVariantMap &map) return true; } -Qt4TargetFactory *Qt4Project::targetFactory() const -{ - return m_targetFactory; -} - Qt4Target *Qt4Project::activeTarget() const { return static_cast<Qt4Target *>(Project::activeTarget()); diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index 3807cf86d676b723bb5be3f7f42be940210e7adf..a98941738bd28438604cfd1ec9b76fb9b0a567ce 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -151,8 +151,6 @@ public: ProjectExplorer::IProjectManager *projectManager() const; Qt4Manager *qt4ProjectManager() const; - Internal::Qt4TargetFactory *targetFactory() const; - Qt4Target *activeTarget() const; QList<Core::IFile *> dependencies(); //NBS remove @@ -239,7 +237,6 @@ private: Qt4Manager *m_manager; Internal::Qt4ProFileNode *m_rootProjectNode; Internal::Qt4NodesWatcher *m_nodesWatcher; - Internal::Qt4TargetFactory *m_targetFactory; Qt4ProjectFile *m_fileInfo; diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index b8f35530b5a9a49fcc96659a8ec9ccdabffd5a6a..1a4fb98678697d115992c2f47ff1a01ddbdfb4cb 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -243,6 +243,10 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) Q_ASSERT(project->targets().isEmpty()); QtVersionManager *vm = QtVersionManager::instance(); + // TODO remove again + Qt4TargetFactory *factory = + ExtensionSystem::PluginManager::instance()->getObject<Qt4TargetFactory>(); + for (int i = 0; i < m_ui->versionTree->topLevelItemCount(); ++i) { QTreeWidgetItem *current = m_ui->versionTree->topLevelItem(i); QString targetId = current->data(NAME_COLUMN, Qt::UserRole).toString(); @@ -275,7 +279,7 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) // create the target: Qt4Target *target = 0; if (!targetInfos.isEmpty()) - target = project->targetFactory()->create(project, targetId, targetInfos); + target = factory->create(project, targetId, targetInfos); if (target) { project->addTarget(target); @@ -286,7 +290,7 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) // Create the default target if nothing else was set up: if (project->targets().isEmpty()) { - Qt4Target *target = project->targetFactory()->create(project, Constants::DESKTOP_TARGET_ID); + Qt4Target *target = factory->create(project, Constants::DESKTOP_TARGET_ID); if (target) project->addTarget(target); }