diff options
Diffstat (limited to 'src')
102 files changed, 4882 insertions, 1818 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index f22c968628..00317e97eb 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -31,6 +31,7 @@ #include "cmakeopenprojectwizard.h" #include "cmakeproject.h" +#include "cmaketarget.h" #include <projectexplorer/projectexplorerconstants.h> #include <utils/qtcassert.h> @@ -46,25 +47,17 @@ const char * const CMAKE_BC_ID("CMakeProjectManager.CMakeBuildConfiguration"); const char * const USER_ENVIRONMENT_CHANGES_KEY("CMakeProjectManager.CMakeBuildConfiguration.UserEnvironmentChanges"); const char * const MSVC_VERSION_KEY("CMakeProjectManager.CMakeBuildConfiguration.MsvcVersion"); const char * const BUILD_DIRECTORY_KEY("CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory"); +} // namespace -} - -CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *project) : - BuildConfiguration(project, QLatin1String(CMAKE_BC_ID)), - m_toolChain(0), - m_clearSystemEnvironment(false) -{ -} - -CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *project, const QString &id) : - BuildConfiguration(project, id), +CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent) : + BuildConfiguration(parent, QLatin1String(CMAKE_BC_ID)), m_toolChain(0), m_clearSystemEnvironment(false) { } -CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *pro, CMakeBuildConfiguration *source) : - BuildConfiguration(pro, source), +CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuildConfiguration *source) : + BuildConfiguration(parent, source), m_toolChain(0), m_clearSystemEnvironment(source->m_clearSystemEnvironment), m_userEnvironmentChanges(source->m_userEnvironmentChanges), @@ -97,9 +90,9 @@ CMakeBuildConfiguration::~CMakeBuildConfiguration() delete m_toolChain; } -CMakeProject *CMakeBuildConfiguration::cmakeProject() const +CMakeTarget *CMakeBuildConfiguration::cmakeTarget() const { - return static_cast<CMakeProject *>(project()); + return static_cast<CMakeTarget *>(target()); } ProjectExplorer::Environment CMakeBuildConfiguration::baseEnvironment() const @@ -155,7 +148,7 @@ QString CMakeBuildConfiguration::buildDirectory() const { QString buildDirectory = m_buildDirectory; if (buildDirectory.isEmpty()) - buildDirectory = cmakeProject()->sourceDirectory() + "/qtcreator-build"; + buildDirectory = cmakeTarget()->cmakeProject()->sourceDirectory() + "/qtcreator-build"; return buildDirectory; } @@ -230,9 +223,9 @@ CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory() { } -QStringList CMakeBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Project *parent) const +QStringList CMakeBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - if (!qobject_cast<CMakeProject *>(parent)) + if (!qobject_cast<CMakeTarget *>(parent)) return QStringList(); return QStringList() << QLatin1String(CMAKE_BC_ID); } @@ -244,22 +237,22 @@ QString CMakeBuildConfigurationFactory::displayNameForId(const QString &id) cons return QString(); } -bool CMakeBuildConfigurationFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +bool CMakeBuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const { - if (!qobject_cast<CMakeProject *>(parent)) + if (!qobject_cast<CMakeTarget *>(parent)) return false; if (id == QLatin1String(CMAKE_BC_ID)) return true; return false; } -ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Project *parent, const QString &id) +CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id) { if (!canCreate(parent, id)) return 0; - CMakeProject *cmProject = static_cast<CMakeProject *>(parent); - Q_ASSERT(cmProject); + CMakeTarget *cmtarget = static_cast<CMakeTarget *>(parent); + Q_ASSERT(cmtarget); //TODO configuration name should be part of the cmakeopenprojectwizard bool ok; @@ -271,7 +264,7 @@ ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(Proj &ok); if (!ok || buildConfigurationName.isEmpty()) return false; - CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmProject); + CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmtarget); bc->setDisplayName(buildConfigurationName); MakeStep *makeStep = new MakeStep(bc); @@ -282,53 +275,53 @@ ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(Proj cleanMakeStep->setAdditionalArguments(QStringList() << "clean"); cleanMakeStep->setClean(true); - CMakeOpenProjectWizard copw(cmProject->projectManager(), - cmProject->sourceDirectory(), + CMakeOpenProjectWizard copw(cmtarget->cmakeProject()->projectManager(), + cmtarget->cmakeProject()->sourceDirectory(), bc->buildDirectory(), bc->environment()); if (copw.exec() != QDialog::Accepted) { delete bc; return false; } - cmProject->addBuildConfiguration(bc); // this also makes the name unique + cmtarget->addBuildConfiguration(bc); // this also makes the name unique bc->setBuildDirectory(copw.buildDirectory()); bc->setMsvcVersion(copw.msvcVersion()); - cmProject->parseCMakeLists(); + cmtarget->cmakeProject()->parseCMakeLists(); // Default to all - if (cmProject->hasBuildTarget("all")) + if (cmtarget->cmakeProject()->hasBuildTarget("all")) makeStep->setBuildTarget("all", true); return bc; } -bool CMakeBuildConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const +bool CMakeBuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const { return canCreate(parent, source->id()); } -ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) +CMakeBuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) { if (!canClone(parent, source)) return 0; CMakeBuildConfiguration *old = static_cast<CMakeBuildConfiguration *>(source); - CMakeProject *cmProject(static_cast<CMakeProject *>(parent)); - return new CMakeBuildConfiguration(cmProject, old); + CMakeTarget *cmtarget(static_cast<CMakeTarget *>(parent)); + return new CMakeBuildConfiguration(cmtarget, old); } -bool CMakeBuildConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +bool CMakeBuildConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { QString id(ProjectExplorer::idFromMap(map)); return canCreate(parent, id); } -ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +CMakeBuildConfiguration *CMakeBuildConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - CMakeProject *cmProject(static_cast<CMakeProject *>(parent)); - CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmProject); + CMakeTarget *cmtarget(static_cast<CMakeTarget *>(parent)); + CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmtarget); if (bc->fromMap(map)) return bc; delete bc; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 7e4f5c4206..30747e712b 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -36,7 +36,7 @@ namespace CMakeProjectManager { namespace Internal { -class CMakeProject; +class CMakeTarget; class CMakeBuildConfigurationFactory; class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration @@ -45,10 +45,10 @@ class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class CMakeBuildConfigurationFactory; public: - CMakeBuildConfiguration(CMakeProject *pro); + CMakeBuildConfiguration(CMakeTarget *parent); ~CMakeBuildConfiguration(); - CMakeProject *cmakeProject() const; + CMakeTarget *cmakeTarget() const; ProjectExplorer::Environment environment() const; ProjectExplorer::Environment baseEnvironment() const; @@ -74,8 +74,7 @@ signals: void msvcVersionChanged(); protected: - CMakeBuildConfiguration(CMakeProject *pro, const QString &id); - CMakeBuildConfiguration(CMakeProject *pro, CMakeBuildConfiguration *source); + CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuildConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: @@ -95,15 +94,15 @@ public: CMakeBuildConfigurationFactory(QObject *parent = 0); ~CMakeBuildConfigurationFactory(); - QStringList availableCreationIds(ProjectExplorer::Project *project) const; + QStringList availableCreationIds(ProjectExplorer::Target *parent) const; QString displayNameForId(const QString &id) const; - bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Project *parent, const QString &id); - bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const; - ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map); + bool canCreate(ProjectExplorer::Target *parent, const QString &id) const; + CMakeBuildConfiguration *create(ProjectExplorer::Target *parent, const QString &id); + bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; + CMakeBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); + bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + CMakeBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); }; } // namespace Internal diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index d0faebe6d1..6bc709cabb 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -31,6 +31,7 @@ #include "cmakeprojectconstants.h" #include "cmakeprojectnodes.h" #include "cmakerunconfiguration.h" +#include "cmaketarget.h" #include "makestep.h" #include "cmakeopenprojectwizard.h" #include "cmakebuildenvironmentwidget.h" @@ -72,12 +73,14 @@ using ProjectExplorer::EnvironmentItem; CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName) : m_manager(manager), m_fileName(fileName), - m_buildConfigurationFactory(new CMakeBuildConfigurationFactory(this)), m_rootNode(new CMakeProjectNode(m_fileName)), m_insideFileChanged(false), - m_lastActiveBuildConfiguration(0) + m_targetFactory(new CMakeTargetFactory(this)) { m_file = new CMakeFile(this, fileName); + + connect(this, SIGNAL(addedTarget(ProjectExplorer::Target*)), + SLOT(targetAdded(ProjectExplorer::Target*))); } CMakeProject::~CMakeProject() @@ -85,29 +88,34 @@ CMakeProject::~CMakeProject() delete m_rootNode; } -CMakeBuildConfiguration *CMakeProject::activeCMakeBuildConfiguration() const +void CMakeProject::fileChanged(const QString &fileName) { - return static_cast<CMakeBuildConfiguration *>(activeBuildConfiguration()); -} + Q_UNUSED(fileName) + if (!activeTarget() || + !activeTarget()->activeBuildConfiguration()) + return; -IBuildConfigurationFactory *CMakeProject::buildConfigurationFactory() const -{ - return m_buildConfigurationFactory; + if (m_insideFileChanged) + return; + m_insideFileChanged = true; + changeActiveBuildConfiguration(activeTarget()->activeBuildConfiguration()); + m_insideFileChanged = false; } -void CMakeProject::slotActiveBuildConfiguration() +void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) { - if (m_lastActiveBuildConfiguration) - disconnect(m_lastActiveBuildConfiguration, SIGNAL(environmentChanged()), - this, SIGNAL(environmentChanged())); + CMakeTarget *target(qobject_cast<CMakeTarget *>(sender())); + if (!bc || !target || target != activeTarget()) + return; + + CMakeBuildConfiguration * cmakebc(qobject_cast<CMakeBuildConfiguration *>(bc)); + if (!cmakebc) + return; - CMakeBuildConfiguration *activeBC = activeCMakeBuildConfiguration(); - connect(activeBC, SIGNAL(environmentChanged()), - this, SIGNAL(environmentChanged())); // Pop up a dialog asking the user to rerun cmake QFileInfo sourceFileInfo(m_fileName); - QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory())); + QString cbpFile = CMakeManager::findCbpFile(QDir(bc->buildDirectory())); QFileInfo cbpFileFi(cbpFile); CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing; if (!cbpFileFi.exists()) { @@ -124,25 +132,23 @@ void CMakeProject::slotActiveBuildConfiguration() if (mode != CMakeOpenProjectWizard::Nothing) { CMakeOpenProjectWizard copw(m_manager, sourceFileInfo.absolutePath(), - activeBC->buildDirectory(), + cmakebc->buildDirectory(), mode, - activeBC->environment()); + cmakebc->environment()); copw.exec(); - activeBC->setMsvcVersion(copw.msvcVersion()); + cmakebc->setMsvcVersion(copw.msvcVersion()); } // reparse parseCMakeLists(); - emit environmentChanged(); } -void CMakeProject::fileChanged(const QString &fileName) +void CMakeProject::targetAdded(ProjectExplorer::Target *t) { - Q_UNUSED(fileName) - if (m_insideFileChanged) + if (!t) return; - m_insideFileChanged = true; - slotActiveBuildConfiguration(); - m_insideFileChanged = false; + + connect(t, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), + SLOT(changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration*))); } void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QString &newBuildDirectory) @@ -158,8 +164,12 @@ QString CMakeProject::sourceDirectory() const bool CMakeProject::parseCMakeLists() { + if (!activeTarget() || + !activeTarget()->activeBuildConfiguration()) + return false; + // Find cbp file - CMakeBuildConfiguration *activeBC = activeCMakeBuildConfiguration(); + CMakeBuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration(); QString cbpFile = CMakeManager::findCbpFile(activeBC->buildDirectory()); // setFolderName @@ -181,7 +191,6 @@ bool CMakeProject::parseCMakeLists() m_rootNode->setFolderName(cbpparser.projectName()); //qDebug()<<"Building Tree"; - QList<ProjectExplorer::FileNode *> fileList = cbpparser.fileList(); QSet<QString> projectFiles; if (cbpparser.hasCMakeFiles()) { @@ -253,59 +262,15 @@ bool CMakeProject::parseCMakeLists() } } - // Create run configurations for m_targets - //qDebug()<<"Create run configurations of m_targets"; - QMultiMap<QString, CMakeRunConfiguration* > existingRunConfigurations; - foreach(ProjectExplorer::RunConfiguration* cmakeRunConfiguration, runConfigurations()) { - if (CMakeRunConfiguration* rc = qobject_cast<CMakeRunConfiguration *>(cmakeRunConfiguration)) { - existingRunConfigurations.insert(rc->title(), rc); - } - } - - bool setActive = existingRunConfigurations.isEmpty(); - foreach(const CMakeBuildTarget &ct, m_buildTargets) { - if (ct.executable.isEmpty()) - continue; - if (ct.title.endsWith(QLatin1String("/fast"))) - continue; - QList<CMakeRunConfiguration *> list = existingRunConfigurations.values(ct.title); - if (!list.isEmpty()) { - // Already exists, so override the settings... - foreach (CMakeRunConfiguration *rc, list) { - //qDebug()<<"Updating Run Configuration with title"<<ct.title; - //qDebug()<<" Executable new:"<<ct.executable<< "old:"<<rc->executable(); - //qDebug()<<" WD new:"<<ct.workingDirectory<<"old:"<<rc->workingDirectory(); - rc->setExecutable(ct.executable); - rc->setWorkingDirectory(ct.workingDirectory); - } - existingRunConfigurations.remove(ct.title); - } else { - // Does not exist yet - //qDebug()<<"Adding new run configuration with title"<<ct.title; - //qDebug()<<" Executable:"<<ct.executable<<"WD:"<<ct.workingDirectory; - ProjectExplorer::RunConfiguration *rc(new CMakeRunConfiguration(this, ct.executable, ct.workingDirectory, ct.title)); - addRunConfiguration(rc); - // The first one gets the honour of being the active one - if (setActive) { - setActiveRunConfiguration(rc); - setActive = false; - } - } - } - QMultiMap<QString, CMakeRunConfiguration *>::const_iterator it = - existingRunConfigurations.constBegin(); - for( ; it != existingRunConfigurations.constEnd(); ++it) { - CMakeRunConfiguration *rc = it.value(); - //qDebug()<<"Removing old RunConfiguration with title:"<<rc->title(); - //qDebug()<<" Executable:"<<rc->executable()<<rc->workingDirectory(); - removeRunConfiguration(rc); - } - //qDebug()<<"\n"; - emit buildTargetsChanged(); return true; } +QList<CMakeBuildTarget> CMakeProject::buildTargets() const +{ + return m_buildTargets; +} + QStringList CMakeProject::buildTargetTitles() const { QStringList results; @@ -452,11 +417,21 @@ Core::IFile *CMakeProject::file() const return m_file; } +CMakeTargetFactory *CMakeProject::targetFactory() const +{ + return m_targetFactory; +} + CMakeManager *CMakeProject::projectManager() const { return m_manager; } +CMakeTarget *CMakeProject::activeTarget() const +{ + return static_cast<CMakeTarget *>(Project::activeTarget()); +} + QList<ProjectExplorer::Project *> CMakeProject::dependsOn() { return QList<Project *>(); @@ -496,9 +471,15 @@ bool CMakeProject::fromMap(const QVariantMap &map) if (!Project::fromMap(map)) return false; - bool hasUserFile = !buildConfigurations().isEmpty(); - MakeStep *makeStep = 0; + bool hasUserFile = activeTarget() && + activeTarget()->activeBuildConfiguration(); if (!hasUserFile) { + CMakeTarget *t(0); + if (!activeTarget()) + t = new CMakeTarget(this); + else + t = activeTarget(); + // Ask the user for where he wants to build it // and the cmake command line @@ -506,29 +487,18 @@ bool CMakeProject::fromMap(const QVariantMap &map) if (copw.exec() != QDialog::Accepted) return false; - CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(this); - bc->setDisplayName("all"); + CMakeBuildConfiguration *bc = + static_cast<CMakeBuildConfiguration *>(t->buildConfigurations().at(0)); bc->setMsvcVersion(copw.msvcVersion()); if (!copw.buildDirectory().isEmpty()) bc->setBuildDirectory(copw.buildDirectory()); - // Now create a standard build configuration - makeStep = new MakeStep(bc); - bc->insertBuildStep(0, makeStep); - - //TODO save arguments somewhere copw.arguments() - MakeStep *cleanMakeStep = new MakeStep(bc); - bc->insertCleanStep(0, cleanMakeStep); - cleanMakeStep->setAdditionalArguments(QStringList() << "clean"); - cleanMakeStep->setClean(true); - - addBuildConfiguration(bc); - setActiveBuildConfiguration(bc); + addTarget(t); } else { // We have a user file, but we could still be missing the cbp file // or simply run createXml with the saved settings QFileInfo sourceFileInfo(m_fileName); - CMakeBuildConfiguration *activeBC = activeCMakeBuildConfiguration(); + CMakeBuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration(); QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory())); QFileInfo cbpFileFi(cbpFile); @@ -552,20 +522,22 @@ bool CMakeProject::fromMap(const QVariantMap &map) m_watcher = new ProjectExplorer::FileWatcher(this); connect(m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChanged(QString))); - bool result = parseCMakeLists(); // Gets the directory from the active buildconfiguration - if (!result) + + if (!parseCMakeLists()) // Gets the directory from the active buildconfiguration return false; - if (!hasUserFile && hasBuildTarget("all")) + if (!hasUserFile && hasBuildTarget("all")) { + MakeStep *makeStep(qobject_cast<MakeStep *>(activeTarget()->activeBuildConfiguration()->buildSteps().at(0))); + Q_ASSERT(makeStep); makeStep->setBuildTarget("all", true); + } - m_lastActiveBuildConfiguration = activeCMakeBuildConfiguration(); - if (m_lastActiveBuildConfiguration) - connect(m_lastActiveBuildConfiguration, SIGNAL(environmentChanged()), - this, SIGNAL(environmentChanged())); - - connect(this, SIGNAL(activeBuildConfigurationChanged()), - this, SLOT(slotActiveBuildConfiguration())); + foreach (Target *t, targets()) { + connect(t, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), + this, SLOT(changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration*))); + connect(t, SIGNAL(environmentChanged()), + this, SLOT(changeEnvironment())); + } return true; } diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 89da96c3a9..b80b8f98c5 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -33,6 +33,7 @@ #include "cmakeprojectmanager.h" #include "cmakeprojectnodes.h" #include "cmakebuildconfiguration.h" +#include "cmaketarget.h" #include "makestep.h" #include <projectexplorer/project.h> @@ -72,14 +73,14 @@ public: CMakeProject(CMakeManager *manager, const QString &filename); ~CMakeProject(); - CMakeBuildConfiguration *activeCMakeBuildConfiguration() const; - QString displayName() const; QString id() const; Core::IFile *file() const; - ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; + CMakeTargetFactory *targetFactory() const; CMakeManager *projectManager() const; + CMakeTarget *activeTarget() const; + QList<ProjectExplorer::Project *> dependsOn(); //NBS TODO implement dependsOn bool isApplication() const; @@ -98,10 +99,9 @@ public: QString sourceDirectory() const; + bool parseCMakeLists(); + signals: - /// convenience signal emitted if the activeBuildConfiguration emits environmentChanged - /// or if the activeBuildConfiguration changes - void environmentChanged(); /// emitted after parsing void buildTargetsChanged(); @@ -113,11 +113,10 @@ protected: private slots: void fileChanged(const QString &fileName); - void slotActiveBuildConfiguration(); + void changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration*); + void targetAdded(ProjectExplorer::Target *); private: - bool parseCMakeLists(); - void buildTree(CMakeProjectNode *rootNode, QList<ProjectExplorer::FileNode *> list); void gatherFileNodes(ProjectExplorer::FolderNode *parent, QList<ProjectExplorer::FileNode *> &list); ProjectExplorer::FolderNode *findOrCreateFolder(CMakeProjectNode *rootNode, QString directory); @@ -126,7 +125,6 @@ private: QString m_fileName; CMakeFile *m_file; QString m_projectName; - CMakeBuildConfigurationFactory *m_buildConfigurationFactory; // TODO probably need a CMake specific node structure CMakeProjectNode *m_rootNode; @@ -135,9 +133,7 @@ private: ProjectExplorer::FileWatcher *m_watcher; bool m_insideFileChanged; QSet<QString> m_watchedFiles; - CMakeBuildConfiguration *m_lastActiveBuildConfiguration; - - friend class CMakeBuildConfigurationFactory; // for parseCMakeLists + CMakeTargetFactory *m_targetFactory; }; class CMakeCbpParser : public QXmlStreamReader diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro index 755e3f99f5..dc1623c567 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro @@ -7,6 +7,7 @@ HEADERS = cmakeproject.h \ cmakeprojectmanager.h \ cmakeprojectconstants.h \ cmakeprojectnodes.h \ + cmaketarget.h \ makestep.h \ cmakerunconfiguration.h \ cmakeopenprojectwizard.h \ @@ -16,6 +17,7 @@ SOURCES = cmakeproject.cpp \ cmakeprojectplugin.cpp \ cmakeprojectmanager.cpp \ cmakeprojectnodes.cpp \ + cmaketarget.cpp \ makestep.cpp \ cmakerunconfiguration.cpp \ cmakeopenprojectwizard.cpp \ diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index f3f2adeda8..c83129454d 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -29,9 +29,10 @@ #include "cmakerunconfiguration.h" -#include "cmakeproject.h" #include "cmakebuildconfiguration.h" +#include "cmakeproject.h" #include "cmakeprojectconstants.h" +#include "cmaketarget.h" #include <projectexplorer/environment.h> #include <projectexplorer/debugginghelper.h> @@ -73,8 +74,8 @@ QString idFromBuildTarget(const QString &target) } // namespace -CMakeRunConfiguration::CMakeRunConfiguration(CMakeProject *pro, const QString &target, const QString &workingDirectory, const QString &title) : - ProjectExplorer::LocalApplicationRunConfiguration(pro, QString::fromLatin1(CMAKE_RC_PREFIX)), +CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, const QString &target, const QString &workingDirectory, const QString &title) : + ProjectExplorer::LocalApplicationRunConfiguration(parent, QString::fromLatin1(CMAKE_RC_PREFIX)), m_runMode(Gui), m_buildTarget(target), m_workingDirectory(workingDirectory), @@ -84,8 +85,8 @@ CMakeRunConfiguration::CMakeRunConfiguration(CMakeProject *pro, const QString &t ctor(); } -CMakeRunConfiguration::CMakeRunConfiguration(CMakeProject *pro, CMakeRunConfiguration *source) : - ProjectExplorer::LocalApplicationRunConfiguration(pro, source), +CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfiguration *source) : + ProjectExplorer::LocalApplicationRunConfiguration(parent, source), m_runMode(source->m_runMode), m_buildTarget(source->m_buildTarget), m_workingDirectory(source->m_workingDirectory), @@ -105,14 +106,16 @@ CMakeRunConfiguration::~CMakeRunConfiguration() void CMakeRunConfiguration::ctor() { setDisplayName(m_title); +} - connect(project(), SIGNAL(environmentChanged()), - this, SIGNAL(baseEnvironmentChanged())); +CMakeTarget *CMakeRunConfiguration::cmakeTarget() const +{ + return static_cast<CMakeTarget *>(target()); } -CMakeProject *CMakeRunConfiguration::cmakeProject() const +CMakeBuildConfiguration *CMakeRunConfiguration::activeBuildConfiguration() const { - return static_cast<CMakeProject *>(project()); + return cmakeTarget()->activeBuildConfiguration(); } QString CMakeRunConfiguration::executable() const @@ -232,7 +235,7 @@ ProjectExplorer::Environment CMakeRunConfiguration::baseEnvironment() const } else if (m_baseEnvironmentBase == CMakeRunConfiguration::SystemEnvironmentBase) { env = ProjectExplorer::Environment::systemEnvironment(); } else if (m_baseEnvironmentBase == CMakeRunConfiguration::BuildEnvironmentBase) { - env = project()->activeBuildConfiguration()->environment(); + env = activeBuildConfiguration()->environment(); } return env; } @@ -284,7 +287,9 @@ void CMakeRunConfiguration::setUserEnvironmentChanges(const QList<ProjectExplore ProjectExplorer::ToolChain::ToolChainType CMakeRunConfiguration::toolChainType() const { - CMakeBuildConfiguration *bc = cmakeProject()->activeCMakeBuildConfiguration(); + CMakeBuildConfiguration *bc = activeBuildConfiguration(); + if (!bc) + return ProjectExplorer::ToolChain::UNKNOWN; return bc->toolChainType(); } @@ -447,13 +452,13 @@ CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory() } // used to show the list of possible additons to a project, returns a list of ids -QStringList CMakeRunConfigurationFactory::availableCreationIds(ProjectExplorer::Project *parent) const +QStringList CMakeRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - CMakeProject *project(qobject_cast<CMakeProject *>(parent)); - if (!project) + CMakeTarget *t(qobject_cast<CMakeTarget *>(parent)); + if (!t) return QStringList(); QStringList allIds; - foreach (const QString &buildTarget, project->buildTargetTitles()) + foreach (const QString &buildTarget, t->cmakeProject()->buildTargetTitles()) allIds << idFromBuildTarget(buildTarget); return allIds; } @@ -464,55 +469,55 @@ QString CMakeRunConfigurationFactory::displayNameForId(const QString &id) const return buildTargetFromId(id); } -bool CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +bool CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const { - CMakeProject *project(qobject_cast<CMakeProject *>(parent)); - if (!project) + CMakeTarget *t(qobject_cast<CMakeTarget *>(parent)); + if (!t) return false; - return project->hasBuildTarget(buildTargetFromId(id)); + return t->cmakeProject()->hasBuildTarget(buildTargetFromId(id)); } -ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectExplorer::Project *parent, const QString &id) +ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id) { if (!canCreate(parent, id)) return 0; - CMakeProject *project(static_cast<CMakeProject *>(parent)); + CMakeTarget *t(static_cast<CMakeTarget *>(parent)); const QString title(buildTargetFromId(id)); - const CMakeBuildTarget &ct = project->buildTargetForTitle(title); - return new CMakeRunConfiguration(project, ct.executable, ct.workingDirectory, ct.title); + const CMakeBuildTarget &ct = t->cmakeProject()->buildTargetForTitle(title); + return new CMakeRunConfiguration(t, ct.executable, ct.workingDirectory, ct.title); } -bool CMakeRunConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) const +bool CMakeRunConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const { - if (!qobject_cast<CMakeProject *>(parent)) + if (!qobject_cast<CMakeTarget *>(parent)) return false; return source->id() == QLatin1String(CMAKE_RC_ID); } -ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::clone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration * source) +ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration * source) { if (!canClone(parent, source)) return 0; - CMakeProject *project(static_cast<CMakeProject *>(parent)); + CMakeTarget *t(static_cast<CMakeTarget *>(parent)); CMakeRunConfiguration *crc(static_cast<CMakeRunConfiguration *>(source)); - return new CMakeRunConfiguration(project, crc); + return new CMakeRunConfiguration(t, crc); } -bool CMakeRunConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +bool CMakeRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { - if (!qobject_cast<CMakeProject *>(parent)) + if (!qobject_cast<CMakeTarget *>(parent)) return false; QString id(ProjectExplorer::idFromMap(map)); return id.startsWith(QLatin1String(CMAKE_RC_ID)); } -ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - CMakeProject *project(static_cast<CMakeProject *>(parent)); - CMakeRunConfiguration *rc(new CMakeRunConfiguration(project, QString(), QString(), QString())); + CMakeTarget *t(static_cast<CMakeTarget *>(parent)); + CMakeRunConfiguration *rc(new CMakeRunConfiguration(t, QString(), QString(), QString())); if (rc->fromMap(map)) return rc; delete rc; diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index 1e5ea8c5f4..018b65bbc3 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -44,7 +44,8 @@ QT_END_NAMESPACE namespace CMakeProjectManager { namespace Internal { -class CMakeProject; +class CMakeBuildConfiguration; +class CMakeTarget; class CMakeRunConfiguration : public ProjectExplorer::LocalApplicationRunConfiguration { @@ -53,11 +54,12 @@ class CMakeRunConfiguration : public ProjectExplorer::LocalApplicationRunConfigu friend class CMakeRunConfigurationFactory; public: - CMakeRunConfiguration(CMakeProject *project, const QString &target, + CMakeRunConfiguration(CMakeTarget *parent, const QString &target, const QString &workingDirectory, const QString &title); ~CMakeRunConfiguration(); - CMakeProject *cmakeProject() const; + CMakeTarget *cmakeTarget() const; + CMakeBuildConfiguration *activeBuildConfiguration() const; QString executable() const; RunMode runMode() const; @@ -88,7 +90,7 @@ private slots: void setArguments(const QString &newText); protected: - CMakeRunConfiguration(CMakeProject *project, CMakeRunConfiguration *source); + CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: @@ -150,17 +152,15 @@ class CMakeRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFa public: explicit CMakeRunConfigurationFactory(QObject *parent = 0); ~CMakeRunConfigurationFactory(); - // used to recreate the runConfigurations when restoring settings - bool canCreate(ProjectExplorer::Project *project, const QString &id) const; - ProjectExplorer::RunConfiguration *create(ProjectExplorer::Project *project, const QString &id); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *product) const; - ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *product); - - // used to show the list of possible additons to a project, returns a list of types - QStringList availableCreationIds(ProjectExplorer::Project *pro) const; - // used to translate the types to names to display to the user + + bool canCreate(ProjectExplorer::Target *parent, const QString &id) const; + ProjectExplorer::RunConfiguration *create(ProjectExplorer::Target *parent, const QString &id); + bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *product) const; + ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *product); + + QStringList availableCreationIds(ProjectExplorer::Target *parent) const; QString displayNameForId(const QString &id) const; }; diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.cpp b/src/plugins/cmakeprojectmanager/cmaketarget.cpp new file mode 100644 index 0000000000..955b152cd3 --- /dev/null +++ b/src/plugins/cmakeprojectmanager/cmaketarget.cpp @@ -0,0 +1,204 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "cmaketarget.h" + +#include "cmakeopenprojectwizard.h" +#include "cmakeproject.h" +#include "cmakerunconfiguration.h" + +#include <QtGui/QApplication> +#include <QtGui/QStyle> + +using namespace CMakeProjectManager; +using namespace CMakeProjectManager::Internal; + +namespace { + +QString displayNameForId(const QString &id) { + if (id == QLatin1String(DEFAULT_CMAKE_TARGET_ID)) + return QApplication::translate("CMakeProjectManager::Internal::CMakeTarget", "Desktop", "CMake Default target display name"); + return QString(); +} + +} // namespace + +// ------------------------------------------------------------------------- +// CMakeTarget +// ------------------------------------------------------------------------- + +CMakeTarget::CMakeTarget(CMakeProject *parent) : + ProjectExplorer::Target(parent, QLatin1String(DEFAULT_CMAKE_TARGET_ID)), + m_buildConfigurationFactory(new CMakeBuildConfigurationFactory(this)) +{ + setDisplayName(displayNameForId(id())); + setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); + connect(parent, SIGNAL(buildTargetsChanged()), SLOT(updateRunConfigurations())); +} + +CMakeTarget::~CMakeTarget() +{ +} + +CMakeProject *CMakeTarget::cmakeProject() const +{ + return static_cast<CMakeProject *>(project()); +} + +CMakeBuildConfiguration *CMakeTarget::activeBuildConfiguration() const +{ + return static_cast<CMakeBuildConfiguration *>(Target::activeBuildConfiguration()); +} + +CMakeBuildConfigurationFactory *CMakeTarget::buildConfigurationFactory() const +{ + return m_buildConfigurationFactory; +} + +bool CMakeTarget::fromMap(const QVariantMap &map) +{ + if (!Target::fromMap(map)) + return false; + + if (displayName().isEmpty()) + setDisplayName(displayNameForId(id())); + if (icon().isNull()) + setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); + + return true; +} + +void CMakeTarget::updateRunConfigurations() +{ + // *Update* runconfigurations: + QMultiMap<QString, CMakeRunConfiguration*> existingRunConfigurations; + foreach(ProjectExplorer::RunConfiguration* cmakeRunConfiguration, runConfigurations()) { + if (CMakeRunConfiguration* rc = qobject_cast<CMakeRunConfiguration *>(cmakeRunConfiguration)) + existingRunConfigurations.insert(rc->title(), rc); + } + + foreach(const CMakeBuildTarget &ct, cmakeProject()->buildTargets()) { + if (ct.executable.isEmpty()) + continue; + if (ct.title.endsWith("/fast")) + continue; + QList<CMakeRunConfiguration *> list = existingRunConfigurations.values(ct.title); + if (!list.isEmpty()) { + // Already exists, so override the settings... + foreach (CMakeRunConfiguration *rc, list) { + rc->setExecutable(ct.executable); + rc->setWorkingDirectory(ct.workingDirectory); + } + existingRunConfigurations.remove(ct.title); + } else { + // Does not exist yet + addRunConfiguration(new CMakeRunConfiguration(this, ct.executable, ct.workingDirectory, ct.title)); + } + } + QMultiMap<QString, CMakeRunConfiguration *>::const_iterator it = + existingRunConfigurations.constBegin(); + for( ; it != existingRunConfigurations.constEnd(); ++it) { + CMakeRunConfiguration *rc = it.value(); + removeRunConfiguration(rc); + } +} + +// ------------------------------------------------------------------------- +// CMakeTargetFactory +// ------------------------------------------------------------------------- + +CMakeTargetFactory::CMakeTargetFactory(QObject *parent) : + ITargetFactory(parent) +{ +} + +CMakeTargetFactory::~CMakeTargetFactory() +{ +} + +QStringList CMakeTargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const +{ + if (!qobject_cast<CMakeProject *>(parent)) + return QStringList(); + return QStringList() << QLatin1String(DEFAULT_CMAKE_TARGET_ID); +} +QString CMakeTargetFactory::displayNameForId(const QString &id) const +{ + return ::displayNameForId(id); +} + +bool CMakeTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +{ + if (!qobject_cast<CMakeProject *>(parent)) + return false; + return id == QLatin1String(DEFAULT_CMAKE_TARGET_ID); +} + +CMakeTarget *CMakeTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) +{ + if (!canCreate(parent, id)) + return 0; + CMakeProject *cmakeparent(static_cast<CMakeProject *>(parent)); + CMakeTarget *t(new CMakeTarget(cmakeparent)); + + // Add default build configuration: + CMakeBuildConfiguration *bc(new CMakeBuildConfiguration(t)); + bc->setDisplayName("all"); + + // Now create a standard build configuration + bc->insertBuildStep(0, new MakeStep(bc)); + + MakeStep *cleanMakeStep = new MakeStep(bc); + bc->insertCleanStep(0, cleanMakeStep); + cleanMakeStep->setAdditionalArguments(QStringList() << "clean"); + cleanMakeStep->setClean(true); + + t->addBuildConfiguration(bc); + + t->updateRunConfigurations(); + + return t; +} + +bool CMakeTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +{ + return canCreate(parent, ProjectExplorer::idFromMap(map)); +} + +CMakeTarget *CMakeTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +{ + if (!canRestore(parent, map)) + return 0; + CMakeProject *cmakeparent(static_cast<CMakeProject *>(parent)); + CMakeTarget *t(new CMakeTarget(cmakeparent)); + if (t->fromMap(map)) + return t; + delete t; + return 0; +} diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.h b/src/plugins/cmakeprojectmanager/cmaketarget.h new file mode 100644 index 0000000000..f10bf44e05 --- /dev/null +++ b/src/plugins/cmakeprojectmanager/cmaketarget.h @@ -0,0 +1,93 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef CMAKETARGET_H +#define CMAKETARGET_H + +#include "cmakebuildconfiguration.h" + +#include <projectexplorer/target.h> + +namespace CMakeProjectManager { + +namespace Internal { + +const char * const DEFAULT_CMAKE_TARGET_ID("CMakeProjectManager.DefaultCMakeTarget"); + +class CMakeBuildConfiguration; +class CMakeBuildConfigurationFactory; +class CMakeProject; +class CMakeTargetFactory; + +class CMakeTarget : public ProjectExplorer::Target +{ + Q_OBJECT + friend class CMakeTargetFactory; + +public: + CMakeTarget(CMakeProject *parent); + ~CMakeTarget(); + + CMakeProject *cmakeProject() const; + CMakeBuildConfiguration *activeBuildConfiguration() const; + + CMakeBuildConfigurationFactory *buildConfigurationFactory() const; + +protected: + bool fromMap(const QVariantMap &map); + +private slots: + void updateRunConfigurations(); + +private: + CMakeBuildConfigurationFactory *m_buildConfigurationFactory; +}; + +class CMakeTargetFactory : public ProjectExplorer::ITargetFactory +{ + Q_OBJECT + +public: + CMakeTargetFactory(QObject *parent = 0); + ~CMakeTargetFactory(); + + QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QString displayNameForId(const QString &id) const; + + bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; + CMakeTarget *create(ProjectExplorer::Project *parent, const QString &id); + bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; + CMakeTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); +}; + +} // namespace Internal + +} // namespace CMakeProjectManager + +#endif // CMAKETARGET_H diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp index 30634231da..c90fe61f9f 100644 --- a/src/plugins/cmakeprojectmanager/makestep.cpp +++ b/src/plugins/cmakeprojectmanager/makestep.cpp @@ -31,6 +31,7 @@ #include "cmakeprojectconstants.h" #include "cmakeproject.h" +#include "cmaketarget.h" #include "cmakebuildconfiguration.h" #include <projectexplorer/projectexplorer.h> @@ -220,7 +221,7 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) // TODO update this list also on rescans of the CMakeLists.txt // TODO shouldn't be accessing project - CMakeProject *pro = m_makeStep->cmakeBuildConfiguration()->cmakeProject(); + CMakeProject *pro = m_makeStep->cmakeBuildConfiguration()->cmakeTarget()->cmakeProject(); foreach(const QString& buildTarget, pro->buildTargetTitles()) { QListWidgetItem *item = new QListWidgetItem(buildTarget, m_buildTargetsList); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); @@ -265,7 +266,7 @@ void MakeStepConfigWidget::init() m_additionalArguments->setText(Environment::joinArgumentList(m_makeStep->additionalArguments())); updateDetails(); - CMakeProject *pro = m_makeStep->cmakeBuildConfiguration()->cmakeProject(); + CMakeProject *pro = m_makeStep->cmakeBuildConfiguration()->cmakeTarget()->cmakeProject(); connect(pro, SIGNAL(buildTargetsChanged()), this, SLOT(buildTargetsChanged())); } @@ -274,7 +275,7 @@ void MakeStepConfigWidget::buildTargetsChanged() { disconnect(m_buildTargetsList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*))); m_buildTargetsList->clear(); - CMakeProject *pro = m_makeStep->cmakeBuildConfiguration()->cmakeProject(); + CMakeProject *pro = m_makeStep->cmakeBuildConfiguration()->cmakeTarget()->cmakeProject(); foreach(const QString& buildTarget, pro->buildTargetTitles()) { QListWidgetItem *item = new QListWidgetItem(buildTarget, m_buildTargetsList); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index d0713e8c35..bf578e1d2e 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -35,6 +35,7 @@ #include <projectexplorer/environment.h> #include <projectexplorer/project.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <projectexplorer/buildconfiguration.h> #include <utils/qtcassert.h> @@ -130,9 +131,9 @@ DebuggerRunControl::DebuggerRunControl(DebuggerManager *manager, default: break; } - if (const ProjectExplorer::Project *project = runConfiguration->project()) { + if (const ProjectExplorer::Project *project = runConfiguration->target()->project()) { m_startParameters->buildDir = - project->activeBuildConfiguration()->buildDirectory(); + runConfiguration->target()->activeBuildConfiguration()->buildDirectory(); } m_startParameters->useTerminal = runConfiguration->runMode() == LocalApplicationRunConfiguration::Console; diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index 32d64b01f1..ae2ee4b530 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -31,6 +31,7 @@ #include "genericmakestep.h" #include "genericproject.h" +#include "generictarget.h" #include <utils/qtcassert.h> @@ -46,18 +47,18 @@ const char * const GENERIC_BC_ID("GenericProjectManager.GenericBuildConfiguratio const char * const BUILD_DIRECTORY_KEY("GenericProjectManager.GenericBuildConfiguration.BuildDirectory"); } -GenericBuildConfiguration::GenericBuildConfiguration(GenericProject *pro) - : BuildConfiguration(pro, QLatin1String(GENERIC_BC_ID)) +GenericBuildConfiguration::GenericBuildConfiguration(GenericTarget *parent) + : BuildConfiguration(parent, QLatin1String(GENERIC_BC_ID)) { } -GenericBuildConfiguration::GenericBuildConfiguration(GenericProject *pro, const QString &id) - : BuildConfiguration(pro, id) +GenericBuildConfiguration::GenericBuildConfiguration(GenericTarget *parent, const QString &id) + : BuildConfiguration(parent, id) { } -GenericBuildConfiguration::GenericBuildConfiguration(GenericProject *pro, GenericBuildConfiguration *source) : - BuildConfiguration(pro, source), +GenericBuildConfiguration::GenericBuildConfiguration(GenericTarget *parent, GenericBuildConfiguration *source) : + BuildConfiguration(parent, source), m_buildDirectory(source->m_buildDirectory) { } @@ -89,7 +90,7 @@ QString GenericBuildConfiguration::buildDirectory() const { QString buildDirectory = m_buildDirectory; if (buildDirectory.isEmpty()) { - QFileInfo fileInfo(project()->file()->fileName()); + QFileInfo fileInfo(target()->project()->file()->fileName()); buildDirectory = fileInfo.absolutePath(); } @@ -104,9 +105,9 @@ void GenericBuildConfiguration::setBuildDirectory(const QString &buildDirectory) emit buildDirectoryChanged(); } -GenericProject *GenericBuildConfiguration::genericProject() const +GenericTarget *GenericBuildConfiguration::genericTarget() const { - return static_cast<GenericProject *>(project()); + return static_cast<GenericTarget *>(target()); } @@ -123,9 +124,10 @@ GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory() { } -QStringList GenericBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Project *parent) const +QStringList GenericBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - Q_UNUSED(parent); + if (!qobject_cast<GenericTarget *>(parent)) + return QStringList(); return QStringList() << QLatin1String(GENERIC_BC_ID); } @@ -136,20 +138,20 @@ QString GenericBuildConfigurationFactory::displayNameForId(const QString &id) co return QString(); } -bool GenericBuildConfigurationFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +bool GenericBuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const { - if (!qobject_cast<GenericProject *>(parent)) + if (!qobject_cast<GenericTarget *>(parent)) return false; if (id == QLatin1String(GENERIC_BC_ID)) return true; return false; } -BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Project *parent, const QString &id) +BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id) { if (!canCreate(parent, id)) return 0; - GenericProject *project(static_cast<GenericProject *>(parent)); + GenericTarget *target(static_cast<GenericTarget *>(parent)); //TODO asking for name is duplicated everywhere, but maybe more // wizards will show up, that incorporate choosing the name @@ -162,41 +164,42 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Pr &ok); if (!ok || buildConfigurationName.isEmpty()) return false; - GenericBuildConfiguration *bc = new GenericBuildConfiguration(project); + GenericBuildConfiguration *bc = new GenericBuildConfiguration(target); bc->setDisplayName(buildConfigurationName); - project->addBuildConfiguration(bc); // also makes the name unique... GenericMakeStep *makeStep = new GenericMakeStep(bc); bc->insertBuildStep(0, makeStep); makeStep->setBuildTarget("all", /* on = */ true); + + target->addBuildConfiguration(bc); // also makes the name unique... return bc; } -bool GenericBuildConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const +bool GenericBuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const { return canCreate(parent, source->id()); } -BuildConfiguration *GenericBuildConfigurationFactory::clone(ProjectExplorer::Project *parent, BuildConfiguration *source) +BuildConfiguration *GenericBuildConfigurationFactory::clone(ProjectExplorer::Target *parent, BuildConfiguration *source) { if (!canClone(parent, source)) return 0; - GenericProject *project(static_cast<GenericProject *>(parent)); - return new GenericBuildConfiguration(project, qobject_cast<GenericBuildConfiguration *>(source)); + GenericTarget *target(static_cast<GenericTarget *>(parent)); + return new GenericBuildConfiguration(target, qobject_cast<GenericBuildConfiguration *>(source)); } -bool GenericBuildConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +bool GenericBuildConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { QString id(ProjectExplorer::idFromMap(map)); return canCreate(parent, id); } -BuildConfiguration *GenericBuildConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +BuildConfiguration *GenericBuildConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - GenericProject *project(static_cast<GenericProject *>(parent)); - GenericBuildConfiguration *bc(new GenericBuildConfiguration(project)); + GenericTarget *target(static_cast<GenericTarget *>(parent)); + GenericBuildConfiguration *bc(new GenericBuildConfiguration(target)); if (bc->fromMap(map)) return bc; delete bc; diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h index 722ca2e217..f22226f7eb 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h @@ -35,7 +35,7 @@ namespace GenericProjectManager { namespace Internal { -class GenericProject; +class GenericTarget; class GenericBuildConfigurationFactory; class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration @@ -44,10 +44,10 @@ class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class GenericBuildConfigurationFactory; public: - explicit GenericBuildConfiguration(GenericProject *pro); + explicit GenericBuildConfiguration(GenericTarget *parent); virtual ~GenericBuildConfiguration(); - GenericProject *genericProject() const; + GenericTarget *genericTarget() const; virtual ProjectExplorer::Environment environment() const; virtual QString buildDirectory() const; @@ -55,8 +55,8 @@ public: QVariantMap toMap() const; protected: - GenericBuildConfiguration(GenericProject *pro, GenericBuildConfiguration *source); - GenericBuildConfiguration(GenericProject *pro, const QString &id); + GenericBuildConfiguration(GenericTarget *parent, GenericBuildConfiguration *source); + GenericBuildConfiguration(GenericTarget *parent, const QString &id); virtual bool fromMap(const QVariantMap &map); private: @@ -71,15 +71,15 @@ public: explicit GenericBuildConfigurationFactory(QObject *parent = 0); virtual ~GenericBuildConfigurationFactory(); - QStringList availableCreationIds(ProjectExplorer::Project *project) const; + QStringList availableCreationIds(ProjectExplorer::Target *parent) const; QString displayNameForId(const QString &id) const; - bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Project *parent, const QString &id); - bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const; - ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map); + bool canCreate(ProjectExplorer::Target *parent, const QString &id) const; + ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const QString &id); + bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; + ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); + bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); }; } // namespace GenericProjectManager diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp index 4dd38982b0..a4532c4645 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.cpp +++ b/src/plugins/genericprojectmanager/genericmakestep.cpp @@ -30,6 +30,7 @@ #include "genericmakestep.h" #include "genericprojectconstants.h" #include "genericproject.h" +#include "generictarget.h" #include "ui_genericmakestep.h" #include "genericbuildconfiguration.h" @@ -111,8 +112,8 @@ bool GenericMakeStep::init() setEnvironment(bc->environment()); setOutputParser(new ProjectExplorer::GnuMakeParser(buildDir)); - if (bc->genericProject()->toolChain()) - appendOutputParser(bc->genericProject()->toolChain()->outputParser()); + if (bc->genericTarget()->genericProject()->toolChain()) + appendOutputParser(bc->genericTarget()->genericProject()->toolChain()->outputParser()); return AbstractProcessStep::init(); } @@ -155,7 +156,7 @@ QString GenericMakeStep::makeCommand() const { QString command = m_makeCommand; if (command.isEmpty()) { - GenericProject *pro = genericBuildConfiguration()->genericProject(); + GenericProject *pro = genericBuildConfiguration()->genericTarget()->genericProject(); if (ProjectExplorer::ToolChain *toolChain = pro->toolChain()) command = toolChain->makeCommand(); else @@ -206,8 +207,8 @@ GenericMakeStepConfigWidget::GenericMakeStepConfigWidget(GenericMakeStep *makeSt m_ui->setupUi(this); // TODO update this list also on rescans of the GenericLists.txt - GenericProject *pro = m_makeStep->genericBuildConfiguration()->genericProject(); - foreach (const QString &target, pro->targets()) { + GenericProject *pro = m_makeStep->genericBuildConfiguration()->genericTarget()->genericProject(); + foreach (const QString &target, pro->buildTargets()) { QListWidgetItem *item = new QListWidgetItem(target, m_ui->targetsList); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 6699e126d3..469651b126 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -28,9 +28,10 @@ **************************************************************************/ #include "genericproject.h" -#include "genericprojectconstants.h" -#include "genericmakestep.h" + #include "genericbuildconfiguration.h" +#include "genericprojectconstants.h" +#include "generictarget.h" #include <projectexplorer/toolchain.h> #include <projectexplorer/projectexplorerconstants.h> @@ -116,7 +117,7 @@ public: GenericProject::GenericProject(Manager *manager, const QString &fileName) : m_manager(manager), m_fileName(fileName), - m_buildConfigurationFactory(new GenericBuildConfigurationFactory(this)), + m_targetFactory(new GenericTargetFactory(this)), m_toolChain(0) { QFileInfo fileInfo(m_fileName); @@ -141,9 +142,14 @@ GenericProject::~GenericProject() delete m_toolChain; } -IBuildConfigurationFactory *GenericProject::buildConfigurationFactory() const +GenericTargetFactory *GenericProject::targetFactory() const +{ + return m_targetFactory; +} + +GenericTarget *GenericProject::activeTarget() const { - return m_buildConfigurationFactory; + return static_cast<GenericTarget *>(Project::activeTarget()); } QString GenericProject::filesFileName() const @@ -424,7 +430,7 @@ QStringList GenericProject::files(FilesMode fileMode) const return m_files; // ### TODO: handle generated files here. } -QStringList GenericProject::targets() const +QStringList GenericProject::buildTargets() const { QStringList targets; targets.append(QLatin1String("all")); @@ -445,21 +451,8 @@ bool GenericProject::fromMap(const QVariantMap &map) return false; // Add default BC: - if (buildConfigurations().isEmpty()) { - GenericBuildConfiguration *bc = new GenericBuildConfiguration(this); - bc->setDisplayName("all"); - addBuildConfiguration(bc); - - GenericMakeStep *makeStep = new GenericMakeStep(bc); - bc->insertBuildStep(0, makeStep); - - makeStep->setBuildTarget("all", /* on = */ true); - - const QFileInfo fileInfo(file()->fileName()); - bc->setBuildDirectory(fileInfo.absolutePath()); - - setActiveBuildConfiguration(bc); - } + if (targets().isEmpty()) + addTarget(targetFactory()->create(this, QLatin1String(GENERIC_DESKTOP_TARGET_ID))); ToolChain::ToolChainType type = static_cast<ProjectExplorer::ToolChain::ToolChainType> diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index d54004511f..a4324d1cb8 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -32,30 +32,28 @@ #include "genericprojectmanager.h" #include "genericprojectnodes.h" +#include "generictarget.h" #include <projectexplorer/project.h> #include <projectexplorer/projectnodes.h> +#include <projectexplorer/target.h> #include <projectexplorer/buildstep.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/buildconfiguration.h> #include <coreplugin/ifile.h> -QT_BEGIN_NAMESPACE -class QPushButton; -class QStringListModel; -QT_END_NAMESPACE - namespace Utils { class PathChooser; } namespace GenericProjectManager { namespace Internal { +class GenericBuildConfiguration; class GenericProject; +class GenericTarget; +class GenericTargetFactory; class GenericMakeStep; class GenericProjectFile; -class GenericBuildConfiguration; -class GenericBuildConfigurationFactory; class GenericProject : public ProjectExplorer::Project { @@ -69,23 +67,24 @@ public: QString includesFileName() const; QString configFileName() const; - virtual QString displayName() const; - virtual QString id() const; - virtual Core::IFile *file() const; - virtual ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; - virtual ProjectExplorer::IProjectManager *projectManager() const; + QString displayName() const; + QString id() const; + Core::IFile *file() const; + GenericTargetFactory *targetFactory() const; + ProjectExplorer::IProjectManager *projectManager() const; + GenericTarget *activeTarget() const; - virtual QList<ProjectExplorer::Project *> dependsOn(); + QList<ProjectExplorer::Project *> dependsOn(); - virtual bool isApplication() const; + bool isApplication() const; - virtual ProjectExplorer::BuildConfigWidget *createConfigWidget(); - virtual QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); + ProjectExplorer::BuildConfigWidget *createConfigWidget(); + QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); - virtual GenericProjectNode *rootProjectNode() const; - virtual QStringList files(FilesMode fileMode) const; + GenericProjectNode *rootProjectNode() const; + QStringList files(FilesMode fileMode) const; - QStringList targets() const; + QStringList buildTargets() const; ProjectExplorer::ToolChain *toolChain() const; bool setFiles(const QStringList &filePaths); @@ -127,7 +126,7 @@ private: QString m_configFileName; GenericProjectFile *m_file; QString m_projectName; - GenericBuildConfigurationFactory *m_buildConfigurationFactory; + GenericTargetFactory *m_targetFactory; QStringList m_files; QStringList m_generated; diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.pro b/src/plugins/genericprojectmanager/genericprojectmanager.pro index cc7f616424..0c3e3ee304 100644 --- a/src/plugins/genericprojectmanager/genericprojectmanager.pro +++ b/src/plugins/genericprojectmanager/genericprojectmanager.pro @@ -4,6 +4,7 @@ include(../../qtcreatorplugin.pri) include(genericprojectmanager_dependencies.pri) HEADERS = genericproject.h \ genericprojectplugin.h \ + generictarget.h \ genericprojectmanager.h \ genericprojectconstants.h \ genericprojectnodes.h \ @@ -14,6 +15,7 @@ HEADERS = genericproject.h \ genericbuildconfiguration.h SOURCES = genericproject.cpp \ genericprojectplugin.cpp \ + generictarget.cpp \ genericprojectmanager.cpp \ genericprojectnodes.cpp \ genericprojectwizard.cpp \ diff --git a/src/plugins/genericprojectmanager/generictarget.cpp b/src/plugins/genericprojectmanager/generictarget.cpp new file mode 100644 index 0000000000..a2ec758839 --- /dev/null +++ b/src/plugins/genericprojectmanager/generictarget.cpp @@ -0,0 +1,175 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "generictarget.h" + +#include "genericbuildconfiguration.h" +#include "genericproject.h" +#include "genericmakestep.h" + +#include <projectexplorer/customexecutablerunconfiguration.h> + +#include <QtGui/QApplication> +#include <QtGui/QStyle> + +namespace { +const char * const GENERIC_DESKTOP_TARGET_DISPLAY_NAME("Desktop"); +} + +using namespace GenericProjectManager; +using namespace GenericProjectManager::Internal; + +//////////////////////////////////////////////////////////////////////////////////// +// GenericTarget +//////////////////////////////////////////////////////////////////////////////////// + +GenericTarget::GenericTarget(GenericProject *parent) : + ProjectExplorer::Target(parent, QLatin1String(GENERIC_DESKTOP_TARGET_ID)), + m_buildConfigurationFactory(new GenericBuildConfigurationFactory(this)) +{ + setDisplayName(QApplication::translate("GenericProjectManager::GenericTarget", + GENERIC_DESKTOP_TARGET_DISPLAY_NAME, + "Generic desktop target display name")); + setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); +} + +GenericTarget::~GenericTarget() +{ +} + +GenericProject *GenericTarget::genericProject() const +{ + return static_cast<GenericProject *>(project()); +} + +GenericBuildConfigurationFactory *GenericTarget::buildConfigurationFactory() const +{ + return m_buildConfigurationFactory; +} + +GenericBuildConfiguration *GenericTarget::activeBuildConfiguration() const +{ + return static_cast<GenericBuildConfiguration *>(Target::activeBuildConfiguration()); +} + +bool GenericTarget::fromMap(const QVariantMap &map) +{ + if (!Target::fromMap(map)) + return false; + + if (displayName().isEmpty()) + setDisplayName(QApplication::translate("GenericProjectManager::GenericTarget", + GENERIC_DESKTOP_TARGET_DISPLAY_NAME, + "Generic desktop target display name")); + if (icon().isNull()) + setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); + + return true; +} + +//////////////////////////////////////////////////////////////////////////////////// +// GenericTargetFactory +//////////////////////////////////////////////////////////////////////////////////// + +GenericTargetFactory::GenericTargetFactory(QObject *parent) : + ITargetFactory(parent) +{ +} + +GenericTargetFactory::~GenericTargetFactory() +{ +} + +QStringList GenericTargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const +{ + if (!qobject_cast<GenericProject *>(parent)) + return QStringList(); + return QStringList() << QLatin1String(GENERIC_DESKTOP_TARGET_ID); +} + +QString GenericTargetFactory::displayNameForId(const QString &id) const +{ + if (id == QLatin1String(GENERIC_DESKTOP_TARGET_ID)) + return QCoreApplication::translate("GenericProjectManager::GenericTarget", + GENERIC_DESKTOP_TARGET_DISPLAY_NAME, + "Generic desktop target display name"); + return QString(); +} + +bool GenericTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +{ + if (!qobject_cast<GenericProject *>(parent)) + return false; + return id == QLatin1String(GENERIC_DESKTOP_TARGET_ID); +} + +GenericTarget *GenericTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) +{ + if (!canCreate(parent, id)) + return 0; + GenericProject *genericproject = static_cast<GenericProject *>(parent); + GenericTarget *t = new GenericTarget(genericproject); + + // Set up BuildConfiguration: + GenericBuildConfiguration *bc = new GenericBuildConfiguration(t); + bc->setDisplayName("all"); + + GenericMakeStep *makeStep = new GenericMakeStep(bc); + bc->insertBuildStep(0, makeStep); + + makeStep->setBuildTarget("all", /* on = */ true); + + const QFileInfo fileInfo(genericproject->file()->fileName()); + bc->setBuildDirectory(fileInfo.absolutePath()); + + t->addBuildConfiguration(bc); + + // Add a runconfiguration. The CustomExecutableRC one will query the user + // for its settings, so it is a good choice here. + t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t)); + + return t; +} + +bool GenericTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +{ + return canCreate(parent, ProjectExplorer::idFromMap(map)); +} + +GenericTarget *GenericTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +{ + if (!canRestore(parent, map)) + return 0; + GenericProject *genericproject = static_cast<GenericProject *>(parent); + GenericTarget *target = new GenericTarget(genericproject); + if (target->fromMap(map)) + return target; + delete target; + return 0; +} diff --git a/src/plugins/genericprojectmanager/generictarget.h b/src/plugins/genericprojectmanager/generictarget.h new file mode 100644 index 0000000000..090e321519 --- /dev/null +++ b/src/plugins/genericprojectmanager/generictarget.h @@ -0,0 +1,97 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef GENERICTARGET_H +#define GENERICTARGET_H + +#include <projectexplorer/target.h> + +#include "genericbuildconfiguration.h" + +#include <QtCore/QStringList> +#include <QtCore/QVariantMap> + +namespace ProjectExplorer { +class IBuildConfigurationFactory; +} // namespace ProjectExplorer + +namespace GenericProjectManager { + +namespace Internal { + +const char * const GENERIC_DESKTOP_TARGET_ID("GenericProjectManager.GenericTarget"); + +class GenericProject; +class GenericRunConfiguration; + +class GenericTargetFactory; + +class GenericTarget : public ProjectExplorer::Target +{ + Q_OBJECT + friend class GenericTargetFactory; + +public: + explicit GenericTarget(GenericProject *parent); + ~GenericTarget(); + + GenericProject *genericProject() const; + + GenericBuildConfigurationFactory *buildConfigurationFactory() const; + GenericBuildConfiguration *activeBuildConfiguration() const; + +protected: + bool fromMap(const QVariantMap &map); + +private: + GenericBuildConfigurationFactory *m_buildConfigurationFactory; +}; + +class GenericTargetFactory : public ProjectExplorer::ITargetFactory +{ + Q_OBJECT + +public: + explicit GenericTargetFactory(QObject *parent = 0); + ~GenericTargetFactory(); + + QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QString displayNameForId(const QString &id) const; + + bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; + GenericTarget *create(ProjectExplorer::Project *parent, const QString &id); + bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; + GenericTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); +}; + +} // namespace Internal + +} // namespace GenericProjectManager + +#endif // GENERICTARGET_H diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index 701c06bdbb..b3297f4fad 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -32,6 +32,7 @@ #include "buildstep.h" #include "ioutputparser.h" #include "project.h" +#include "target.h" #include <utils/qtcassert.h> @@ -270,7 +271,7 @@ void AbstractProcessStep::taskAdded(const ProjectExplorer::TaskWindow::Task &tas QList<QFileInfo> possibleFiles; QString fileName = QFileInfo(filePath).fileName(); - foreach (const QString &file, buildConfiguration()->project()->files(ProjectExplorer::Project::AllFiles)) { + foreach (const QString &file, buildConfiguration()->target()->project()->files(ProjectExplorer::Project::AllFiles)) { QFileInfo candidate(file); if (candidate.fileName() == fileName) possibleFiles << candidate; diff --git a/src/plugins/projectexplorer/addtargetdialog.cpp b/src/plugins/projectexplorer/addtargetdialog.cpp new file mode 100644 index 0000000000..c7385f8e56 --- /dev/null +++ b/src/plugins/projectexplorer/addtargetdialog.cpp @@ -0,0 +1,71 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "addtargetdialog.h" + +#include "ui_addtargetdialog.h" + +#include "project.h" + +using namespace ProjectExplorer; +using namespace ProjectExplorer::Internal; + +AddTargetDialog::AddTargetDialog(Project *project, QWidget *parent) : + QDialog(parent), + m_project(project), + ui(new Ui::AddTargetDialog) +{ + ui->setupUi(this); + + foreach (const QString &id, m_project->possibleTargetIds()) { + ui->targetComboBox->addItem(m_project->targetFactory()->displayNameForId(id), + id); + } + + connect(ui->buttonBox, SIGNAL(accepted()), + this, SLOT(accept())); +} + +AddTargetDialog::~AddTargetDialog() +{ + delete ui; +} + +void AddTargetDialog::accept() +{ + int index = ui->targetComboBox->currentIndex(); + QString id(ui->targetComboBox->itemData(index).toString()); + Target *target(m_project->targetFactory()->create(m_project, id)); + if (!target) + return; + m_project->addTarget(target); + + done(QDialog::Accepted); +} + diff --git a/src/plugins/projectexplorer/addtargetdialog.h b/src/plugins/projectexplorer/addtargetdialog.h new file mode 100644 index 0000000000..fd8f2d4d5d --- /dev/null +++ b/src/plugins/projectexplorer/addtargetdialog.h @@ -0,0 +1,64 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ADDTARGETDIALOG_H +#define ADDTARGETDIALOG_H + +#include <QDialog> + +namespace ProjectExplorer { + +class Project; + +namespace Internal { + +namespace Ui { +class AddTargetDialog; +} + +class AddTargetDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AddTargetDialog(Project *project, QWidget *parent = 0); + ~AddTargetDialog(); + +private slots: + void accept(); + +private: + Project *m_project; + Ui::AddTargetDialog *ui; +}; + +} // namespace Internal +} // namespace ProjectExplorer + +#endif // ADDTARGETDIALOG_H diff --git a/src/plugins/projectexplorer/addtargetdialog.ui b/src/plugins/projectexplorer/addtargetdialog.ui new file mode 100644 index 0000000000..079b5fe891 --- /dev/null +++ b/src/plugins/projectexplorer/addtargetdialog.ui @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ProjectExplorer::Internal::AddTargetDialog</class> + <widget class="QDialog" name="ProjectExplorer::Internal::AddTargetDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>343</width> + <height>67</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QFormLayout" name="formLayout"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::AllNonFixedFieldsGrow</enum> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Target:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="targetComboBox"/> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>ProjectExplorer::Internal::AddTargetDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ProjectExplorer::Internal::AddTargetDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/plugins/projectexplorer/applicationrunconfiguration.cpp b/src/plugins/projectexplorer/applicationrunconfiguration.cpp index 32cd11e241..c09c65ab34 100644 --- a/src/plugins/projectexplorer/applicationrunconfiguration.cpp +++ b/src/plugins/projectexplorer/applicationrunconfiguration.cpp @@ -42,13 +42,13 @@ using namespace ProjectExplorer::Internal; /// LocalApplicationRunConfiguration -LocalApplicationRunConfiguration::LocalApplicationRunConfiguration(Project *project, const QString &id) : - RunConfiguration(project, id) +LocalApplicationRunConfiguration::LocalApplicationRunConfiguration(Target *target, const QString &id) : + RunConfiguration(target, id) { } -LocalApplicationRunConfiguration::LocalApplicationRunConfiguration(Project *project, LocalApplicationRunConfiguration *rc) : - RunConfiguration(project, rc) +LocalApplicationRunConfiguration::LocalApplicationRunConfiguration(Target *target, LocalApplicationRunConfiguration *rc) : + RunConfiguration(target, rc) { } diff --git a/src/plugins/projectexplorer/applicationrunconfiguration.h b/src/plugins/projectexplorer/applicationrunconfiguration.h index 877c80829e..38e99d8aef 100644 --- a/src/plugins/projectexplorer/applicationrunconfiguration.h +++ b/src/plugins/projectexplorer/applicationrunconfiguration.h @@ -59,8 +59,8 @@ public: virtual ProjectExplorer::ToolChain::ToolChainType toolChainType() const = 0; protected: - LocalApplicationRunConfiguration(Project *project, const QString &id); - LocalApplicationRunConfiguration(Project *project, LocalApplicationRunConfiguration *rc); + LocalApplicationRunConfiguration(Target *target, const QString &id); + LocalApplicationRunConfiguration(Target *target, LocalApplicationRunConfiguration *rc); }; namespace Internal { diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 402fae1b24..05be2a1b47 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -62,30 +62,18 @@ const char * const CLEAN_STEPS_PREFIX("ProjectExplorer.BuildConfiguration.CleanS } // namespace -BuildConfiguration::BuildConfiguration(Project *project, const QString &id) : +BuildConfiguration::BuildConfiguration(Target *target, const QString &id) : ProjectConfiguration(id), - m_project(project) + m_target(target) { - Q_ASSERT(m_project); + Q_ASSERT(m_target); } -BuildConfiguration::BuildConfiguration(Project *project, BuildConfiguration *source) : +BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *source) : ProjectConfiguration(source), - m_project(project) + m_target(target) { - Q_ASSERT(m_project); - foreach(BuildStep *originalbs, source->buildSteps()) { - IBuildStepFactory *factory = findCloneFactory(this, originalbs); - BuildStep *clonebs = factory->clone(this, originalbs); - if (clonebs) - m_buildSteps.append(clonebs); - } - foreach(BuildStep *originalcs, source->cleanSteps()) { - IBuildStepFactory *factory = findCloneFactory(this, originalcs); - BuildStep *clonecs = factory->clone(this, originalcs); - if (clonecs) - m_cleanSteps.append(clonecs); - } + Q_ASSERT(m_target); } BuildConfiguration::~BuildConfiguration() @@ -107,9 +95,32 @@ QVariantMap BuildConfiguration::toMap() const return map; } +void BuildConfiguration::cloneSteps(BuildConfiguration *source) +{ + Q_ASSERT(source); + foreach(BuildStep *originalbs, source->buildSteps()) { + IBuildStepFactory *factory(findCloneFactory(this, originalbs)); + if (!factory) + continue; + BuildStep *clonebs(factory->clone(this, originalbs)); + if (clonebs) + m_buildSteps.append(clonebs); + } + foreach(BuildStep *originalcs, source->cleanSteps()) { + IBuildStepFactory *factory = findCloneFactory(this, originalcs); + if (!factory) + continue; + BuildStep *clonecs = factory->clone(this, originalcs); + if (clonecs) + m_cleanSteps.append(clonecs); + } +} bool BuildConfiguration::fromMap(const QVariantMap &map) { + if (!ProjectConfiguration::fromMap(map)) + return false; + int maxI(map.value(QLatin1String(BUILD_STEPS_COUNT_KEY), 0).toInt()); if (maxI < 0) maxI = 0; @@ -142,7 +153,7 @@ bool BuildConfiguration::fromMap(const QVariantMap &map) insertCleanStep(m_cleanSteps.count(), bs); } - return ProjectConfiguration::fromMap(map); + return true; } QList<BuildStep *> BuildConfiguration::buildSteps() const @@ -192,9 +203,9 @@ void BuildConfiguration::moveCleanStepUp(int position) m_cleanSteps.swap(position - 1, position); } -Project *BuildConfiguration::project() const +Target *BuildConfiguration::target() const { - return m_project; + return m_target; } /// diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 2c8e881d27..24614050c3 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -43,7 +43,7 @@ namespace ProjectExplorer { -class Project; +class Target; class PROJECTEXPLORER_EXPORT BuildConfiguration : public ProjectConfiguration { @@ -66,7 +66,7 @@ public: virtual Environment environment() const = 0; virtual QString buildDirectory() const = 0; - Project *project() const; + Target *target() const; virtual QVariantMap toMap() const; @@ -75,15 +75,16 @@ signals: void buildDirectoryChanged(); protected: - BuildConfiguration(Project *project, const QString &id); - BuildConfiguration(Project *project, BuildConfiguration *source); + BuildConfiguration(Target *target, const QString &id); + BuildConfiguration(Target *target, BuildConfiguration *source); + void cloneSteps(BuildConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: QList<BuildStep *> m_buildSteps; QList<BuildStep *> m_cleanSteps; - Project *m_project; + Target *m_target; }; class PROJECTEXPLORER_EXPORT IBuildConfigurationFactory : @@ -95,18 +96,18 @@ public: explicit IBuildConfigurationFactory(QObject *parent = 0); virtual ~IBuildConfigurationFactory(); - // used to show the list of possible additons to a project, returns a list of types - virtual QStringList availableCreationIds(Project *parent) const = 0; + // used to show the list of possible additons to a target, returns a list of types + virtual QStringList availableCreationIds(Target *parent) const = 0; // used to translate the types to names to display to the user virtual QString displayNameForId(const QString &id) const = 0; - virtual bool canCreate(Project *parent, const QString &id) const = 0; - virtual BuildConfiguration *create(Project *parent, const QString &id) = 0; + virtual bool canCreate(Target *parent, const QString &id) const = 0; + virtual BuildConfiguration *create(Target *parent, const QString &id) = 0; // used to recreate the runConfigurations when restoring settings - virtual bool canRestore(Project *parent, const QVariantMap &map) const = 0; - virtual BuildConfiguration *restore(Project *parent, const QVariantMap &map) = 0; - virtual bool canClone(Project *parent, BuildConfiguration *product) const = 0; - virtual BuildConfiguration *clone(Project *parent, BuildConfiguration *product) = 0; + virtual bool canRestore(Target *parent, const QVariantMap &map) const = 0; + virtual BuildConfiguration *restore(Target *parent, const QVariantMap &map) = 0; + virtual bool canClone(Target *parent, BuildConfiguration *product) const = 0; + virtual BuildConfiguration *clone(Target *parent, BuildConfiguration *product) = 0; signals: void availableCreationIdsChanged(); diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index 87684a7258..0938481c0d 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -36,6 +36,7 @@ #include "projectexplorer.h" #include "project.h" #include "projectexplorersettings.h" +#include "target.h" #include "taskwindow.h" #include "buildconfiguration.h" @@ -136,7 +137,7 @@ void BuildManager::cancel() this, SLOT(addToTaskWindow(ProjectExplorer::TaskWindow::Task))); disconnect(m_currentBuildStep, SIGNAL(addOutput(QString)), this, SLOT(addToOutputWindow(QString))); - decrementActiveBuildSteps(m_currentBuildStep->buildConfiguration()->project()); + decrementActiveBuildSteps(m_currentBuildStep->buildConfiguration()->target()->project()); m_progressFutureInterface->setProgressValueAndText(m_progress*100, "Build canceled"); //TODO NBS fix in qtconcurrent clearBuildQueue(); @@ -169,7 +170,7 @@ void BuildManager::emitCancelMessage() void BuildManager::clearBuildQueue() { foreach (BuildStep *bs, m_buildQueue) { - decrementActiveBuildSteps(bs->buildConfiguration()->project()); + decrementActiveBuildSteps(bs->buildConfiguration()->target()->project()); disconnect(bs, SIGNAL(addTask(ProjectExplorer::TaskWindow::Task)), this, SLOT(addToTaskWindow(ProjectExplorer::TaskWindow::Task))); disconnect(bs, SIGNAL(addOutput(QString)), @@ -281,12 +282,12 @@ void BuildManager::nextBuildQueue() ++m_progress; m_progressFutureInterface->setProgressValueAndText(m_progress*100, msgProgress(m_progress, m_maxProgress)); - decrementActiveBuildSteps(m_currentBuildStep->buildConfiguration()->project()); + decrementActiveBuildSteps(m_currentBuildStep->buildConfiguration()->target()->project()); bool result = m_watcher.result(); if (!result) { // Build Failure - const QString projectName = m_currentBuildStep->buildConfiguration()->project()->displayName(); + const QString projectName = m_currentBuildStep->buildConfiguration()->target()->displayName(); addToOutputWindow(tr("<font color=\"#ff0000\">Error while building project %1</font>").arg(projectName)); addToOutputWindow(tr("<font color=\"#ff0000\">When executing build step '%1'</font>").arg(m_currentBuildStep->displayName())); // NBS TODO fix in qtconcurrent @@ -316,11 +317,11 @@ void BuildManager::nextStep() m_currentBuildStep = m_buildQueue.front(); m_buildQueue.pop_front(); - if (m_currentBuildStep->buildConfiguration()->project() != m_previousBuildStepProject) { - const QString projectName = m_currentBuildStep->buildConfiguration()->project()->displayName(); + if (m_currentBuildStep->buildConfiguration()->target()->project() != m_previousBuildStepProject) { + const QString projectName = m_currentBuildStep->buildConfiguration()->target()->displayName(); addToOutputWindow(tr("<b>Running build steps for project %2...</b>") .arg(projectName)); - m_previousBuildStepProject = m_currentBuildStep->buildConfiguration()->project(); + m_previousBuildStepProject = m_currentBuildStep->buildConfiguration()->target()->project(); } m_watcher.setFuture(QtConcurrent::run(&BuildStep::run, m_currentBuildStep)); } else { @@ -339,7 +340,7 @@ bool BuildManager::buildQueueAppend(BuildStep *bs) { m_buildQueue.append(bs); ++m_maxProgress; - incrementActiveBuildSteps(bs->buildConfiguration()->project()); + incrementActiveBuildSteps(bs->buildConfiguration()->target()->project()); connect(bs, SIGNAL(addTask(ProjectExplorer::TaskWindow::Task)), this, SLOT(addToTaskWindow(ProjectExplorer::TaskWindow::Task))); @@ -348,7 +349,7 @@ bool BuildManager::buildQueueAppend(BuildStep *bs) bool init = bs->init(); if (!init) { - const QString projectName = m_currentBuildStep->buildConfiguration()->project()->displayName(); + const QString projectName = m_currentBuildStep->buildConfiguration()->target()->displayName(); addToOutputWindow(tr("<font color=\"#ff0000\">Error while building project %1</font>").arg(projectName)); addToOutputWindow(tr("<font color=\"#ff0000\">When executing build step '%1'</font>").arg(m_currentBuildStep->displayName())); cancel(); diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp index cf50b4a2be..10f11d34aa 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp @@ -31,6 +31,7 @@ #include "buildstep.h" #include "buildstepspage.h" #include "project.h" +#include "target.h" #include "buildconfiguration.h" #include <coreplugin/coreconstants.h> @@ -54,6 +55,11 @@ using namespace ProjectExplorer::Internal; // BuildSettingsPanelFactory /// +QString BuildSettingsPanelFactory::id() const +{ + return QLatin1String(BUILDSETTINGS_PANEL_ID); +} + QString BuildSettingsPanelFactory::displayName() const { return QApplication::tr("Build Settings"); @@ -61,20 +67,33 @@ QString BuildSettingsPanelFactory::displayName() const bool BuildSettingsPanelFactory::supports(Project *project) { - return project->hasBuildSettings(); + return project->targets().count() == 1; +} + +bool BuildSettingsPanelFactory::supports(Target *target) +{ + return target->buildConfigurationFactory(); } + IPropertiesPanel *BuildSettingsPanelFactory::createPanel(Project *project) { - return new BuildSettingsPanel(project); + Q_ASSERT(supports(project)); + return new BuildSettingsPanel(project->activeTarget()); } +IPropertiesPanel *BuildSettingsPanelFactory::createPanel(Target *target) +{ + return new BuildSettingsPanel(target); +} + + /// // BuildSettingsPanel /// -BuildSettingsPanel::BuildSettingsPanel(Project *project) : - m_widget(new BuildSettingsWidget(project)), +BuildSettingsPanel::BuildSettingsPanel(Target *target) : + m_widget(new BuildSettingsWidget(target)), m_icon(":/projectexplorer/images/rebuild.png") { } @@ -99,11 +118,6 @@ QIcon BuildSettingsPanel::icon() const return m_icon; } -void BuildSettingsPanel::widgetWasAddedToLayout() -{ - m_widget->setupUi(); -} - /// // BuildSettingsWidget /// @@ -113,27 +127,33 @@ BuildSettingsWidget::~BuildSettingsWidget() clear(); } -BuildSettingsWidget::BuildSettingsWidget(Project *project) : - m_project(project), +BuildSettingsWidget::BuildSettingsWidget(Target *target) : + m_target(target), m_buildConfiguration(0), m_leftMargin(0) { - // setup is done after panel has been added to layout. - // setupUi will be called by the IPropertiesPanel implementation then. - // this is necessary to handle the margin by hand for the up/down/delete hover + Q_ASSERT(m_target); + setupUi(); } void BuildSettingsWidget::setupUi() { - // called by IPropertiesPanel implementation once the panel has been added - QMargins margins(contentsMargins()); - m_leftMargin = margins.left(); - margins.setLeft(0); - setContentsMargins(margins); - + m_leftMargin = Constants::PANEL_LEFT_MARGIN; QVBoxLayout *vbox = new QVBoxLayout(this); vbox->setContentsMargins(0, 0, 0, 0); + if (!m_target->buildConfigurationFactory()) { + QLabel * noSettingsLabel(new QLabel(this)); + noSettingsLabel->setText(tr("No Build Settings available")); + { + QFont f(noSettingsLabel->font()); + f.setPointSizeF(f.pointSizeF() * 1.2); + noSettingsLabel->setFont(f); + } + vbox->addWidget(noSettingsLabel); + return; + } + { // Edit Build Configuration row QHBoxLayout *hbox = new QHBoxLayout(); hbox->setContentsMargins(m_leftMargin, 0, 0, 0); @@ -157,7 +177,7 @@ void BuildSettingsWidget::setupUi() vbox->addLayout(hbox); } - m_buildConfiguration = m_project->activeBuildConfiguration(); + m_buildConfiguration = m_target->activeBuildConfiguration(); connect(m_buildConfigurationComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int))); @@ -169,21 +189,23 @@ void BuildSettingsWidget::setupUi() // connect(m_project, SIGNAL(buildConfigurationDisplayNameChanged(const QString &)), // this, SLOT(buildConfigurationDisplayNameChanged(const QString &))); - connect(m_project, SIGNAL(activeBuildConfigurationChanged()), + connect(m_target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), this, SLOT(updateConfigurationComboBoxLabels())); - connect(m_project, SIGNAL(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), + + connect(m_target, SIGNAL(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), this, SLOT(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*))); - connect(m_project, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), + connect(m_target, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), this, SLOT(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*))); - foreach (BuildConfiguration *bc, m_project->buildConfigurations()) { + foreach (BuildConfiguration *bc, m_target->buildConfigurations()) { connect(bc, SIGNAL(displayNameChanged()), this, SLOT(buildConfigurationDisplayNameChanged())); } - if (m_project->buildConfigurationFactory()) - connect(m_project->buildConfigurationFactory(), SIGNAL(availableCreationIdsChanged()), SLOT(updateAddButtonMenu())); + if (m_target->buildConfigurationFactory()) + connect(m_target->buildConfigurationFactory(), SIGNAL(availableCreationIdsChanged()), + SLOT(updateAddButtonMenu())); updateAddButtonMenu(); updateBuildSettings(); @@ -235,7 +257,6 @@ void BuildSettingsWidget::clear() m_subWidgets.clear(); qDeleteAll(m_labels); m_labels.clear(); - } QList<QWidget *> BuildSettingsWidget::subWidgets() const @@ -246,11 +267,14 @@ QList<QWidget *> BuildSettingsWidget::subWidgets() const void BuildSettingsWidget::updateAddButtonMenu() { m_addButtonMenu->clear(); - m_addButtonMenu->addAction(tr("&Clone Selected"), - this, SLOT(cloneConfiguration())); - IBuildConfigurationFactory *factory = m_project->buildConfigurationFactory(); + if (m_target && + m_target->activeBuildConfiguration()) { + m_addButtonMenu->addAction(tr("&Clone Selected"), + this, SLOT(cloneConfiguration())); + } + IBuildConfigurationFactory *factory = m_target->buildConfigurationFactory(); if (factory) { - foreach (const QString &id, factory->availableCreationIds(m_project)) { + foreach (const QString &id, factory->availableCreationIds(m_target)) { QAction *action = m_addButtonMenu->addAction(factory->displayNameForId(id), this, SLOT(createConfiguration())); action->setData(id); } @@ -267,21 +291,21 @@ void BuildSettingsWidget::updateBuildSettings() clear(); // update buttons - m_removeButton->setEnabled(m_project->buildConfigurations().size() > 1); + m_removeButton->setEnabled(m_target->buildConfigurations().size() > 1); // Add pages - BuildConfigWidget *generalConfigWidget = m_project->createConfigWidget(); + BuildConfigWidget *generalConfigWidget = m_target->project()->createConfigWidget(); addSubWidget(generalConfigWidget->displayName(), generalConfigWidget); - addSubWidget(tr("Build Steps"), new BuildStepsPage(m_project, false)); - addSubWidget(tr("Clean Steps"), new BuildStepsPage(m_project, true)); + addSubWidget(tr("Build Steps"), new BuildStepsPage(m_target, false)); + addSubWidget(tr("Clean Steps"), new BuildStepsPage(m_target, true)); - QList<BuildConfigWidget *> subConfigWidgets = m_project->subConfigWidgets(); + QList<BuildConfigWidget *> subConfigWidgets = m_target->project()->subConfigWidgets(); foreach (BuildConfigWidget *subConfigWidget, subConfigWidgets) addSubWidget(subConfigWidget->displayName(), subConfigWidget); // Add tree items - foreach (BuildConfiguration *bc, m_project->buildConfigurations()) { + foreach (BuildConfiguration *bc, m_target->buildConfigurations()) { m_buildConfigurationComboBox->addItem(buildConfigurationItemName(bc), QVariant::fromValue<BuildConfiguration *>(bc)); if (bc == m_buildConfiguration) m_buildConfigurationComboBox->setCurrentIndex(m_buildConfigurationComboBox->count() - 1); @@ -300,12 +324,16 @@ void BuildSettingsWidget::currentIndexChanged(int index) void BuildSettingsWidget::currentBuildConfigurationChanged() { + if (!m_buildConfiguration) + return; + for (int i = 0; i < m_buildConfigurationComboBox->count(); ++i) { if (m_buildConfigurationComboBox->itemData(i).value<BuildConfiguration *>() == m_buildConfiguration) { m_buildConfigurationComboBox->setCurrentIndex(i); break; } } + foreach (QWidget *widget, subWidgets()) { if (BuildConfigWidget *buildStepWidget = qobject_cast<BuildConfigWidget*>(widget)) { buildStepWidget->init(m_buildConfiguration); @@ -323,16 +351,19 @@ void BuildSettingsWidget::updateConfigurationComboBoxLabels() QString BuildSettingsWidget::buildConfigurationItemName(const BuildConfiguration *bc) const { - if (bc == m_project->activeBuildConfiguration()) + if (bc == m_target->activeBuildConfiguration()) return tr("%1 (Active)").arg(bc->displayName()); return bc->displayName(); } void BuildSettingsWidget::createConfiguration() { + if (!m_target->buildConfigurationFactory()) + return; + QAction *action = qobject_cast<QAction *>(sender()); - const QString &type = action->data().toString(); - BuildConfiguration *bc = m_project->buildConfigurationFactory()->create(m_project, type); + const QString &id = action->data().toString(); + BuildConfiguration *bc = m_target->buildConfigurationFactory()->create(m_target, id); if (bc) { m_buildConfiguration = bc; updateBuildSettings(); @@ -355,7 +386,8 @@ void BuildSettingsWidget::deleteConfiguration() void BuildSettingsWidget::cloneConfiguration(BuildConfiguration *sourceConfiguration) { - if (!sourceConfiguration) + if (!sourceConfiguration || + !m_target->buildConfigurationFactory()) return; QString newDisplayName(QInputDialog::getText(this, tr("Clone configuration"), tr("New Configuration Name:"))); @@ -363,35 +395,38 @@ void BuildSettingsWidget::cloneConfiguration(BuildConfiguration *sourceConfigura return; QStringList buildConfigurationDisplayNames; - foreach(BuildConfiguration *bc, m_project->buildConfigurations()) + foreach(BuildConfiguration *bc, m_target->buildConfigurations()) buildConfigurationDisplayNames << bc->displayName(); newDisplayName = Project::makeUnique(newDisplayName, buildConfigurationDisplayNames); - m_buildConfiguration = m_project->buildConfigurationFactory()->clone(m_project, sourceConfiguration); - if (!m_buildConfiguration) + BuildConfiguration * bc(m_target->buildConfigurationFactory()->clone(m_target, sourceConfiguration)); + if (!bc) return; + + m_buildConfiguration = bc; m_buildConfiguration->setDisplayName(newDisplayName); - m_project->addBuildConfiguration(m_buildConfiguration); + m_target->addBuildConfiguration(m_buildConfiguration); updateBuildSettings(); } void BuildSettingsWidget::deleteConfiguration(BuildConfiguration *deleteConfiguration) { - if (!deleteConfiguration || m_project->buildConfigurations().size() <= 1) + if (!deleteConfiguration || + m_target->buildConfigurations().size() <= 1) return; - if (m_project->activeBuildConfiguration() == deleteConfiguration) { - foreach (BuildConfiguration *bc, m_project->buildConfigurations()) { + if (m_target->activeBuildConfiguration() == deleteConfiguration) { + foreach (BuildConfiguration *bc, m_target->buildConfigurations()) { if (bc != deleteConfiguration) { - m_project->setActiveBuildConfiguration(bc); + m_target->setActiveBuildConfiguration(bc); break; } } } if (m_buildConfiguration == deleteConfiguration) { - foreach (BuildConfiguration *bc, m_project->buildConfigurations()) { + foreach (BuildConfiguration *bc, m_target->buildConfigurations()) { if (bc != deleteConfiguration) { m_buildConfiguration = bc; break; @@ -399,7 +434,7 @@ void BuildSettingsWidget::deleteConfiguration(BuildConfiguration *deleteConfigur } } - m_project->removeBuildConfiguration(deleteConfiguration); + m_target->removeBuildConfiguration(deleteConfiguration); updateBuildSettings(); } diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.h b/src/plugins/projectexplorer/buildsettingspropertiespage.h index 80121aa46f..cb5c741117 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.h +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.h @@ -48,12 +48,17 @@ class IBuildStepFactory; namespace Internal { +const char * const BUILDSETTINGS_PANEL_ID("ProjectExplorer.BuildSettingsPanel"); + class BuildSettingsPanelFactory : public IPanelFactory { public: + QString id() const; QString displayName() const; bool supports(Project *project); + bool supports(Target *target); IPropertiesPanel *createPanel(Project *project); + IPropertiesPanel *createPanel(Target *target); }; class BuildSettingsWidget; @@ -61,12 +66,12 @@ class BuildSettingsWidget; class BuildSettingsPanel : public IPropertiesPanel { public: - BuildSettingsPanel(Project *project); + BuildSettingsPanel(Target *target); ~BuildSettingsPanel(); QString displayName() const; QWidget *widget() const; QIcon icon() const; - void widgetWasAddedToLayout(); + PanelFlags flags() const { return IPropertiesPanel::NoLeftMargin; } private: BuildSettingsWidget *m_widget; @@ -79,7 +84,7 @@ class BuildSettingsWidget : public QWidget { Q_OBJECT public: - BuildSettingsWidget(Project *project); + BuildSettingsWidget(Target *target); ~BuildSettingsWidget(); void clear(); @@ -108,7 +113,7 @@ private: void deleteConfiguration(BuildConfiguration *toDelete); QString buildConfigurationItemName(const BuildConfiguration *bc) const; - Project *m_project; + Target *m_target; BuildConfiguration *m_buildConfiguration; QPushButton *m_addButton; diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h index d6407a43ff..dd39dbb366 100644 --- a/src/plugins/projectexplorer/buildstep.h +++ b/src/plugins/projectexplorer/buildstep.h @@ -82,18 +82,18 @@ public: // use it to retrieve any information that you need in run() virtual bool init() = 0; - // Reimplement this. This function is called when the project is build. + // Reimplement this. This function is called when the target is build. // This function is NOT run in the gui thread. It runs in its own thread // If you need an event loop, you need to create one. // The absolute minimal implementation is: // fi.reportResult(true); virtual void run(QFutureInterface<bool> &fi) = 0; - // the Widget shown in the project settings dialog for this buildStep + // the Widget shown in the target settings dialog for this buildStep // ownership is transferred to the caller virtual BuildStepConfigWidget *createConfigWidget() = 0; - // if this function returns true, the user can't delete this BuildStep for this project + // if this function returns true, the user can't delete this BuildStep for this target // and the user is prevented from changing the order immutable steps are run // the default implementation returns false virtual bool immutable() const; @@ -121,7 +121,7 @@ public: explicit IBuildStepFactory(QObject *parent = 0); virtual ~IBuildStepFactory(); - // used to show the list of possible additons to a project, returns a list of types + // used to show the list of possible additons to a target, returns a list of types virtual QStringList availableCreationIds(BuildConfiguration *parent) const = 0; // used to translate the types to names to display to the user virtual QString displayNameForId(const QString &id) const = 0; diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp index bf36144a75..08b0f1c116 100644 --- a/src/plugins/projectexplorer/buildstepspage.cpp +++ b/src/plugins/projectexplorer/buildstepspage.cpp @@ -46,13 +46,13 @@ using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; -BuildStepsPage::BuildStepsPage(Project *project, bool clean) : +BuildStepsPage::BuildStepsPage(Target *target, bool clean) : BuildConfigWidget(), m_clean(clean), m_addButton(0), m_leftMargin(-1) { - Q_UNUSED(project); + Q_UNUSED(target); } BuildStepsPage::~BuildStepsPage() diff --git a/src/plugins/projectexplorer/buildstepspage.h b/src/plugins/projectexplorer/buildstepspage.h index dd673609f6..782a7f336f 100644 --- a/src/plugins/projectexplorer/buildstepspage.h +++ b/src/plugins/projectexplorer/buildstepspage.h @@ -43,7 +43,7 @@ QT_END_NAMESPACE namespace ProjectExplorer { -class Project; +class Target; class BuildConfiguration; namespace Internal { @@ -64,9 +64,9 @@ struct BuildStepsWidgetStruct class BuildStepsPage : public BuildConfigWidget { Q_OBJECT - Q_DISABLE_COPY(BuildStepsPage) + public: - explicit BuildStepsPage(Project *project, bool clean = false); + explicit BuildStepsPage(Target *target, bool clean = false); virtual ~BuildStepsPage(); QString displayName() const; diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index 3d71f14108..47ee00bb1b 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -29,12 +29,12 @@ #include "customexecutablerunconfiguration.h" #include "environment.h" -#include "project.h" #include <coreplugin/icore.h> #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/environmenteditmodel.h> #include <projectexplorer/debugginghelper.h> +#include <projectexplorer/target.h> #include <utils/detailswidget.h> #include <utils/pathchooser.h> @@ -263,7 +263,7 @@ void CustomExecutableRunConfiguration::ctor() setDisplayName(m_userName); else setDisplayName(tr("Custom Executable")); - connect(project(), SIGNAL(activeBuildConfigurationChanged()), + connect(target(), SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), this, SLOT(activeBuildConfigurationChanged())); m_lastActiveBuildConfiguration = activeBuildConfiguration(); @@ -274,8 +274,8 @@ void CustomExecutableRunConfiguration::ctor() } } -CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Project *project) : - LocalApplicationRunConfiguration(project, QLatin1String(CUSTOM_EXECUTABLE_ID)), +CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Target *parent) : + LocalApplicationRunConfiguration(parent, QLatin1String(CUSTOM_EXECUTABLE_ID)), m_runMode(Gui), m_userSetName(false), m_baseEnvironmentBase(CustomExecutableRunConfiguration::BuildEnvironmentBase) @@ -284,8 +284,8 @@ CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Project *proj ctor(); } -CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Project *project, CustomExecutableRunConfiguration *source) : - LocalApplicationRunConfiguration(project, source), +CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Target *parent, CustomExecutableRunConfiguration *source) : + LocalApplicationRunConfiguration(parent, source), m_executable(source->m_executable), m_workingDirectory(source->m_workingDirectory), m_cmdArguments(source->m_cmdArguments), @@ -551,54 +551,54 @@ CustomExecutableRunConfigurationFactory::~CustomExecutableRunConfigurationFactor } -bool CustomExecutableRunConfigurationFactory::canCreate(Project *project, const QString &id) const +bool CustomExecutableRunConfigurationFactory::canCreate(Target *parent, const QString &id) const { - Q_UNUSED(project); + Q_UNUSED(parent); return id == QLatin1String(CUSTOM_EXECUTABLE_ID); } -RunConfiguration *CustomExecutableRunConfigurationFactory::create(Project *project, const QString &id) +RunConfiguration *CustomExecutableRunConfigurationFactory::create(Target *parent, const QString &id) { - if (!canCreate(project, id)) + if (!canCreate(parent, id)) return 0; - RunConfiguration *rc(new CustomExecutableRunConfiguration(project)); + RunConfiguration *rc(new CustomExecutableRunConfiguration(parent)); rc->setDisplayName(tr("Custom Executable")); return rc; } -bool CustomExecutableRunConfigurationFactory::canRestore(Project *project, const QVariantMap &map) const +bool CustomExecutableRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { QString id(idFromMap(map)); - return canCreate(project, id); + return canCreate(parent, id); } -RunConfiguration *CustomExecutableRunConfigurationFactory::restore(Project *project, const QVariantMap &map) +RunConfiguration *CustomExecutableRunConfigurationFactory::restore(Target *parent, const QVariantMap &map) { - if (!canRestore(project, map)) + if (!canRestore(parent, map)) return 0; - CustomExecutableRunConfiguration *rc(new CustomExecutableRunConfiguration(project)); + CustomExecutableRunConfiguration *rc(new CustomExecutableRunConfiguration(parent)); if (rc->fromMap(map)) return rc; delete rc; return 0; } -bool CustomExecutableRunConfigurationFactory::canClone(Project *parent, RunConfiguration *source) const +bool CustomExecutableRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const { return canCreate(parent, source->id()); } -RunConfiguration *CustomExecutableRunConfigurationFactory::clone(Project *parent, RunConfiguration *source) +RunConfiguration *CustomExecutableRunConfigurationFactory::clone(Target *parent, RunConfiguration *source) { if (!canClone(parent, source)) return 0; return new CustomExecutableRunConfiguration(parent, static_cast<CustomExecutableRunConfiguration*>(source)); } -QStringList CustomExecutableRunConfigurationFactory::availableCreationIds(Project *project) const +QStringList CustomExecutableRunConfigurationFactory::availableCreationIds(Target *parent) const { - Q_UNUSED(project) + Q_UNUSED(parent) return QStringList() << QLatin1String(CUSTOM_EXECUTABLE_ID); } diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.h b/src/plugins/projectexplorer/customexecutablerunconfiguration.h index e4b3f58eb8..207268545d 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.h +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.h @@ -49,7 +49,10 @@ class PathChooser; } namespace ProjectExplorer { + class EnvironmentWidget; +class Target; + namespace Internal { class CustomExecutableConfigurationWidget; } @@ -64,7 +67,7 @@ class PROJECTEXPLORER_EXPORT CustomExecutableRunConfiguration : public LocalAppl friend class CustomExecutableRunConfigurationFactory; public: - explicit CustomExecutableRunConfiguration(Project *project); + explicit CustomExecutableRunConfiguration(Target *parent); ~CustomExecutableRunConfiguration(); /** @@ -109,7 +112,7 @@ private slots: void activeBuildConfigurationChanged(); protected: - CustomExecutableRunConfiguration(Project *project, CustomExecutableRunConfiguration *source); + CustomExecutableRunConfiguration(Target *parent, CustomExecutableRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: @@ -149,15 +152,15 @@ public: explicit CustomExecutableRunConfigurationFactory(QObject *parent = 0); ~CustomExecutableRunConfigurationFactory(); - QStringList availableCreationIds(Project *project) const; + QStringList availableCreationIds(Target *parent) const; QString displayNameForId(const QString &id) const; - bool canCreate(Project *project, const QString &id) const; - RunConfiguration *create(Project *project, const QString &id); - bool canRestore(Project *project, const QVariantMap &map) const; - RunConfiguration *restore(Project *project, const QVariantMap &map); - bool canClone(Project *parent, RunConfiguration *product) const; - RunConfiguration *clone(Project *parent, RunConfiguration *source); + bool canCreate(Target *parent, const QString &id) const; + RunConfiguration *create(Target *parent, const QString &id); + bool canRestore(Target *parent, const QVariantMap &map) const; + RunConfiguration *restore(Target *parent, const QVariantMap &map); + bool canClone(Target *parent, RunConfiguration *product) const; + RunConfiguration *clone(Target *parent, RunConfiguration *source); }; namespace Internal { diff --git a/src/plugins/projectexplorer/dependenciespanel.cpp b/src/plugins/projectexplorer/dependenciespanel.cpp index 27917bc809..f33b1cf030 100644 --- a/src/plugins/projectexplorer/dependenciespanel.cpp +++ b/src/plugins/projectexplorer/dependenciespanel.cpp @@ -292,20 +292,38 @@ DependenciesPanelFactory::DependenciesPanelFactory(SessionManager *session) { } +QString DependenciesPanelFactory::id() const +{ + return QLatin1String(DEPENDENCIES_PANEL_ID); +} + QString DependenciesPanelFactory::displayName() const { return QApplication::tr("Dependencies"); } -bool DependenciesPanelFactory::supports(Project * /* project */) +bool DependenciesPanelFactory::supports(Project *project) { + Q_UNUSED(project); return true; } +bool DependenciesPanelFactory::supports(Target *target) +{ + Q_UNUSED(target); + return false; +} + IPropertiesPanel *DependenciesPanelFactory::createPanel(Project *project) { return new DependenciesPanel(m_session, project); } +IPropertiesPanel *DependenciesPanelFactory::createPanel(Target *target) +{ + Q_UNUSED(target); + return 0; +} + } // namespace Internal } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/dependenciespanel.h b/src/plugins/projectexplorer/dependenciespanel.h index 0694357e2e..1e932a5dd8 100644 --- a/src/plugins/projectexplorer/dependenciespanel.h +++ b/src/plugins/projectexplorer/dependenciespanel.h @@ -47,6 +47,8 @@ class SessionManager; namespace Internal { +const char * const DEPENDENCIES_PANEL_ID("ProjectExplorer.DependenciesPanel"); + class DependenciesWidget; class DependenciesPanelFactory : public IPanelFactory @@ -54,9 +56,12 @@ class DependenciesPanelFactory : public IPanelFactory public: DependenciesPanelFactory(SessionManager *session); + QString id() const; QString displayName() const; bool supports(Project *project); + bool supports(Target *target); IPropertiesPanel *createPanel(Project *project); + IPropertiesPanel *createPanel(Target *target); private: SessionManager *m_session; diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp index be37cc9ea2..5c58468552 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp @@ -38,21 +38,39 @@ using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; +QString EditorSettingsPanelFactory::id() const +{ + return QLatin1String(EDITORSETTINGS_PANEL_ID); +} + QString EditorSettingsPanelFactory::displayName() const { return QApplication::tr("Editor Settings"); } -bool EditorSettingsPanelFactory::supports(Project * /*project*/) +bool EditorSettingsPanelFactory::supports(Project *project) { + Q_UNUSED(project); return true; } +bool EditorSettingsPanelFactory::supports(Target *target) +{ + Q_UNUSED(target); + return false; +} + IPropertiesPanel *EditorSettingsPanelFactory::createPanel(Project *project) { return new EditorSettingsPanel(project); } +IPropertiesPanel *EditorSettingsPanelFactory::createPanel(Target *target) +{ + Q_UNUSED(target); + return 0; +} + EditorSettingsPanel::EditorSettingsPanel(Project *project) : m_widget(new EditorSettingsWidget(project)), m_icon(":/projectexplorer/images/rebuild.png") diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.h b/src/plugins/projectexplorer/editorsettingspropertiespage.h index 0df493512b..137998e419 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.h +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.h @@ -37,12 +37,17 @@ namespace ProjectExplorer { namespace Internal { +const char * const EDITORSETTINGS_PANEL_ID("ProjectExplorer.EditorSettingsPanel"); + class EditorSettingsPanelFactory : public IPanelFactory { public: + QString id() const; QString displayName() const; bool supports(Project *project); + bool supports(Target *target); IPropertiesPanel *createPanel(Project *project); + IPropertiesPanel *createPanel(Target *target); }; class EditorSettingsWidget; diff --git a/src/plugins/projectexplorer/iprojectproperties.h b/src/plugins/projectexplorer/iprojectproperties.h index b0c4a186ee..02425059d5 100644 --- a/src/plugins/projectexplorer/iprojectproperties.h +++ b/src/plugins/projectexplorer/iprojectproperties.h @@ -36,10 +36,22 @@ namespace ProjectExplorer { class Project; +class Target; + +namespace Constants { + const int PANEL_LEFT_MARGIN = 70; +} class PROJECTEXPLORER_EXPORT IPropertiesPanel { public: + enum PanelFlag { + NoFlag = 0x00, + NoLeftMargin = 0x01, + NoAutomaticStyle = 0x02 + }; + Q_DECLARE_FLAGS(PanelFlags, PanelFlag) + IPropertiesPanel() { } virtual ~IPropertiesPanel() @@ -48,16 +60,19 @@ public: virtual QString displayName() const = 0; virtual QIcon icon() const = 0; virtual QWidget *widget() const = 0; - virtual void widgetWasAddedToLayout() { } + virtual PanelFlags flags() const { return NoFlag; } }; class PROJECTEXPLORER_EXPORT IPanelFactory : public QObject { Q_OBJECT public: + virtual QString id() const = 0; virtual QString displayName() const = 0; virtual bool supports(Project *project) = 0; + virtual bool supports(Target *target) = 0; virtual IPropertiesPanel *createPanel(Project *project) = 0; + virtual IPropertiesPanel *createPanel(Target *target) = 0; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp index 9b6c193002..50aeba7c40 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp +++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp @@ -1,3 +1,32 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + #include "miniprojecttargetselector.h" #include <utils/qtcassert.h> @@ -20,19 +49,77 @@ #include <QtGui/QListWidget> #include <QtGui/QStatusBar> #include <QtGui/QStackedWidget> +#include <QtGui/QKeyEvent> -#include <QDebug> +#include <QtGui/QApplication> using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; -MiniTargetWidget::MiniTargetWidget(Project *project, QWidget *parent) : - QWidget(parent), m_project(project) +ProjectListWidget::ProjectListWidget(ProjectExplorer::Project *project, QWidget *parent) + : QListWidget(parent), m_project(project) +{ + setFocusPolicy(Qt::NoFocus); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setAlternatingRowColors(false); + setFocusPolicy(Qt::WheelFocus); + + connect(this, SIGNAL(currentRowChanged(int)), SLOT(setTarget(int))); +} + +ProjectExplorer::Project *ProjectListWidget::project() const { - m_buildComboBox = new QComboBox; - m_buildComboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + return m_project; +} + +QSize ProjectListWidget::sizeHint() const +{ + int height = 0; + for (int itemPos = 0; itemPos < count(); ++itemPos) + height += item(itemPos)->sizeHint().height(); + + return QListWidget::sizeHint().expandedTo(QSize(0, height)); +} + +void ProjectListWidget::setRunComboPopup() +{ + QWidget *w = itemWidget(currentItem()); + MiniTargetWidget *mtw = qobject_cast<MiniTargetWidget*>(w); + if (mtw->runSettingsComboBox()) + mtw->runSettingsComboBox()->showPopup(); +} + +void ProjectListWidget::setBuildComboPopup() +{ + QWidget *w = itemWidget(currentItem()); + MiniTargetWidget *mtw = qobject_cast<MiniTargetWidget*>(w); + if (mtw->buildSettingsComboBox()) + mtw->buildSettingsComboBox()->showPopup(); +} + +void ProjectListWidget::setTarget(int index) +{ + QList<Target *> targets(m_project->targets()); + if (index >= 0 && index < targets.count()) + m_project->setActiveTarget(targets.at(index)); +} + +MiniTargetWidget::MiniTargetWidget(Target *target, QWidget *parent) : + QWidget(parent), m_target(target) +{ + Q_ASSERT(m_target); + + if (hasBuildConfiguration()) { + m_buildComboBox = new QComboBox; + m_buildComboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + m_buildComboBox->setToolTip(tr("Make active and press 'b' to select.")); + } else { + m_buildComboBox = 0; + } + m_runComboBox = new QComboBox; m_runComboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + m_runComboBox->setToolTip(tr("Make active and press 'r' to select.")); int fontSize = font().pointSize(); setStyleSheet(QString::fromLatin1("QWidget { font-size: %1pt; color: white; } " @@ -45,47 +132,65 @@ MiniTargetWidget::MiniTargetWidget(Project *project, QWidget *parent) : QGridLayout *gridLayout = new QGridLayout(this); - m_targetName = new QLabel(tr("Target")); - m_targetName->setObjectName(QLatin1String("targetName")); + m_targetName = new QLabel(m_target->displayName()); + m_targetName->setObjectName(QLatin1String("target")); m_targetIcon = new QLabel(); - m_targetIcon->setPixmap(style()->standardIcon(QStyle::SP_ComputerIcon).pixmap(48, 48)); + m_targetIcon->setPixmap(m_target->icon().pixmap(48, 48)); + + if (hasBuildConfiguration()) { + Q_FOREACH(BuildConfiguration* bc, m_target->buildConfigurations()) + addBuildConfiguration(bc); - Q_FOREACH(BuildConfiguration* bc, project->buildConfigurations()) - addBuildConfiguration(bc); + connect(m_target, SIGNAL(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), + SLOT(addBuildConfiguration(ProjectExplorer::BuildConfiguration*))); + connect(m_target, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), + SLOT(addBuildConfiguration(ProjectExplorer::BuildConfiguration*))); + + connect(m_target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), + SLOT(setActiveBuildConfiguration())); + connect(m_buildComboBox, SIGNAL(currentIndexChanged(int)), SLOT(setActiveBuildConfiguration(int))); + } - Q_FOREACH(RunConfiguration* rc, project->runConfigurations()) + Q_FOREACH(RunConfiguration* rc, m_target->runConfigurations()) addRunConfiguration(rc); - connect(project, SIGNAL(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), + connect(m_target, SIGNAL(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), SLOT(addBuildConfiguration(ProjectExplorer::BuildConfiguration*))); - connect(project, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), + connect(m_target, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), SLOT(addBuildConfiguration(ProjectExplorer::BuildConfiguration*))); - connect(project, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration*)), + connect(m_target, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration*)), SLOT(addRunConfiguration(ProjectExplorer::RunConfiguration*))); - connect(project, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration*)), + connect(m_target, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration*)), SLOT(removeRunConfiguration(ProjectExplorer::RunConfiguration*))); - connect(m_buildComboBox, SIGNAL(currentIndexChanged(int)), SLOT(setActiveBuildConfiguration(int))); connect(m_runComboBox, SIGNAL(currentIndexChanged(int)), SLOT(setActiveRunConfiguration(int))); - connect(project, SIGNAL(activeBuildConfigurationChanged()), SLOT(setActiveBuildConfiguration())); - connect(project, SIGNAL(activeRunConfigurationChanged()), SLOT(setActiveRunConfiguration())); + connect(m_target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), + SLOT(setActiveBuildConfiguration())); + connect(m_target, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), + SLOT(setActiveRunConfiguration())); + + QHBoxLayout *buildHelperLayout = 0; + if (hasBuildConfiguration()) { + buildHelperLayout= new QHBoxLayout; + buildHelperLayout->setMargin(0); + buildHelperLayout->setSpacing(0); + buildHelperLayout->addWidget(m_buildComboBox); + } QHBoxLayout *runHelperLayout = new QHBoxLayout; runHelperLayout->setMargin(0); runHelperLayout->setSpacing(0); - QHBoxLayout *buildHelperLayout = new QHBoxLayout; - buildHelperLayout->setMargin(0); - buildHelperLayout->setSpacing(0); - - buildHelperLayout->addWidget(m_buildComboBox); runHelperLayout->addWidget(m_runComboBox); QFormLayout *formLayout = new QFormLayout; - QLabel *lbl = new QLabel(tr("Build:")); - lbl->setIndent(6); - formLayout->addRow(lbl, buildHelperLayout); + QLabel *lbl; + if (hasBuildConfiguration()) { + lbl = new QLabel(tr("Build:")); + lbl->setIndent(6); + formLayout->addRow(lbl, buildHelperLayout); + } lbl = new QLabel(tr("Run:")); lbl->setIndent(6); formLayout->addRow(lbl, runHelperLayout); @@ -95,77 +200,90 @@ MiniTargetWidget::MiniTargetWidget(Project *project, QWidget *parent) : gridLayout->addLayout(formLayout, 1, 0); } +ProjectExplorer::Target *MiniTargetWidget::target() const +{ + return m_target; +} + void MiniTargetWidget::setActiveBuildConfiguration(int index) { ProjectExplorer::BuildConfiguration* bc = m_buildComboBox->itemData(index).value<ProjectExplorer::BuildConfiguration*>(); - m_project->setActiveBuildConfiguration(bc); + m_target->setActiveBuildConfiguration(bc); emit activeBuildConfigurationChanged(bc); } void MiniTargetWidget::setActiveRunConfiguration(int index) { - m_project->setActiveRunConfiguration( + m_target->setActiveRunConfiguration( m_runComboBox->itemData(index).value<ProjectExplorer::RunConfiguration*>()); } void MiniTargetWidget::setActiveBuildConfiguration() { + QTC_ASSERT(m_buildComboBox, return) m_buildComboBox->setCurrentIndex(m_buildComboBox->findData( - QVariant::fromValue(m_project->activeBuildConfiguration()))); + QVariant::fromValue(m_target->activeBuildConfiguration()))); } void MiniTargetWidget::setActiveRunConfiguration() { m_runComboBox->setCurrentIndex(m_runComboBox->findData( - QVariant::fromValue(m_project->activeRunConfiguration()))); + QVariant::fromValue(m_target->activeRunConfiguration()))); } -void MiniTargetWidget::addRunConfiguration(ProjectExplorer::RunConfiguration* runConfig) +void MiniTargetWidget::addRunConfiguration(ProjectExplorer::RunConfiguration* rc) { - connect(runConfig, SIGNAL(displayNameChanged()), SLOT(updateDisplayName())); - m_runComboBox->addItem(runConfig->displayName(), QVariant::fromValue(runConfig)); - if (m_project->activeRunConfiguration() == runConfig) + connect(rc, SIGNAL(displayNameChanged()), SLOT(updateDisplayName())); + m_runComboBox->addItem(rc->displayName(), QVariant::fromValue(rc)); + if (m_target->activeRunConfiguration() == rc) m_runComboBox->setCurrentIndex(m_runComboBox->count()-1); } -void MiniTargetWidget::removeRunConfiguration(ProjectExplorer::RunConfiguration* runConfig) +void MiniTargetWidget::removeRunConfiguration(ProjectExplorer::RunConfiguration* rc) { - m_runComboBox->removeItem(m_runComboBox->findData(QVariant::fromValue(runConfig))); + m_runComboBox->removeItem(m_runComboBox->findData(QVariant::fromValue(rc))); } -void MiniTargetWidget::addBuildConfiguration(ProjectExplorer::BuildConfiguration* buildConfig) +void MiniTargetWidget::addBuildConfiguration(ProjectExplorer::BuildConfiguration* bc) { - connect(buildConfig, SIGNAL(displayNameChanged()), SLOT(updateDisplayName())); - m_buildComboBox->addItem(buildConfig->displayName(), QVariant::fromValue(buildConfig)); - if (m_project->activeBuildConfiguration() == buildConfig) + QTC_ASSERT(m_buildComboBox, return); + connect(bc, SIGNAL(displayNameChanged()), SLOT(updateDisplayName())); + m_buildComboBox->addItem(bc->displayName(), QVariant::fromValue(bc)); + if (m_target->activeBuildConfiguration() == bc) m_buildComboBox->setCurrentIndex(m_buildComboBox->count()-1); } -void MiniTargetWidget::removeBuildConfiguration(ProjectExplorer::BuildConfiguration* buildConfig) +void MiniTargetWidget::removeBuildConfiguration(ProjectExplorer::BuildConfiguration* bc) { - m_buildComboBox->removeItem(m_buildComboBox->findData(QVariant::fromValue(buildConfig))); + QTC_ASSERT(m_buildComboBox, return); + m_buildComboBox->removeItem(m_buildComboBox->findData(QVariant::fromValue(bc))); } void MiniTargetWidget::updateDisplayName() { QObject *obj = sender(); - if (RunConfiguration* runConfig = qobject_cast<RunConfiguration*>(obj)) - { - m_runComboBox->setItemText(m_runComboBox->findData(QVariant::fromValue(runConfig)), - runConfig->displayName()); - } else if (BuildConfiguration* buildConfig = qobject_cast<BuildConfiguration*>(obj)) - { - m_buildComboBox->setItemText(m_buildComboBox->findData(QVariant::fromValue(buildConfig)), - buildConfig->displayName()); + RunConfiguration *rc = qobject_cast<RunConfiguration*>(obj); + BuildConfiguration *bc = qobject_cast<BuildConfiguration*>(obj); + if (rc) { + m_runComboBox->setItemText(m_runComboBox->findData(QVariant::fromValue(rc)), + rc->displayName()); + } else if (bc) { + m_buildComboBox->setItemText(m_buildComboBox->findData(QVariant::fromValue(bc)), + bc->displayName()); } } +bool MiniTargetWidget::hasBuildConfiguration() const +{ + return (m_target->buildConfigurationFactory() != 0); +} + MiniProjectTargetSelector::MiniProjectTargetSelector(QAction *targetSelectorAction, QWidget *parent) : QWidget(parent), m_projectAction(targetSelectorAction) { setWindowFlags(Qt::Popup); - setFocusPolicy(Qt::NoFocus); + setFocusPolicy(Qt::WheelFocus); targetSelectorAction->setIcon(style()->standardIcon(QStyle::SP_ComputerIcon)); targetSelectorAction->setProperty("titledAction", true); @@ -187,18 +305,23 @@ MiniProjectTargetSelector::MiniProjectTargetSelector(QAction *targetSelectorActi f.setBold(true); lbl->setFont(f); m_projectsBox = new QComboBox; + m_projectsBox->setObjectName(QLatin1String("ProjectsBox")); + m_projectsBox->setFocusPolicy(Qt::WheelFocus); m_projectsBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); m_projectsBox->setMaximumWidth(200); + m_projectsBox->installEventFilter(this); toolLayout->addWidget(lbl); toolLayout->addWidget(new Utils::StyledSeparator); toolLayout->addWidget(m_projectsBox); m_widgetStack = new QStackedWidget; - m_widgetStack->setFocusPolicy(Qt::NoFocus); + m_widgetStack->setFocusPolicy(Qt::WheelFocus); + m_widgetStack->installEventFilter(this); layout->addWidget(m_widgetStack); - connect(m_projectsBox, SIGNAL(activated(int)), this, SLOT(emitStartupProjectChanged(int))); + connect(m_projectsBox, SIGNAL(activated(int)), + SLOT(emitStartupProjectChanged(int))); } void MiniProjectTargetSelector::setVisible(bool visible) @@ -211,46 +334,98 @@ void MiniProjectTargetSelector::setVisible(bool visible) move(moveTo); } QWidget::setVisible(visible); + if (m_widgetStack->currentWidget()) + m_widgetStack->currentWidget()->setFocus(); } void MiniProjectTargetSelector::addProject(ProjectExplorer::Project* project) { QTC_ASSERT(project, return); ProjectListWidget *targetList = new ProjectListWidget(project); + targetList->installEventFilter(this); targetList->setStyleSheet(QString::fromLatin1("QListWidget { background: %1; border: none; }") .arg(Utils::StyleHelper::baseColor().name())); int pos = m_widgetStack->addWidget(targetList); m_projectsBox->addItem(project->displayName(), QVariant::fromValue(project)); - QListWidgetItem *lwi = new QListWidgetItem(); - targetList->addItem(lwi); - MiniTargetWidget *targetWidget = new MiniTargetWidget(project); - targetWidget->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - // width==0 size hint to avoid horizontal scrolling in list widget - lwi->setSizeHint(QSize(0, targetWidget->sizeHint().height())); - targetList->setItemWidget(lwi, targetWidget); - targetList->setCurrentItem(lwi); + connect(project, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), + SLOT(updateAction())); - connect(project, SIGNAL(activeBuildConfigurationChanged()), SLOT(updateAction())); + connect(project, SIGNAL(addedTarget(ProjectExplorer::Target*)), + SLOT(addTarget(ProjectExplorer::Target*))); + connect(project, SIGNAL(removedTarget(ProjectExplorer::Target*)), + SLOT(removeTarget(ProjectExplorer::Target*))); if (project == ProjectExplorerPlugin::instance()->startupProject()) { m_projectsBox->setCurrentIndex(pos); m_widgetStack->setCurrentIndex(pos); } + + foreach (Target *t, project->targets()) + addTarget(t, t == project->activeTarget()); } void MiniProjectTargetSelector::removeProject(ProjectExplorer::Project* project) { - for (int i = 0; i < m_widgetStack->count(); ++i) { - ProjectListWidget *plw = qobject_cast<ProjectListWidget*>(m_widgetStack->widget(i)); - if (plw && plw->project() == project) { - m_projectsBox->removeItem(i); - delete plw; - } - } + int index = indexFor(project); + if (index < 0) + return; + ProjectListWidget *plw = qobject_cast<ProjectListWidget*>(m_widgetStack->widget(index)); + m_projectsBox->removeItem(index); + delete plw; } +void MiniProjectTargetSelector::addTarget(ProjectExplorer::Target *target, bool activeTarget) +{ + QTC_ASSERT(target, return); + + int index = indexFor(target->project()); + if (index < 0) + return; + + connect(target, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), + SLOT(updateAction())); + + ProjectListWidget *plw = qobject_cast<ProjectListWidget*>(m_widgetStack->widget(index)); + + QListWidgetItem *lwi = new QListWidgetItem(); + plw->addItem(lwi); + MiniTargetWidget *targetWidget = new MiniTargetWidget(target); + targetWidget->installEventFilter(this); + if (targetWidget->buildSettingsComboBox()) + targetWidget->buildSettingsComboBox()->installEventFilter(this); + if (targetWidget->runSettingsComboBox()) + targetWidget->runSettingsComboBox()->installEventFilter(this); + targetWidget->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + // width==0 size hint to avoid horizontal scrolling in list widget + lwi->setSizeHint(QSize(0, targetWidget->sizeHint().height())); + plw->setItemWidget(lwi, targetWidget); + + if (activeTarget) + plw->setCurrentItem(lwi, QItemSelectionModel::SelectCurrent); +} + +void MiniProjectTargetSelector::removeTarget(ProjectExplorer::Target *target) +{ + QTC_ASSERT(target, return); + + int index = indexFor(target->project()); + if (index < 0) + return; + + ProjectListWidget *plw = qobject_cast<ProjectListWidget*>(m_widgetStack->widget(index)); + for (int i = 0; i < plw->count(); ++i) { + QListWidgetItem *itm(plw->item(i)); + MiniTargetWidget *mtw(qobject_cast<MiniTargetWidget *>(plw->itemWidget(itm))); + if (!mtw) + continue; + if (target != mtw->target()) + continue; + delete plw->takeItem(i); + delete mtw; + } +} void MiniProjectTargetSelector::updateAction() { @@ -261,12 +436,29 @@ void MiniProjectTargetSelector::updateAction() if (project) { projectName = project->displayName(); - if (BuildConfiguration* bc = project->activeBuildConfiguration()) - buildConfig = bc->displayName(); + + if (project->activeTarget() && project->activeTarget()->activeBuildConfiguration()) { + if (BuildConfiguration* bc = project->activeTarget()->activeBuildConfiguration()) + buildConfig = bc->displayName(); + } } m_projectAction->setProperty("heading", projectName); m_projectAction->setProperty("subtitle", buildConfig); - m_projectAction->setIcon(m_projectAction->icon()); // HACK TO FORCE UPDATE + if (project && + project->activeTarget()) + m_projectAction->setIcon(project->activeTarget()->icon()); + else + m_projectAction->setIcon(m_projectAction->icon()); // Hack to force update! +} + +int MiniProjectTargetSelector::indexFor(ProjectExplorer::Project *project) const +{ + for (int i = 0; i < m_widgetStack->count(); ++i) { + ProjectListWidget *plw = qobject_cast<ProjectListWidget*>(m_widgetStack->widget(i)); + if (plw && plw->project() == project) + return i; + } + return -1; } void MiniProjectTargetSelector::emitStartupProjectChanged(int index) @@ -287,3 +479,48 @@ void MiniProjectTargetSelector::changeStartupProject(ProjectExplorer::Project *p } updateAction(); } + +bool MiniProjectTargetSelector::eventFilter(QObject *o, QEvent *ev) +{ + switch(ev->type()) + { + case QEvent::KeyPress: { + + QKeyEvent *kev = static_cast<QKeyEvent*>(ev); + + if (kev->key() == Qt::Key_Tab) { + if(o == m_projectsBox) { + if (m_widgetStack->currentWidget()) + m_widgetStack->currentWidget()->setFocus(); + return true; + } else { + m_projectsBox->setFocus(); + return true; + } + } + + if (o == m_widgetStack->currentWidget()) { + if (kev->key() == Qt::Key_Return) { + hide(); + return true; + } + + ProjectListWidget *plw = qobject_cast<ProjectListWidget*>(m_widgetStack->currentWidget()); + if (kev->key() == Qt::Key_B) + { + plw->setBuildComboPopup(); + return true; + } + if (kev->key() == Qt::Key_R) + { + plw->setRunComboPopup(); + return true; + } + } + } + default: + return false; + + } + return false; +} diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.h b/src/plugins/projectexplorer/miniprojecttargetselector.h index 2759f4accd..dede1c4c66 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.h +++ b/src/plugins/projectexplorer/miniprojecttargetselector.h @@ -1,3 +1,32 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + #ifndef MINIPROJECTTARGETSELECTOR_H #define MINIPROJECTTARGETSELECTOR_H @@ -12,7 +41,9 @@ QT_END_NAMESPACE namespace ProjectExplorer { class Project; +class Target; class RunConfiguration; +class Target; class BuildConfiguration; namespace Internal { @@ -26,28 +57,27 @@ private: ProjectExplorer::Project* m_project; public: - ProjectListWidget(ProjectExplorer::Project *project, QWidget *parent = 0) - : QListWidget(parent), m_project(project) - { - setFocusPolicy(Qt::NoFocus); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setAlternatingRowColors(false); - } - - ProjectExplorer::Project *project() const - { - return m_project; - } + ProjectListWidget(ProjectExplorer::Project *project, QWidget *parent = 0); + + QSize sizeHint() const; + + void setBuildComboPopup(); + void setRunComboPopup(); + + ProjectExplorer::Project *project() const; +private slots: + void setTarget(int index); }; class MiniTargetWidget : public QWidget { Q_OBJECT public: - // TODO: Pass target instead of project - MiniTargetWidget(Project *project, QWidget *parent = 0); + MiniTargetWidget(ProjectExplorer::Target *target, QWidget *parent = 0); + ProjectExplorer::Target *target() const; + bool hasBuildConfiguration() const; private slots: void addRunConfiguration(ProjectExplorer::RunConfiguration *runConfig); @@ -70,7 +100,11 @@ private: QLabel *m_targetIcon; QComboBox *m_runComboBox; QComboBox *m_buildComboBox; - ProjectExplorer::Project* m_project; + ProjectExplorer::Target *m_target; + +public: + QComboBox *runSettingsComboBox() const { return m_runComboBox; } + QComboBox *buildSettingsComboBox() const { return m_buildComboBox; } }; // main class @@ -79,25 +113,33 @@ class MiniProjectTargetSelector : public QWidget { Q_OBJECT public: - MiniProjectTargetSelector(QAction *projectAction,QWidget *parent = 0); + MiniProjectTargetSelector(QAction *projectAction, QWidget *parent = 0); void setVisible(bool visible); +protected: + bool eventFilter(QObject *o, QEvent *ev); + signals: void startupProjectChanged(ProjectExplorer::Project *project); private slots: void addProject(ProjectExplorer::Project *project); void removeProject(ProjectExplorer::Project *project); + void addTarget(ProjectExplorer::Target *target, bool isActiveTarget = false); + void removeTarget(ProjectExplorer::Target *target); void emitStartupProjectChanged(int index); void changeStartupProject(ProjectExplorer::Project *project); void updateAction(); private: + int indexFor(ProjectExplorer::Project *project) const; + QAction *m_projectAction; QComboBox *m_projectsBox; QStackedWidget *m_widgetStack; }; -}; -}; +} // namespace Internal +} // namespace ProjectExplorer + #endif // MINIPROJECTTARGETSELECTOR_H diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index c743173088..1537d5d9e7 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -29,33 +29,24 @@ #include "project.h" -#include "buildconfiguration.h" +#include "editorconfiguration.h" #include "environment.h" -#include "projectnodes.h" -#include "buildstep.h" #include "projectexplorer.h" -#include "runconfiguration.h" +#include "projectnodes.h" +#include "target.h" #include "userfileaccessor.h" -#include "editorconfiguration.h" #include <coreplugin/ifile.h> #include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> -#include <QtCore/QDebug> -#include <QtCore/QTextCodec> - using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; namespace { -const char * const ACTIVE_BC_KEY("ProjectExplorer.Project.ActiveBuildConfiguration"); -const char * const BC_KEY_PREFIX("ProjectExplorer.Project.BuildConfiguration."); -const char * const BC_COUNT_KEY("ProjectExplorer.Project.BuildConfigurationCount"); - -const char * const ACTIVE_RC_KEY("ProjectExplorer.Project.ActiveRunConfiguration"); -const char * const RC_KEY_PREFIX("ProjectExplorer.Project.RunConfiguration."); -const char * const RC_COUNT_KEY("ProjectExplorer.Project.RunConfigurationCount"); +const char * const ACTIVE_TARGET_KEY("ProjectExplorer.Project.ActiveTarget"); +const char * const TARGET_KEY_PREFIX("ProjectExplorer.Project.Target."); +const char * const TARGET_COUNT_KEY("ProjectExplorer.Project.TargetCount"); const char * const EDITOR_SETTINGS_KEY("ProjectExplorer.Project.EditorSettings"); } // namespace @@ -65,19 +56,23 @@ const char * const EDITOR_SETTINGS_KEY("ProjectExplorer.Project.EditorSettings") // ------------------------------------------------------------------------- Project::Project() : - m_activeBuildConfiguration(0), - m_activeRunConfiguration(0), + m_activeTarget(0), m_editorConfiguration(new EditorConfiguration()) { } Project::~Project() { - qDeleteAll(m_buildConfigurations); - qDeleteAll(m_runConfigurations); + qDeleteAll(m_targets); delete m_editorConfiguration; } +bool Project::hasActiveBuildSettings() const +{ + return activeTarget() && + activeTarget()->buildConfigurationFactory(); +} + QString Project::makeUnique(const QString &preferredName, const QStringList &usedNames) { if (!usedNames.contains(preferredName)) @@ -89,59 +84,112 @@ QString Project::makeUnique(const QString &preferredName, const QStringList &use return tryName; } -void Project::addBuildConfiguration(BuildConfiguration *configuration) +QSet<QString> Project::supportedTargetIds() const +{ + return m_supportedTargetIds; +} + +QSet<QString> Project::possibleTargetIds() const +{ + QSet<QString> result(m_supportedTargetIds); + foreach (ProjectExplorer::Target *t, targets()) + result.remove(t->id()); + + return result; +} + +bool Project::canAddTarget(const QString &id) const { - QTC_ASSERT(configuration && !m_buildConfigurations.contains(configuration), return); + return possibleTargetIds().contains(id); +} + +void Project::setSupportedTargetIds(const QSet<QString> &ids) +{ + if (ids == m_supportedTargetIds) + return; + + m_supportedTargetIds = ids; + emit supportedTargetIdsChanged(); +} + +void Project::changeEnvironment() +{ + Target *t(qobject_cast<Target *>(sender())); + if (t == activeTarget()) + emit environmentChanged(); +} + + +void Project::addTarget(Target *t) +{ + QTC_ASSERT(t && !m_targets.contains(t), return); + QTC_ASSERT(!target(t->id()), return); + Q_ASSERT(t->project() == this); // Check that we don't have a configuration with the same displayName - QString configurationDisplayName = configuration->displayName(); + QString targetDisplayName = t->displayName(); QStringList displayNames; - foreach (const BuildConfiguration *bc, m_buildConfigurations) - displayNames << bc->displayName(); - configurationDisplayName = makeUnique(configurationDisplayName, displayNames); - configuration->setDisplayName(configurationDisplayName); + foreach (const Target *target, m_targets) + displayNames << target->displayName(); + targetDisplayName = makeUnique(targetDisplayName, displayNames); + t->setDisplayName(targetDisplayName); // add it - m_buildConfigurations.push_back(configuration); - - emit addedBuildConfiguration(configuration); + m_targets.push_back(t); + connect(t, SIGNAL(environmentChanged()), + SLOT(changeEnvironment())); + emit addedTarget(t); + + // check activeTarget: + if (activeTarget() == 0) + setActiveTarget(t); } -void Project::removeBuildConfiguration(BuildConfiguration *configuration) +void Project::removeTarget(Target *target) { - //todo: this might be error prone - if (!m_buildConfigurations.contains(configuration)) - return; + QTC_ASSERT(target && m_targets.contains(target), return); - m_buildConfigurations.removeOne(configuration); + emit aboutToRemoveTarget(target); - emit removedBuildConfiguration(configuration); - delete configuration; + m_targets.removeOne(target); + + emit removedTarget(target); + if (target == activeTarget()) { + if (m_targets.isEmpty()) + setActiveTarget(0); + else + setActiveTarget(m_targets.at(0)); + } + delete target; } -QList<BuildConfiguration *> Project::buildConfigurations() const +QList<Target *> Project::targets() const { - return m_buildConfigurations; + return m_targets; } -BuildConfiguration *Project::activeBuildConfiguration() const +Target *Project::activeTarget() const { - return m_activeBuildConfiguration; + return m_activeTarget; } -void Project::setActiveBuildConfiguration(BuildConfiguration *configuration) +void Project::setActiveTarget(Target *target) { - if (!configuration || - m_activeBuildConfiguration == configuration || - !m_buildConfigurations.contains(configuration)) - return; - m_activeBuildConfiguration = configuration; - emit activeBuildConfigurationChanged(); + if ((!target && !m_targets.isEmpty()) || + (target && m_targets.contains(target) && m_activeTarget != target)) { + m_activeTarget = target; + emit activeTargetChanged(m_activeTarget); + emit environmentChanged(); + } } -bool Project::hasBuildSettings() const +Target *Project::target(const QString &id) const { - return true; + foreach (Target * target, m_targets) { + if (target->id() == id) + return target; + } + return 0; } void Project::saveSettings() @@ -164,19 +212,13 @@ QList<BuildConfigWidget*> Project::subConfigWidgets() QVariantMap Project::toMap() const { - const QList<BuildConfiguration *> bcs = buildConfigurations(); + const QList<Target *> ts = targets(); QVariantMap map; - map.insert(QLatin1String(ACTIVE_BC_KEY), bcs.indexOf(m_activeBuildConfiguration)); - map.insert(QLatin1String(BC_COUNT_KEY), bcs.size()); - for (int i = 0; i < bcs.size(); ++i) - map.insert(QString::fromLatin1(BC_KEY_PREFIX) + QString::number(i), bcs.at(i)->toMap()); - - const QList<RunConfiguration *> rcs = runConfigurations(); - map.insert(QLatin1String(ACTIVE_RC_KEY), rcs.indexOf(m_activeRunConfiguration)); - map.insert(QLatin1String(RC_COUNT_KEY), rcs.size()); - for (int i = 0; i < rcs.size(); ++i) - map.insert(QString::fromLatin1(RC_KEY_PREFIX) + QString::number(i), rcs.at(i)->toMap()); + map.insert(QLatin1String(ACTIVE_TARGET_KEY), ts.indexOf(m_activeTarget)); + map.insert(QLatin1String(TARGET_COUNT_KEY), ts.size()); + for (int i = 0; i < ts.size(); ++i) + map.insert(QString::fromLatin1(TARGET_KEY_PREFIX) + QString::number(i), ts.at(i)->toMap()); map.insert(QLatin1String(EDITOR_SETTINGS_KEY), m_editorConfiguration->toMap()); @@ -192,122 +234,29 @@ bool Project::fromMap(const QVariantMap &map) } bool ok; - int maxI(map.value(QLatin1String(BC_COUNT_KEY), 0).toInt(&ok)); + int maxI(map.value(QLatin1String(TARGET_COUNT_KEY), 0).toInt(&ok)); if (!ok || maxI < 0) maxI = 0; - int activeConfiguration(map.value(QLatin1String(ACTIVE_BC_KEY), 0).toInt(&ok)); - if (!ok || activeConfiguration < 0) - activeConfiguration = 0; - if (0 > activeConfiguration || maxI < activeConfiguration) - activeConfiguration = 0; + int active(map.value(QLatin1String(ACTIVE_TARGET_KEY), 0).toInt(&ok)); + if (!ok || active < 0) + active = 0; + if (0 > active || maxI < active) + active = 0; for (int i = 0; i < maxI; ++i) { - const QString key(QString::fromLatin1(BC_KEY_PREFIX) + QString::number(i)); + const QString key(QString::fromLatin1(TARGET_KEY_PREFIX) + QString::number(i)); if (!map.contains(key)) return false; - if (!buildConfigurationFactory()->canRestore(this, map.value(key).toMap())) - return false; - BuildConfiguration *bc(buildConfigurationFactory()->restore(this, map.value(key).toMap())); - if (!bc) + Target *t(targetFactory()->restore(this, map.value(key).toMap())); + if (!t) continue; - addBuildConfiguration(bc); - if (i == activeConfiguration) - setActiveBuildConfiguration(bc); + addTarget(t); + if (i == active) + setActiveTarget(t); } - if (!activeBuildConfiguration() && !m_buildConfigurations.isEmpty()) - setActiveBuildConfiguration(m_buildConfigurations.at(0)); - - maxI = map.value(QLatin1String(RC_COUNT_KEY), 0).toInt(&ok); - if (!ok || maxI < 0) - maxI = 0; - activeConfiguration = map.value(QLatin1String(ACTIVE_RC_KEY), 0).toInt(&ok); - if (!ok || activeConfiguration < 0) - activeConfiguration = 0; - if (0 > activeConfiguration || maxI < activeConfiguration) - activeConfiguration = 0; - - QList<IRunConfigurationFactory *> - factories(ExtensionSystem::PluginManager::instance()-> - getObjects<IRunConfigurationFactory>()); - - for (int i = 0; i < maxI; ++i) { - const QString key(QString::fromLatin1(RC_KEY_PREFIX) + QString::number(i)); - if (!map.contains(key)) - return false; - - QVariantMap valueMap(map.value(key).toMap()); - IRunConfigurationFactory *factory(0); - foreach (IRunConfigurationFactory *f, factories) { - if (!f->canRestore(this, valueMap)) - continue; - factory = f; - break; - } - if (!factory) - return false; - - RunConfiguration *rc(factory->restore(this, valueMap)); - if (!rc) - return false; - addRunConfiguration(rc); - if (i == activeConfiguration) - setActiveRunConfiguration(rc); - } - - if (!activeRunConfiguration() && !m_runConfigurations.isEmpty()) - setActiveRunConfiguration(m_runConfigurations.at(0)); - return true; } -QList<RunConfiguration *> Project::runConfigurations() const -{ - return m_runConfigurations; -} - -void Project::addRunConfiguration(RunConfiguration* runConfiguration) -{ - QTC_ASSERT(runConfiguration && !m_runConfigurations.contains(runConfiguration), return); - - m_runConfigurations.push_back(runConfiguration); - emit addedRunConfiguration(runConfiguration); -} - -void Project::removeRunConfiguration(RunConfiguration* runConfiguration) -{ - if(!m_runConfigurations.contains(runConfiguration)) { - qWarning()<<"Not removing runConfiguration"<<runConfiguration->displayName()<<"becasue it doesn't exist"; - return; - } - - if (m_activeRunConfiguration == runConfiguration) { - if (m_runConfigurations.size() <= 1) - setActiveRunConfiguration(0); - else if (m_runConfigurations.at(0) == m_activeRunConfiguration) - setActiveRunConfiguration(m_runConfigurations.at(1)); - else - setActiveRunConfiguration(m_runConfigurations.at(0)); - } - - m_runConfigurations.removeOne(runConfiguration); - emit removedRunConfiguration(runConfiguration); - delete runConfiguration; -} - -RunConfiguration* Project::activeRunConfiguration() const -{ - return m_activeRunConfiguration; -} - -void Project::setActiveRunConfiguration(RunConfiguration* runConfiguration) -{ - if (runConfiguration == m_activeRunConfiguration) - return; - Q_ASSERT(m_runConfigurations.contains(runConfiguration) || runConfiguration == 0); - m_activeRunConfiguration = runConfiguration; - emit activeRunConfigurationChanged(); -} - EditorConfiguration *Project::editorConfiguration() const { return m_editorConfiguration; @@ -332,4 +281,3 @@ QString Project::generatedUiHeader(const QString & /* formFile */) const { return QString(); } - diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 3d163912b1..f9b25b9f8b 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -31,14 +31,12 @@ #define PROJECT_H #include "projectexplorer_export.h" +#include "target.h" #include <QtCore/QObject> +#include <QtCore/QSet> #include <QtGui/QFileSystemModel> -QT_BEGIN_NAMESPACE -class QMenu; -QT_END_NAMESPACE - namespace Core { class IFile; } @@ -46,17 +44,12 @@ class IFile; namespace ProjectExplorer { class BuildManager; -class BuildStep; class BuildConfigWidget; class IProjectManager; -class RunConfiguration; class EditorConfiguration; -class Environment; class ProjectNode; -class PersistentSettingsWriter; -class PersistentSettingsReader; -class BuildConfiguration; -class IBuildConfigurationFactory; +class Target; +class ITargetFactory; class PROJECTEXPLORER_EXPORT Project : public QObject @@ -81,28 +74,29 @@ public: virtual QList<Project *> dependsOn() = 0; //NBS TODO implement dependsOn virtual bool isApplication() const = 0; + bool hasActiveBuildSettings() const; - virtual bool hasBuildSettings() const; - - // Build configuration - void addBuildConfiguration(BuildConfiguration *configuration); - void removeBuildConfiguration(BuildConfiguration *configuration); + // EditorConfiguration: + EditorConfiguration *editorConfiguration() const; - QList<BuildConfiguration *> buildConfigurations() const; - BuildConfiguration *activeBuildConfiguration() const; - void setActiveBuildConfiguration(BuildConfiguration *configuration); + // Target: - virtual IBuildConfigurationFactory *buildConfigurationFactory() const = 0; + // Note: You can only add a specific kind of target (identified by id) + // once. + QSet<QString> supportedTargetIds() const; + QSet<QString> possibleTargetIds() const; + bool canAddTarget(const QString &id) const; - // Running - QList<RunConfiguration *> runConfigurations() const; - void addRunConfiguration(RunConfiguration* runConfiguration); - void removeRunConfiguration(RunConfiguration* runConfiguration); + void addTarget(Target *target); + void removeTarget(Target *target); - RunConfiguration* activeRunConfiguration() const; - void setActiveRunConfiguration(RunConfiguration* runConfiguration); + QList<Target *> targets() const; + // Note: activeTarget can be 0 (if no targets are defined). + Target *activeTarget() const; + void setActiveTarget(Target *target); + Target *target(const QString &id) const; - EditorConfiguration *editorConfiguration() const; + virtual ITargetFactory *targetFactory() const = 0; void saveSettings(); bool restoreSettings(); @@ -117,14 +111,14 @@ public: // TODO: generalize to find source(s) of generated files? virtual QString generatedUiHeader(const QString &formFile) const; + static QString makeUnique(const QString &preferedName, const QStringList &usedNames); + // C++ specific // TODO do a C++ project as a base ? virtual QByteArray predefinedMacros(const QString &fileName) const; virtual QStringList includePaths(const QString &fileName) const; virtual QStringList frameworkPaths(const QString &fileName) const; - static QString makeUnique(const QString &preferedName, const QStringList &usedNames); - // Serialize all data into a QVariantMap. This map is then saved // in the .user file of the project. // @@ -138,17 +132,19 @@ public: signals: void fileListChanged(); -// TODO clean up signal names -// might be better to also have aboutToRemove signals - void activeBuildConfigurationChanged(); - void activeRunConfigurationChanged(); - void runConfigurationsEnabledStateChanged(); + // Note: activeTarget can be 0 (if no targets are defined). + void activeTargetChanged(ProjectExplorer::Target *target); + + void aboutToRemoveTarget(ProjectExplorer::Target *target); + void removedTarget(ProjectExplorer::Target *target); + void addedTarget(ProjectExplorer::Target *target); - void removedRunConfiguration(ProjectExplorer::RunConfiguration *rc); - void addedRunConfiguration(ProjectExplorer::RunConfiguration *rc); + void supportedTargetIdsChanged(); - void removedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); - void addedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); + /// convenience signal emitted if the activeBuildConfiguration emits environmentChanged + /// or if the activeBuildConfiguration changes + /// (which theoretically might happen due to the active target changing). + void environmentChanged(); protected: // restore all data from the map. @@ -156,11 +152,15 @@ protected: // Note: Do not forget to call your base class' fromMap method! virtual bool fromMap(const QVariantMap &map); + void setSupportedTargetIds(const QSet<QString> &ids); + +private slots: + void changeEnvironment(); + private: - QList<BuildConfiguration *> m_buildConfigurations; - BuildConfiguration *m_activeBuildConfiguration; - QList<RunConfiguration *> m_runConfigurations; - RunConfiguration* m_activeRunConfiguration; + QSet<QString> m_supportedTargetIds; + QList<Target *> m_targets; + Target *m_activeTarget; EditorConfiguration *m_editorConfiguration; }; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 0ccccde586..07d7cc18de 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -28,8 +28,11 @@ **************************************************************************/ #include "projectexplorer.h" + #include "project.h" #include "projectexplorersettings.h" +#include "target.h" +#include "targetsettingspanel.h" #include "applicationrunconfiguration.h" #include "allprojectsfilter.h" #include "allprojectsfind.h" @@ -57,6 +60,7 @@ #include "scriptwrappers.h" #include "session.h" #include "sessiondialog.h" +#include "target.h" #include "projectexplorersettingspage.h" #include "projectwelcomepage.h" #include "projectwelcomepagewidget.h" @@ -290,6 +294,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er addAutoReleasedObject(new BuildSettingsPanelFactory); addAutoReleasedObject(new RunSettingsPanelFactory); + addAutoReleasedObject(new TargetSettingsPanelFactory); addAutoReleasedObject(new EditorSettingsPanelFactory); addAutoReleasedObject(new DependenciesPanelFactory(d->m_session)); @@ -695,7 +700,9 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er d->m_targetSelector = new Internal::MiniProjectTargetSelector(d->m_projectSelectorAction, mainWindow); connect(d->m_projectSelectorAction, SIGNAL(triggered()), d->m_targetSelector, SLOT(show())); modeManager->addProjectSelector(d->m_projectSelectorAction); - + cmd = am->registerAction(d->m_projectSelectorAction, ProjectExplorer::Constants::SELECTTARGET, + globalcontext); + cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+T"))); connect(d->m_session, SIGNAL(projectAdded(ProjectExplorer::Project*)), d->m_targetSelector, SLOT(addProject(ProjectExplorer::Project*))); @@ -1250,7 +1257,7 @@ void ProjectExplorerPlugin::buildStateChanged(Project * pro) void ProjectExplorerPlugin::executeRunConfiguration(RunConfiguration *runConfiguration, const QString &runMode) { if (IRunControlFactory *runControlFactory = findRunControlFactory(runConfiguration, runMode)) { - emit aboutToExecuteProject(runConfiguration->project()); + emit aboutToExecuteProject(runConfiguration->target()->project()); RunControl *control = runControlFactory->create(runConfiguration, runMode); startRunControl(control, runMode); @@ -1359,7 +1366,7 @@ void ProjectExplorerPlugin::updateActions() bool enableBuildActions = d->m_currentProject && ! (d->m_buildManager->isBuilding(d->m_currentProject)) - && d->m_currentProject->hasBuildSettings(); + && d->m_currentProject->hasActiveBuildSettings(); bool hasProjects = !d->m_session->projects().isEmpty(); bool building = d->m_buildManager->isBuilding(); QString projectName = d->m_currentProject ? d->m_currentProject->displayName() : QString(); @@ -1438,7 +1445,7 @@ void ProjectExplorerPlugin::buildProjectOnly() qDebug() << "ProjectExplorerPlugin::buildProjectOnly"; if (saveModifiedFiles()) - buildManager()->buildProject(d->m_currentProject->activeBuildConfiguration()); + buildManager()->buildProject(d->m_currentProject->activeTarget()->activeBuildConfiguration()); } void ProjectExplorerPlugin::buildProject() @@ -1449,7 +1456,7 @@ void ProjectExplorerPlugin::buildProject() if (saveModifiedFiles()) { QList<BuildConfiguration *> configurations; foreach (Project *pro, d->m_session->projectOrder(d->m_currentProject)) - configurations << pro->activeBuildConfiguration(); + configurations << pro->activeTarget()->activeBuildConfiguration(); d->m_buildManager->buildProjects(configurations); } @@ -1463,7 +1470,7 @@ void ProjectExplorerPlugin::buildSession() if (saveModifiedFiles()) { QList<BuildConfiguration *> configurations; foreach (Project *pro, d->m_session->projectOrder()) - configurations << pro->activeBuildConfiguration(); + configurations << pro->activeTarget()->activeBuildConfiguration(); d->m_buildManager->buildProjects(configurations); } } @@ -1474,8 +1481,8 @@ void ProjectExplorerPlugin::rebuildProjectOnly() qDebug() << "ProjectExplorerPlugin::rebuildProjectOnly"; if (saveModifiedFiles()) { - d->m_buildManager->cleanProject(d->m_currentProject->activeBuildConfiguration()); - d->m_buildManager->buildProject(d->m_currentProject->activeBuildConfiguration()); + d->m_buildManager->cleanProject(d->m_currentProject->activeTarget()->activeBuildConfiguration()); + d->m_buildManager->buildProject(d->m_currentProject->activeTarget()->activeBuildConfiguration()); } } @@ -1488,7 +1495,7 @@ void ProjectExplorerPlugin::rebuildProject() const QList<Project *> &projects = d->m_session->projectOrder(d->m_currentProject); QList<BuildConfiguration *> configurations; foreach (Project *pro, projects) - configurations << pro->activeBuildConfiguration(); + configurations << pro->activeTarget()->activeBuildConfiguration(); d->m_buildManager->cleanProjects(configurations); d->m_buildManager->buildProjects(configurations); @@ -1504,7 +1511,7 @@ void ProjectExplorerPlugin::rebuildSession() const QList<Project *> & projects = d->m_session->projectOrder(); QList<BuildConfiguration *> configurations; foreach (Project *pro, projects) - configurations << pro->activeBuildConfiguration(); + configurations << pro->activeTarget()->activeBuildConfiguration(); d->m_buildManager->cleanProjects(configurations); d->m_buildManager->buildProjects(configurations); @@ -1517,7 +1524,7 @@ void ProjectExplorerPlugin::cleanProjectOnly() qDebug() << "ProjectExplorerPlugin::cleanProjectOnly"; if (saveModifiedFiles()) - d->m_buildManager->cleanProject(d->m_currentProject->activeBuildConfiguration()); + d->m_buildManager->cleanProject(d->m_currentProject->activeTarget()->activeBuildConfiguration()); } void ProjectExplorerPlugin::cleanProject() @@ -1529,7 +1536,7 @@ void ProjectExplorerPlugin::cleanProject() const QList<Project *> & projects = d->m_session->projectOrder(d->m_currentProject); QList<BuildConfiguration *> configurations; foreach (Project *pro, projects) - configurations << pro->activeBuildConfiguration(); + configurations << pro->activeTarget()->activeBuildConfiguration(); d->m_buildManager->cleanProjects(configurations); } } @@ -1543,7 +1550,7 @@ void ProjectExplorerPlugin::cleanSession() const QList<Project *> & projects = d->m_session->projectOrder(); QList<BuildConfiguration *> configurations; foreach (Project *pro, projects) - configurations << pro->activeBuildConfiguration(); + configurations << pro->activeTarget()->activeBuildConfiguration(); d->m_buildManager->cleanProjects(configurations); } } @@ -1563,19 +1570,19 @@ void ProjectExplorerPlugin::runProjectImpl(Project *pro, QString mode) if (!pro) return; - if (d->m_projectExplorerSettings.buildBeforeRun && pro->hasBuildSettings()) { - if (!pro->activeRunConfiguration()->isEnabled()) { + if (d->m_projectExplorerSettings.buildBeforeRun && pro->hasActiveBuildSettings()) { + if (!pro->activeTarget()->activeRunConfiguration()->isEnabled()) { if (!showBuildConfigDialog()) return; } if (saveModifiedFiles()) { d->m_runMode = mode; - d->m_delayedRunConfiguration = pro->activeRunConfiguration(); + d->m_delayedRunConfiguration = pro->activeTarget()->activeRunConfiguration(); const QList<Project *> & projects = d->m_session->projectOrder(pro); QList<BuildConfiguration *> configurations; foreach(Project *pro, projects) - configurations << pro->activeBuildConfiguration(); + configurations << pro->activeTarget()->activeBuildConfiguration(); d->m_buildManager->buildProjects(configurations); updateToolBarActions(); @@ -1583,7 +1590,7 @@ void ProjectExplorerPlugin::runProjectImpl(Project *pro, QString mode) } else { // TODO this ignores RunConfiguration::isEnabled() if (saveModifiedFiles()) - executeRunConfiguration(pro->activeRunConfiguration(), mode); + executeRunConfiguration(pro->activeTarget()->activeRunConfiguration(), mode); } } @@ -1608,7 +1615,7 @@ bool ProjectExplorerPlugin::showBuildConfigDialog() switch (result) { case BuildConfigDialog::ChangeBuild: if (otherConfig) { - pro->setActiveBuildConfiguration(otherConfig); + pro->activeTarget()->setActiveBuildConfiguration(otherConfig); return true; } return false; @@ -1652,15 +1659,21 @@ void ProjectExplorerPlugin::startupProjectChanged() return; if (previousStartupProject) { - disconnect(previousStartupProject, SIGNAL(activeRunConfigurationChanged()), + disconnect(previousStartupProject, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), this, SLOT(updateToolBarActions())); + foreach (Target *t, previousStartupProject->targets()) + disconnect(t, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), + this, SLOT(updateActions())); } previousStartupProject = project; if (project) { - connect(project, SIGNAL(activeRunConfigurationChanged()), + connect(project, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), this, SLOT(updateToolBarActions())); + foreach (Target *t, project->targets()) + connect(t, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), + this, SLOT(updateActions())); } updateToolBarActions(); @@ -1680,12 +1693,21 @@ IRunControlFactory *ProjectExplorerPlugin::findRunControlFactory(RunConfiguratio void ProjectExplorerPlugin::updateToolBarActions() { const Project *project = startupProject(); - bool canRun = project && findRunControlFactory(project->activeRunConfiguration(), ProjectExplorer::Constants::RUNMODE); - const bool canDebug = project && !d->m_debuggingRunControl && findRunControlFactory(project->activeRunConfiguration(), ProjectExplorer::Constants::DEBUGMODE); + + if (!project || + !project->activeTarget() || + !project->activeTarget()->activeRunConfiguration()) { + d->m_runAction->setEnabled(false); + d->m_debugAction->setEnabled(false); + return; + } + + bool canRun = findRunControlFactory(project->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::RUNMODE); + const bool canDebug = !d->m_debuggingRunControl && findRunControlFactory(project->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::DEBUGMODE); const bool building = d->m_buildManager->isBuilding(); d->m_runAction->setEnabled(canRun && !building); - canRun = d->m_currentProject && findRunControlFactory(d->m_currentProject->activeRunConfiguration(), ProjectExplorer::Constants::RUNMODE); + canRun = d->m_currentProject && findRunControlFactory(d->m_currentProject->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::RUNMODE); d->m_runActionContextMenu->setEnabled(canRun && !building); d->m_debugAction->setEnabled(canDebug && !building); @@ -1959,8 +1981,8 @@ void ProjectExplorerPlugin::populateBuildConfigurationMenu() d->m_buildConfigurationActionGroup = new QActionGroup(d->m_buildConfigurationMenu); d->m_buildConfigurationMenu->clear(); if (Project *pro = d->m_currentProject) { - const BuildConfiguration *activeBC = pro->activeBuildConfiguration(); - foreach (BuildConfiguration *bc, pro->buildConfigurations()) { + const BuildConfiguration *activeBC = pro->activeTarget()->activeBuildConfiguration(); + foreach (BuildConfiguration *bc, pro->activeTarget()->buildConfigurations()) { QString displayName = bc->displayName(); QAction *act = new QAction(displayName, d->m_buildConfigurationActionGroup); if (debug) @@ -1981,7 +2003,7 @@ void ProjectExplorerPlugin::buildConfigurationMenuTriggered(QAction *action) if (debug) qDebug() << "ProjectExplorerPlugin::buildConfigurationMenuTriggered"; - d->m_currentProject->setActiveBuildConfiguration(action->data().value<BuildConfiguration *>()); + d->m_currentProject->activeTarget()->setActiveBuildConfiguration(action->data().value<BuildConfiguration *>()); } void ProjectExplorerPlugin::populateRunConfigurationMenu() @@ -1996,10 +2018,10 @@ void ProjectExplorerPlugin::populateRunConfigurationMenu() const Project *startupProject = d->m_session->startupProject(); RunConfiguration *activeRunConfiguration = 0; if (startupProject) - activeRunConfiguration = startupProject->activeRunConfiguration(); + activeRunConfiguration = startupProject->activeTarget()->activeRunConfiguration(); foreach (const Project *pro, d->m_session->projects()) { - foreach (RunConfiguration *runConfiguration, pro->runConfigurations()) { + foreach (RunConfiguration *runConfiguration, pro->activeTarget()->runConfigurations()) { const QString title = QString("%1 (%2)").arg(pro->displayName(), runConfiguration->displayName()); QAction *act = new QAction(title, d->m_runConfigurationActionGroup); act->setCheckable(true); @@ -2021,8 +2043,8 @@ void ProjectExplorerPlugin::runConfigurationMenuTriggered(QAction *action) qDebug() << "ProjectExplorerPlugin::runConfigurationMenuTriggered" << action; RunConfiguration *runConfiguration = action->data().value<RunConfiguration *>(); - runConfiguration->project()->setActiveRunConfiguration(runConfiguration); - setStartupProject(runConfiguration->project()); + runConfiguration->target()->project()->activeTarget()->setActiveRunConfiguration(runConfiguration); + setStartupProject(runConfiguration->target()->project()); } void ProjectExplorerPlugin::populateOpenWithMenu(QMenu *menu, const QString &fileName) @@ -2169,8 +2191,8 @@ BuildConfigDialog::BuildConfigDialog(Project *project, QWidget *parent) vlayout->addWidget(descriptiveText); m_configCombo = new QComboBox; - RunConfiguration *activeRun = m_project->activeRunConfiguration(); - foreach (BuildConfiguration *config, m_project->buildConfigurations()) { + RunConfiguration *activeRun = m_project->activeTarget()->activeRunConfiguration(); + foreach (BuildConfiguration *config, m_project->activeTarget()->buildConfigurations()) { if (activeRun->isEnabled(config)) { m_configCombo->addItem(config->displayName(), QVariant::fromValue(config)); } diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 517e2137d0..5858c5d652 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -218,6 +218,7 @@ private slots: void loadProject(const QString &project) { openProject(project); } void currentModeChanged(Core::IMode *mode); + void updateActions(); private: void runProjectImpl(Project *pro, QString mode); @@ -229,7 +230,6 @@ private: QStringList allFilesWithDependencies(Project *pro); IRunControlFactory *findRunControlFactory(RunConfiguration *config, const QString &mode); - void updateActions(); void addToRecentProjects(const QString &fileName, const QString &displayName); void updateWelcomePage(); Internal::ProjectFileFactory *findProjectFileFactory(const QString &filename) const; diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index febeae644b..cbdf7c71e0 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -12,6 +12,8 @@ HEADERS += projectexplorer.h \ projectwindow.h \ buildmanager.h \ compileoutputwindow.h \ + target.h \ + targetsettingspanel.h \ taskwindow.h \ outputwindow.h \ persistentsettings.h \ @@ -71,11 +73,14 @@ HEADERS += projectexplorer.h \ miniprojecttargetselector.h \ targetselector.h \ targetsettingswidget.h \ - doubletabwidget.h + doubletabwidget.h \ + addtargetdialog.h SOURCES += projectexplorer.cpp \ projectwindow.cpp \ buildmanager.cpp \ compileoutputwindow.cpp \ + target.cpp \ + targetsettingspanel.cpp \ ioutputparser.cpp \ projectconfiguration.cpp \ gnumakeparser.cpp \ @@ -130,7 +135,8 @@ SOURCES += projectexplorer.cpp \ miniprojecttargetselector.cpp \ targetselector.cpp \ targetsettingswidget.cpp \ - doubletabwidget.cpp + doubletabwidget.cpp \ + addtargetdialog.cpp FORMS += processstep.ui \ editorsettingspropertiespage.ui \ runsettingspropertiespage.ui \ @@ -140,22 +146,20 @@ FORMS += processstep.ui \ projectexplorersettingspage.ui \ projectwelcomepagewidget.ui \ targetsettingswidget.ui \ - doubletabwidget.ui + doubletabwidget.ui \ + addtargetdialog.ui win32 { SOURCES += applicationlauncher_win.cpp \ winguiprocess.cpp HEADERS += winguiprocess.h } -else:macx { +else:macx { SOURCES += applicationlauncher_x11.cpp LIBS += -framework \ Carbon } -else:unix { - SOURCES += applicationlauncher_x11.cpp -} - +else:unix:SOURCES += applicationlauncher_x11.cpp RESOURCES += projectexplorer.qrc DEFINES += PROJECTEXPLORER_LIBRARY OTHER_FILES += ProjectExplorer.pluginspec diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 95e227c26d..e6250cd26d 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -77,6 +77,9 @@ const char * const RENAMEFILE = "ProjectExplorer.RenameFile"; const char * const RUNMODE = "ProjectExplorer.RunMode"; const char * const DEBUGMODE = "ProjectExplorer.DebugMode"; +const char * const SELECTTARGET = "ProjectExplorer.SelectTarget"; + + // action priorities const int P_ACTION_RUN = 100; const int P_ACTION_DEBUG = 90; diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 76c08d4d4a..e85d5a836c 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -37,9 +37,13 @@ #include "projectexplorerconstants.h" #include "iprojectproperties.h" #include "session.h" +#include "target.h" #include "projecttreewidget.h" #include "runconfiguration.h" #include "buildconfiguration.h" +#include "buildsettingspropertiespage.h" +#include "runsettingspropertiespage.h" +#include "targetsettingspanel.h" #include <coreplugin/minisplitter.h> #include <coreplugin/fileiconprovider.h> @@ -68,8 +72,30 @@ const int ICON_SIZE(64); const int ABOVE_HEADING_MARGIN(10); const int ABOVE_CONTENTS_MARGIN(4); const int BELOW_CONTENTS_MARGIN(16); + +bool skipPanelFactory(Project *project, IPanelFactory *factory) +{ + bool simplifyTargets(project->supportedTargetIds().count() <= 1); + if (simplifyTargets) { + // Do not show the targets list: + if (factory->id() == QLatin1String(TARGETSETTINGS_PANEL_ID)) + return true; + // Skip build settigns if none are available anyway: + if (project->activeTarget() && + !project->activeTarget()->buildConfigurationFactory() && + factory->id() == QLatin1String(BUILDSETTINGS_PANEL_ID)) + return true; + } else { + // Skip panels embedded into the targets panel: + if (factory->id() == QLatin1String(BUILDSETTINGS_PANEL_ID) || + factory->id() == QLatin1String(RUNSETTINGS_PANEL_ID)) + return true; + } + return false; } +} // namespace + /// // OnePixelBlackLine /// @@ -135,10 +161,10 @@ void PanelsWidget::addPropertiesPanel(IPropertiesPanel *panel) { QTC_ASSERT(panel, return); - // icon: const int headerRow(m_layout->rowCount() - 1); m_layout->setRowStretch(headerRow, 0); + // icon: if (!panel->icon().isNull()) { QLabel *iconLabel = new QLabel(m_root); iconLabel->setPixmap(panel->icon().pixmap(ICON_SIZE, ICON_SIZE)); @@ -168,9 +194,11 @@ void PanelsWidget::addPropertiesPanel(IPropertiesPanel *panel) void PanelsWidget::addPanelWidget(IPropertiesPanel *panel, int row) { QWidget *widget = panel->widget(); - widget->setContentsMargins(m_layout->columnMinimumWidth(0), - ABOVE_CONTENTS_MARGIN, 0, - BELOW_CONTENTS_MARGIN); + int leftMargin = (panel->flags() & IPropertiesPanel::NoLeftMargin) + ? 0 : Constants::PANEL_LEFT_MARGIN; + widget->setContentsMargins(leftMargin, + ABOVE_CONTENTS_MARGIN, 0, + BELOW_CONTENTS_MARGIN); widget->setParent(m_root); m_layout->addWidget(widget, row, 0, 1, 2); @@ -186,7 +214,8 @@ void PanelsWidget::addPanelWidget(IPropertiesPanel *panel, int row) ProjectWindow::ProjectWindow(QWidget *parent) : QWidget(parent), - m_panelsWidget(0) + m_currentWidget(0), + m_currentPanel(0) { ProjectExplorer::SessionManager *session = ProjectExplorerPlugin::instance()->session(); @@ -252,11 +281,16 @@ void ProjectWindow::projectAdded(ProjectExplorer::Project *project) { QList<Project *> projects = ProjectExplorerPlugin::instance()->session()->projects(); int index = projects.indexOf(project); + if (index < 0) + return; + QStringList subtabs; foreach (IPanelFactory *panelFactory, ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>()) { - if (panelFactory->supports(project)) - subtabs << panelFactory->displayName(); + if (skipPanelFactory(project, panelFactory)) + continue; + subtabs << panelFactory->displayName(); } + m_tabIndexToProject.insert(index, project); m_tabWidget->insertTab(index, project->displayName(), subtabs); } @@ -282,41 +316,46 @@ void ProjectWindow::showProperties(int index, int subIndex) { if (index < 0) { m_centralWidget->setCurrentWidget(m_noprojectLabel); - if (m_panelsWidget) { - m_centralWidget->removeWidget(m_panelsWidget); - delete m_panelsWidget; - m_panelsWidget = 0; - } + removeCurrentWidget(); return; } Project *project = m_tabIndexToProject.at(index); - - PanelsWidget *panelsWidget = 0; // Set up custom panels again: - QList<IPanelFactory *> pages = - ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>(); - int indexOfPanel = 0; - foreach (IPanelFactory *panelFactory, pages) { - if (panelFactory->supports(project)) { - if (indexOfPanel == subIndex) { - panelsWidget = new PanelsWidget(m_centralWidget); - IPropertiesPanel *panel = panelFactory->createPanel(project); + int pos = 0; + foreach (IPanelFactory *panelFactory, ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>()) { + if (skipPanelFactory(project, panelFactory)) + continue; + if (pos == subIndex) { + removeCurrentWidget(); + IPropertiesPanel *panel(panelFactory->createPanel(project)); + if (panel->flags() & IPropertiesPanel::NoAutomaticStyle) { + m_currentWidget = panel->widget(); + m_currentPanel = panel; + } else { + PanelsWidget *panelsWidget = new PanelsWidget(m_centralWidget); panelsWidget->addPropertiesPanel(panel); - panel->widgetWasAddedToLayout(); - break; + m_currentWidget = panelsWidget; } - ++indexOfPanel; + m_centralWidget->addWidget(m_currentWidget); + m_centralWidget->setCurrentWidget(m_currentWidget); + break; } + ++pos; } - if (panelsWidget) { - // add the new stuff to the stack widget - m_centralWidget->addWidget(panelsWidget); - m_centralWidget->setCurrentWidget(panelsWidget); - if (m_panelsWidget) { - m_centralWidget->removeWidget(m_panelsWidget); - delete m_panelsWidget; +} + +void ProjectWindow::removeCurrentWidget() +{ + if (m_currentWidget) { + m_centralWidget->removeWidget(m_currentWidget); + if (m_currentPanel) { + delete m_currentPanel; + m_currentPanel = 0; + m_currentWidget = 0; // is deleted by the panel + } else if (m_currentWidget) { + delete m_currentWidget; + m_currentWidget = 0; } - m_panelsWidget = panelsWidget; } } diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h index f1c40be034..73c9c0d357 100644 --- a/src/plugins/projectexplorer/projectwindow.h +++ b/src/plugins/projectexplorer/projectwindow.h @@ -52,6 +52,7 @@ namespace ProjectExplorer { class IPropertiesPanel; class Project; +class Target; class BuildConfiguration; class RunConfiguration; @@ -93,10 +94,13 @@ private slots: void aboutToRemoveProject(ProjectExplorer::Project*); private: + void removeCurrentWidget(); + DoubleTabWidget *m_tabWidget; QWidget *m_noprojectLabel; QStackedWidget *m_centralWidget; - PanelsWidget *m_panelsWidget; + QWidget *m_currentWidget; + IPropertiesPanel *m_currentPanel; QList<ProjectExplorer::Project *> m_tabIndexToProject; }; diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index ea9c38d8ce..55c62fbc8d 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -30,9 +30,11 @@ #include "runconfiguration.h" #include "project.h" -#include "persistentsettings.h" +#include "target.h" #include "buildconfiguration.h" +#include <extensionsystem/pluginmanager.h> + #include <QtCore/QTimer> #ifdef Q_OS_MAC @@ -41,19 +43,109 @@ using namespace ProjectExplorer; +namespace { +// Function objects: + +class RunConfigurationFactoryMatcher +{ +public: + RunConfigurationFactoryMatcher(Target * target) : m_target(target) + { } + + virtual bool operator()(IRunConfigurationFactory *) const = 0; + + Target *target() const + { + return m_target; + } + +private: + Target *m_target; +}; + +class CreateMatcher : public RunConfigurationFactoryMatcher +{ +public: + CreateMatcher(Target *target, const QString &id) : + RunConfigurationFactoryMatcher(target), + m_id(id) + { } + ~CreateMatcher() { } + + bool operator()(IRunConfigurationFactory *factory) const + { + return factory->canCreate(target(), m_id); + } + +private: + QString m_id; +}; + +class CloneMatcher : public RunConfigurationFactoryMatcher +{ +public: + CloneMatcher(Target *target, RunConfiguration *source) : + RunConfigurationFactoryMatcher(target), + m_source(source) + { } + ~CloneMatcher() { } + + bool operator()(IRunConfigurationFactory *factory) const + { + return factory->canClone(target(), m_source); + } + +private: + RunConfiguration *m_source; +}; + +class RestoreMatcher : public RunConfigurationFactoryMatcher +{ +public: + RestoreMatcher(Target *target, const QVariantMap &map) : + RunConfigurationFactoryMatcher(target), + m_map(map) + { } + ~RestoreMatcher() { } + + bool operator()(IRunConfigurationFactory *factory) const + { + return factory->canRestore(target(), m_map); + } + +private: + QVariantMap m_map; +}; + +// Helper methods: + +IRunConfigurationFactory * findRunConfigurationFactory(RunConfigurationFactoryMatcher &matcher) +{ + QList<IRunConfigurationFactory *> + factories(ExtensionSystem::PluginManager::instance()-> + getObjects<IRunConfigurationFactory>()); + foreach (IRunConfigurationFactory *factory, factories) { + if (matcher(factory)) + return factory; + } + return 0; +} + +} // namespace + // RunConfiguration -RunConfiguration::RunConfiguration(Project *project, const QString &id) : +RunConfiguration::RunConfiguration(Target *target, const QString &id) : ProjectConfiguration(id), - m_project(project) + m_target(target) { - Q_ASSERT(m_project); + Q_ASSERT(m_target); } -RunConfiguration::RunConfiguration(Project *project, RunConfiguration *source) : +RunConfiguration::RunConfiguration(Target *target, RunConfiguration *source) : ProjectConfiguration(source), - m_project(project) + m_target(target) { - Q_ASSERT(m_project); + Q_ASSERT(m_target); } RunConfiguration::~RunConfiguration() @@ -68,24 +160,22 @@ bool RunConfiguration::isEnabled(BuildConfiguration *bc) const bool RunConfiguration::isEnabled() const { - if (!m_project) - return false; - if (m_project->hasBuildSettings() - && !m_project->activeBuildConfiguration()) + if (target()->project()->hasActiveBuildSettings() + && !activeBuildConfiguration()) return false; - return isEnabled(m_project->activeBuildConfiguration()); + return isEnabled(activeBuildConfiguration()); } BuildConfiguration *RunConfiguration::activeBuildConfiguration() const { - if (!project()) + if (!target()) return 0; - return project()->activeBuildConfiguration(); + return target()->activeBuildConfiguration(); } -Project *RunConfiguration::project() const +Target *RunConfiguration::target() const { - return m_project; + return m_target; } IRunConfigurationFactory::IRunConfigurationFactory(QObject *parent) : @@ -97,6 +187,24 @@ IRunConfigurationFactory::~IRunConfigurationFactory() { } +IRunConfigurationFactory *IRunConfigurationFactory::createFactory(Target *parent, const QString &id) +{ + CreateMatcher matcher(parent, id); + return findRunConfigurationFactory(matcher); +} + +IRunConfigurationFactory *IRunConfigurationFactory::cloneFactory(Target *parent, RunConfiguration *source) +{ + CloneMatcher matcher(parent, source); + return findRunConfigurationFactory(matcher); +} + +IRunConfigurationFactory *IRunConfigurationFactory::restoreFactory(Target *parent, const QVariantMap &map) +{ + RestoreMatcher matcher(parent, map); + return findRunConfigurationFactory(matcher); +} + IRunControlFactory::IRunControlFactory(QObject *parent) : QObject(parent) { diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 9293b01107..1eeea302cc 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -43,22 +43,21 @@ QT_END_NAMESPACE namespace ProjectExplorer { -class Project; +class Target; class RunControl; class BuildConfiguration; /* Base class for a run configuration. A run configuration specifies how a - * project should be run, while the runner (see below) does the actual running. + * target should be run, while the runner (see below) does the actual running. * - * Note that all RunControls and the project hold a shared pointer to the RunConfiguration. - * That is the lifetime of the RunConfiguration might exceed the life of the project. + * Note that all RunControls and the target hold a shared pointer to the RunConfiguration. + * That is the lifetime of the RunConfiguration might exceed the life of the target. * The user might still have a RunControl running (or output tab of that RunControl open) - * and yet unloaded the project. - * Also a RunConfiguration might be already removed from the list of RunConfigurations - * for a project, but stil be runnable via the output tab. - -*/ + * and yet unloaded the target. + * Also a RunConfiguration might be already removed from the list of RunConfigurations + * for a target, but stil be runnable via the output tab. + */ class PROJECTEXPLORER_EXPORT RunConfiguration : public ProjectConfiguration { Q_OBJECT @@ -78,24 +77,24 @@ public: // rename to createConfigurationWidget virtual QWidget *configurationWidget() = 0; - Project *project() const; + Target *target() const; protected: - RunConfiguration(Project *project, const QString &id); - RunConfiguration(Project *project, RunConfiguration *source); + RunConfiguration(Target *parent, const QString &id); + RunConfiguration(Target *parent, RunConfiguration *source); // convenience method to get current build configuration. BuildConfiguration *activeBuildConfiguration() const; private: - Project *m_project; + Target *m_target; }; /* The run configuration factory is used for restoring run configurations from * settings. And used to create new runconfigurations in the "Run Settings" Dialog. - * For the first case bool canRestore(const QString &type) and - * RunConfiguration* create(Project *project, QString type) are used. - * For the second type the functions QStringList availableCreationIds(Project *pro) and + * For the first case bool canRestore(Target *parent, const QString &id) and + * RunConfiguration* create(Target *parent, const QString &id) are used. + * For the second type the functions QStringList availableCreationIds(Target *parent) and * QString displayNameForType(const QString&) are used to generate a list of creatable * RunConfigurations, and create(..) is used to create it. */ @@ -108,17 +107,21 @@ public: explicit IRunConfigurationFactory(QObject *parent = 0); virtual ~IRunConfigurationFactory(); - // used to show the list of possible additons to a project, returns a list of types - virtual QStringList availableCreationIds(Project *parent) const = 0; + // used to show the list of possible additons to a target, returns a list of types + virtual QStringList availableCreationIds(Target *parent) const = 0; // used to translate the types to names to display to the user virtual QString displayNameForId(const QString &id) const = 0; - virtual bool canCreate(Project *parent, const QString &id) const = 0; - virtual RunConfiguration *create(Project *parent, const QString &id) = 0; - virtual bool canRestore(Project *parent, const QVariantMap &map) const = 0; - virtual RunConfiguration *restore(Project *parent, const QVariantMap &map) = 0; - virtual bool canClone(Project *parent, RunConfiguration *product) const = 0; - virtual RunConfiguration *clone(Project *parent, RunConfiguration *product) = 0; + virtual bool canCreate(Target *parent, const QString &id) const = 0; + virtual RunConfiguration *create(Target *parent, const QString &id) = 0; + virtual bool canRestore(Target *parent, const QVariantMap &map) const = 0; + virtual RunConfiguration *restore(Target *parent, const QVariantMap &map) = 0; + virtual bool canClone(Target *parent, RunConfiguration *product) const = 0; + virtual RunConfiguration *clone(Target *parent, RunConfiguration *product) = 0; + + static IRunConfigurationFactory *createFactory(Target *parent, const QString &id); + static IRunConfigurationFactory *cloneFactory(Target *parent, RunConfiguration *source); + static IRunConfigurationFactory *restoreFactory(Target *parent, const QVariantMap &map); signals: void availableCreationIdsChanged(); diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index 2d8b1a6470..c82b676840 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -29,6 +29,7 @@ #include "runsettingspropertiespage.h" #include "runconfiguration.h" +#include "target.h" #include "project.h" #include "ui_runsettingspropertiespage.h" @@ -92,27 +93,44 @@ using ExtensionSystem::PluginManager; /// RunSettingsPanelFactory /// +QString RunSettingsPanelFactory::id() const +{ + return QLatin1String(RUNSETTINGS_PANEL_ID); +} + QString RunSettingsPanelFactory::displayName() const { return QApplication::tr("Run Settings"); } -bool RunSettingsPanelFactory::supports(Project * /* project */) +bool RunSettingsPanelFactory::supports(Project *project) +{ + return project->targets().count() == 1; +} + +bool RunSettingsPanelFactory::supports(Target *target) { + Q_UNUSED(target); return true; } IPropertiesPanel *RunSettingsPanelFactory::createPanel(Project *project) { - return new RunSettingsPanel(project); + Q_ASSERT(supports(project)); + return new RunSettingsPanel(project->activeTarget()); +} + +IPropertiesPanel *RunSettingsPanelFactory::createPanel(Target *target) +{ + return new RunSettingsPanel(target); } /// /// RunSettingsPanel /// -RunSettingsPanel::RunSettingsPanel(Project *project) : - m_widget(new RunSettingsWidget(project)), +RunSettingsPanel::RunSettingsPanel(Target *target) : + m_widget(new RunSettingsWidget(target)), m_icon(":/projectexplorer/images/run.png") { } @@ -193,11 +211,13 @@ void RunConfigurationsModel::setRunConfigurations(const QList<RunConfiguration * /// RunSettingsWidget /// -RunSettingsWidget::RunSettingsWidget(Project *project) - : m_project(project), +RunSettingsWidget::RunSettingsWidget(Target *target) + : m_target(target), m_runConfigurationsModel(new RunConfigurationsModel(this)), m_runConfigurationWidget(0) { + Q_ASSERT(m_target); + m_ui = new Ui::RunSettingsPropertiesPage; m_ui->setupUi(this); m_addMenu = new QMenu(m_ui->addToolButton); @@ -213,15 +233,17 @@ RunSettingsWidget::RunSettingsWidget(Project *project) connect(m_ui->removeToolButton, SIGNAL(clicked(bool)), this, SLOT(removeRunConfiguration())); - connect(m_project, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration *)), + connect(m_target, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration *)), this, SLOT(initRunConfigurationComboBox())); - connect(m_project, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration *)), + connect(m_target, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration *)), this, SLOT(initRunConfigurationComboBox())); - connect(m_project, SIGNAL(activeRunConfigurationChanged()), + + connect(m_target, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)), this, SLOT(activeRunConfigurationChanged())); initRunConfigurationComboBox(); - const QList<RunConfiguration *> runConfigurations = m_project->runConfigurations(); + + const QList<RunConfiguration *> runConfigurations = m_target->runConfigurations(); for (int i=0; i<runConfigurations.size(); ++i) { connect(runConfigurations.at(i), SIGNAL(displayNameChanged()), this, SLOT(displayNameChanged())); @@ -248,7 +270,7 @@ void RunSettingsWidget::aboutToShowAddMenu() QList<IRunConfigurationFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IRunConfigurationFactory>(); foreach (IRunConfigurationFactory *factory, factories) { - QStringList ids = factory->availableCreationIds(m_project); + QStringList ids = factory->availableCreationIds(m_target); foreach (const QString &id, ids) { QAction *action = m_addMenu->addAction(factory->displayNameForId(id));; FactoryAndId fai; @@ -269,10 +291,10 @@ void RunSettingsWidget::addRunConfiguration() if (!act) return; FactoryAndId fai = act->data().value<FactoryAndId>(); - RunConfiguration *newRC = fai.factory->create(m_project, fai.id); + RunConfiguration *newRC = fai.factory->create(m_target, fai.id); if (!newRC) return; - m_project->addRunConfiguration(newRC); + m_target->addRunConfiguration(newRC); initRunConfigurationComboBox(); m_ui->runConfigurationCombo->setCurrentIndex( m_runConfigurationsModel->runConfigurations().indexOf(newRC)); @@ -284,14 +306,14 @@ void RunSettingsWidget::removeRunConfiguration() int index = m_ui->runConfigurationCombo->currentIndex(); RunConfiguration *rc = m_runConfigurationsModel->runConfigurations().at(index); disconnect(rc, SIGNAL(displayNameChanged()), this, SLOT(displayNameChanged())); - m_project->removeRunConfiguration(rc); + m_target->removeRunConfiguration(rc); initRunConfigurationComboBox(); } void RunSettingsWidget::initRunConfigurationComboBox() { - const QList<RunConfiguration *> &runConfigurations = m_project->runConfigurations(); - RunConfiguration *activeRunConfiguration = m_project->activeRunConfiguration(); + const QList<RunConfiguration *> &runConfigurations = m_target->runConfigurations(); + RunConfiguration *activeRunConfiguration = m_target->activeRunConfiguration(); RunConfiguration *currentSelection = 0; if (m_ui->runConfigurationCombo->currentIndex() >= 0) currentSelection = m_runConfigurationsModel->runConfigurations().at(m_ui->runConfigurationCombo->currentIndex()); @@ -307,12 +329,11 @@ void RunSettingsWidget::initRunConfigurationComboBox() void RunSettingsWidget::activeRunConfigurationChanged() { - m_runConfigurationsModel->activeRunConfigurationChanged(m_project->activeRunConfiguration()); + m_runConfigurationsModel->activeRunConfigurationChanged(m_target->activeRunConfiguration()); } void RunSettingsWidget::showRunConfigurationWidget(int index) { - Q_ASSERT(m_project); if (index == -1) { delete m_runConfigurationWidget; m_runConfigurationWidget = 0; diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.h b/src/plugins/projectexplorer/runsettingspropertiespage.h index c7efeb8f63..869182111b 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.h +++ b/src/plugins/projectexplorer/runsettingspropertiespage.h @@ -42,6 +42,8 @@ QT_END_NAMESPACE namespace ProjectExplorer { namespace Internal { +const char * const RUNSETTINGS_PANEL_ID("ProjectExplorer.RunSettingsPanel"); + namespace Ui { class RunSettingsPropertiesPage; } @@ -52,15 +54,18 @@ class RunSettingsWidget; class RunSettingsPanelFactory : public IPanelFactory { public: + QString id() const; QString displayName() const; bool supports(Project *project); + bool supports(Target *target); IPropertiesPanel *createPanel(Project *project); + IPropertiesPanel *createPanel(Target *target); }; class RunSettingsPanel : public IPropertiesPanel { public: - RunSettingsPanel(Project *project); + RunSettingsPanel(Target *target); ~RunSettingsPanel(); QString displayName() const; @@ -76,7 +81,7 @@ class RunSettingsWidget : public QWidget { Q_OBJECT public: - RunSettingsWidget(Project *project); + RunSettingsWidget(Target *target); ~RunSettingsWidget(); private slots: @@ -88,7 +93,7 @@ private slots: void initRunConfigurationComboBox(); void activeRunConfigurationChanged(); private: - Project *m_project; + Target *m_target; RunConfigurationsModel *m_runConfigurationsModel; Ui::RunSettingsPropertiesPage *m_ui; QWidget *m_runConfigurationWidget; diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp new file mode 100644 index 0000000000..c9f0c41b95 --- /dev/null +++ b/src/plugins/projectexplorer/target.cpp @@ -0,0 +1,321 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "target.h" + +#include "buildconfiguration.h" +#include "project.h" +#include "runconfiguration.h" + +#include <utils/qtcassert.h> + +using namespace ProjectExplorer; + +namespace { +const char * const ACTIVE_BC_KEY("ProjectExplorer.Target.ActiveBuildConfiguration"); +const char * const BC_KEY_PREFIX("ProjectExplorer.Target.BuildConfiguration."); +const char * const BC_COUNT_KEY("ProjectExplorer.Target.BuildConfigurationCount"); + +const char * const ACTIVE_RC_KEY("ProjectExplorer.Target.ActiveRunConfiguration"); +const char * const RC_KEY_PREFIX("ProjectExplorer.Target.RunConfiguration."); +const char * const RC_COUNT_KEY("ProjectExplorer.Target.RunConfigurationCount"); + +const char * const ICON_KEY("ProjectExplorer.Target.Icon"); +} // namespace + +// ------------------------------------------------------------------------- +// Target +// ------------------------------------------------------------------------- + +Target::Target(Project *project, const QString &id) : + ProjectConfiguration(id), + m_project(project), + m_isEnabled(true), + m_activeBuildConfiguration(0), + m_activeRunConfiguration(0) +{ +} + +Target::~Target() +{ + qDeleteAll(m_buildConfigurations); + qDeleteAll(m_runConfigurations); +} + +void Target::changeEnvironment() +{ + ProjectExplorer::BuildConfiguration *bc(qobject_cast<ProjectExplorer::BuildConfiguration *>(sender())); + if (bc == activeBuildConfiguration()) + emit environmentChanged(); +} + +Project *Target::project() const +{ + return m_project; +} + +void Target::addBuildConfiguration(BuildConfiguration *configuration) +{ + QTC_ASSERT(configuration && !m_buildConfigurations.contains(configuration), return); + Q_ASSERT(configuration->target() == this); + + if (!buildConfigurationFactory()) + return; + + // Check that we don't have a configuration with the same displayName + QString configurationDisplayName = configuration->displayName(); + QStringList displayNames; + foreach (const BuildConfiguration *bc, m_buildConfigurations) + displayNames << bc->displayName(); + configurationDisplayName = Project::makeUnique(configurationDisplayName, displayNames); + configuration->setDisplayName(configurationDisplayName); + + // add it + m_buildConfigurations.push_back(configuration); + + emit addedBuildConfiguration(configuration); + + connect(configuration, SIGNAL(environmentChanged()), + SLOT(changeEnvironment())); + + if (!activeBuildConfiguration()) + setActiveBuildConfiguration(configuration); +} + +void Target::removeBuildConfiguration(BuildConfiguration *configuration) +{ + //todo: this might be error prone + if (!m_buildConfigurations.contains(configuration)) + return; + + m_buildConfigurations.removeOne(configuration); + + emit removedBuildConfiguration(configuration); + + if (activeBuildConfiguration() == configuration) { + if (m_buildConfigurations.isEmpty()) + setActiveBuildConfiguration(0); + else + setActiveBuildConfiguration(m_buildConfigurations.at(0)); + } + + delete configuration; +} + +QList<BuildConfiguration *> Target::buildConfigurations() const +{ + return m_buildConfigurations; +} + +BuildConfiguration *Target::activeBuildConfiguration() const +{ + return m_activeBuildConfiguration; +} + +void Target::setActiveBuildConfiguration(BuildConfiguration *configuration) +{ + if ((!configuration && m_buildConfigurations.isEmpty()) || + (configuration && m_buildConfigurations.contains(configuration) && + configuration != m_activeBuildConfiguration)) { + m_activeBuildConfiguration = configuration; + emit activeBuildConfigurationChanged(m_activeBuildConfiguration); + emit environmentChanged(); + } +} + +QList<RunConfiguration *> Target::runConfigurations() const +{ + return m_runConfigurations; +} + +void Target::addRunConfiguration(RunConfiguration* runConfiguration) +{ + QTC_ASSERT(runConfiguration && !m_runConfigurations.contains(runConfiguration), return); + Q_ASSERT(runConfiguration->target() == this); + + m_runConfigurations.push_back(runConfiguration); + emit addedRunConfiguration(runConfiguration); + + if (!activeRunConfiguration()) + setActiveRunConfiguration(runConfiguration); +} + +void Target::removeRunConfiguration(RunConfiguration* runConfiguration) +{ + QTC_ASSERT(runConfiguration && m_runConfigurations.contains(runConfiguration), return); + + m_runConfigurations.removeOne(runConfiguration); + + if (activeRunConfiguration() == runConfiguration) { + if (m_runConfigurations.isEmpty()) + setActiveRunConfiguration(0); + else + setActiveRunConfiguration(m_runConfigurations.at(0)); + } + + emit removedRunConfiguration(runConfiguration); + delete runConfiguration; +} + +RunConfiguration* Target::activeRunConfiguration() const +{ + return m_activeRunConfiguration; +} + +void Target::setActiveRunConfiguration(RunConfiguration* configuration) +{ + if ((!configuration && !m_runConfigurations.isEmpty()) || + (configuration && m_runConfigurations.contains(configuration) && + configuration != m_activeRunConfiguration)) { + m_activeRunConfiguration = configuration; + emit activeRunConfigurationChanged(m_activeRunConfiguration); + } +} + +bool Target::isEnabled() const +{ + return m_isEnabled; +} + +QIcon Target::icon() const +{ + return m_icon; +} + +void Target::setIcon(QIcon icon) +{ + m_icon = icon; + emit iconChanged(); +} + +QVariantMap Target::toMap() const +{ + const QList<BuildConfiguration *> bcs = buildConfigurations(); + + QVariantMap map(ProjectConfiguration::toMap()); + map.insert(QLatin1String(ACTIVE_BC_KEY), bcs.indexOf(m_activeBuildConfiguration)); + map.insert(QLatin1String(BC_COUNT_KEY), bcs.size()); + for (int i = 0; i < bcs.size(); ++i) + map.insert(QString::fromLatin1(BC_KEY_PREFIX) + QString::number(i), bcs.at(i)->toMap()); + + const QList<RunConfiguration *> rcs = runConfigurations(); + map.insert(QLatin1String(ACTIVE_RC_KEY), rcs.indexOf(m_activeRunConfiguration)); + map.insert(QLatin1String(RC_COUNT_KEY), rcs.size()); + for (int i = 0; i < rcs.size(); ++i) + map.insert(QString::fromLatin1(RC_KEY_PREFIX) + QString::number(i), rcs.at(i)->toMap()); + + map.insert(QLatin1String(ICON_KEY), m_icon); + + return map; +} + +void Target::setEnabled(bool enabled) +{ + if (enabled == m_isEnabled) + return; + + m_isEnabled = enabled; + emit targetEnabled(m_isEnabled); +} + +bool Target::fromMap(const QVariantMap &map) +{ + if (!ProjectConfiguration::fromMap(map)) + return false; + + m_icon = map.value(QLatin1String(ICON_KEY)).value<QIcon>(); + + bool ok; + int bcCount(map.value(QLatin1String(BC_COUNT_KEY), 0).toInt(&ok)); + if (!ok || bcCount < 0) + bcCount = 0; + int activeConfiguration(map.value(QLatin1String(ACTIVE_BC_KEY), 0).toInt(&ok)); + if (!ok || activeConfiguration < 0) + activeConfiguration = 0; + if (0 > activeConfiguration || bcCount < activeConfiguration) + activeConfiguration = 0; + + for (int i = 0; i < bcCount; ++i) { + const QString key(QString::fromLatin1(BC_KEY_PREFIX) + QString::number(i)); + if (!map.contains(key)) + return false; + BuildConfiguration *bc(buildConfigurationFactory()->restore(this, map.value(key).toMap())); + if (!bc) + continue; + addBuildConfiguration(bc); + if (i == activeConfiguration) + setActiveBuildConfiguration(bc); + } + if (buildConfigurations().isEmpty()) + return false; + + int rcCount(map.value(QLatin1String(RC_COUNT_KEY), 0).toInt(&ok)); + if (!ok || rcCount < 0) + rcCount = 0; + activeConfiguration = map.value(QLatin1String(ACTIVE_RC_KEY), 0).toInt(&ok); + if (!ok || activeConfiguration < 0) + activeConfiguration = 0; + if (0 > activeConfiguration || rcCount < activeConfiguration) + activeConfiguration = 0; + + for (int i = 0; i < rcCount; ++i) { + const QString key(QString::fromLatin1(RC_KEY_PREFIX) + QString::number(i)); + if (!map.contains(key)) + return false; + + QVariantMap valueMap(map.value(key).toMap()); + IRunConfigurationFactory *factory(IRunConfigurationFactory::restoreFactory(this, valueMap)); + if (!factory) + continue; // Skip RCs we do not know about.) + + RunConfiguration *rc(factory->restore(this, valueMap)); + if (!rc) + continue; + addRunConfiguration(rc); + if (i == activeConfiguration) + setActiveRunConfiguration(rc); + } + // Ignore missing RCs: We will just populate them usign the default ones. + + return true; +} + + +// ------------------------------------------------------------------------- +// ITargetFactory +// ------------------------------------------------------------------------- + +ITargetFactory::ITargetFactory(QObject *parent) : + QObject(parent) +{ +} + +ITargetFactory::~ITargetFactory() +{ +} diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h new file mode 100644 index 0000000000..09f00f4f89 --- /dev/null +++ b/src/plugins/projectexplorer/target.h @@ -0,0 +1,154 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef TARGET_H +#define TARGET_H + +#include "projectconfiguration.h" +#include "projectexplorer_export.h" + +#include <QtCore/QObject> +#include <QtGui/QFileSystemModel> +#include <QtGui/QIcon> + +namespace ProjectExplorer { + +class RunConfiguration; +class Environment; +class BuildConfiguration; +class IBuildConfigurationFactory; +class IRunConfigurationFactory; +class Project; + +class PROJECTEXPLORER_EXPORT Target : public ProjectConfiguration +{ + Q_OBJECT + +public: + virtual ~Target(); + + virtual Project *project() const; + + // Build configuration + void addBuildConfiguration(BuildConfiguration *configuration); + void removeBuildConfiguration(BuildConfiguration *configuration); + + QList<BuildConfiguration *> buildConfigurations() const; + virtual BuildConfiguration *activeBuildConfiguration() const; + void setActiveBuildConfiguration(BuildConfiguration *configuration); + + virtual IBuildConfigurationFactory *buildConfigurationFactory() const = 0; + + // Running + QList<RunConfiguration *> runConfigurations() const; + void addRunConfiguration(RunConfiguration* runConfiguration); + void removeRunConfiguration(RunConfiguration* runConfiguration); + + RunConfiguration* activeRunConfiguration() const; + void setActiveRunConfiguration(RunConfiguration* runConfiguration); + + // Returns whether this target is actually available at he time + // of the call. A target may become unavailable e.g. when a Qt version + // is removed. + // + // Note: Enabled state is not saved! + bool isEnabled() const; + + QIcon icon() const; + void setIcon(QIcon icon); + + virtual QVariantMap toMap() const; + +signals: + void targetEnabled(bool); + void iconChanged(); + + // TODO clean up signal names + // might be better to also have aboutToRemove signals + void runConfigurationsEnabledStateChanged(); + + void removedRunConfiguration(ProjectExplorer::RunConfiguration *); + void addedRunConfiguration(ProjectExplorer::RunConfiguration *); + void activeRunConfigurationChanged(ProjectExplorer::RunConfiguration *); + + void removedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); + void addedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); + void activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration *); + + /// convenience signal, emitted if either the active buildconfiguration emits + /// environmentChanged() or if the active build configuration changes + void environmentChanged(); + +protected: + Target(Project *parent, const QString &id); + + void setEnabled(bool); + + virtual bool fromMap(const QVariantMap &map); + +private slots: + void changeEnvironment(); + +private: + Project *m_project; + bool m_isEnabled; + QIcon m_icon; + + QList<BuildConfiguration *> m_buildConfigurations; + BuildConfiguration *m_activeBuildConfiguration; + QList<RunConfiguration *> m_runConfigurations; + RunConfiguration* m_activeRunConfiguration; +}; + +class PROJECTEXPLORER_EXPORT ITargetFactory : + public QObject +{ + Q_OBJECT + +public: + explicit ITargetFactory(QObject *parent = 0); + virtual ~ITargetFactory(); + + // used to show the list of possible additons to a target, returns a list of types + virtual QStringList availableCreationIds(Project *parent) const = 0; + // used to translate the types to names to display to the user + virtual QString displayNameForId(const QString &id) const = 0; + + virtual bool canCreate(Project *parent, const QString &id) const = 0; + virtual Target *create(Project *parent, const QString &id) = 0; + virtual bool canRestore(Project *parent, const QVariantMap &map) const = 0; + virtual Target *restore(Project *parent, const QVariantMap &map) = 0; + +signals: + void availableCreationIdsChanged(); +}; + +} // namespace ProjectExplorer + +#endif // TARGET_H diff --git a/src/plugins/projectexplorer/targetselector.cpp b/src/plugins/projectexplorer/targetselector.cpp index 6771eec101..8c1286a558 100644 --- a/src/plugins/projectexplorer/targetselector.cpp +++ b/src/plugins/projectexplorer/targetselector.cpp @@ -14,10 +14,10 @@ TargetSelector::TargetSelector(QWidget *parent) : QWidget(parent), m_currentTargetIndex(-1) { - QFont f = font(); - f.setPixelSize(10); - f.setBold(true); - setFont(f); + QFont f = font(); + f.setPixelSize(10); + f.setBold(true); + setFont(f); } void TargetSelector::addTarget(const QString &name) @@ -25,16 +25,55 @@ void TargetSelector::addTarget(const QString &name) Target target; target.name = name; target.currentSubIndex = 0; + target.isActive = false; m_targets.append(target); if (m_currentTargetIndex == -1) - m_currentTargetIndex = m_targets.size() - 1; + setCurrentIndex(m_targets.size() - 1); + update(); +} + +void TargetSelector::markActive(int index) +{ + if (index < 0 || index >= m_targets.count()) + return; + for (int i = 0; i < m_targets.count(); ++i) + m_targets[i].isActive = (i == index); update(); } void TargetSelector::removeTarget(int index) { m_targets.removeAt(index); + if (m_currentTargetIndex == index) + setCurrentIndex(m_targets.size() - 1); + update(); +} + +void TargetSelector::setCurrentIndex(int index) +{ + if (index < -1 || + index >= m_targets.count() || + index == m_currentTargetIndex) + return; + + m_currentTargetIndex = index; + + update(); + emit currentIndexChanged(m_currentTargetIndex, + m_currentTargetIndex >= 0 ? m_targets.at(m_currentTargetIndex).currentSubIndex : -1); +} + +void TargetSelector::setCurrentSubIndex(int subindex) +{ + if (subindex < 0 || + subindex >= 2 || + subindex == m_targets.at(m_currentTargetIndex).currentSubIndex) + return; + m_targets[m_currentTargetIndex].currentSubIndex = subindex; + update(); + emit currentIndexChanged(m_currentTargetIndex, + m_targets.at(m_currentTargetIndex).currentSubIndex); } TargetSelector::Target TargetSelector::targetAt(int index) const @@ -117,8 +156,13 @@ void TargetSelector::paintEvent(QPaintEvent *event) p.setPen(QColor(0, 0, 0)); } p.drawPixmap(x, 1, *pixmap); + QString targetName; + if (target.isActive) + targetName = QChar('*') + target.name + QChar('*'); + else + targetName = target.name; p.drawText(x + (TARGET_WIDTH - fm.width(target.name))/2 + 1, 7 + fm.ascent(), - target.name); + targetName); x += TARGET_WIDTH; p.drawLine(x, 1, x, TARGET_HEIGHT); ++x; diff --git a/src/plugins/projectexplorer/targetselector.h b/src/plugins/projectexplorer/targetselector.h index 212f259496..1459d3dc62 100644 --- a/src/plugins/projectexplorer/targetselector.h +++ b/src/plugins/projectexplorer/targetselector.h @@ -13,6 +13,7 @@ public: struct Target { QString name; int currentSubIndex; + bool isActive; }; explicit TargetSelector(QWidget *parent = 0); @@ -26,7 +27,10 @@ public: public slots: void addTarget(const QString &name); + void markActive(int index); void removeTarget(int index); + void setCurrentIndex(int index); + void setCurrentSubIndex(int subindex); signals: void addButtonClicked(); diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp new file mode 100644 index 0000000000..6cc50afd3a --- /dev/null +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -0,0 +1,272 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "targetsettingspanel.h" + +#include "addtargetdialog.h" +#include "buildsettingspropertiespage.h" +#include "project.h" +#include "projectwindow.h" +#include "runsettingspropertiespage.h" +#include "target.h" +#include "targetsettingswidget.h" + +#include <extensionsystem/pluginmanager.h> + +#include <QtCore/QCoreApplication> +#include <QtGui/QLabel> +#include <QtGui/QVBoxLayout> + +using namespace ProjectExplorer; +using namespace ProjectExplorer::Internal; + +/// +// TargetSettingsPanelFactory +/// + +QString TargetSettingsPanelFactory::id() const +{ + return QLatin1String(TARGETSETTINGS_PANEL_ID); +} + +QString TargetSettingsPanelFactory::displayName() const +{ + return QCoreApplication::tr("Targets"); +} + +bool TargetSettingsPanelFactory::supports(Project *project) +{ + Q_UNUSED(project); + return true; +} + +bool TargetSettingsPanelFactory::supports(Target *target) +{ + Q_UNUSED(target); + return false; +} + +IPropertiesPanel *TargetSettingsPanelFactory::createPanel(Project *project) +{ + return new TargetSettingsPanel(project); +} + +IPropertiesPanel *TargetSettingsPanelFactory::createPanel(Target *target) +{ + Q_UNUSED(target); + return 0; +} + +/// +// TargetSettingsPanel +/// + +TargetSettingsPanel::TargetSettingsPanel(Project *project) : + m_widget(new TargetSettingsPanelWidget(project)) +{ +} + +TargetSettingsPanel::~TargetSettingsPanel() +{ + delete m_widget; +} + +QString TargetSettingsPanel::displayName() const +{ + return QCoreApplication::tr("Targets"); +} + +QWidget *TargetSettingsPanel::widget() const +{ + return m_widget; +} + +QIcon TargetSettingsPanel::icon() const +{ + return QIcon(); +} + +/// +// TargetSettingsWidget +/// + +TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) : + m_currentIndex(-1), + m_project(project), + m_selector(0), + m_centralWidget(0) +{ + m_panelWidgets[0] = 0; + m_panelWidgets[1] = 0; + + setupUi(); + + connect(m_project, SIGNAL(addedTarget(ProjectExplorer::Target*)), + this, SLOT(targetAdded(ProjectExplorer::Target*))); + connect(m_project, SIGNAL(aboutToRemoveTarget(ProjectExplorer::Target*)), + this, SLOT(targetRemoved(ProjectExplorer::Target*))); + connect(m_project, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), + this, SLOT(activeTargetChanged(ProjectExplorer::Target*))); +} + +TargetSettingsPanelWidget::~TargetSettingsPanelWidget() +{ +} + +void TargetSettingsPanelWidget::setupUi() +{ + QVBoxLayout *viewLayout = new QVBoxLayout(this); + viewLayout->setMargin(0); + viewLayout->setSpacing(0); + + m_selector = new TargetSettingsWidget(this); + viewLayout->addWidget(m_selector); + + // Setup our container for the contents: + m_centralWidget = new QStackedWidget(this); + m_selector->setCentralWidget(m_centralWidget); + + // no projects label: + m_noTargetLabel = new QWidget; + QVBoxLayout *noTargetLayout = new QVBoxLayout; + noTargetLayout->setMargin(0); + QLabel *label = new QLabel(m_noTargetLabel); + label->setText(tr("No target defined.")); + { + QFont f = label->font(); + f.setPointSizeF(f.pointSizeF() * 1.4); + f.setBold(true); + label->setFont(f); + } + label->setMargin(10); + label->setAlignment(Qt::AlignTop); + noTargetLayout->addWidget(label); + noTargetLayout->addStretch(10); + m_centralWidget->addWidget(m_noTargetLabel); + + foreach (Target *t, m_project->targets()) + targetAdded(t); + m_selector->markActive(m_project->targets().indexOf(m_project->activeTarget())); + + connect(m_selector, SIGNAL(currentIndexChanged(int,int)), + this, SLOT(currentTargetIndexChanged(int,int))); + connect(m_selector, SIGNAL(addButtonClicked()), + this, SLOT(addTarget())); + + if (m_project->targets().count()) + currentTargetIndexChanged(m_project->targets().indexOf(m_project->activeTarget()), 0); +} + +void TargetSettingsPanelWidget::currentTargetIndexChanged(int targetIndex, int subIndex) +{ + if (targetIndex < -1 || targetIndex >= m_project->targets().count()) + return; + if (subIndex < -1 || subIndex >= 2) + return; + m_selector->setCurrentIndex(targetIndex); + m_selector->setCurrentSubIndex(subIndex); + + Target *target(m_project->targets().at(targetIndex)); + + // Target was not actually changed: + if (m_currentIndex == targetIndex) { + m_centralWidget->setCurrentWidget(m_panelWidgets[subIndex]); + return; + } + + // Target has changed: + delete m_panelWidgets[0]; + m_panelWidgets[0] = 0; + delete m_panelWidgets[1]; + m_panelWidgets[1] = 0; + + if (targetIndex == -1) { // no more targets! + m_centralWidget->setCurrentWidget(m_noTargetLabel); + return; + } + + PanelsWidget *buildPanel(new PanelsWidget(m_centralWidget)); + PanelsWidget *runPanel(new PanelsWidget(m_centralWidget)); + + foreach (IPanelFactory *panelFactory, ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>()) { + if (panelFactory->id() == QLatin1String(BUILDSETTINGS_PANEL_ID)) { + IPropertiesPanel *panel = panelFactory->createPanel(target); + buildPanel->addPropertiesPanel(panel); + continue; + } + if (panelFactory->id() == QLatin1String(RUNSETTINGS_PANEL_ID)) { + IPropertiesPanel *panel = panelFactory->createPanel(target); + runPanel->addPropertiesPanel(panel); + continue; + } + } + m_centralWidget->addWidget(buildPanel); + m_centralWidget->addWidget(runPanel); + + m_panelWidgets[0] = buildPanel; + m_panelWidgets[1] = runPanel; + + m_centralWidget->setCurrentWidget(m_panelWidgets[subIndex]); +} + +void TargetSettingsPanelWidget::addTarget() +{ + AddTargetDialog dialog(m_project); + dialog.exec(); +} + +void TargetSettingsPanelWidget::targetAdded(ProjectExplorer::Target *target) +{ + Q_ASSERT(m_project == target->project()); + Q_ASSERT(m_selector); + + m_selector->addTarget(target->displayName()); + // TODO: Disable/enable add button. +} + +void TargetSettingsPanelWidget::targetRemoved(ProjectExplorer::Target *target) +{ + Q_ASSERT(m_project == target->project()); + Q_ASSERT(m_selector); + + int index(m_project->targets().indexOf(target)); + if (index < 0) + return; + m_selector->removeTarget(index); + // TODO: Disable/enable add button. +} + +void TargetSettingsPanelWidget::activeTargetChanged(ProjectExplorer::Target *target) +{ + Q_ASSERT(m_project == target->project()); + Q_ASSERT(m_selector); + + int index(m_project->targets().indexOf(target)); + m_selector->markActive(index); +} diff --git a/src/plugins/projectexplorer/targetsettingspanel.h b/src/plugins/projectexplorer/targetsettingspanel.h new file mode 100644 index 0000000000..3eb7834b86 --- /dev/null +++ b/src/plugins/projectexplorer/targetsettingspanel.h @@ -0,0 +1,104 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef TARGETSETTINGSPANEL_H +#define TARGETSETTINGSPANEL_H + +#include "iprojectproperties.h" + +#include <QtGui/QStackedWidget> +#include <QtGui/QWidget> + +namespace ProjectExplorer { + +class Target; + +namespace Internal { + +const char * const TARGETSETTINGS_PANEL_ID("ProjectExplorer.TargetSettingsPanel"); + +class TargetSettingsWidget; +class PanelsWidget; + +class TargetSettingsPanelFactory : public IPanelFactory +{ +public: + QString id() const; + QString displayName() const; + bool supports(Project *project); + bool supports(Target *target); + IPropertiesPanel *createPanel(Project *project); + IPropertiesPanel *createPanel(Target *target); +}; + +class TargetSettingsPanelWidget; + +class TargetSettingsPanel : public IPropertiesPanel +{ +public: + TargetSettingsPanel(Project *project); + ~TargetSettingsPanel(); + QString displayName() const; + QWidget *widget() const; + QIcon icon() const; + PanelFlags flags() const { return IPropertiesPanel::NoAutomaticStyle; } + +private: + TargetSettingsPanelWidget *m_widget; +}; + +class TargetSettingsPanelWidget : public QWidget +{ + Q_OBJECT +public: + TargetSettingsPanelWidget(Project *project); + ~TargetSettingsPanelWidget(); + + void setupUi(); + +private slots: + void currentTargetIndexChanged(int targetIndex, int subIndex); + void addTarget(); + void targetAdded(ProjectExplorer::Target *target); + void targetRemoved(ProjectExplorer::Target *target); + void activeTargetChanged(ProjectExplorer::Target *target); + +private: + int m_currentIndex; + Project *m_project; + TargetSettingsWidget *m_selector; + QStackedWidget *m_centralWidget; + QWidget *m_noTargetLabel; + PanelsWidget *m_panelWidgets[2]; +}; + +} // namespace Internal +} // namespace ProjectExplorer + +#endif // TARGETSETTINGSPANEL_H diff --git a/src/plugins/projectexplorer/targetsettingswidget.cpp b/src/plugins/projectexplorer/targetsettingswidget.cpp index 6a45a4f9ed..eeafaf7b0c 100644 --- a/src/plugins/projectexplorer/targetsettingswidget.cpp +++ b/src/plugins/projectexplorer/targetsettingswidget.cpp @@ -33,11 +33,26 @@ void TargetSettingsWidget::addTarget(const QString &name) updateTargetSelector(); } +void TargetSettingsWidget::markActive(int index) +{ + m_targetSelector->markActive(index); +} + void TargetSettingsWidget::removeTarget(int index) { m_targetSelector->removeTarget(index); } +void TargetSettingsWidget::setCurrentIndex(int index) +{ + m_targetSelector->setCurrentIndex(index); +} + +void TargetSettingsWidget::setCurrentSubIndex(int index) +{ + m_targetSelector->setCurrentSubIndex(index); +} + QString TargetSettingsWidget::targetNameAt(int index) const { return m_targetSelector->targetAt(index).name; diff --git a/src/plugins/projectexplorer/targetsettingswidget.h b/src/plugins/projectexplorer/targetsettingswidget.h index ca4d8b26ea..af250dec47 100644 --- a/src/plugins/projectexplorer/targetsettingswidget.h +++ b/src/plugins/projectexplorer/targetsettingswidget.h @@ -27,7 +27,10 @@ public: public slots: void addTarget(const QString &name); + void markActive(int index); void removeTarget(int index); + void setCurrentIndex(int index); + void setCurrentSubIndex(int index); signals: void addButtonClicked(); diff --git a/src/plugins/projectexplorer/targetsettingswidget.ui b/src/plugins/projectexplorer/targetsettingswidget.ui index 64f25f70a9..4a7bc504ba 100644 --- a/src/plugins/projectexplorer/targetsettingswidget.ui +++ b/src/plugins/projectexplorer/targetsettingswidget.ui @@ -44,6 +44,9 @@ </item> <item> <widget class="QScrollArea" name="scrollArea"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> <property name="widgetResizable"> <bool>true</bool> </property> @@ -52,8 +55,8 @@ <rect> <x>0</x> <y>0</y> - <width>614</width> - <height>400</height> + <width>618</width> + <height>404</height> </rect> </property> </widget> diff --git a/src/plugins/projectexplorer/userfileaccessor.cpp b/src/plugins/projectexplorer/userfileaccessor.cpp index 2f565514a8..661eab47af 100644 --- a/src/plugins/projectexplorer/userfileaccessor.cpp +++ b/src/plugins/projectexplorer/userfileaccessor.cpp @@ -32,22 +32,24 @@ #include "buildconfiguration.h" #include "persistentsettings.h" #include "project.h" +#include "target.h" #include "toolchain.h" #include <coreplugin/ifile.h> #include <utils/qtcassert.h> +#include <QtCore/QCoreApplication> #include <QtCore/QFile> using namespace ProjectExplorer; namespace { const char * const USER_FILE_VERSION("ProjectExplorer.Project.Updater.FileVersion"); +const char * const WAS_UPDATED("ProjectExplorer.Project.Updater.DidUpdate"); const char * const PROJECT_FILE_POSTFIX(".user"); // Version 0 is used in Qt Creator 1.3.x and -// (in a slighly differnt flavour) 1.4 pre-alpha releases. - +// (in a slighly differnt flavour) post 1.3 master. class Version0Handler : public UserFileVersionHandler { public: @@ -72,6 +74,51 @@ private: QVariantMap convertBuildSteps(Project *project, const QVariantMap &map); }; +// Version 1 is used in master post Qt Creator 1.3.x. +// It was never used in any official release but is required for the +// transition to later versions (which introduce support for targets). +class Version1Handler : public UserFileVersionHandler +{ +public: + Version1Handler(); + ~Version1Handler(); + + int userFileVersion() const + { + return 1; + } + + QString displayUserFileVersion() const + { + return QLatin1String("1.3+git"); + } + + QVariantMap update(Project *project, const QVariantMap &map); + +private: + struct TargetDescription + { + TargetDescription(QString tid, QString dn) : + id(tid), + displayName(dn) + { + } + + TargetDescription(const TargetDescription &td) : + id(td.id), + displayName(td.displayName) + { + } + + QString id; + QString displayName; + }; +}; + +// +// Helper functions: +// + QString fileNameFor(const QString &name) { QString baseName(name); QString environmentExtension(QString::fromLocal8Bit(qgetenv("QTC_EXTENSION"))); @@ -109,6 +156,7 @@ UserFileAccessor::UserFileAccessor() : m_lastVersion(-1) { addVersionHandler(new Version0Handler); + addVersionHandler(new Version1Handler); } UserFileAccessor::~UserFileAccessor() @@ -134,14 +182,18 @@ QVariantMap UserFileAccessor::restoreSettings(Project *project) return QVariantMap(); } - // Copy user file before changing it: - if (fileVersion != m_lastVersion + 1) + // Do we need to do a update? + if (fileVersion != m_lastVersion + 1) { + map.insert(QLatin1String(WAS_UPDATED), true); QFile::copy(fileName, fileName + '.' + m_handlers.value(fileVersion)->displayUserFileVersion()); + } // Update: for (int i = fileVersion; i <= m_lastVersion; ++i) map = m_handlers.value(i)->update(project, map); + map.insert(QLatin1String(USER_FILE_VERSION), m_lastVersion + 1); + return map; } @@ -640,8 +692,120 @@ QVariantMap Version0Handler::update(Project *project, const QVariantMap &map) } result.insert(QLatin1String("GenericProjectManager.GenericProject.Toolchain"), type); } - // File version information: - result.insert(QLatin1String(USER_FILE_VERSION), 1); + + return result; +} + +// ------------------------------------------------------------------------- +// Version1Handler +// ------------------------------------------------------------------------- + +Version1Handler::Version1Handler() +{ +} + +Version1Handler::~Version1Handler() +{ +} + +QVariantMap Version1Handler::update(Project *project, const QVariantMap &map) +{ + QVariantMap result; + + // The only difference between version 1 and 2 of the user file is that + // we need to add targets. + + // Generate a list of all possible targets for the project: + QList<TargetDescription> targets; + if (project->id() == QLatin1String("GenericProjectManager.GenericProject")) + targets << TargetDescription(QString::fromLatin1("GenericProjectManager.GenericTarget"), + QCoreApplication::translate("GenericProjectManager::GenericTarget", + "Desktop", + "Generic desktop target display name")); + else if (project->id() == QLatin1String("CMakeProjectManager.CMakeProject")) + targets << TargetDescription(QString::fromLatin1("CMakeProjectManager.DefaultCMakeTarget"), + QCoreApplication::translate("CMakeProjectManager::Internal::CMakeTarget", + "Desktop", + "CMake Default target display name")); + else if (project->id() == QLatin1String("Qt4ProjectManager.Qt4Project")) + targets << TargetDescription(QString::fromLatin1("Qt4ProjectManager.Target.DesktopTarget"), + QCoreApplication::translate("Qt4ProjectManager::Internal::Qt4Target", + "Desktop", + "Qt4 Desktop target display name")) + << TargetDescription(QString::fromLatin1("Qt4ProjectManager.Target.S60EmulatorTarget"), + QCoreApplication::translate("Qt4ProjectManager::Internal::Qt4Target", + "S60 Emulator", + "Qt4 S60 Emulator target display name")) + << TargetDescription(QString::fromLatin1("Qt4ProjectManager.Target.S60DeviceTarget"), + QCoreApplication::translate("Qt4ProjectManager::Internal::Qt4Target", + "S60 Device", + "Qt4 S60 Device target display name")) + << TargetDescription(QString::fromLatin1("Qt4ProjectManager.Target.MaemoEmulatorTarget"), + QCoreApplication::translate("Qt4ProjectManager::Internal::Qt4Target", + "Maemo Emulator", + "Qt4 Maemo Emulator target display name")) + << TargetDescription(QString::fromLatin1("Qt4ProjectManager.Target.MaemoDeviceTarget"), + QCoreApplication::translate("Qt4ProjectManager::Internal::Qt4Target", + "Maemo Device", + "Qt4 Maemo Device target display name")); + else if (project->id() == QLatin1String("QmlProjectManager.QmlProject")) + targets << TargetDescription(QString::fromLatin1("QmlProjectManager.QmlTarget"), + QCoreApplication::translate("QmlProjectManager::QmlTarget", + "QML Viewer", + "Qml Viewer target display name")); + else + return QVariantMap(); // We do not know how to handle this. + + result.insert(QLatin1String("ProjectExplorer.Project.ActiveTarget"), 0); + result.insert(QLatin1String("ProjectExplorer.Project.TargetCount"), targets.count()); + int pos(0); + foreach (const TargetDescription &td, targets) { + QVariantMap targetMap; + // Do not set displayName or icon! + targetMap.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), td.id); + + int count = map.value(QLatin1String("ProjectExplorer.Project.BuildConfigurationCount")).toInt(); + targetMap.insert(QLatin1String("ProjectExplorer.Target.BuildConfigurationCount"), count); + for (int i = 0; i < count; ++i) { + QString key(QString::fromLatin1("ProjectExplorer.Project.BuildConfiguration.") + QString::number(i)); + if (map.contains(key)) + targetMap.insert(QString::fromLatin1("ProjectExplorer.Target.BuildConfiguration.") + QString::number(i), + map.value(key)); + } + + count = map.value(QLatin1String("ProjectExplorer.Project.RunConfigurationCount")).toInt(); + for (int i = 0; i < count; ++i) { + QString key(QString::fromLatin1("ProjectExplorer.Project.RunConfiguration.") + QString::number(i)); + if (map.contains(key)) + targetMap.insert(QString::fromLatin1("ProjectExplorer.Target.RunConfiguration.") + QString::number(i), + map.value(key)); + } + + if (map.contains(QLatin1String("ProjectExplorer.Project.ActiveBuildConfiguration"))) + targetMap.insert(QLatin1String("ProjectExplorer.Target.ActiveBuildConfiguration"), + map.value(QLatin1String("ProjectExplorer.Project.ActiveBuildConfiguration"))); + if (map.contains(QLatin1String("ProjectExplorer.Project.ActiveRunConfiguration"))) + targetMap.insert(QLatin1String("ProjectExplorer.Target.ActiveRunConfiguration"), + map.value(QLatin1String("ProjectExplorer.Project.ActiveRunConfiguration"))); + if (map.contains(QLatin1String("ProjectExplorer.Project.RunConfigurationCount"))) + targetMap.insert(QLatin1String("ProjectExplorer.Target.RunConfigurationCount"), + map.value(QLatin1String("ProjectExplorer.Project.RunConfigurationCount"))); + + result.insert(QString::fromLatin1("ProjectExplorer.Project.Target.") + QString::number(pos), targetMap); + ++pos; + } + + // copy everything else: + for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) { + if (i.key() == QLatin1String("ProjectExplorer.Project.ActiveBuildConfiguration") || + i.key() == QLatin1String("ProjectExplorer.Project.BuildConfigurationCount") || + i.key() == QLatin1String("ProjectExplorer.Project.ActiveRunConfiguration") || + i.key() == QLatin1String("ProjectExplorer.Project.RunConfigurationCount") || + i.key().startsWith(QLatin1String("ProjectExplorer.Project.BuildConfiguration.")) || + i.key().startsWith(QLatin1String("ProjectExplorer.Project.RunConfiguration."))) + continue; + result.insert(i.key(), i.value()); + } return result; } diff --git a/src/plugins/qmlinspector/qmlinspectormode.cpp b/src/plugins/qmlinspector/qmlinspectormode.cpp index 3c9032b88f..c4e568c664 100644 --- a/src/plugins/qmlinspector/qmlinspectormode.cpp +++ b/src/plugins/qmlinspector/qmlinspectormode.cpp @@ -60,6 +60,7 @@ #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/project.h> +#include <projectexplorer/target.h> #include <qmlprojectmanager/qmlproject.h> @@ -186,7 +187,7 @@ void QmlInspectorMode::connectToViewer() } QmlProjectManager::QmlRunConfiguration* config = - qobject_cast<QmlProjectManager::QmlRunConfiguration*>(project->activeRunConfiguration()); + qobject_cast<QmlProjectManager::QmlRunConfiguration*>(project->activeTarget()->activeRunConfiguration()); if (!config) { emit statusMessage(tr("Cannot find project run configuration, debugging canceled.")); return; diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 4230368985..8ff1071ee5 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -29,6 +29,7 @@ #include "qmlproject.h" #include "qmlprojectconstants.h" +#include "qmltarget.h" #include <projectexplorer/toolchain.h> #include <projectexplorer/persistentsettings.h> @@ -85,8 +86,10 @@ QmlProject::QmlProject(Manager *manager, const QString &fileName) : m_manager(manager), m_fileName(fileName), m_modelManager(ExtensionSystem::PluginManager::instance()->getObject<QmlJSEditor::QmlModelManagerInterface>()), - m_fileWatcher(new ProjectExplorer::FileWatcher(this)) + m_fileWatcher(new ProjectExplorer::FileWatcher(this)), + m_targetFactory(new QmlTargetFactory(this)) { + setSupportedTargetIds(QSet<QString>() << QLatin1String(VIEWER_TARGET_ID)); QFileInfo fileInfo(m_fileName); m_projectName = fileInfo.completeBaseName(); @@ -259,11 +262,6 @@ bool QmlProject::isApplication() const return true; } -bool QmlProject::hasBuildSettings() const -{ - return false; -} - ProjectExplorer::BuildConfigWidget *QmlProject::createConfigWidget() { return 0; @@ -274,9 +272,14 @@ QList<ProjectExplorer::BuildConfigWidget*> QmlProject::subConfigWidgets() return QList<ProjectExplorer::BuildConfigWidget*>(); } -ProjectExplorer::IBuildConfigurationFactory *QmlProject::buildConfigurationFactory() const +QmlTargetFactory *QmlProject::targetFactory() const { - return 0; + return m_targetFactory; +} + +QmlTarget *QmlProject::activeTarget() const +{ + return static_cast<QmlTarget *>(Project::activeTarget()); } QmlProjectNode *QmlProject::rootProjectNode() const @@ -294,10 +297,9 @@ bool QmlProject::fromMap(const QVariantMap &map) if (!Project::fromMap(map)) return false; - if (runConfigurations().isEmpty()) { - QmlRunConfiguration *runConf = new QmlRunConfiguration(this); - addRunConfiguration(runConf); - setActiveRunConfiguration(runConf); + if (targets().isEmpty()) { + Internal::QmlTarget *target(targetFactory()->create(this, QLatin1String(VIEWER_TARGET_ID))); + addTarget(target); } refresh(Everything); @@ -365,14 +367,14 @@ void QmlProjectFile::modified(ReloadBehavior *) // QmlRunConfiguration //////////////////////////////////////////////////////////////////////////////////// -QmlRunConfiguration::QmlRunConfiguration(QmlProject *parent) : +QmlRunConfiguration::QmlRunConfiguration(QmlTarget *parent) : ProjectExplorer::RunConfiguration(parent, QLatin1String(QML_RC_ID)), m_debugServerPort(DEFAULT_DEBUG_SERVER_PORT) { ctor(); } -QmlRunConfiguration::QmlRunConfiguration(QmlProject *parent, QmlRunConfiguration *source) : +QmlRunConfiguration::QmlRunConfiguration(QmlTarget *parent, QmlRunConfiguration *source) : ProjectExplorer::RunConfiguration(parent, source), m_scriptFile(source->m_scriptFile), m_qmlViewerCustomPath(source->m_qmlViewerCustomPath), @@ -397,9 +399,9 @@ QmlRunConfiguration::~QmlRunConfiguration() { } -QmlProject *QmlRunConfiguration::qmlProject() const +QmlTarget *QmlRunConfiguration::qmlTarget() const { - return static_cast<QmlProject *>(project()); + return static_cast<Internal::QmlTarget *>(target()); } QString QmlRunConfiguration::viewerPath() const @@ -418,11 +420,9 @@ QStringList QmlRunConfiguration::viewerArguments() const args.append(m_qmlViewerArgs); // arguments from .qmlproject file - if (qmlProject()) { - foreach (const QString &libraryPath, qmlProject()->libraryPaths()) { - args.append(QLatin1String("-L")); - args.append(libraryPath); - } + foreach (const QString &libraryPath, qmlTarget()->qmlProject()->libraryPaths()) { + args.append(QLatin1String("-L")); + args.append(libraryPath); } const QString s = mainScript(); @@ -433,7 +433,7 @@ QStringList QmlRunConfiguration::viewerArguments() const QString QmlRunConfiguration::workingDirectory() const { - QFileInfo projectFile(qmlProject()->file()->fileName()); + QFileInfo projectFile(qmlTarget()->qmlProject()->file()->fileName()); return projectFile.absolutePath(); } @@ -449,14 +449,14 @@ QWidget *QmlRunConfiguration::configurationWidget() QComboBox *combo = new QComboBox; - QDir projectDir = qmlProject()->projectDir(); + QDir projectDir = qmlTarget()->qmlProject()->projectDir(); QStringList files; files.append(tr("<Current File>")); int currentIndex = -1; - foreach (const QString &fn, qmlProject()->files()) { + foreach (const QString &fn, qmlTarget()->qmlProject()->files()) { QFileInfo fileInfo(fn); if (fileInfo.suffix() != QLatin1String("qml")) continue; @@ -506,7 +506,7 @@ QString QmlRunConfiguration::mainScript() const } } - return qmlProject()->projectDir().absoluteFilePath(m_scriptFile); + return qmlTarget()->qmlProject()->projectDir().absoluteFilePath(m_scriptFile); } void QmlRunConfiguration::setMainScript(const QString &scriptFile) @@ -568,8 +568,10 @@ QmlRunConfigurationFactory::~QmlRunConfigurationFactory() { } -QStringList QmlRunConfigurationFactory::availableCreationIds(ProjectExplorer::Project *) const +QStringList QmlRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { + if (!qobject_cast<QmlTarget *>(parent)) + return QStringList(); return QStringList() << QLatin1String(QML_RC_ID); } @@ -580,50 +582,50 @@ QString QmlRunConfigurationFactory::displayNameForId(const QString &id) const return QString(); } -bool QmlRunConfigurationFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +bool QmlRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const { - if (!qobject_cast<QmlProject *>(parent)) + if (!qobject_cast<QmlTarget *>(parent)) return false; return id == QLatin1String(QML_RC_ID); } -ProjectExplorer::RunConfiguration *QmlRunConfigurationFactory::create(ProjectExplorer::Project *parent, const QString &id) +ProjectExplorer::RunConfiguration *QmlRunConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id) { if (!canCreate(parent, id)) return 0; - QmlProject *project(static_cast<QmlProject *>(parent)); - return new QmlRunConfiguration(project); + QmlTarget *qmlparent(static_cast<QmlTarget *>(parent)); + return new QmlRunConfiguration(qmlparent); } -bool QmlRunConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +bool QmlRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { QString id(idFromMap(map)); return canCreate(parent, id); } -ProjectExplorer::RunConfiguration *QmlRunConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +ProjectExplorer::RunConfiguration *QmlRunConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - QmlProject *project(static_cast<QmlProject *>(parent)); - QmlRunConfiguration *rc(new QmlRunConfiguration(project)); + QmlTarget *qmlparent(static_cast<QmlTarget *>(parent)); + QmlRunConfiguration *rc(new QmlRunConfiguration(qmlparent)); if (rc->fromMap(map)) return rc; delete rc; return 0; } -bool QmlRunConfigurationFactory::canClone(ProjectExplorer::Project *parent, RunConfiguration *source) const +bool QmlRunConfigurationFactory::canClone(ProjectExplorer::Target *parent, RunConfiguration *source) const { return canCreate(parent, source->id()); } -ProjectExplorer::RunConfiguration *QmlRunConfigurationFactory::clone(ProjectExplorer::Project *parent, RunConfiguration *source) +ProjectExplorer::RunConfiguration *QmlRunConfigurationFactory::clone(ProjectExplorer::Target *parent, RunConfiguration *source) { if (!canClone(parent, source)) return 0; - QmlProject *project(static_cast<QmlProject *>(parent)); - return new QmlRunConfiguration(project, qobject_cast<QmlRunConfiguration *>(source)); + QmlTarget *qmlparent(static_cast<QmlTarget *>(parent)); + return new QmlRunConfiguration(qmlparent, qobject_cast<QmlRunConfiguration *>(source)); } //////////////////////////////////////////////////////////////////////////////////// diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index b229221f19..cd9edd84f9 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -33,6 +33,7 @@ #include "qmlprojectmanager.h" #include "qmlprojectnodes.h" #include "qmlprojectmanager_global.h" +#include "qmltarget.h" #include "fileformat/qmlprojectitem.h" #include <projectexplorer/project.h> @@ -55,8 +56,6 @@ class QmlRunConfiguration; namespace Internal { -class QmlMakeStep; - class QmlProjectFile : public Core::IFile { Q_OBJECT @@ -89,22 +88,17 @@ class QmlRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFact public: explicit QmlRunConfigurationFactory(QObject *parent = 0); - virtual ~QmlRunConfigurationFactory(); - - // used to show the list of possible additons to a project, returns a list of types - virtual QStringList availableCreationIds(ProjectExplorer::Project *pro) const; - // used to translate the types to names to display to the user - virtual QString displayNameForId(const QString &id) const; + ~QmlRunConfigurationFactory(); - virtual bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; - virtual ProjectExplorer::RunConfiguration *create(ProjectExplorer::Project *project, const QString &id); + QStringList availableCreationIds(ProjectExplorer::Target *parent) const; + QString displayNameForId(const QString &id) const; - // used to recreate the runConfigurations when restoring settings - virtual bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - virtual ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - - virtual bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) const; - virtual ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source); + bool canCreate(ProjectExplorer::Target *parent, const QString &id) const; + ProjectExplorer::RunConfiguration *create(ProjectExplorer::Target *parent, const QString &id); + bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const; + ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); }; class QmlRunControl : public ProjectExplorer::RunControl { @@ -157,22 +151,22 @@ public: QString filesFileName() const; - virtual QString displayName() const; - virtual QString id() const; - virtual Core::IFile *file() const; - virtual Internal::Manager *projectManager() const; - virtual ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; + QString displayName() const; + QString id() const; + Core::IFile *file() const; + Internal::Manager *projectManager() const; + Internal::QmlTargetFactory *targetFactory() const; + Internal::QmlTarget *activeTarget() const; - virtual QList<ProjectExplorer::Project *> dependsOn(); + QList<ProjectExplorer::Project *> dependsOn(); - virtual bool isApplication() const; - virtual bool hasBuildSettings() const; + bool isApplication() const; - virtual ProjectExplorer::BuildConfigWidget *createConfigWidget(); - virtual QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); + ProjectExplorer::BuildConfigWidget *createConfigWidget(); + QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); - virtual Internal::QmlProjectNode *rootProjectNode() const; - virtual QStringList files(FilesMode fileMode) const; + Internal::QmlProjectNode *rootProjectNode() const; + QStringList files(FilesMode fileMode) const; enum RefreshOption { ProjectFile = 0x01, @@ -215,6 +209,7 @@ private: ProjectExplorer::FileWatcher *m_fileWatcher; Internal::QmlProjectNode *m_rootNode; + Internal::QmlTargetFactory *m_targetFactory; }; class QMLPROJECTMANAGER_EXPORT QmlRunConfiguration : public ProjectExplorer::RunConfiguration @@ -223,10 +218,10 @@ class QMLPROJECTMANAGER_EXPORT QmlRunConfiguration : public ProjectExplorer::Run friend class Internal::QmlRunConfigurationFactory; public: - QmlRunConfiguration(QmlProject *parent); + QmlRunConfiguration(Internal::QmlTarget *parent); virtual ~QmlRunConfiguration(); - QmlProject *qmlProject() const; + Internal::QmlTarget *qmlTarget() const; QString viewerPath() const; QStringList viewerArguments() const; @@ -246,7 +241,7 @@ private slots: void onDebugServerPortChanged(); protected: - QmlRunConfiguration(QmlProject *parent, QmlRunConfiguration *source); + QmlRunConfiguration(Internal::QmlTarget *parent, QmlRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: diff --git a/src/plugins/qmlprojectmanager/qmlprojectconstants.h b/src/plugins/qmlprojectmanager/qmlprojectconstants.h index 5acfde7983..d41f7a5685 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectconstants.h +++ b/src/plugins/qmlprojectmanager/qmlprojectconstants.h @@ -38,7 +38,6 @@ const char *const LANG_QML = "QML"; const char *const QMLMIMETYPE = "application/x-qmlproject"; const char *const QMLRUNCONFIGURATION = "QmlProject.QmlLocalApplicationRunConfiguration"; -const char *const MAKESTEP = "QmlProject.QmlMakeStep"; // contexts const char *const C_FILESEDITOR = ".files Editor"; diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro index 6b55476c99..ba56ece28d 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro +++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro @@ -16,14 +16,16 @@ HEADERS += qmlproject.h \ qmlprojectwizard.h \ qmlnewprojectwizard.h \ qmltaskmanager.h \ - qmlprojectmanager_global.h + qmlprojectmanager_global.h \ + qmltarget.h SOURCES += qmlproject.cpp \ qmlprojectplugin.cpp \ qmlprojectmanager.cpp \ qmlprojectnodes.cpp \ qmlprojectwizard.cpp \ qmlnewprojectwizard.cpp \ - qmltaskmanager.cpp + qmltaskmanager.cpp \ + qmltarget.cpp RESOURCES += qmlproject.qrc OTHER_FILES += QmlProjectManager.pluginspec diff --git a/src/plugins/qmlprojectmanager/qmltarget.cpp b/src/plugins/qmlprojectmanager/qmltarget.cpp new file mode 100644 index 0000000000..c8a2ab5290 --- /dev/null +++ b/src/plugins/qmlprojectmanager/qmltarget.cpp @@ -0,0 +1,151 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qmltarget.h" + +#include "qmlproject.h" + +#include <QtGui/QApplication> +#include <QtGui/QStyle> + +namespace { +const char * const VIEWER_TARGET_DISPLAY_NAME("QML Viewer"); +} + +using namespace QmlProjectManager; +using namespace QmlProjectManager::Internal; + +//////////////////////////////////////////////////////////////////////////////////// +// QmlTarget +//////////////////////////////////////////////////////////////////////////////////// + +QmlTarget::QmlTarget(QmlProject *parent) : + ProjectExplorer::Target(parent, QLatin1String(VIEWER_TARGET_ID)) +{ + setDisplayName(QApplication::translate("QmlProjectManager::QmlTarget", + VIEWER_TARGET_DISPLAY_NAME, + "Qml Viewer target display name")); + setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); +} + +QmlTarget::~QmlTarget() +{ +} + +QmlProject *QmlTarget::qmlProject() const +{ + return static_cast<QmlProject *>(project()); +} + +ProjectExplorer::IBuildConfigurationFactory *QmlTarget::buildConfigurationFactory(void) const +{ + return 0; +} + +bool QmlTarget::fromMap(const QVariantMap &map) +{ + if (!Target::fromMap(map)) + return false; + + if (displayName().isEmpty()) + setDisplayName(QApplication::translate("QmlProjectManager::QmlTarget", + VIEWER_TARGET_DISPLAY_NAME, + "Qml Viewer target display name")); + if (icon().isNull()) + setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); + + return true; +} + +//////////////////////////////////////////////////////////////////////////////////// +// QmlTargetFactory +//////////////////////////////////////////////////////////////////////////////////// + +QmlTargetFactory::QmlTargetFactory(QObject *parent) : + ITargetFactory(parent) +{ +} + +QmlTargetFactory::~QmlTargetFactory() +{ +} + +QStringList QmlTargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const +{ + if (!qobject_cast<QmlProject *>(parent)) + return QStringList(); + return QStringList() << QLatin1String(VIEWER_TARGET_ID); +} + +QString QmlTargetFactory::displayNameForId(const QString &id) const +{ + if (id == QLatin1String(VIEWER_TARGET_ID)) + return QCoreApplication::translate("QmlProjectManager::QmlTarget", + VIEWER_TARGET_DISPLAY_NAME, + "Qml Viewer target display name"); + return QString(); +} + +bool QmlTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +{ + if (!qobject_cast<QmlProject *>(parent)) + return false; + return id == QLatin1String(VIEWER_TARGET_ID); +} + +QmlTarget *QmlTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) +{ + if (!canCreate(parent, id)) + return 0; + QmlProject *qmlproject(static_cast<QmlProject *>(parent)); + QmlTarget *t(new QmlTarget(qmlproject)); + + // Add RunConfiguration (Qml does not have BuildConfigurations) + QmlRunConfiguration *runConf(new QmlRunConfiguration(t)); + t->addRunConfiguration(runConf); + + return t; +} + +bool QmlTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +{ + return canCreate(parent, ProjectExplorer::idFromMap(map)); +} + +QmlTarget *QmlTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +{ + if (!canRestore(parent, map)) + return 0; + QmlProject *qmlproject(static_cast<QmlProject *>(parent)); + QmlTarget *target(new QmlTarget(qmlproject)); + if (target->fromMap(map)) + return target; + delete target; + return 0; +} diff --git a/src/plugins/qmlprojectmanager/qmltarget.h b/src/plugins/qmlprojectmanager/qmltarget.h new file mode 100644 index 0000000000..158f4d8ffc --- /dev/null +++ b/src/plugins/qmlprojectmanager/qmltarget.h @@ -0,0 +1,86 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QMLTARGET_H +#define QMLTARGET_H + +#include <projectexplorer/target.h> + +#include <QtCore/QStringList> +#include <QtCore/QVariantMap> + +namespace QmlProjectManager { +class QmlProject; +class QmlRunConfiguration; + +namespace Internal { + +const char * const VIEWER_TARGET_ID("QmlProjectManager.QmlTarget"); + +class QmlTargetFactory; + +class QmlTarget : public ProjectExplorer::Target +{ + Q_OBJECT + friend class QmlTargetFactory; + +public: + explicit QmlTarget(QmlProject *parent); + ~QmlTarget(); + + QmlProject *qmlProject() const; + + ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; + +protected: + bool fromMap(const QVariantMap &map); +}; + +class QmlTargetFactory : public ProjectExplorer::ITargetFactory +{ + Q_OBJECT + +public: + explicit QmlTargetFactory(QObject *parent = 0); + ~QmlTargetFactory(); + + QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QString displayNameForId(const QString &id) const; + + bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; + QmlTarget *create(ProjectExplorer::Project *parent, const QString &id); + bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; + QmlTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); +}; + +} // namespace Internal + +} // namespace QmlProjectManager + +#endif // QMLTARGET_H diff --git a/src/plugins/qt4projectmanager/externaleditors.cpp b/src/plugins/qt4projectmanager/externaleditors.cpp index 0f113175d7..225e9a0639 100644 --- a/src/plugins/qt4projectmanager/externaleditors.cpp +++ b/src/plugins/qt4projectmanager/externaleditors.cpp @@ -30,6 +30,7 @@ #include "externaleditors.h" #include "qt4project.h" #include "qt4projectmanagerconstants.h" +#include "qt4target.h" #include "qtversionmanager.h" #include "qt4buildconfiguration.h" @@ -139,8 +140,11 @@ bool ExternalQtEditor::getEditorLaunchData(const QString &fileName, const Qt4Project *project = qt4ProjectFor(fileName); // Get the binary either from the current Qt version of the project or Path if (project) { - Qt4BuildConfiguration *qt4bc = project->activeQt4BuildConfiguration(); - const QtVersion *qtVersion= qt4bc->qtVersion(); + if (!project->activeTarget() || + !project->activeTarget()->activeBuildConfiguration()) + return false; + Qt4BuildConfiguration *qt4bc = project->activeTarget()->activeBuildConfiguration(); + const QtVersion *qtVersion = qt4bc->qtVersion(); data->binary = (qtVersion->*commandAccessor)(); data->workingDirectory = QFileInfo(project->file()->fileName()).absolutePath(); } else { diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 8b8007b5d8..b1f2a550ad 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -30,6 +30,7 @@ #include "makestep.h" #include "qt4project.h" +#include "qt4target.h" #include "qt4buildconfiguration.h" #include "qt4projectmanagerconstants.h" @@ -175,7 +176,7 @@ bool MakeStep::init() void MakeStep::run(QFutureInterface<bool> & fi) { - if (qt4BuildConfiguration()->qt4Project()->rootProjectNode()->projectType() == ScriptTemplate) { + if (qt4BuildConfiguration()->qt4Target()->qt4Project()->rootProjectNode()->projectType() == ScriptTemplate) { fi.reportResult(true); return; } diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp index 7b72e5ce96..267bb31f16 100644 --- a/src/plugins/qt4projectmanager/projectloadwizard.cpp +++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp @@ -32,6 +32,7 @@ #include "qt4project.h" #include "qt4projectmanager.h" #include "qmakestep.h" +#include "qt4target.h" #include "makestep.h" #include "qt4buildconfiguration.h" @@ -119,21 +120,33 @@ void ProjectLoadWizard::done(int result) // Importing if (m_temporaryVersion) vm->addVersion(m_importVersion); + // Import the existing stuff // qDebug()<<"Creating m_buildconfiguration entry from imported stuff"; // qDebug()<<((m_importBuildConfig& QtVersion::BuildAll)? "debug_and_release" : "")<<((m_importBuildConfig & QtVersion::DebugBuild)? "debug" : "release"); bool debug = m_importBuildConfig & QtVersion::DebugBuild; - m_project->addQt4BuildConfiguration(debug ? "Debug" : "Release", m_importVersion, m_importBuildConfig, m_additionalArguments); - - if (m_importBuildConfig & QtVersion::BuildAll) { - // Also create the other configuration - QtVersion::QmakeBuildConfigs otherBuildConfiguration = m_importBuildConfig; - if (debug) - otherBuildConfiguration = otherBuildConfiguration & ~ QtVersion::DebugBuild; - else - otherBuildConfiguration = otherBuildConfiguration | QtVersion::DebugBuild; - m_project->addQt4BuildConfiguration(debug ? "Release" : "Debug", m_importVersion, otherBuildConfiguration, m_additionalArguments); + foreach (const QString &id, m_importVersion->supportedTargetIds()) { + Qt4Target *t(m_project->targetFactory()->create(m_project, id)); + if (!t) + continue; + // Remove default BCs + foreach (ProjectExplorer::BuildConfiguration *bc, t->buildConfigurations()) + t->removeBuildConfiguration(bc); + + // ... and add our own! + t->addQt4BuildConfiguration(debug ? "Debug" : "Release", m_importVersion, m_importBuildConfig, m_additionalArguments); + if (m_importBuildConfig & QtVersion::BuildAll) { + // Also create the other configuration + QtVersion::QmakeBuildConfigs otherBuildConfiguration = m_importBuildConfig; + if (debug) + otherBuildConfiguration = otherBuildConfiguration & ~ QtVersion::DebugBuild; + else + otherBuildConfiguration = otherBuildConfiguration | QtVersion::DebugBuild; + + t->addQt4BuildConfiguration(debug ? "Release" : "Debug", m_importVersion, otherBuildConfiguration, m_additionalArguments); + } + m_project->addTarget(t); } } else { // Not importing @@ -141,20 +154,30 @@ void ProjectLoadWizard::done(int result) delete m_importVersion; // Create default bool buildAll = false; - QtVersion *defaultVersion = vm->version(0); - if (defaultVersion && defaultVersion->isValid() && (defaultVersion->defaultBuildConfig() & QtVersion::BuildAll)) + + // Find a Qt version: + // TODO: Update the wizard to support targets properly. + QList<QtVersion *> candidates = vm->versions(); + QtVersion *defaultVersion = candidates.at(0); + foreach (QtVersion *v, candidates) { + if (v->isValid()) + defaultVersion = v; + if (v->supportsTargetId(DESKTOP_TARGET_ID) && v->isValid()) { + defaultVersion = v; + break; + } + } + + if (defaultVersion->isValid() && (defaultVersion->defaultBuildConfig() & QtVersion::BuildAll)) buildAll = true; - if (buildAll) { - m_project->addQt4BuildConfiguration("Debug", 0, QtVersion::BuildAll | QtVersion::DebugBuild, m_additionalArguments); - m_project->addQt4BuildConfiguration("Release", 0, QtVersion::BuildAll, m_additionalArguments); - } else { - m_project->addQt4BuildConfiguration("Debug", 0, QtVersion::DebugBuild, m_additionalArguments); - m_project->addQt4BuildConfiguration("Release", 0, QtVersion::QmakeBuildConfig(0), m_additionalArguments); + + foreach (const QString &id, defaultVersion->supportedTargetIds()) { + Qt4Target *t(m_project->targetFactory()->create(m_project, id)); + if (!t) + continue; + m_project->addTarget(t); } } - - if (!m_project->buildConfigurations().isEmpty()) - m_project->setActiveBuildConfiguration(m_project->buildConfigurations().at(0)); } // This function used to do the commented stuff instead of having only one page diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index 48d001ea77..4edc5abc8f 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -34,6 +34,7 @@ #include "qt4project.h" #include "qt4projectmanagerconstants.h" #include "qt4projectmanager.h" +#include "qt4target.h" #include "qtversionmanager.h" #include <coreplugin/icore.h> @@ -96,7 +97,7 @@ QStringList QMakeStep::allArguments() if (bc->subNodeBuild()) arguments << bc->subNodeBuild()->path(); else - arguments << buildConfiguration()->project()->file()->fileName(); + arguments << buildConfiguration()->target()->project()->file()->fileName(); arguments << "-r"; if (!additonalArguments.contains("-spec")) @@ -179,7 +180,7 @@ bool QMakeStep::init() void QMakeStep::run(QFutureInterface<bool> &fi) { - Qt4Project *pro = qt4BuildConfiguration()->qt4Project(); + Qt4Project *pro = qt4BuildConfiguration()->qt4Target()->qt4Project(); if (pro->rootProjectNode()->projectType() == ScriptTemplate) { fi.reportResult(true); return; @@ -367,7 +368,7 @@ void QMakeStepConfigWidget::updateSummaryLabel() QStringList args = m_step->allArguments(); // We don't want the full path to the .pro file - const QString projectFileName = m_step->buildConfiguration()->project()->file()->fileName(); + const QString projectFileName = m_step->buildConfiguration()->target()->project()->file()->fileName(); int index = args.indexOf(projectFileName); if (index != -1) args[index] = QFileInfo(projectFileName).fileName(); @@ -383,12 +384,8 @@ void QMakeStepConfigWidget::updateEffectiveQMakeCall() { Qt4BuildConfiguration *qt4bc = m_step->qt4BuildConfiguration(); const QtVersion *qtVersion = qt4bc->qtVersion(); - if (qtVersion) { - QString program = QFileInfo(qtVersion->qmakeCommand()).fileName(); - m_ui.qmakeArgumentsEdit->setPlainText(program + QLatin1Char(' ') + ProjectExplorer::Environment::joinArgumentList(m_step->allArguments())); - } else { - m_ui.qmakeArgumentsEdit->setPlainText(tr("No valid Qt version set.")); - } + QString program = QFileInfo(qtVersion->qmakeCommand()).fileName(); + m_ui.qmakeArgumentsEdit->setPlainText(program + QLatin1Char(' ') + ProjectExplorer::Environment::joinArgumentList(m_step->allArguments())); } //// diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp index 4e2286aecf..879f9b9ad3 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp @@ -125,6 +125,9 @@ MaemoManager::maemoToolChain(const QtVersion *version) const void MaemoManager::addQemuSimulatorStarter(Project *project) { + if (projects.contains(project)) + return; + projects.insert(project); if (m_qemuCommand) { diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp index 5f11c9d768..a2acc2cca5 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp @@ -36,6 +36,7 @@ #include "maemotoolchain.h" #include "profilereader.h" #include "qt4project.h" +#include "qt4target.h" #include "qt4buildconfiguration.h" #include <coreplugin/icore.h> @@ -55,21 +56,6 @@ namespace { const char * const MAEMO_RC_ID("Qt4ProjectManager.MaemoRunConfiguration"); const char * const MAEMO_RC_ID_PREFIX("Qt4ProjectManager.MaemoRunConfiguration."); -bool hasMaemoRunConfig(ProjectExplorer::Project* project) -{ - Qt4ProjectManager::Qt4Project *qt4Project( - qobject_cast<Qt4ProjectManager::Qt4Project *>(project)); - if (qt4Project) { - QList<ProjectExplorer::RunConfiguration *> list = - qt4Project->runConfigurations(); - foreach (ProjectExplorer::RunConfiguration *rc, list) { - if (qobject_cast<Qt4ProjectManager::Internal::MaemoRunConfiguration *>(rc)) - return true; - } - } - return false; -} - QString targetFromId(const QString &id) { QString prefix(MAEMO_RC_ID_PREFIX); @@ -139,9 +125,9 @@ void ErrorDumper::printToStream(QProcess::ProcessError error) // #pragma mark -- MaemoRunConfiguration -MaemoRunConfiguration::MaemoRunConfiguration(Qt4Project *project, +MaemoRunConfiguration::MaemoRunConfiguration(Qt4Target *parent, const QString &proFilePath) - : RunConfiguration(project, QLatin1String(MAEMO_RC_ID)) + : RunConfiguration(parent, QLatin1String(MAEMO_RC_ID)) , m_proFilePath(proFilePath) , m_cachedTargetInformationValid(false) , m_cachedSimulatorInformationValid(false) @@ -150,9 +136,9 @@ MaemoRunConfiguration::MaemoRunConfiguration(Qt4Project *project, init(); } -MaemoRunConfiguration::MaemoRunConfiguration(Qt4Project *project, +MaemoRunConfiguration::MaemoRunConfiguration(Qt4Target *parent, MaemoRunConfiguration *source) - : RunConfiguration(project, source) + : RunConfiguration(parent, source) , m_executable(source->m_executable) , m_proFilePath(source->m_proFilePath) , m_cachedTargetInformationValid(false) @@ -186,13 +172,13 @@ void MaemoRunConfiguration::init() connect(&MaemoDeviceConfigurations::instance(), SIGNAL(updated()), this, SLOT(updateDeviceConfigurations())); - connect(qt4Project(), SIGNAL(targetInformationChanged()), + connect(qt4Target(), SIGNAL(targetInformationChanged()), this, SLOT(invalidateCachedTargetInformation())); - connect(qt4Project(), SIGNAL(targetInformationChanged()), + connect(qt4Target(), SIGNAL(targetInformationChanged()), this, SLOT(enabledStateChanged())); - connect(qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*)), + connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*)), this, SLOT(proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode*))); qemu = new QProcess(this); @@ -212,9 +198,14 @@ MaemoRunConfiguration::~MaemoRunConfiguration() qemu = NULL; } -Qt4Project *MaemoRunConfiguration::qt4Project() const +Qt4Target *MaemoRunConfiguration::qt4Target() const { - return static_cast<Qt4Project *>(project()); + return static_cast<Qt4Target *>(target()); +} + +Qt4BuildConfiguration *MaemoRunConfiguration::activeQt4BuildConfiguration() const +{ + return static_cast<Qt4BuildConfiguration *>(activeBuildConfiguration()); } bool MaemoRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *config) const @@ -248,7 +239,7 @@ QVariantMap MaemoRunConfiguration::toMap() const map.insert(SimulatorPathKey, m_simulatorPath); - const QDir &dir = QFileInfo(qt4Project()->file()->fileName()).absoluteDir(); + const QDir &dir = QFileInfo(qt4Target()->qt4Project()->file()->fileName()).absoluteDir(); map.insert(ProFileKey, dir.relativeFilePath(m_proFilePath)); return map; @@ -269,7 +260,7 @@ bool MaemoRunConfiguration::fromMap(const QVariantMap &map) m_simulatorPath = map.value(SimulatorPathKey).toString(); - const QDir &dir = QFileInfo(qt4Project()->file()->fileName()).absoluteDir(); + const QDir &dir = QFileInfo(qt4Target()->qt4Project()->file()->fileName()).absoluteDir(); m_proFilePath = dir.filePath(map.value(ProFileKey).toString()); return true; @@ -287,7 +278,7 @@ void MaemoRunConfiguration::wasDeployed() bool MaemoRunConfiguration::hasDebuggingHelpers() const { - Qt4BuildConfiguration *qt4bc = qt4Project()->activeQt4BuildConfiguration(); + Qt4BuildConfiguration *qt4bc = activeQt4BuildConfiguration(); return qt4bc->qtVersion()->hasDebuggingHelper(); } @@ -342,8 +333,7 @@ const QString MaemoRunConfiguration::cmd(const QString &cmdName) const const MaemoToolChain *MaemoRunConfiguration::toolchain() const { - Qt4BuildConfiguration *qt4bc = qobject_cast<Qt4BuildConfiguration *> - (qt4Project()->activeBuildConfiguration()); + Qt4BuildConfiguration *qt4bc(activeQt4BuildConfiguration()); QTC_ASSERT(qt4bc, return 0); MaemoToolChain *tc = dynamic_cast<MaemoToolChain *>(qt4bc->toolChain()); QTC_ASSERT(tc != 0, return 0); @@ -378,7 +368,7 @@ const QStringList MaemoRunConfiguration::arguments() const const QString MaemoRunConfiguration::dumperLib() const { - Qt4BuildConfiguration *qt4bc = qt4Project()->activeQt4BuildConfiguration(); + Qt4BuildConfiguration *qt4bc(activeQt4BuildConfiguration()); return qt4bc->qtVersion()->debuggingHelperLibrary(); } @@ -466,9 +456,8 @@ void MaemoRunConfiguration::updateTarget() const m_executable.clear(); m_cachedTargetInformationValid = true; - Qt4TargetInformation info - = qt4Project()->targetInformation(qt4Project()->activeQt4BuildConfiguration(), - m_proFilePath); + Qt4TargetInformation info = qt4Target()->targetInformation(activeQt4BuildConfiguration(), + m_proFilePath); if (info.error != Qt4TargetInformation::NoError) { if (info.error == Qt4TargetInformation::ProParserError) { Core::ICore::instance()->messageManager()->printToOutputPane(tr( @@ -628,35 +617,40 @@ MaemoRunConfigurationFactory::~MaemoRunConfigurationFactory() { } -bool MaemoRunConfigurationFactory::canCreate(Project *parent, +bool MaemoRunConfigurationFactory::canCreate(Target *parent, const QString &id) const { - if (!qobject_cast<Qt4Project *>(parent)) + Qt4Target * t = qobject_cast<Qt4Target *>(parent); + if (!t || + (t->id() != QLatin1String(MAEMO_DEVICE_TARGET_ID) && + t->id() != QLatin1String(MAEMO_EMULATOR_TARGET_ID))) return false; - return id.startsWith(QLatin1String(MAEMO_RC_ID)); + return id == QLatin1String(MAEMO_RC_ID); } -bool MaemoRunConfigurationFactory::canRestore(Project *parent, +bool MaemoRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { QString id(ProjectExplorer::idFromMap(map)); return canCreate(parent, id); } -bool MaemoRunConfigurationFactory::canClone(Project *parent, +bool MaemoRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const { QString id(source->id()); return canCreate(parent, id); } -QStringList MaemoRunConfigurationFactory::availableCreationIds(Project *pro) const +QStringList MaemoRunConfigurationFactory::availableCreationIds(Target *parent) const { - Qt4Project *qt4Project(qobject_cast<Qt4Project *>(pro)); - if (!qt4Project) + Qt4Target *t = qobject_cast<Qt4Target *>(parent); + if (!t || + (t->id() != QLatin1String(MAEMO_DEVICE_TARGET_ID) && + t->id() != QLatin1String(MAEMO_EMULATOR_TARGET_ID))) return QStringList(); - return qt4Project->applicationProFilePathes(QLatin1String(MAEMO_RC_ID_PREFIX)); + return t->qt4Project()->applicationProFilePathes(QLatin1String(MAEMO_RC_ID_PREFIX)); } QString MaemoRunConfigurationFactory::displayNameForId(const QString &id) const @@ -667,44 +661,41 @@ QString MaemoRunConfigurationFactory::displayNameForId(const QString &id) const return tr("%1 on Maemo Device").arg(QFileInfo(target).completeBaseName()); } -RunConfiguration *MaemoRunConfigurationFactory::create(Project *parent, +RunConfiguration *MaemoRunConfigurationFactory::create(Target *parent, const QString &id) { if (!canCreate(parent, id)) return 0; - Qt4Project *pqt4parent(static_cast<Qt4Project *>(parent)); - MaemoRunConfiguration *rc(new MaemoRunConfiguration(pqt4parent, targetFromId(id))); + Qt4Target *pqt4parent = static_cast<Qt4Target *>(parent); + MaemoRunConfiguration *rc = new MaemoRunConfiguration(pqt4parent, targetFromId(id)); setupRunConfiguration(rc); return rc; } -RunConfiguration *MaemoRunConfigurationFactory::restore(Project *parent, +RunConfiguration *MaemoRunConfigurationFactory::restore(Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - Qt4Project *qt4Project(qobject_cast<Qt4Project *>(parent)); - Q_ASSERT(qt4Project); - - MaemoRunConfiguration *rc(new MaemoRunConfiguration(qt4Project, QString())); + Qt4Target *t = static_cast<Qt4Target *>(parent); + MaemoRunConfiguration *rc = new MaemoRunConfiguration(t, QString()); if (!rc->fromMap(map)) { delete rc; return 0; } - setupRunConfiguration(rc); return rc; } -RunConfiguration *MaemoRunConfigurationFactory::clone(Project *parent, +RunConfiguration *MaemoRunConfigurationFactory::clone(Target *parent, RunConfiguration *source) { if (!canClone(parent, source)) return 0; - Qt4Project *qt4Project(static_cast<Qt4Project *>(parent)); - MaemoRunConfiguration *old(static_cast<MaemoRunConfiguration *>(source)); - MaemoRunConfiguration *rc(new MaemoRunConfiguration(qt4Project, old)); + Qt4Target *t = static_cast<Qt4Target *>(parent); + MaemoRunConfiguration *old = static_cast<MaemoRunConfiguration *>(source); + MaemoRunConfiguration *rc = new MaemoRunConfiguration(t, old); setupRunConfiguration(rc); @@ -716,60 +707,71 @@ void MaemoRunConfigurationFactory::setupRunConfiguration(MaemoRunConfiguration * if (!rc) return; - connect(rc->project(), SIGNAL(runConfigurationsEnabledStateChanged()), - rc, SLOT(enabledStateChanged())); connect(MaemoManager::instance(), SIGNAL(startStopQemu()), rc, SLOT(startStopQemu())); connect(rc, SIGNAL(qemuProcessStatus(bool)), MaemoManager::instance(), SLOT(updateQemuSimulatorStarter(bool))); } -void MaemoRunConfigurationFactory::addedRunConfiguration(ProjectExplorer::RunConfiguration *rc) +void MaemoRunConfigurationFactory::projectAdded( + ProjectExplorer::Project *project) { - if (hasMaemoRunConfig(rc->project())) - MaemoManager::instance()->addQemuSimulatorStarter(rc->project()); + disconnect(project, SIGNAL(addedTarget(ProjectExplorer::Target*)), + this, SLOT(targetAdded(ProjectExplorer::Target*))); + disconnect(project, SIGNAL(removedTarget(ProjectExplorer::Target*)), + this, SLOT(targetRemoved(ProjectExplorer::Target*))); + + foreach (Target *target, project->targets()) + targetAdded(target); } -void MaemoRunConfigurationFactory::removedRunConfiguration(ProjectExplorer::RunConfiguration *rc) +void MaemoRunConfigurationFactory::projectRemoved( + ProjectExplorer::Project *project) { - if (!hasMaemoRunConfig(rc->project())) - MaemoManager::instance()->removeQemuSimulatorStarter(rc->project()); + connect(project, SIGNAL(addedTarget(ProjectExplorer::Target*)), + this, SLOT(targetAdded(ProjectExplorer::Target*))); + connect(project, SIGNAL(removedTarget(ProjectExplorer::Target*)), + this, SLOT(targetRemoved(ProjectExplorer::Target*))); + + foreach (Target *target, project->targets()) + targetRemoved(target); } -void MaemoRunConfigurationFactory::projectAdded( - ProjectExplorer::Project *project) +void MaemoRunConfigurationFactory::targetAdded(ProjectExplorer::Target *target) { - connect(project, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration*)), - this, SLOT(addedRunConfiguration(ProjectExplorer::RunConfiguration*))); - connect(project, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration*)), - this, SLOT(removedRunConfiguration(ProjectExplorer::RunConfiguration*))); + if (target->id() != QLatin1String(MAEMO_EMULATOR_TARGET_ID) && + target->id() != QLatin1String(MAEMO_DEVICE_TARGET_ID)) + return; - if (hasMaemoRunConfig(project)) - MaemoManager::instance()->addQemuSimulatorStarter(project); + MaemoManager::instance()->addQemuSimulatorStarter(target->project()); } -void MaemoRunConfigurationFactory::projectRemoved( - ProjectExplorer::Project *project) +void MaemoRunConfigurationFactory::targetRemoved(ProjectExplorer::Target *target) { - disconnect(project, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration*)), - this, SLOT(addedRunConfiguration(ProjectExplorer::RunConfiguration*))); - disconnect(project, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration*)), - this, SLOT(removedRunConfiguration(ProjectExplorer::RunConfiguration*))); + if (target->id() != QLatin1String(MAEMO_EMULATOR_TARGET_ID) && + target->id() != QLatin1String(MAEMO_DEVICE_TARGET_ID)) + return; - if (hasMaemoRunConfig(project)) - MaemoManager::instance()->removeQemuSimulatorStarter(project); + MaemoManager::instance()->removeQemuSimulatorStarter(target->project()); } void MaemoRunConfigurationFactory::currentProjectChanged( ProjectExplorer::Project *project) { - bool hasRunConfig = hasMaemoRunConfig(project); - MaemoManager::instance()->setQemuSimulatorStarterEnabled(hasRunConfig); + if (!project) + return; - bool isRunning = false; - if (Qt4Project *qt4Project = qobject_cast<Qt4Project *>(project)) { - RunConfiguration *rc = qt4Project->activeRunConfiguration(); - if (MaemoRunConfiguration *mrc = qobject_cast<MaemoRunConfiguration *>(rc)) + Target *maemoTarget(project->target(QLatin1String(MAEMO_EMULATOR_TARGET_ID))); + if (!maemoTarget) + maemoTarget = project->target(QLatin1String(MAEMO_DEVICE_TARGET_ID)); + MaemoManager::instance()->setQemuSimulatorStarterEnabled(maemoTarget); + + bool isRunning(false); + if (maemoTarget && + project->activeTarget() == maemoTarget && + maemoTarget->activeRunConfiguration()) { + MaemoRunConfiguration *mrc = qobject_cast<MaemoRunConfiguration *>(maemoTarget->activeRunConfiguration()); + if (mrc) isRunning = mrc->isQemuRunning(); } MaemoManager::instance()->updateQemuSimulatorStarter(isRunning); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h index b9406a6437..d8c490a0ea 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h @@ -40,13 +40,16 @@ #include <projectexplorer/applicationlauncher.h> namespace Qt4ProjectManager { + class Qt4Project; namespace Internal { class MaemoManager; class MaemoToolChain; +class Qt4BuildConfiguration; class Qt4ProFileNode; +class Qt4Target; class ErrorDumper : public QObject { @@ -67,14 +70,15 @@ class MaemoRunConfiguration : public ProjectExplorer::RunConfiguration friend class MaemoRunConfigurationFactory; public: - MaemoRunConfiguration(Qt4Project *project, + MaemoRunConfiguration(Qt4Target *parent, const QString &proFilePath); virtual ~MaemoRunConfiguration(); bool isEnabled(ProjectExplorer::BuildConfiguration *config) const; using RunConfiguration::isEnabled; QWidget *configurationWidget(); - Qt4Project *qt4Project() const; + Qt4Target *qt4Target() const; + Qt4BuildConfiguration *activeQt4BuildConfiguration() const; bool currentlyNeedsDeployment() const; void wasDeployed(); @@ -114,7 +118,7 @@ signals: void qemuProcessStatus(bool running); protected: - MaemoRunConfiguration(Qt4Project *project, + MaemoRunConfiguration(Qt4Target *parent, MaemoRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); @@ -169,22 +173,23 @@ public: explicit MaemoRunConfigurationFactory(QObject *parent = 0); ~MaemoRunConfigurationFactory(); - QStringList availableCreationIds(ProjectExplorer::Project *project) const; + QStringList availableCreationIds(ProjectExplorer::Target *parent) const; QString displayNameForId(const QString &id) const; - bool canRestore(ProjectExplorer::Project *project, const QVariantMap &map) const; - bool canClone(ProjectExplorer::Project *project, ProjectExplorer::RunConfiguration *source) const; - bool canCreate(ProjectExplorer::Project *project, const QString &id) const; - ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Project *project, const QVariantMap &map); - ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Project *project, ProjectExplorer::RunConfiguration *source); - ProjectExplorer::RunConfiguration *create(ProjectExplorer::Project *project, const QString &id); + bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const; + bool canCreate(ProjectExplorer::Target *parent, const QString &id) const; + ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); + ProjectExplorer::RunConfiguration *create(ProjectExplorer::Target *parent, const QString &id); private slots: - void addedRunConfiguration(ProjectExplorer::RunConfiguration *rc); - void removedRunConfiguration(ProjectExplorer::RunConfiguration *rc); - void projectAdded(ProjectExplorer::Project *project); void projectRemoved(ProjectExplorer::Project *project); + + void targetAdded(ProjectExplorer::Target *target); + void targetRemoved(ProjectExplorer::Target *target); + void currentProjectChanged(ProjectExplorer::Project *project); private: diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 5d0aef4a40..62da8c438b 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -30,6 +30,7 @@ #include "s60devicerunconfiguration.h" #include "s60devicerunconfigurationwidget.h" #include "qt4project.h" +#include "qt4target.h" #include "qtversionmanager.h" #include "profilereader.h" #include "s60manager.h" @@ -45,7 +46,6 @@ #include <utils/qtcassert.h> #include <utils/pathchooser.h> #include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/persistentsettings.h> #include <projectexplorer/project.h> #include <projectexplorer/buildconfiguration.h> @@ -106,8 +106,8 @@ QString pathToId(const QString &path) // ======== S60DeviceRunConfiguration -S60DeviceRunConfiguration::S60DeviceRunConfiguration(Project *project, const QString &proFilePath) : - RunConfiguration(project, QLatin1String(S60_DEVICE_RC_ID)), +S60DeviceRunConfiguration::S60DeviceRunConfiguration(Target *parent, const QString &proFilePath) : + RunConfiguration(parent, QLatin1String(S60_DEVICE_RC_ID)), m_proFilePath(proFilePath), m_cachedTargetInformationValid(false), #ifdef Q_OS_WIN @@ -122,8 +122,8 @@ S60DeviceRunConfiguration::S60DeviceRunConfiguration(Project *project, const QSt ctor(); } -S60DeviceRunConfiguration::S60DeviceRunConfiguration(Project *project, S60DeviceRunConfiguration *source) : - RunConfiguration(project, source), +S60DeviceRunConfiguration::S60DeviceRunConfiguration(Target *target, S60DeviceRunConfiguration *source) : + RunConfiguration(target, source), m_proFilePath(source->m_proFilePath), m_cachedTargetInformationValid(false), m_serialPortName(source->m_serialPortName), @@ -148,10 +148,10 @@ void S60DeviceRunConfiguration::ctor() else setDisplayName(tr("QtS60DeviceRunConfiguration")); - connect(qt4Project(), SIGNAL(targetInformationChanged()), + connect(target(), SIGNAL(targetInformationChanged()), this, SLOT(invalidateCachedTargetInformation())); - connect(qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*)), + connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*)), this, SLOT(proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode*))); } @@ -160,9 +160,9 @@ S60DeviceRunConfiguration::~S60DeviceRunConfiguration() { } -Qt4Project *S60DeviceRunConfiguration::qt4Project() const +Qt4Target *S60DeviceRunConfiguration::qt4Target() const { - return static_cast<Qt4Project *>(project()); + return static_cast<Qt4Target *>(target()); } ProjectExplorer::ToolChain::ToolChainType S60DeviceRunConfiguration::toolChainType( @@ -175,7 +175,7 @@ ProjectExplorer::ToolChain::ToolChainType S60DeviceRunConfiguration::toolChainTy ProjectExplorer::ToolChain::ToolChainType S60DeviceRunConfiguration::toolChainType() const { - if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(project()->activeBuildConfiguration())) + if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration())) return bc->toolChainType(); return ProjectExplorer::ToolChain::INVALID; } @@ -195,7 +195,7 @@ QWidget *S60DeviceRunConfiguration::configurationWidget() QVariantMap S60DeviceRunConfiguration::toMap() const { QVariantMap map(ProjectExplorer::RunConfiguration::toMap()); - const QDir projectDir = QFileInfo(project()->file()->fileName()).absoluteDir(); + const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir(); map.insert(QLatin1String(PRO_FILE_KEY), projectDir.relativeFilePath(m_proFilePath)); map.insert(QLatin1String(SIGNING_MODE_KEY), (int)m_signingMode); @@ -210,7 +210,7 @@ QVariantMap S60DeviceRunConfiguration::toMap() const bool S60DeviceRunConfiguration::fromMap(const QVariantMap &map) { - const QDir projectDir = QFileInfo(qt4Project()->file()->fileName()).absoluteDir(); + const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir(); m_proFilePath = projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString()); m_signingMode = static_cast<SigningMode>(map.value(QLatin1String(SIGNING_MODE_KEY)).toInt()); @@ -313,7 +313,7 @@ QString S60DeviceRunConfiguration::packageFileName() const QString S60DeviceRunConfiguration::localExecutableFileName() const { - Qt4BuildConfiguration *qt4bc = qobject_cast<Qt4BuildConfiguration *>(project()->activeBuildConfiguration()); + Qt4BuildConfiguration *qt4bc = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration()); S60Devices::Device device = S60Manager::instance()->deviceForQtVersion(qt4bc->qtVersion()); QString localExecutable = device.epocRoot; @@ -337,7 +337,7 @@ void S60DeviceRunConfiguration::updateTarget() { if (m_cachedTargetInformationValid) return; - Qt4TargetInformation info = qt4Project()->targetInformation(qt4Project()->activeQt4BuildConfiguration(), + Qt4TargetInformation info = qt4Target()->targetInformation(qt4Target()->activeBuildConfiguration(), m_proFilePath); if (info.error != Qt4TargetInformation::NoError) { if (info.error == Qt4TargetInformation::ProParserError) { @@ -359,7 +359,7 @@ void S60DeviceRunConfiguration::updateTarget() m_baseFileName = info.workingDir + QLatin1Char('/') + m_targetName; m_packageTemplateFileName = m_baseFileName + QLatin1String("_template.pkg"); - Qt4BuildConfiguration *qt4bc = qt4Project()->activeQt4BuildConfiguration(); + Qt4BuildConfiguration *qt4bc = qt4Target()->activeBuildConfiguration(); switch (qt4bc->toolChainType()) { case ToolChain::GCCE: case ToolChain::GCCE_GNUPOC: @@ -400,13 +400,14 @@ S60DeviceRunConfigurationFactory::~S60DeviceRunConfigurationFactory() { } -QStringList S60DeviceRunConfigurationFactory::availableCreationIds(Project *parent) const +QStringList S60DeviceRunConfigurationFactory::availableCreationIds(Target *parent) const { - Qt4Project *qt4project = qobject_cast<Qt4Project *>(parent); - if (!qt4project) + Qt4Target *target = qobject_cast<Qt4Target *>(parent); + if (!target || + target->id() != QLatin1String(S60_DEVICE_TARGET_ID)) return QStringList(); - return qt4project->applicationProFilePathes(QLatin1String(S60_DEVICE_RC_PREFIX)); + return target->qt4Project()->applicationProFilePathes(QLatin1String(S60_DEVICE_RC_PREFIX)); } QString S60DeviceRunConfigurationFactory::displayNameForId(const QString &id) const @@ -416,37 +417,40 @@ QString S60DeviceRunConfigurationFactory::displayNameForId(const QString &id) co return QString(); } -bool S60DeviceRunConfigurationFactory::canCreate(Project *parent, const QString &id) const +bool S60DeviceRunConfigurationFactory::canCreate(Target *parent, const QString &id) const { - Qt4Project * project(qobject_cast<Qt4Project *>(parent)); - if (!project) + Qt4Target * t(qobject_cast<Qt4Target *>(parent)); + if (!t || + t->id() != QLatin1String(S60_DEVICE_TARGET_ID)) return false; - return project->hasApplicationProFile(pathFromId(id)); + return t->qt4Project()->hasApplicationProFile(pathFromId(id)); } -RunConfiguration *S60DeviceRunConfigurationFactory::create(Project *parent, const QString &id) +RunConfiguration *S60DeviceRunConfigurationFactory::create(Target *parent, const QString &id) { if (!canCreate(parent, id)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); - return new S60DeviceRunConfiguration(project, pathFromId(id)); + Qt4Target *t(static_cast<Qt4Target *>(parent)); + return new S60DeviceRunConfiguration(t, pathFromId(id)); } -bool S60DeviceRunConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +bool S60DeviceRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - if (!qobject_cast<Qt4Project *>(parent)) + Qt4Target * t(qobject_cast<Qt4Target *>(parent)); + if (!t || + t->id() != QLatin1String(S60_DEVICE_TARGET_ID)) return false; QString id(ProjectExplorer::idFromMap(map)); return id == QLatin1String(S60_DEVICE_RC_ID); } -RunConfiguration *S60DeviceRunConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +RunConfiguration *S60DeviceRunConfigurationFactory::restore(Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); - S60DeviceRunConfiguration *rc(new S60DeviceRunConfiguration(project, QString())); + Qt4Target *t(static_cast<Qt4Target *>(parent)); + S60DeviceRunConfiguration *rc(new S60DeviceRunConfiguration(t, QString())); if (rc->fromMap(map)) return rc; @@ -454,20 +458,20 @@ RunConfiguration *S60DeviceRunConfigurationFactory::restore(ProjectExplorer::Pro return 0; } -bool S60DeviceRunConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) const +bool S60DeviceRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const { - if (!qobject_cast<Qt4Project *>(parent)) + if (!qobject_cast<Qt4Target *>(parent)) return false; return source->id() == QLatin1String(S60_DEVICE_RC_ID); } -RunConfiguration *S60DeviceRunConfigurationFactory::clone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) +RunConfiguration *S60DeviceRunConfigurationFactory::clone(Target *parent, RunConfiguration *source) { if (!canClone(parent, source)) return 0; - Qt4Project *project = static_cast<Qt4Project *>(parent); + Qt4Target *t = static_cast<Qt4Target *>(parent); S60DeviceRunConfiguration * old(static_cast<S60DeviceRunConfiguration *>(source)); - return new S60DeviceRunConfiguration(project, old); + return new S60DeviceRunConfiguration(t, old); } // ======== S60DeviceRunControlBase @@ -493,7 +497,7 @@ S60DeviceRunControlBase::S60DeviceRunControlBase(RunConfiguration *runConfigurat S60DeviceRunConfiguration *s60runConfig = qobject_cast<S60DeviceRunConfiguration *>(runConfiguration); - Qt4BuildConfiguration *activeBuildConf = s60runConfig->qt4Project()->activeQt4BuildConfiguration(); + Qt4BuildConfiguration *activeBuildConf = s60runConfig->qt4Target()->activeBuildConfiguration(); QTC_ASSERT(s60runConfig, return); m_toolChain = s60runConfig->toolChainType(); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index ed6b52aed6..a4da14a4a4 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -48,10 +48,10 @@ class DebuggerStartParameters; } namespace Qt4ProjectManager { -class Qt4Project; namespace Internal { class Qt4ProFileNode; +class Qt4Target; class S60DeviceRunConfigurationFactory; class S60DeviceRunConfiguration : public ProjectExplorer::RunConfiguration @@ -65,10 +65,10 @@ public: SignCustom }; - S60DeviceRunConfiguration(ProjectExplorer::Project *project, const QString &proFilePath); + S60DeviceRunConfiguration(ProjectExplorer::Target *parent, const QString &proFilePath); virtual ~S60DeviceRunConfiguration(); - Qt4Project *qt4Project() const; + Qt4Target *qt4Target() const; bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; QWidget *configurationWidget(); @@ -109,7 +109,7 @@ private slots: void proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode *pro); protected: - S60DeviceRunConfiguration(ProjectExplorer::Project *project, S60DeviceRunConfiguration *source); + S60DeviceRunConfiguration(ProjectExplorer::Target *parent, S60DeviceRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: @@ -140,14 +140,14 @@ public: explicit S60DeviceRunConfigurationFactory(QObject *parent = 0); ~S60DeviceRunConfigurationFactory(); - bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; - ProjectExplorer::RunConfiguration *create(ProjectExplorer::Project *parent, const QString &id); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) const; - ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source); + bool canCreate(ProjectExplorer::Target *parent, const QString &id) const; + ProjectExplorer::RunConfiguration *create(ProjectExplorer::Target *parent, const QString &id); + bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const; + ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); - QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QStringList availableCreationIds(ProjectExplorer::Target *parent) const; // used to translate the ids to names to display to the user QString displayNameForId(const QString &id) const; }; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp index ea24942ef3..43444b0745 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp @@ -30,6 +30,7 @@ #include "s60emulatorrunconfiguration.h" #include "qt4project.h" +#include "qt4target.h" #include "qtversionmanager.h" #include "profilereader.h" #include "s60manager.h" @@ -73,16 +74,16 @@ QString pathToId(const QString &path) // ======== S60EmulatorRunConfiguration -S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Project *project, const QString &proFilePath) : - RunConfiguration(project, QLatin1String(S60_EMULATOR_RC_ID)), +S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Target *parent, const QString &proFilePath) : + RunConfiguration(parent, QLatin1String(S60_EMULATOR_RC_ID)), m_proFilePath(proFilePath), m_cachedTargetInformationValid(false) { ctor(); } -S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Project *project, S60EmulatorRunConfiguration *source) : - RunConfiguration(project, source), +S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Target *parent, S60EmulatorRunConfiguration *source) : + RunConfiguration(parent, source), m_proFilePath(source->m_proFilePath), m_cachedTargetInformationValid(false) { @@ -96,10 +97,10 @@ void S60EmulatorRunConfiguration::ctor() else setDisplayName(tr("Qt Symbian Emulator RunConfiguration")); - connect(qt4Project(), SIGNAL(targetInformationChanged()), + connect(qt4Target(), SIGNAL(targetInformationChanged()), this, SLOT(invalidateCachedTargetInformation())); - connect(qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*)), + connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*)), this, SLOT(proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode*))); } @@ -115,9 +116,9 @@ void S60EmulatorRunConfiguration::proFileUpdate(Qt4ProjectManager::Internal::Qt4 } -Qt4Project *S60EmulatorRunConfiguration::qt4Project() const +Qt4Target *S60EmulatorRunConfiguration::qt4Target() const { - return static_cast<Qt4Project *>(project()); + return static_cast<Qt4Target *>(target()); } bool S60EmulatorRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *configuration) const @@ -136,14 +137,14 @@ QWidget *S60EmulatorRunConfiguration::configurationWidget() QVariantMap S60EmulatorRunConfiguration::toMap() const { QVariantMap map(ProjectExplorer::RunConfiguration::toMap()); - const QDir projectDir = QFileInfo(project()->file()->fileName()).absoluteDir(); + const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir(); map.insert(QLatin1String(PRO_FILE_KEY), projectDir.relativeFilePath(m_proFilePath)); return map; } bool S60EmulatorRunConfiguration::fromMap(const QVariantMap &map) { - const QDir projectDir = QFileInfo(qt4Project()->file()->fileName()).absoluteDir(); + const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir(); m_proFilePath = projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString()); return RunConfiguration::fromMap(map); @@ -159,7 +160,7 @@ void S60EmulatorRunConfiguration::updateTarget() { if (m_cachedTargetInformationValid) return; - Qt4TargetInformation info = qt4Project()->targetInformation(qt4Project()->activeQt4BuildConfiguration(), + Qt4TargetInformation info = qt4Target()->targetInformation(qt4Target()->activeBuildConfiguration(), m_proFilePath); if (info.error != Qt4TargetInformation::NoError) { if (info.error == Qt4TargetInformation::ProParserError) { @@ -173,7 +174,7 @@ void S60EmulatorRunConfiguration::updateTarget() return; } - Qt4BuildConfiguration *qt4bc = qt4Project()->activeQt4BuildConfiguration(); + Qt4BuildConfiguration *qt4bc = qt4Target()->activeBuildConfiguration(); QtVersion *qtVersion = qt4bc->qtVersion(); QString baseDir = S60Manager::instance()->deviceForQtVersion(qtVersion).epocRoot; QString qmakeBuildConfig = "urel"; @@ -251,64 +252,66 @@ S60EmulatorRunConfigurationFactory::~S60EmulatorRunConfigurationFactory() { } -bool S60EmulatorRunConfigurationFactory::canCreate(Project *parent, const QString &id) const +bool S60EmulatorRunConfigurationFactory::canCreate(Target *parent, const QString &id) const { - Qt4Project *project(qobject_cast<Qt4Project *>(parent)); - if (!project) + Qt4Target * t(qobject_cast<Qt4Target *>(parent)); + if (!t || + t->id() != QLatin1String(S60_EMULATOR_TARGET_ID)) return false; - return project->hasApplicationProFile(pathFromId(id)); + return t->qt4Project()->hasApplicationProFile(pathFromId(id)); } -RunConfiguration *S60EmulatorRunConfigurationFactory::create(Project *parent, const QString &id) +RunConfiguration *S60EmulatorRunConfigurationFactory::create(Target *parent, const QString &id) { if (!canCreate(parent, id)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); - return new S60EmulatorRunConfiguration(project, pathFromId(id)); + Qt4Target *t(static_cast<Qt4Target *>(parent)); + return new S60EmulatorRunConfiguration(t, pathFromId(id)); } -bool S60EmulatorRunConfigurationFactory::canRestore(Project *parent, const QVariantMap &map) const +bool S60EmulatorRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { - if (!qobject_cast<Qt4Project *>(parent)) + Qt4Target * t(qobject_cast<Qt4Target *>(parent)); + if (!t || + t->id() != QLatin1String(S60_EMULATOR_TARGET_ID)) return false; QString id(ProjectExplorer::idFromMap(map)); - return id.startsWith(QLatin1String(S60_EMULATOR_RC_ID)); + return id == QLatin1String(S60_EMULATOR_RC_ID); } -RunConfiguration *S60EmulatorRunConfigurationFactory::restore(Project *parent, const QVariantMap &map) +RunConfiguration *S60EmulatorRunConfigurationFactory::restore(Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); - S60EmulatorRunConfiguration *rc(new S60EmulatorRunConfiguration(project, QString())); + Qt4Target *t(static_cast<Qt4Target *>(parent)); + S60EmulatorRunConfiguration *rc(new S60EmulatorRunConfiguration(t, QString())); if (rc->fromMap(map)) return rc; delete rc; return 0; } -bool S60EmulatorRunConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) const +bool S60EmulatorRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const { - if (!qobject_cast<Qt4Project *>(parent)) - return false; - return source->id() == QLatin1String(S60_EMULATOR_RC_ID); + return canCreate(parent, source->id()); } -RunConfiguration *S60EmulatorRunConfigurationFactory::clone(Project *parent, RunConfiguration *source) +RunConfiguration *S60EmulatorRunConfigurationFactory::clone(Target *parent, RunConfiguration *source) { if (!canClone(parent, source)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); - return new S60EmulatorRunConfiguration(project, QString()); + Qt4Target *t(static_cast<Qt4Target *>(parent)); + return new S60EmulatorRunConfiguration(t, QString()); } -QStringList S60EmulatorRunConfigurationFactory::availableCreationIds(Project *pro) const +QStringList S60EmulatorRunConfigurationFactory::availableCreationIds(Target *parent) const { - Qt4Project *qt4project(qobject_cast<Qt4Project *>(pro)); - if (!qt4project) + Qt4Target * t(qobject_cast<Qt4Target *>(parent)); + if (!t || + t->id() != QLatin1String(S60_EMULATOR_TARGET_ID)) return QStringList(); - return qt4project->applicationProFilePathes(QLatin1String(S60_EMULATOR_RC_PREFIX)); + return t->qt4Project()->applicationProFilePathes(QLatin1String(S60_EMULATOR_RC_PREFIX)); } QString S60EmulatorRunConfigurationFactory::displayNameForId(const QString &id) const @@ -325,7 +328,7 @@ S60EmulatorRunControl::S60EmulatorRunControl(S60EmulatorRunConfiguration *runCon { // stuff like the EPOCROOT and EPOCDEVICE env variable Environment env = Environment::systemEnvironment(); - runConfiguration->qt4Project()->activeQt4BuildConfiguration()->toolChain()->addToEnvironment(env); + runConfiguration->qt4Target()->activeBuildConfiguration()->toolChain()->addToEnvironment(env); m_applicationLauncher.setEnvironment(env.toStringList()); m_executable = runConfiguration->executable(); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h index d5d0f1ccf3..3890885100 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h @@ -50,6 +50,7 @@ class Qt4Project; namespace Internal { class Qt4ProFileNode; +class Qt4Target; class S60EmulatorRunConfigurationFactory; class S60EmulatorRunConfiguration : public ProjectExplorer::RunConfiguration @@ -58,10 +59,10 @@ class S60EmulatorRunConfiguration : public ProjectExplorer::RunConfiguration friend class S60EmulatorRunConfigurationFactory; public: - S60EmulatorRunConfiguration(ProjectExplorer::Project *parent, const QString &proFilePath); + S60EmulatorRunConfiguration(ProjectExplorer::Target *parent, const QString &proFilePath); virtual ~S60EmulatorRunConfiguration(); - Qt4Project *qt4Project() const; + Qt4Target *qt4Target() const; bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; QWidget *configurationWidget(); @@ -78,7 +79,7 @@ private slots: void proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode *pro); protected: - S60EmulatorRunConfiguration(ProjectExplorer::Project *parent, S60EmulatorRunConfiguration *source); + S60EmulatorRunConfiguration(ProjectExplorer::Target *parent, S60EmulatorRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: @@ -115,14 +116,14 @@ public: explicit S60EmulatorRunConfigurationFactory(QObject *parent = 0); ~S60EmulatorRunConfigurationFactory(); - bool canCreate(ProjectExplorer::Project *project, const QString &id) const; - ProjectExplorer::RunConfiguration *create(ProjectExplorer::Project *project, const QString &id); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) const; - ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source); + bool canCreate(ProjectExplorer::Target *project, const QString &id) const; + ProjectExplorer::RunConfiguration *create(ProjectExplorer::Target *parent, const QString &id); + bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const; + ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); - QStringList availableCreationIds(ProjectExplorer::Project *pro) const; + QStringList availableCreationIds(ProjectExplorer::Target *pro) const; // used to translate the ids to names to display to the user QString displayNameForId(const QString &id) const; }; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp index 7caa8a1089..ec555019ad 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp @@ -208,11 +208,13 @@ void S60Manager::updateQtVersions() ProjectExplorer::ToolChain *S60Manager::createWINSCWToolChain(const Qt4ProjectManager::QtVersion *version) const { + Q_ASSERT(version); return new WINSCWToolChain(deviceForQtVersion(version), version->mwcDirectory()); } ProjectExplorer::ToolChain *S60Manager::createGCCEToolChain(const Qt4ProjectManager::QtVersion *version) const { + Q_ASSERT(version); ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); env.prependOrSetPath(version->gcceDirectory()+"/bin"); QString gcceCommandPath= env.searchInPath(GCCE_COMMAND); @@ -221,6 +223,7 @@ ProjectExplorer::ToolChain *S60Manager::createGCCEToolChain(const Qt4ProjectMana ProjectExplorer::ToolChain *S60Manager::createGCCE_GnuPocToolChain(const Qt4ProjectManager::QtVersion *version) const { + Q_ASSERT(version); return new GCCEToolChain(deviceForQtVersion(version), QLatin1String("arm-none-symbianelf-g++"), ProjectExplorer::ToolChain::GCCE_GNUPOC); } @@ -228,11 +231,13 @@ ProjectExplorer::ToolChain *S60Manager::createRVCTToolChain( const Qt4ProjectManager::QtVersion *version, ProjectExplorer::ToolChain::ToolChainType type) const { + Q_ASSERT(version); return new RVCTToolChain(deviceForQtVersion(version), type); } S60Devices::Device S60Manager::deviceForQtVersion(const Qt4ProjectManager::QtVersion *version) const { + Q_ASSERT(version); S60Devices::Device device; QString deviceId; if (version->isAutodetected()) diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index 056f24e8a1..dec9fa033f 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -30,6 +30,7 @@ #include "qt4buildconfiguration.h" #include "qt4project.h" +#include "qt4target.h" #include <utils/qtcassert.h> @@ -54,11 +55,11 @@ const char * const QT_VERSION_ID_KEY("Qt4ProjectManager.Qt4BuildConfiguration.Qt enum { debug = 0 }; } -Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro) : - BuildConfiguration(pro, QLatin1String(QT4_BC_ID)), +Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target) : + BuildConfiguration(target, QLatin1String(QT4_BC_ID)), m_clearSystemEnvironment(false), m_shadowBuild(false), - m_qtVersion(0), + m_qtVersionId(-1), m_toolChainType(-1), // toolChainType() makes sure to return the default toolchainType m_qmakeBuildConfiguration(0), m_subNodeBuild(0) @@ -66,11 +67,11 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro) : ctor(); } -Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro, const QString &id) : - BuildConfiguration(pro, id), +Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, const QString &id) : + BuildConfiguration(target, id), m_clearSystemEnvironment(false), m_shadowBuild(false), - m_qtVersion(0), + m_qtVersionId(-1), m_toolChainType(-1), // toolChainType() makes sure to return the default toolchainType m_qmakeBuildConfiguration(0), m_subNodeBuild(0) @@ -78,17 +79,18 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro, const QString &id) ctor(); } -Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro, Qt4BuildConfiguration *source) : - BuildConfiguration(pro, source), +Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source) : + BuildConfiguration(target, source), m_clearSystemEnvironment(source->m_clearSystemEnvironment), m_userEnvironmentChanges(source->m_userEnvironmentChanges), m_shadowBuild(source->m_shadowBuild), m_buildDirectory(source->m_buildDirectory), - m_qtVersion(source->m_qtVersion), + m_qtVersionId(source->m_qtVersionId), m_toolChainType(source->m_toolChainType), m_qmakeBuildConfiguration(source->m_qmakeBuildConfiguration), m_subNodeBuild(0) // temporary value, so not copied { + cloneSteps(source); ctor(); } @@ -103,7 +105,7 @@ QVariantMap Qt4BuildConfiguration::toMap() const map.insert(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY), EnvironmentItem::toStringList(m_userEnvironmentChanges)); map.insert(QLatin1String(USE_SHADOW_BUILD_KEY), m_shadowBuild); map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory); - map.insert(QLatin1String(QT_VERSION_ID_KEY), m_qtVersion); + map.insert(QLatin1String(QT_VERSION_ID_KEY), m_qtVersionId); map.insert(QLatin1String(TOOLCHAIN_KEY), m_toolChainType); map.insert(QLatin1String(BUILD_CONFIGURATION_KEY), int(m_qmakeBuildConfiguration)); return map; @@ -112,29 +114,48 @@ QVariantMap Qt4BuildConfiguration::toMap() const bool Qt4BuildConfiguration::fromMap(const QVariantMap &map) { + if (!BuildConfiguration::fromMap(map)) + return false; + m_clearSystemEnvironment = map.value(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY)).toBool(); m_userEnvironmentChanges = EnvironmentItem::fromStringList(map.value(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY)).toStringList()); m_shadowBuild = map.value(QLatin1String(USE_SHADOW_BUILD_KEY)).toBool(); m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString(); - m_qtVersion = map.value(QLatin1String(QT_VERSION_ID_KEY)).toInt(); + m_qtVersionId = map.value(QLatin1String(QT_VERSION_ID_KEY)).toInt(); m_toolChainType = map.value(QLatin1String(TOOLCHAIN_KEY)).toInt(); m_qmakeBuildConfiguration = QtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt()); - return BuildConfiguration::fromMap(map); + if (!qtVersion()->supportedTargetIds().contains(target()->id())) + return false; + + QList<ToolChain::ToolChainType> possibleTcs(qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes())); + if (!possibleTcs.contains(toolChainType())) + setToolChainType(qt4Target()->preferredToolChainType(possibleTcs)); + + if (toolChainType() == ToolChain::INVALID) + return false; + return true; } void Qt4BuildConfiguration::ctor() { QtVersionManager *vm = QtVersionManager::instance(); - connect(vm, SIGNAL(defaultQtVersionChanged()), - this, SLOT(defaultQtVersionChanged())); connect(vm, SIGNAL(qtVersionsChanged(QList<int>)), this, SLOT(qtVersionsChanged(QList<int>))); } -Qt4Project *Qt4BuildConfiguration::qt4Project() const +void Qt4BuildConfiguration::pickValidQtVersion() +{ + QList<QtVersion *> versions = QtVersionManager::instance()->versionsForTargetId(qt4Target()->id()); + if (!versions.isEmpty()) + setQtVersion(versions.at(0)); + else + setQtVersion(QtVersionManager::instance()->emptyVersion()); +} + +Qt4Target *Qt4BuildConfiguration::qt4Target() const { - return static_cast<Qt4Project *>(project()); + return static_cast<Qt4Target *>(target()); } QString Qt4BuildConfiguration::baseEnvironmentText() const @@ -192,7 +213,7 @@ QString Qt4BuildConfiguration::buildDirectory() const if (m_shadowBuild) workingDirectory = m_buildDirectory; if (workingDirectory.isEmpty()) - workingDirectory = QFileInfo(project()->file()->fileName()).absolutePath(); + workingDirectory = QFileInfo(target()->project()->file()->fileName()).absolutePath(); return workingDirectory; } @@ -286,32 +307,18 @@ QString Qt4BuildConfiguration::defaultMakeTarget() const QtVersion *Qt4BuildConfiguration::qtVersion() const { - return QtVersionManager::instance()->version(qtVersionId()); -} - -int Qt4BuildConfiguration::qtVersionId() const -{ QtVersionManager *vm = QtVersionManager::instance(); - if (!vm->version(m_qtVersion)->isValid()) - m_qtVersion = 0; - - return m_qtVersion; + return vm->version(m_qtVersionId); } -// TODO: This assumes there is always at least one Qt version... Is that valid? -void Qt4BuildConfiguration::setQtVersion(int id) +void Qt4BuildConfiguration::setQtVersion(QtVersion *version) { - if (m_qtVersion == id) - return; - - if (!QtVersionManager::instance()->isValidId(id)) - return; + Q_ASSERT(version); - QtVersionManager *vm = QtVersionManager::instance(); - if (!vm->version(id)->isValid()) + if (m_qtVersionId == version->uniqueId()) return; - m_qtVersion = id; + m_qtVersionId = version->uniqueId(); emit qtVersionChanged(); emit targetInformationChanged(); emit environmentChanged(); @@ -319,7 +326,8 @@ void Qt4BuildConfiguration::setQtVersion(int id) void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolChainType type) { - if (m_toolChainType == type) + if (!qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes()).contains(type) || + m_toolChainType == type) return; m_toolChainType = type; emit toolChainTypeChanged(); @@ -329,16 +337,7 @@ void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolCha ProjectExplorer::ToolChain::ToolChainType Qt4BuildConfiguration::toolChainType() const { - ToolChain::ToolChainType originalType = ToolChain::ToolChainType(m_toolChainType); - ToolChain::ToolChainType type = originalType; - const QtVersion *version = qtVersion(); - if (!version->possibleToolChainTypes().contains(type)) { - // Oh no the saved type is not valid for this qt version - // use default tool chain - type = version->defaultToolchainType(); - const_cast<Qt4BuildConfiguration *>(this)->setToolChainType(type); - } - return type; + return ToolChain::ToolChainType(m_toolChainType); } QtVersion::QmakeBuildConfigs Qt4BuildConfiguration::qmakeBuildConfiguration() const @@ -396,23 +395,13 @@ MakeStep *Qt4BuildConfiguration::makeStep() const return 0; } -void Qt4BuildConfiguration::defaultQtVersionChanged() -{ - if (qtVersionId() == 0) { - emit qtVersionChanged(); - emit targetInformationChanged(); - emit environmentChanged(); - } -} - void Qt4BuildConfiguration::qtVersionsChanged(const QList<int> &changedVersions) { - if (changedVersions.contains(qtVersionId())) { - if (!qtVersion()->isValid()) - setQtVersion(0); - emit qtVersionChanged(); - emit targetInformationChanged(); - } + if (!changedVersions.contains(m_qtVersionId) || + qtVersion()->isValid()) + return; + + pickValidQtVersion(); } // returns true if both are equal @@ -559,8 +548,6 @@ Qt4BuildConfigurationFactory::Qt4BuildConfigurationFactory(QObject *parent) : update(); QtVersionManager *vm = QtVersionManager::instance(); - connect(vm, SIGNAL(defaultQtVersionChanged()), - this, SLOT(update())); connect(vm, SIGNAL(qtVersionsChanged(QList<int>)), this, SLOT(update())); } @@ -581,11 +568,19 @@ void Qt4BuildConfigurationFactory::update() emit availableCreationIdsChanged(); } -QStringList Qt4BuildConfigurationFactory::availableCreationIds(ProjectExplorer::Project *parent) const +QStringList Qt4BuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - if (!qobject_cast<Qt4Project *>(parent)) + if (!qobject_cast<Qt4Target *>(parent)) return QStringList(); - return m_versions.keys(); + + QStringList results; + QtVersionManager *vm = QtVersionManager::instance(); + for (QMap<QString, VersionInfo>::const_iterator i = m_versions.constBegin(); + i != m_versions.constEnd(); ++i) { + if (vm->version(i.value().versionId)->supportsTargetId(parent->id())) + results.append(i.key()); + } + return results; } QString Qt4BuildConfigurationFactory::displayNameForId(const QString &id) const @@ -595,20 +590,21 @@ QString Qt4BuildConfigurationFactory::displayNameForId(const QString &id) const return m_versions.value(id).displayName; } -bool Qt4BuildConfigurationFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +bool Qt4BuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const { - if (!qobject_cast<Qt4Project *>(parent)) + if (!qobject_cast<Qt4Target *>(parent)) return false; if (!m_versions.contains(id)) return false; const VersionInfo &info = m_versions.value(id); QtVersion *version = QtVersionManager::instance()->version(info.versionId); - if (!version) + if (!version || + !version->supportsTargetId(parent->id())) return false; return true; } -BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Project *parent, const QString &id) +BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id) { if (!canCreate(parent, id)) return 0; @@ -617,7 +613,7 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Projec QtVersion *version = QtVersionManager::instance()->version(info.versionId); Q_ASSERT(version); - Qt4Project *qt4project(static_cast<Qt4Project *>(parent)); + Qt4Target *qt4Target(static_cast<Qt4Target *>(parent)); bool ok; QString buildConfigurationName = QInputDialog::getText(0, @@ -629,45 +625,55 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Projec if (!ok || buildConfigurationName.isEmpty()) return false; - qt4project->addQt4BuildConfiguration(tr("%1 Debug").arg(buildConfigurationName), - version, - (version->defaultBuildConfig() | QtVersion::DebugBuild)); + qt4Target->addQt4BuildConfiguration(tr("%1 Debug").arg(buildConfigurationName), + version, + (version->defaultBuildConfig() | QtVersion::DebugBuild)); BuildConfiguration *bc = - qt4project->addQt4BuildConfiguration(tr("%1 Release").arg(buildConfigurationName), - version, - (version->defaultBuildConfig() & ~QtVersion::DebugBuild)); + qt4Target->addQt4BuildConfiguration(tr("%1 Release").arg(buildConfigurationName), + version, + (version->defaultBuildConfig() & ~QtVersion::DebugBuild)); return bc; } -bool Qt4BuildConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const +bool Qt4BuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const { - return canCreate(parent, source->id()); + if (!qobject_cast<Qt4Target *>(parent)) + return false; + Qt4BuildConfiguration *qt4bc(qobject_cast<Qt4BuildConfiguration *>(source)); + if (!qt4bc) + return false; + + QtVersion *version = qt4bc->qtVersion(); + if (!version || + !version->supportsTargetId(parent->id())) + return false; + return true; } -BuildConfiguration *Qt4BuildConfigurationFactory::clone(ProjectExplorer::Project *parent, BuildConfiguration *source) +BuildConfiguration *Qt4BuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source) { if (!canClone(parent, source)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); + Qt4Target *target(static_cast<Qt4Target *>(parent)); Qt4BuildConfiguration *oldbc(static_cast<Qt4BuildConfiguration *>(source)); - return new Qt4BuildConfiguration(project, oldbc); + return new Qt4BuildConfiguration(target, oldbc); } -bool Qt4BuildConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +bool Qt4BuildConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const { QString id(ProjectExplorer::idFromMap(map)); - if (!qobject_cast<Qt4Project *>(parent)) + if (!qobject_cast<Qt4Target *>(parent)) return false; return id.startsWith(QLatin1String(QT4_BC_ID_PREFIX)) || id == QLatin1String(QT4_BC_ID); } -BuildConfiguration *Qt4BuildConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +BuildConfiguration *Qt4BuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); - Qt4BuildConfiguration *bc(new Qt4BuildConfiguration(project)); + Qt4Target *target(static_cast<Qt4Target *>(parent)); + Qt4BuildConfiguration *bc(new Qt4BuildConfiguration(target)); if (bc->fromMap(map)) return bc; delete bc; diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index a62f1e9b61..08c032d8ba 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -38,13 +38,13 @@ namespace Qt4ProjectManager { -class Qt4Project; class QMakeStep; class MakeStep; namespace Internal { class Qt4BuildConfigurationFactory; +class Qt4Target; class Qt4BuildConfiguration : public ProjectExplorer::BuildConfiguration { @@ -52,10 +52,10 @@ class Qt4BuildConfiguration : public ProjectExplorer::BuildConfiguration friend class Qt4BuildConfigurationFactory; public: - explicit Qt4BuildConfiguration(Qt4Project *pro); + explicit Qt4BuildConfiguration(Qt4Target *target); virtual ~Qt4BuildConfiguration(); - Qt4Project *qt4Project() const; + Qt4Target *qt4Target() const; ProjectExplorer::Environment environment() const; ProjectExplorer::Environment baseEnvironment() const; @@ -73,19 +73,9 @@ public: void setSubNodeBuild(Qt4ProjectManager::Internal::Qt4ProFileNode *node); Qt4ProjectManager::Internal::Qt4ProFileNode *subNodeBuild() const; - //returns the qtVersion, if the project is set to use the default qt version, then - // that is returned - // to check whether the project uses the default qt version use qtVersionId + // returns the qtVersion QtVersion *qtVersion() const; - - // returns the id of the qt version, if the project is using the default qt version - // this function returns 0 - int qtVersionId() const; - //returns the name of the qt version, might be QString::Null, which means default qt version - // qtVersion is in general the better method to use - QString qtVersionName() const; - - void setQtVersion(int id); + void setQtVersion(QtVersion *); ProjectExplorer::ToolChain *toolChain() const; void setToolChainType(ProjectExplorer::ToolChain::ToolChainType type); @@ -131,21 +121,22 @@ signals: void targetInformationChanged(); private slots: - void defaultQtVersionChanged(); void qtVersionsChanged(const QList<int> &changedVersions); protected: - Qt4BuildConfiguration(Qt4Project *pro, Qt4BuildConfiguration *source); - Qt4BuildConfiguration(Qt4Project *pro, const QString &id); + Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source); + Qt4BuildConfiguration(Qt4Target *target, const QString &id); virtual bool fromMap(const QVariantMap &map); private: void ctor(); + void pickValidQtVersion(); + bool m_clearSystemEnvironment; QList<ProjectExplorer::EnvironmentItem> m_userEnvironmentChanges; bool m_shadowBuild; QString m_buildDirectory; - mutable int m_qtVersion; // Changed if the qtversion is invalid + int m_qtVersionId; int m_toolChainType; QtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration; Qt4ProjectManager::Internal::Qt4ProFileNode *m_subNodeBuild; @@ -159,15 +150,15 @@ public: explicit Qt4BuildConfigurationFactory(QObject *parent = 0); ~Qt4BuildConfigurationFactory(); - QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QStringList availableCreationIds(ProjectExplorer::Target *parent) const; QString displayNameForId(const QString &id) const; - bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Project *parent, const QString &id); - bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const; - ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map); + bool canCreate(ProjectExplorer::Target *parent, const QString &id) const; + ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const QString &id); + bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; + ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); + bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); private slots: void update(); diff --git a/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp b/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp index 564c3e6175..df4b25c7c3 100644 --- a/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp @@ -32,6 +32,7 @@ #include "qt4buildconfiguration.h" #include <projectexplorer/environmenteditmodel.h> +#include <utils/qtcassert.h> #include <QtGui/QCheckBox> @@ -68,6 +69,8 @@ QString Qt4BuildEnvironmentWidget::displayName() const void Qt4BuildEnvironmentWidget::init(ProjectExplorer::BuildConfiguration *bc) { + QTC_ASSERT(bc, return); + if (debug) qDebug() << "Qt4BuildConfigWidget::init()"; @@ -77,6 +80,13 @@ void Qt4BuildEnvironmentWidget::init(ProjectExplorer::BuildConfiguration *bc) } m_buildConfiguration = static_cast<Qt4BuildConfiguration *>(bc); + + if (!m_buildConfiguration) { + setEnabled(false); + return; + } + setEnabled(true); + connect(m_buildConfiguration, SIGNAL(environmentChanged()), this, SLOT(environmentChanged())); diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 511ae593b5..9daf588a24 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -806,6 +806,7 @@ void Qt4ProFileNode::scheduleUpdate() void Qt4ProFileNode::update() { ProFileReader *reader = m_project->createProFileReader(this); + Q_ASSERT(reader); if (!reader->readProFile(m_projectFilePath)) { m_project->proFileParseError(tr("Error while parsing file %1. Giving up.").arg(m_projectFilePath)); m_project->destroyProFileReader(reader); @@ -1174,7 +1175,7 @@ QString Qt4ProFileNode::buildDir() const { const QDir srcDirRoot = QFileInfo(m_project->rootProjectNode()->path()).absoluteDir(); const QString relativeDir = srcDirRoot.relativeFilePath(m_projectDir); - return QDir(m_project->activeBuildConfiguration()->buildDirectory()).absoluteFilePath(relativeDir); + return QDir(m_project->activeTarget()->activeBuildConfiguration()->buildDirectory()).absoluteFilePath(relativeDir); } /* diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index eb9699ff41..01e6e85221 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -29,9 +29,8 @@ #include "qt4project.h" -#include "qt4projectmanager.h" #include "profilereader.h" -#include "prowriter.h" +#include "qt4projectmanager.h" #include "makestep.h" #include "qmakestep.h" #include "qt4runconfiguration.h" @@ -46,9 +45,9 @@ #include <coreplugin/messagemanager.h> #include <coreplugin/coreconstants.h> #include <extensionsystem/pluginmanager.h> +#include <projectexplorer/customexecutablerunconfiguration.h> #include <projectexplorer/nodesvisitor.h> #include <projectexplorer/project.h> -#include <projectexplorer/customexecutablerunconfiguration.h> #include <utils/qtcassert.h> #include <QtCore/QDebug> @@ -229,11 +228,10 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) : m_manager(manager), m_rootProjectNode(0), m_nodesWatcher(new Internal::Qt4NodesWatcher(this)), - m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)), + m_targetFactory(new Qt4TargetFactory(this)), m_fileInfo(new Qt4ProjectFile(this, fileName, this)), m_isApplication(true), m_projectFiles(new Qt4ProjectFiles), - m_lastActiveQt4BuildConfiguration(0), m_proFileOption(0) { m_manager->registerProject(this); @@ -249,16 +247,6 @@ Qt4Project::~Qt4Project() delete m_projectFiles; } -Qt4BuildConfiguration *Qt4Project::activeQt4BuildConfiguration() const -{ - return static_cast<Qt4BuildConfiguration *>(activeBuildConfiguration()); -} - -void Qt4Project::qtVersionChanged() -{ - m_rootProjectNode->update(); -} - void Qt4Project::updateFileList() { Qt4ProjectFiles newFiles; @@ -273,23 +261,41 @@ void Qt4Project::updateFileList() bool Qt4Project::fromMap(const QVariantMap &map) { + m_rootProjectNode = new Qt4ProFileNode(this, m_fileInfo->fileName(), this); + m_rootProjectNode->registerWatcher(m_nodesWatcher); + + connect(this, SIGNAL(addedTarget(ProjectExplorer::Target*)), + this, SLOT(onAddedTarget(ProjectExplorer::Target*))); + + // Setup Qt versions supported (== possible targets). + connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)), + this, SLOT(qtVersionsChanged())); + setSupportedTargetIds(QtVersionManager::instance()->supportedTargetIds()); + if (!Project::fromMap(map)) return false; - if (buildConfigurations().isEmpty()) + // Prune targets without buildconfigurations: + // This can happen esp. when updating from a old version of Qt Creator + QList<Target *>ts(targets()); + foreach (Target *t, ts) { + if (t->buildConfigurations().isEmpty()) + removeTarget(t); + } + + // Add buildconfigurations so we can parse the pro-files. + if (targets().isEmpty()) addDefaultBuild(); - // Ensure that the qt version and tool chain in each build configuration is valid - // or if not, is reset to the default + Q_ASSERT(activeTarget()); + Q_ASSERT(activeTarget()->activeBuildConfiguration()); - foreach (BuildConfiguration *bc, buildConfigurations()) { - Qt4BuildConfiguration *qt4bc = static_cast<Qt4BuildConfiguration *>(bc); - qt4bc->qtVersionId(); - qt4bc->toolChainType(); - } + update(); + updateFileList(); + // This might be incorrect, need a full update + scheduleUpdateCodeModel(rootProjectNode()); - m_rootProjectNode = new Qt4ProFileNode(this, m_fileInfo->fileName(), this); - m_rootProjectNode->registerWatcher(m_nodesWatcher); + // Now connect connect(m_nodesWatcher, SIGNAL(foldersAdded()), this, SLOT(updateFileList())); connect(m_nodesWatcher, SIGNAL(foldersRemoved()), this, SLOT(updateFileList())); connect(m_nodesWatcher, SIGNAL(filesAdded()), this, SLOT(updateFileList())); @@ -297,29 +303,6 @@ bool Qt4Project::fromMap(const QVariantMap &map) connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *)), this, SLOT(scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFileNode *))); - update(); - - // restored old runconfigurations - if (runConfigurations().isEmpty()) { - // Oha no runConfigurations, add some - QList<Qt4ProFileNode *> list; - collectApplicationProFiles(list, m_rootProjectNode); - - if (!list.isEmpty()) { - foreach (Qt4ProFileNode *node, list) { - RunConfiguration *rc(new Qt4RunConfiguration(this, node->path())); - addRunConfiguration(rc); - } - setActiveRunConfiguration(runConfigurations().first()); - } else { - RunConfiguration *rc(new ProjectExplorer::CustomExecutableRunConfiguration(this)); - addRunConfiguration(rc); - setActiveRunConfiguration(rc); - m_isApplication = false; - } - } - - // Now connect connect(m_nodesWatcher, SIGNAL(foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &)), this, SLOT(foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &))); connect(m_nodesWatcher, SIGNAL(foldersAdded()), this, SLOT(checkForNewApplicationProjects())); @@ -336,87 +319,36 @@ bool Qt4Project::fromMap(const QVariantMap &map) connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *)), this, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *))); - connect(this, SIGNAL(activeBuildConfigurationChanged()), - this, SLOT(slotActiveBuildConfigurationChanged())); - - m_lastActiveQt4BuildConfiguration = activeQt4BuildConfiguration(); - if (m_lastActiveQt4BuildConfiguration) { - connect(m_lastActiveQt4BuildConfiguration, SIGNAL(qtVersionChanged()), - this, SLOT(update())); - connect(m_lastActiveQt4BuildConfiguration, SIGNAL(targetInformationChanged()), - this, SIGNAL(targetInformationChanged())); - connect(m_lastActiveQt4BuildConfiguration, SIGNAL(environmentChanged()), - this, SIGNAL(environmentChanged())); + connect(this, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), + this, SLOT(activeTargetWasChanged())); + + // Add RunConfigurations to targets: + // If we have no application targets then add a empty CustomExecutableRC as + // it will ask the user for an executable to run. + QStringList pathes = applicationProFilePathes(); + foreach (Target *t, targets()) { + Qt4Target * qt4target = static_cast<Qt4Target*>(t); + if (t->runConfigurations().isEmpty()) { + if (pathes.isEmpty()) { + t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t)); + } else { + foreach (const QString &path, pathes) + qt4target->addRunConfigurationForPath(path); + } + } } return true; } -void Qt4Project::slotActiveBuildConfigurationChanged() +Qt4TargetFactory *Qt4Project::targetFactory() const { - if (m_lastActiveQt4BuildConfiguration) { - disconnect(m_lastActiveQt4BuildConfiguration, SIGNAL(qtVersionChanged()), - this, SLOT(update())); - disconnect(m_lastActiveQt4BuildConfiguration, SIGNAL(targetInformationChanged()), - this, SIGNAL(targetInformationChanged())); - disconnect(m_lastActiveQt4BuildConfiguration, SIGNAL(environmentChanged()), - this, SIGNAL(environmentChanged())); - } - m_lastActiveQt4BuildConfiguration = activeQt4BuildConfiguration(); - if (m_lastActiveQt4BuildConfiguration) { - connect(m_lastActiveQt4BuildConfiguration, SIGNAL(qtVersionChanged()), - this, SLOT(update())); - connect(m_lastActiveQt4BuildConfiguration, SIGNAL(targetInformationChanged()), - this, SIGNAL(targetInformationChanged())); - connect(m_lastActiveQt4BuildConfiguration, SIGNAL(environmentChanged()), - this, SIGNAL(environmentChanged())); - } - emit environmentChanged(); - emit targetInformationChanged(); + return m_targetFactory; } -ProjectExplorer::IBuildConfigurationFactory *Qt4Project::buildConfigurationFactory() const +Qt4Target *Qt4Project::activeTarget() const { - return m_buildConfigurationFactory; -} - -Qt4BuildConfiguration *Qt4Project::addQt4BuildConfiguration(QString displayName, QtVersion *qtversion, - QtVersion::QmakeBuildConfigs qmakeBuildConfiguration, - QStringList additionalArguments) -{ - bool debug = qmakeBuildConfiguration & QtVersion::DebugBuild; - - // Add the buildconfiguration - Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(this); - bc->setDisplayName(displayName); - - QMakeStep *qmakeStep = new QMakeStep(bc); - bc->insertBuildStep(0, qmakeStep); - - MakeStep *makeStep = new MakeStep(bc); - bc->insertBuildStep(1, makeStep); - - MakeStep* cleanStep = new MakeStep(bc); - cleanStep->setClean(true); - cleanStep->setUserArguments(QStringList() << "clean"); - bc->insertCleanStep(0, cleanStep); - if (!additionalArguments.isEmpty()) - qmakeStep->setUserArguments(additionalArguments); - - // set some options for qmake and make - if (qmakeBuildConfiguration & QtVersion::BuildAll) // debug_and_release => explicit targets - makeStep->setUserArguments(QStringList() << (debug ? "debug" : "release")); - - bc->setQMakeBuildConfiguration(qmakeBuildConfiguration); - - // Finally set the qt version - bool defaultQtVersion = (qtversion == 0); - if (defaultQtVersion) - bc->setQtVersion(0); - else - bc->setQtVersion(qtversion->uniqueId()); - addBuildConfiguration(bc); - return bc; + return static_cast<Qt4Target *>(Project::activeTarget()); } namespace { @@ -446,12 +378,29 @@ void Qt4Project::scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFile m_proFilesForCodeModelUpdate.append(pro); } +void Qt4Project::changeTargetInformation() +{ + Qt4Target *t(qobject_cast<Qt4Target *>(sender())); + if (t && t == activeTarget()) + emit targetInformationChanged(); +} + +void Qt4Project::onAddedTarget(ProjectExplorer::Target *t) +{ + Q_ASSERT(t); + connect(t, SIGNAL(targetInformationChanged()), + this, SLOT(changeTargetInformation())); +} + void Qt4Project::updateCodeModel() { if (debug) qDebug()<<"Qt4Project::updateCodeModel()"; - Qt4BuildConfiguration *activeBC = activeQt4BuildConfiguration(); + if (!activeTarget() || !activeTarget()->activeBuildConfiguration()) + return; + + Qt4BuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration(); CppTools::CppModelManagerInterface *modelmanager = ExtensionSystem::PluginManager::instance() @@ -470,7 +419,7 @@ void Qt4Project::updateCodeModel() if (tc) { predefinedMacros = tc->predefinedMacros(); allHeaderPaths = tc->systemHeaderPaths(); - //qDebug()<<"Predifined Macros"; + //qDebug()<<"Predefined Macros"; //qDebug()<<tc->predefinedMacros(); //qDebug()<<""; //qDebug()<<"System Header Paths"; @@ -659,6 +608,11 @@ void Qt4Project::updateCodeModel() m_proFilesForCodeModelUpdate.clear(); } +void Qt4Project::qtVersionsChanged() +{ + setSupportedTargetIds(QtVersionManager::instance()->supportedTargetIds()); +} + QByteArray Qt4Project::predefinedMacros(const QString &fileName) const { QMap<QString, CodeModelInfo>::const_iterator it = m_codeModelInfo.constFind(fileName); @@ -803,8 +757,9 @@ ProFileReader *Qt4Project::createProFileReader(Qt4ProFileNode *qt4ProFileNode) m_proFileOption = new ProFileOption; m_proFileOptionRefCnt = 0; - if (Qt4BuildConfiguration *qt4bc = activeQt4BuildConfiguration()) { - QtVersion *version = qt4bc->qtVersion(); + if (activeTarget() && + activeTarget()->activeBuildConfiguration()) { + QtVersion *version = activeTarget()->activeBuildConfiguration()->qtVersion(); if (version->isValid()) m_proFileOption->properties = version->versionInfo(); } @@ -836,89 +791,6 @@ void Qt4Project::destroyProFileReader(ProFileReader *reader) } } -Qt4TargetInformation Qt4Project::targetInformation(Qt4BuildConfiguration *buildConfiguration, - const QString &proFilePath) -{ - Qt4TargetInformation info; - Qt4ProFileNode *proFileNode = rootProjectNode()->findProFileFor(proFilePath); - if (!proFileNode) { - info.error = Qt4TargetInformation::InvalidProjectError; - return info; - } - ProFileReader *reader = createProFileReader(proFileNode); - reader->setCumulative(false); - - // Find out what flags we pass on to qmake - QStringList addedUserConfigArguments; - QStringList removedUserConfigArguments; - buildConfiguration->getConfigCommandLineArguments(&addedUserConfigArguments, &removedUserConfigArguments); - reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments); - - if (!reader->readProFile(proFilePath)) { - destroyProFileReader(reader); - info.error = Qt4TargetInformation::ProParserError; - return info; - } - - // Extract data - const QDir baseProjectDirectory = QFileInfo(file()->fileName()).absoluteDir(); - const QString relSubDir = baseProjectDirectory.relativeFilePath(QFileInfo(proFilePath).path()); - const QDir baseBuildDirectory = buildConfiguration->buildDirectory(); - const QString baseDir = baseBuildDirectory.absoluteFilePath(relSubDir); - //qDebug()<<relSubDir<<baseDir; - - // Working Directory - if (reader->contains("DESTDIR")) { - //qDebug() << "reader contains destdir:" << reader->value("DESTDIR"); - info.workingDir = reader->value("DESTDIR"); - if (QDir::isRelativePath(info.workingDir)) { - info.workingDir = baseDir + QLatin1Char('/') + info.workingDir; - //qDebug() << "was relative and expanded to" << info.workingDir; - } - } else { - //qDebug() << "reader didn't contain DESTDIR, setting to " << baseDir; - info.workingDir = baseDir; - } - - info.target = reader->value("TARGET"); - if (info.target.isEmpty()) - info.target = QFileInfo(proFilePath).baseName(); - -#if defined (Q_OS_MAC) - if (reader->values("CONFIG").contains("app_bundle")) { - info.workingDir += QLatin1Char('/') - + info.target - + QLatin1String(".app/Contents/MacOS"); - } -#endif - - info.workingDir = QDir::cleanPath(info.workingDir); - - QString wd = info.workingDir; - if (!reader->contains("DESTDIR") - && reader->values("CONFIG").contains("debug_and_release") - && reader->values("CONFIG").contains("debug_and_release_target")) { - // If we don't have a destdir and debug and release is set - // then the executable is in a debug/release folder - //qDebug() << "reader has debug_and_release_target"; - QString qmakeBuildConfig = "release"; - if (buildConfiguration->qmakeBuildConfiguration() & QtVersion::DebugBuild) - qmakeBuildConfig = "debug"; - wd += QLatin1Char('/') + qmakeBuildConfig; - } - - info.executable = QDir::cleanPath(wd + QLatin1Char('/') + info.target); - //qDebug() << "##### updateTarget sets:" << info.workingDir << info.executable; - -#if defined (Q_OS_WIN) - info.executable += QLatin1String(".exe"); -#endif - - destroyProFileReader(reader); - info.error = Qt4TargetInformation::NoError; - return info; -} - Qt4ProFileNode *Qt4Project::rootProjectNode() const { return m_rootProjectNode; @@ -963,21 +835,23 @@ void Qt4Project::foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &n void Qt4Project::checkForNewApplicationProjects() { // Check all new project nodes - // against all runConfigurations + // against all runConfigurations in all targets. foreach (Qt4ProFileNode *qt4proFile, m_applicationProFileChange) { - bool found = false; - foreach (RunConfiguration *rc, runConfigurations()) { - Qt4RunConfiguration *qtrc = qobject_cast<Qt4RunConfiguration *>(rc); - if (qtrc && qtrc->proFilePath() == qt4proFile->path()) { - found = true; - break; + foreach (Target *target, targets()) { + Qt4Target *qt4Target = static_cast<Qt4Target *>(target); + bool found = false; + foreach (RunConfiguration *rc, target->runConfigurations()) { + Qt4RunConfiguration *qtrc = qobject_cast<Qt4RunConfiguration *>(rc); + if (qtrc && qtrc->proFilePath() == qt4proFile->path()) { + found = true; + break; + } + } + if (!found) { + qt4Target->addRunConfigurationForPath(qt4proFile->path()); + m_isApplication = true; } - } - if (!found) { - Qt4RunConfiguration *newRc = new Qt4RunConfiguration(this, qt4proFile->path()); - addRunConfiguration(newRc); - m_isApplication = true; } } } @@ -991,35 +865,30 @@ void Qt4Project::checkForDeletedApplicationProjects() // qDebug()<<"Still existing paths :"<<paths; QList<Qt4RunConfiguration *> removeList; - foreach (RunConfiguration *rc, runConfigurations()) { - if (Qt4RunConfiguration *qt4rc = qobject_cast<Qt4RunConfiguration *>(rc)) { - if (!paths.contains(qt4rc->proFilePath())) { - removeList.append(qt4rc); -// qDebug()<<"Removing runConfiguration for "<<qt4rc->proFilePath(); + foreach (Target *target, targets()) { + foreach (RunConfiguration *rc, target->runConfigurations()) { + if (Qt4RunConfiguration *qt4rc = qobject_cast<Qt4RunConfiguration *>(rc)) { + if (!paths.contains(qt4rc->proFilePath())) { + removeList.append(qt4rc); + // qDebug()<<"Removing runConfiguration for "<<qt4rc->proFilePath(); + } } } - } + foreach (Qt4RunConfiguration *qt4rc, removeList) + target->removeRunConfiguration(qt4rc); - bool resetActiveRunConfiguration = false; - foreach (Qt4RunConfiguration *qt4rc, removeList) { - removeRunConfiguration(qt4rc); - if (activeRunConfiguration() == qt4rc) - resetActiveRunConfiguration = true; - } - - if (runConfigurations().isEmpty()) { - RunConfiguration *rc = new ProjectExplorer::CustomExecutableRunConfiguration(this); - addRunConfiguration(rc); - setActiveRunConfiguration(rc); - m_isApplication = false; - } else if (resetActiveRunConfiguration) { - setActiveRunConfiguration(runConfigurations().first()); + if (target->runConfigurations().isEmpty()) { + target->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(target)); + m_isApplication = false; + } } } QList<Qt4ProFileNode *> Qt4Project::applicationProFiles() const { QList<Qt4ProFileNode *> list; + if (!rootProjectNode()) + return list; collectApplicationProFiles(list, rootProjectNode()); return list; } @@ -1061,6 +930,16 @@ void Qt4Project::projectTypeChanged(Qt4ProFileNode *node, const Qt4ProjectType o } } +void Qt4Project::activeTargetWasChanged() +{ + emit targetInformationChanged(); + + if (!activeTarget()) + return; + + update(); +} + bool Qt4Project::hasSubNode(Qt4PriFileNode *root, const QString &path) { if (root->path() == path) diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index ff299ce72d..026ae43629 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -30,7 +30,9 @@ #ifndef QT4PROJECT_H #define QT4PROJECT_H +#include "profileevaluator.h" #include "qt4nodes.h" +#include "qt4target.h" #include "qmakestep.h" #include "makestep.h" #include "qtversionmanager.h" @@ -73,8 +75,6 @@ namespace Internal { class GCCPreprocessor; struct Qt4ProjectFiles; class Qt4ProjectConfigWidget; - class Qt4BuildConfiguration; - class Qt4BuildConfigurationFactory; class CodeModelInfo { @@ -119,20 +119,6 @@ private: QString m_filePath; }; -struct Qt4TargetInformation -{ - enum ErrorCode { - NoError, - InvalidProjectError, - ProParserError - }; - - ErrorCode error; - QString workingDir; - QString target; - QString executable; -}; - class Qt4Project : public ProjectExplorer::Project { Q_OBJECT @@ -141,19 +127,15 @@ public: explicit Qt4Project(Qt4Manager *manager, const QString &proFile); virtual ~Qt4Project(); - Internal::Qt4BuildConfiguration *activeQt4BuildConfiguration() const; - QString displayName() const; QString id() const; Core::IFile *file() const; ProjectExplorer::IProjectManager *projectManager() const; Qt4Manager *qt4ProjectManager() const; - ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const; - Internal::Qt4BuildConfiguration *addQt4BuildConfiguration(QString displayName, - QtVersion *qtversion, - QtVersion::QmakeBuildConfigs qmakeBuildConfiguration, - QStringList additionalArguments = QStringList()); + Internal::Qt4TargetFactory *targetFactory() const; + + Internal::Qt4Target *activeTarget() const; QList<Core::IFile *> dependencies(); //NBS remove QList<ProjectExplorer::Project *>dependsOn(); @@ -184,28 +166,24 @@ public: Internal::ProFileReader *createProFileReader(Internal::Qt4ProFileNode *qt4ProFileNode); void destroyProFileReader(Internal::ProFileReader *reader); - Qt4TargetInformation targetInformation(Internal::Qt4BuildConfiguration *buildConfiguration, - const QString &proFilePath); - signals: /// convenience signal, emitted if either the active buildconfiguration emits /// targetInformationChanged() or if the active build configuration changes + /// (which can happen by the active target changing, too). void targetInformationChanged(); void proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *node); - /// convenience signal, emitted if either the active buildconfiguration emits - /// environmentChanged() or if the active build configuration changes - void environmentChanged(); public slots: - void update(); void proFileParseError(const QString &errorMessage); - void scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFileNode *); + void update(); + void changeTargetInformation(); private slots: void updateCodeModel(); - void qtVersionChanged(); - void slotActiveBuildConfigurationChanged(); + void scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFileNode *); + void qtVersionsChanged(); void updateFileList(); + void onAddedTarget(ProjectExplorer::Target *t); void foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &); void checkForNewApplicationProjects(); @@ -213,6 +191,7 @@ private slots: void projectTypeChanged(Qt4ProjectManager::Internal::Qt4ProFileNode *node, const Qt4ProjectManager::Internal::Qt4ProjectType oldType, const Qt4ProjectManager::Internal::Qt4ProjectType newType); + void activeTargetWasChanged(); protected: virtual bool fromMap(const QVariantMap &map); @@ -232,7 +211,7 @@ private: Qt4Manager *m_manager; Internal::Qt4ProFileNode *m_rootProjectNode; Internal::Qt4NodesWatcher *m_nodesWatcher; - Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory; + Internal::Qt4TargetFactory *m_targetFactory; Qt4ProjectFile *m_fileInfo; bool m_isApplication; @@ -248,7 +227,6 @@ private: QList<Qt4ProjectManager::Internal::Qt4ProFileNode *> m_proFilesForCodeModelUpdate; QMap<QString, Internal::CodeModelInfo> m_codeModelInfo; - Internal::Qt4BuildConfiguration *m_lastActiveQt4BuildConfiguration; friend class Qt4ProjectFile; friend class Internal::Qt4ProjectConfigWidget; diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 15a5c00cbc..7bccc2ecce 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -41,6 +41,7 @@ #include <coreplugin/mainwindow.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/buildconfiguration.h> +#include <utils/qtcassert.h> #include <extensionsystem/pluginmanager.h> #include <QtGui/QFileDialog> @@ -116,14 +117,25 @@ void Qt4ProjectConfigWidget::updateDetails() { QtVersion *version = m_buildConfiguration->qtVersion(); - QString versionString; - if (m_buildConfiguration->qtVersionId() == 0) { - versionString = tr("Default Qt Version (%1)").arg(version->displayName()); - } else if(version){ - versionString = version->displayName(); + versionString = version->displayName(); + + if (!version || !version->isValid()) { + // Not a valid qt version + m_detailsContainer->setSummaryText( + tr("using <font color=\"#ff0000\">invalid</font> Qt Version: <b>%1</b><br>" + "%2") + .arg(versionString, + version ? version->invalidReason() : tr("No Qt Version found."))); } else { - versionString = tr("No Qt Version set"); + // Qt Version, Build Directory and Toolchain + m_detailsContainer->setSummaryText( + tr("using Qt version: <b>%1</b><br>" + "with tool chain <b>%2</b><br>" + "building in <b>%3</b>") + .arg(versionString, + ProjectExplorer::ToolChain::toolChainName(m_buildConfiguration->toolChainType()), + QDir::toNativeSeparators(m_buildConfiguration->buildDirectory()))); } } @@ -141,6 +153,8 @@ QString Qt4ProjectConfigWidget::displayName() const void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc) { + QTC_ASSERT(bc, return); + if (debug) qDebug() << "Qt4ProjectConfigWidget::init() for"<<bc->displayName(); @@ -152,7 +166,6 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc) disconnect(m_buildConfiguration, SIGNAL(qmakeBuildConfigurationChanged()), this, SLOT(updateImportLabel())); } - m_buildConfiguration = static_cast<Qt4BuildConfiguration *>(bc); connect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()), @@ -199,23 +212,23 @@ void Qt4ProjectConfigWidget::qtVersionsChanged() QtVersionManager *vm = QtVersionManager::instance(); m_ui->qtVersionComboBox->clear(); - m_ui->qtVersionComboBox->addItem(tr("Default Qt Version (%1)").arg(vm->defaultVersion()->displayName()), 0); + QtVersion * qtVersion = m_buildConfiguration->qtVersion(); - int qtVersionId = m_buildConfiguration->qtVersionId(); - - if (qtVersionId == 0) { - m_ui->qtVersionComboBox->setCurrentIndex(0); + const QList<QtVersion *> validVersions(vm->versionsForTargetId(m_buildConfiguration->target()->id())); + if (validVersions.isEmpty()) { + m_ui->invalidQtWarningLabel->setVisible(true); + } else { m_ui->invalidQtWarningLabel->setVisible(false); - } - // Add Qt Versions to the combo box - const QList<QtVersion *> &versions = vm->versions(); - for (int i = 0; i < versions.size(); ++i) { - m_ui->qtVersionComboBox->addItem(versions.at(i)->displayName(), versions.at(i)->uniqueId()); - - if (versions.at(i)->uniqueId() == qtVersionId) { - m_ui->qtVersionComboBox->setCurrentIndex(i + 1); - m_ui->invalidQtWarningLabel->setVisible(!versions.at(i)->isValid()); + for (int i = 0; i < validVersions.size(); ++i) { + m_ui->qtVersionComboBox->addItem(validVersions.at(i)->displayName(), + validVersions.at(i)->uniqueId()); + + if (validVersions.at(i) == qtVersion) { + m_ui->qtVersionComboBox->setCurrentIndex(i); + m_ui->invalidQtWarningLabel->setVisible(!validVersions.at(i)->isValid()); + } } + m_ui->qtVersionComboBox->setEnabled(validVersions.count() > 1); } // And connect again @@ -234,7 +247,7 @@ void Qt4ProjectConfigWidget::buildDirectoryChanged() void Qt4ProjectConfigWidget::onBeforeBeforeShadowBuildDirBrowsed() { - QString initialDirectory = QFileInfo(m_buildConfiguration->project()->file()->fileName()).absolutePath(); + QString initialDirectory = QFileInfo(m_buildConfiguration->target()->project()->file()->fileName()).absolutePath(); if (!initialDirectory.isEmpty()) m_ui->shadowBuildDirEdit->setInitialBrowsePathBackup(initialDirectory); } @@ -323,7 +336,7 @@ void Qt4ProjectConfigWidget::importLabelClicked() } // So we got all the information now apply it... - m_buildConfiguration->setQtVersion(version->uniqueId()); + m_buildConfiguration->setQtVersion(version); // Combo box will be updated at the end QMakeStep *qmakeStep = m_buildConfiguration->qmakeStep(); @@ -356,16 +369,12 @@ void Qt4ProjectConfigWidget::importLabelClicked() void Qt4ProjectConfigWidget::qtVersionSelected(const QString &) { //Qt Version - int newQtVersion; - if (m_ui->qtVersionComboBox->currentIndex() == 0) { - newQtVersion = 0; - } else { - newQtVersion = m_ui->qtVersionComboBox->itemData(m_ui->qtVersionComboBox->currentIndex()).toInt(); - } + int newQtVersionId = m_ui->qtVersionComboBox->itemData(m_ui->qtVersionComboBox->currentIndex()).toInt(); QtVersionManager *vm = QtVersionManager::instance(); - bool isValid = vm->version(newQtVersion)->isValid(); + QtVersion *newQtVersion = vm->version(newQtVersionId); + bool isValid = newQtVersion->isValid(); m_ui->invalidQtWarningLabel->setVisible(!isValid); - if (newQtVersion != m_buildConfiguration->qtVersionId()) { + if (newQtVersion != m_buildConfiguration->qtVersion()) { m_ignoreChange = true; m_buildConfiguration->setQtVersion(newQtVersion); m_ignoreChange = false; @@ -377,12 +386,12 @@ void Qt4ProjectConfigWidget::qtVersionSelected(const QString &) void Qt4ProjectConfigWidget::updateToolChainCombo() { m_ui->toolChainComboBox->clear(); - QList<ProjectExplorer::ToolChain::ToolChainType> toolchains = m_buildConfiguration->qtVersion()->possibleToolChainTypes(); - foreach (ToolChain::ToolChainType toolchain, toolchains) { + QList<ProjectExplorer::ToolChain::ToolChainType> toolchains(m_buildConfiguration->qtVersion()->possibleToolChainTypes()); + toolchains = m_buildConfiguration->qt4Target()->filterToolChainTypes(toolchains); + foreach (ToolChain::ToolChainType toolchain, toolchains) m_ui->toolChainComboBox->addItem(ToolChain::toolChainName(toolchain), qVariantFromValue(toolchain)); - } m_ui->toolChainComboBox->setEnabled(toolchains.size() > 1); - m_ui->toolChainComboBox->setCurrentIndex(toolchains.indexOf(m_buildConfiguration->toolChainType())); + m_ui->toolChainComboBox->setCurrentIndex(toolchains.indexOf(m_buildConfiguration->qt4Target()->preferredToolChainType(toolchains))); updateDetails(); } diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp index 390e73d3ab..78d09dac1e 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp @@ -33,6 +33,7 @@ #include "qt4projectmanagerplugin.h" #include "qt4nodes.h" #include "qt4project.h" +#include "qt4target.h" #include "profilereader.h" #include "qmakestep.h" #include "qt4buildconfiguration.h" @@ -251,7 +252,11 @@ void Qt4Manager::runQMake(ProjectExplorer::Project *p, ProjectExplorer::Node *no Qt4Project *qt4pro = qobject_cast<Qt4Project *>(p); QTC_ASSERT(qt4pro, return); - Qt4BuildConfiguration *bc = qt4pro->activeQt4BuildConfiguration(); + if (!qt4pro->activeTarget() || + !qt4pro->activeTarget()->activeBuildConfiguration()) + return; + + Qt4BuildConfiguration *bc = qt4pro->activeTarget()->activeBuildConfiguration(); QMakeStep *qs = bc->qmakeStep(); if (!qs) @@ -272,7 +277,11 @@ void Qt4Manager::buildSubDirContextMenu() Qt4Project *qt4pro = qobject_cast<Qt4Project *>(m_contextProject); QTC_ASSERT(qt4pro, return); - Qt4BuildConfiguration *bc = qt4pro->activeQt4BuildConfiguration(); + if (!qt4pro->activeTarget() || + !qt4pro->activeTarget()->activeBuildConfiguration()) + return; + + Qt4BuildConfiguration *bc = qt4pro->activeTarget()->activeBuildConfiguration(); if (m_contextNode != 0 && m_contextNode != qt4pro->rootProjectNode()) if (Qt4ProFileNode *profile = qobject_cast<Qt4ProFileNode *>(m_contextNode)) bc->setSubNodeBuild(profile); diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index b44f104a71..dd24ed8e64 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -42,6 +42,7 @@ HEADERS += qt4projectmanagerplugin.h \ gettingstartedwelcomepagewidget.h \ gettingstartedwelcomepage.h \ qt4buildconfiguration.h \ + qt4target.h \ qmakeparser.h SOURCES += qt4projectmanagerplugin.cpp \ qt4projectmanager.cpp \ @@ -81,6 +82,7 @@ SOURCES += qt4projectmanagerplugin.cpp \ gettingstartedwelcomepagewidget.cpp \ gettingstartedwelcomepage.cpp \ qt4buildconfiguration.cpp \ + qt4target.cpp \ qmakeparser.cpp FORMS += makestep.ui \ qmakestep.ui \ diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index a78fca61c6..c57728b9f1 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -33,6 +33,7 @@ #include "profilereader.h" #include "qt4nodes.h" #include "qt4project.h" +#include "qt4target.h" #include "qt4buildconfiguration.h" #include <coreplugin/icore.h> @@ -89,7 +90,7 @@ QString pathToId(const QString &path) // Qt4RunConfiguration // -Qt4RunConfiguration::Qt4RunConfiguration(Qt4Project *parent, const QString &proFilePath) : +Qt4RunConfiguration::Qt4RunConfiguration(Qt4Target *parent, const QString &proFilePath) : LocalApplicationRunConfiguration(parent, QLatin1String(QT4_RC_ID)), m_proFilePath(proFilePath), m_runMode(Gui), @@ -102,7 +103,7 @@ Qt4RunConfiguration::Qt4RunConfiguration(Qt4Project *parent, const QString &proF ctor(); } -Qt4RunConfiguration::Qt4RunConfiguration(Qt4Project *parent, Qt4RunConfiguration *source) : +Qt4RunConfiguration::Qt4RunConfiguration(Qt4Target *parent, Qt4RunConfiguration *source) : LocalApplicationRunConfiguration(parent, source), m_commandLineArguments(source->m_commandLineArguments), m_proFilePath(source->m_proFilePath), @@ -122,9 +123,9 @@ Qt4RunConfiguration::~Qt4RunConfiguration() { } -Qt4Project *Qt4RunConfiguration::qt4Project() const +Qt4Target *Qt4RunConfiguration::qt4Target() const { - return static_cast<Qt4Project *>(project()); + return static_cast<Qt4Target *>(target()); } bool Qt4RunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *configuration) const @@ -161,13 +162,13 @@ void Qt4RunConfiguration::proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileN void Qt4RunConfiguration::ctor() { setDefaultDisplayName(); - connect(qt4Project(), SIGNAL(targetInformationChanged()), + connect(qt4Target(), SIGNAL(targetInformationChanged()), this, SLOT(invalidateCachedTargetInformation())); - connect(qt4Project(), SIGNAL(environmentChanged()), + connect(qt4Target(), SIGNAL(environmentChanged()), this, SIGNAL(baseEnvironmentChanged())); - connect(qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*)), + connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*)), this, SLOT(proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode*))); } @@ -443,7 +444,7 @@ QWidget *Qt4RunConfiguration::configurationWidget() QVariantMap Qt4RunConfiguration::toMap() const { - const QDir projectDir = QFileInfo(project()->file()->fileName()).absoluteDir(); + const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir(); QVariantMap map(LocalApplicationRunConfiguration::toMap()); map.insert(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY), m_commandLineArguments); map.insert(QLatin1String(PRO_FILE_KEY), projectDir.relativeFilePath(m_proFilePath)); @@ -459,7 +460,7 @@ QVariantMap Qt4RunConfiguration::toMap() const bool Qt4RunConfiguration::fromMap(const QVariantMap &map) { - const QDir projectDir = QFileInfo(project()->file()->fileName()).absoluteDir(); + const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir(); m_commandLineArguments = map.value(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY)).toStringList(); m_proFilePath = projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString()); m_userSetName = map.value(QLatin1String(USER_SET_NAME_KEY), false).toBool(); @@ -537,7 +538,7 @@ ProjectExplorer::Environment Qt4RunConfiguration::baseEnvironment() const } else if (m_baseEnvironmentBase == Qt4RunConfiguration::SystemEnvironmentBase) { env = ProjectExplorer::Environment::systemEnvironment(); } else if (m_baseEnvironmentBase == Qt4RunConfiguration::BuildEnvironmentBase) { - env = project()->activeBuildConfiguration()->environment(); + env = target()->activeBuildConfiguration()->environment(); } if (m_isUsingDyldImageSuffix) { env.set("DYLD_IMAGE_SUFFIX", "_debug"); @@ -610,8 +611,8 @@ void Qt4RunConfiguration::updateTarget() { if (m_cachedTargetInformationValid) return; - Qt4TargetInformation info = qt4Project()->targetInformation(qt4Project()->activeQt4BuildConfiguration(), - m_proFilePath); + Qt4TargetInformation info = qt4Target()->targetInformation(qt4Target()->activeBuildConfiguration(), + m_proFilePath); if (info.error != Qt4TargetInformation::NoError) { if (info.error == Qt4TargetInformation::ProParserError) { Core::ICore::instance()->messageManager()->printToOutputPane( @@ -640,14 +641,16 @@ void Qt4RunConfiguration::invalidateCachedTargetInformation() QString Qt4RunConfiguration::dumperLibrary() const { - if (const QtVersion *version = qt4Project()->activeQt4BuildConfiguration()->qtVersion()) + QtVersion *version = qt4Target()->activeBuildConfiguration()->qtVersion(); + if (version) return version->debuggingHelperLibrary(); return QString(); } QStringList Qt4RunConfiguration::dumperLibraryLocations() const { - if (const QtVersion *version = qt4Project()->activeQt4BuildConfiguration()->qtVersion()) + QtVersion *version = qt4Target()->activeBuildConfiguration()->qtVersion(); + if (version) return version->debuggingHelperLibraryLocations(); return QStringList(); } @@ -655,7 +658,7 @@ QStringList Qt4RunConfiguration::dumperLibraryLocations() const void Qt4RunConfiguration::setDefaultDisplayName() { if (m_userSetName) - return; + return; if (!m_proFilePath.isEmpty()) setDisplayName(QFileInfo(m_proFilePath).completeBaseName()); else @@ -676,7 +679,7 @@ Qt4RunConfiguration::BaseEnvironmentBase Qt4RunConfiguration::baseEnvironmentBas } ProjectExplorer::ToolChain::ToolChainType Qt4RunConfiguration::toolChainType() const { - Qt4BuildConfiguration *qt4bc = qt4Project()->activeQt4BuildConfiguration(); + Qt4BuildConfiguration *qt4bc = qt4Target()->activeBuildConfiguration(); return qt4bc->toolChainType(); } @@ -694,36 +697,40 @@ Qt4RunConfigurationFactory::~Qt4RunConfigurationFactory() { } -bool Qt4RunConfigurationFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +bool Qt4RunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const { - Qt4Project *qt4project = qobject_cast<Qt4Project *>(parent); - if (!qt4project) + Qt4Target *t = qobject_cast<Qt4Target *>(parent); + if (!t) + return false; + if (t->id() != QLatin1String(DESKTOP_TARGET_ID)) return false; - return qt4project->hasApplicationProFile(pathFromId(id)); + return t->qt4Project()->hasApplicationProFile(pathFromId(id)); } -ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::create(ProjectExplorer::Project *parent, const QString &id) +ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id) { if (!canCreate(parent, id)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); - return new Qt4RunConfiguration(project, pathFromId(id)); + Qt4Target *t(static_cast<Qt4Target *>(parent)); + return new Qt4RunConfiguration(t, pathFromId(id)); } -bool Qt4RunConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +bool Qt4RunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { - if (!qobject_cast<Qt4Project *>(parent)) + if (!qobject_cast<Qt4Target *>(parent)) + return false; + if (parent->id() != QLatin1String(DESKTOP_TARGET_ID)) return false; QString id(ProjectExplorer::idFromMap(map)); return id.startsWith(QLatin1String(QT4_RC_ID)); } -ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); - Qt4RunConfiguration *rc(new Qt4RunConfiguration(project, QString())); + Qt4Target *t(static_cast<Qt4Target *>(parent)); + Qt4RunConfiguration *rc(new Qt4RunConfiguration(t, QString())); if (rc->fromMap(map)) return rc; @@ -731,28 +738,28 @@ ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::restore(ProjectEx return 0; } -bool Qt4RunConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) const +bool Qt4RunConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const { - if (!qobject_cast<Qt4Project *>(parent)) - return false; - return source->id().startsWith(QLatin1String(QT4_RC_ID)); + return canCreate(parent, source->id()); } -ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::clone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) +ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) { if (!canClone(parent, source)) return 0; - Qt4Project *project(static_cast<Qt4Project *>(parent)); + Qt4Target *t(static_cast<Qt4Target *>(parent)); Qt4RunConfiguration *old(static_cast<Qt4RunConfiguration *>(source)); - return new Qt4RunConfiguration(project, old); + return new Qt4RunConfiguration(t, old); } -QStringList Qt4RunConfigurationFactory::availableCreationIds(ProjectExplorer::Project *pro) const +QStringList Qt4RunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - Qt4Project *qt4project = qobject_cast<Qt4Project *>(pro); - if (!qt4project) + Qt4Target *t(qobject_cast<Qt4Target *>(parent)); + if (!t) + return QStringList(); + if (t->id() != DESKTOP_TARGET_ID) return QStringList(); - return qt4project->applicationProFilePathes(QLatin1String(QT4_RC_PREFIX)); + return t->qt4Project()->applicationProFilePathes(QLatin1String(QT4_RC_PREFIX)); } QString Qt4RunConfigurationFactory::displayNameForId(const QString &id) const diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt4runconfiguration.h index 76c3ddc9a6..3bb94154f4 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.h @@ -56,6 +56,7 @@ namespace Internal { class Qt4PriFileNode; class Qt4ProFileNode; class Qt4RunConfigurationFactory; +class Qt4Target; class Qt4RunConfiguration : public ProjectExplorer::LocalApplicationRunConfiguration { @@ -65,10 +66,10 @@ class Qt4RunConfiguration : public ProjectExplorer::LocalApplicationRunConfigura friend class Qt4RunConfigurationFactory; public: - Qt4RunConfiguration(Qt4Project *parent, const QString &proFilePath); + Qt4RunConfiguration(Qt4Target *parent, const QString &proFilePath); virtual ~Qt4RunConfiguration(); - Qt4Project *qt4Project() const; + Qt4Target *qt4Target() const; virtual bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; virtual QWidget *configurationWidget(); @@ -117,7 +118,7 @@ private slots: void setRunMode(RunMode runMode); protected: - Qt4RunConfiguration(Qt4Project *parent, Qt4RunConfiguration *source); + Qt4RunConfiguration(Qt4Target *parent, Qt4RunConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: @@ -206,14 +207,14 @@ public: explicit Qt4RunConfigurationFactory(QObject *parent = 0); virtual ~Qt4RunConfigurationFactory(); - virtual bool canCreate(ProjectExplorer::Project *project, const QString &id) const; - virtual ProjectExplorer::RunConfiguration *create(ProjectExplorer::Project *project, const QString &id); - virtual bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - virtual ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map); - virtual bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source) const; - virtual ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::RunConfiguration *source); + virtual bool canCreate(ProjectExplorer::Target *parent, const QString &id) const; + virtual ProjectExplorer::RunConfiguration *create(ProjectExplorer::Target *parent, const QString &id); + virtual bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; + virtual ProjectExplorer::RunConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + virtual bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const; + virtual ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source); - QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QStringList availableCreationIds(ProjectExplorer::Target *parent) const; QString displayNameForId(const QString &id) const; }; diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp new file mode 100644 index 0000000000..76835ef0a4 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt4target.cpp @@ -0,0 +1,398 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qt4target.h" + +#include "makestep.h" +#include "profilereader.h" +#include "qmakestep.h" +#include "qt4buildconfiguration.h" +#include "qt4project.h" +#include "qt4runconfiguration.h" +#include "qt-maemo/maemorunconfiguration.h" +#include "qt-s60/s60devicerunconfiguration.h" +#include "qt-s60/s60emulatorrunconfiguration.h" + +#include <projectexplorer/toolchain.h> + +#include <QtGui/QApplication> + +using namespace ProjectExplorer; +using namespace Qt4ProjectManager; +using namespace Qt4ProjectManager::Internal; + +namespace { + +QString displayNameForId(const QString &id) { + if (id == QLatin1String(DESKTOP_TARGET_ID)) + return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Desktop", "Qt4 Desktop target display name"); + if (id == QLatin1String(S60_EMULATOR_TARGET_ID)) + return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "S60 Emulator", "Qt4 S60 Emulator target display name"); + if (id == QLatin1String(S60_DEVICE_TARGET_ID)) + return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "S60 Device", "Qt4 S60 Device target display name"); + if (id == QLatin1String(MAEMO_EMULATOR_TARGET_ID)) + return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Maemo Emulator", "Qt4 Maemo Emulator target display name"); + if (id == QLatin1String(MAEMO_DEVICE_TARGET_ID)) + return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Maemo Device", "Qt4 Maemo Device target display name"); + return QString(); +} + +QIcon iconForId(const QString &id) { + if (id == QLatin1String(DESKTOP_TARGET_ID)) + return QIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); + if (id == QLatin1String(S60_EMULATOR_TARGET_ID)) + return QIcon(); + if (id == QLatin1String(S60_DEVICE_TARGET_ID)) + return QIcon(); + if (id == QLatin1String(MAEMO_EMULATOR_TARGET_ID)) + return QIcon(); + if (id == QLatin1String(MAEMO_DEVICE_TARGET_ID)) + return QIcon(); + return QIcon(); +} + +} // namespace + +// ------------------------------------------------------------------------- +// Qt4TargetFactory +// ------------------------------------------------------------------------- + +Qt4TargetFactory::Qt4TargetFactory(QObject *parent) : + ITargetFactory(parent) +{ + connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)), + this, SIGNAL(availableCreationIdsChanged())); +} + +Qt4TargetFactory::~Qt4TargetFactory() +{ +} + +QStringList Qt4TargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return QStringList(); + + return parent->possibleTargetIds().toList(); +} + +QString Qt4TargetFactory::displayNameForId(const QString &id) const +{ + return ::displayNameForId(id); +} + +bool Qt4TargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const +{ + if (!qobject_cast<Qt4Project *>(parent)) + return false; + + return parent->canAddTarget(id); +} + +Qt4Target *Qt4TargetFactory::create(ProjectExplorer::Project *parent, const QString &id) +{ + if (!canCreate(parent, id)) + return 0; + + Qt4Project * qt4project(static_cast<Qt4Project *>(parent)); + Qt4Target *t(new Qt4Target(qt4project, id)); + + QList<QtVersion *> versions(QtVersionManager::instance()->versionsForTargetId(id)); + if (versions.isEmpty()) + return t; + + // BuildConfigurations: + QtVersion *version(versions.at(0)); + bool buildAll(false); + if (version && version->isValid() && (version->defaultBuildConfig() & QtVersion::BuildAll)) + buildAll = true; + + if (buildAll) { + t->addQt4BuildConfiguration("Debug", version, QtVersion::BuildAll | QtVersion::DebugBuild); + if (id != QLatin1String(S60_EMULATOR_TARGET_ID)) + t->addQt4BuildConfiguration("Release", version, QtVersion::BuildAll); + } else { + t->addQt4BuildConfiguration("Debug", version, QtVersion::DebugBuild); + if (id != QLatin1String(S60_EMULATOR_TARGET_ID)) + t->addQt4BuildConfiguration("Release", version, QtVersion::QmakeBuildConfig(0)); + } + + return t; +} + +bool Qt4TargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const +{ + return canCreate(parent, ProjectExplorer::idFromMap(map)); +} + +Qt4Target *Qt4TargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) +{ + if (!canRestore(parent, map)) + return 0; + + Qt4Project * qt4project(static_cast<Qt4Project *>(parent)); + Qt4Target *t(new Qt4Target(qt4project, QLatin1String("transient ID"))); + if (t->fromMap(map)) + return t; + delete t; + return 0; +} + +// ------------------------------------------------------------------------- +// Qt4Target +// ------------------------------------------------------------------------- + +Qt4Target::Qt4Target(Qt4Project *parent, const QString &id) : + ProjectExplorer::Target(parent, id), + m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)) +{ + connect(project(), SIGNAL(supportedTargetIdsChanged()), + this, SLOT(updateQtVersion())); + connect(this, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), + this, SIGNAL(targetInformationChanged())); + connect(this, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), + this, SIGNAL(environmentChanged())); + + setDisplayName(displayNameForId(id)); + setIcon(iconForId(id)); +} + +Qt4Target::~Qt4Target() +{ +} + +Qt4BuildConfiguration *Qt4Target::activeBuildConfiguration() const +{ + return static_cast<Qt4BuildConfiguration *>(Target::activeBuildConfiguration()); +} + +Qt4Project *Qt4Target::qt4Project() const +{ + return static_cast<Qt4Project *>(project()); +} + +Qt4TargetInformation Qt4Target::targetInformation(Qt4BuildConfiguration *buildConfiguration, + const QString &proFilePath) +{ + Qt4TargetInformation info; + Qt4ProFileNode *proFileNode = qt4Project()->rootProjectNode()->findProFileFor(proFilePath); + if (!proFileNode) { + info.error = Qt4TargetInformation::InvalidProjectError; + return info; + } + ProFileReader *reader = qt4Project()->createProFileReader(proFileNode); + reader->setCumulative(false); + + // Find out what flags we pass on to qmake + QStringList addedUserConfigArguments; + QStringList removedUserConfigArguments; + buildConfiguration->getConfigCommandLineArguments(&addedUserConfigArguments, &removedUserConfigArguments); + reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments); + + if (!reader->readProFile(proFilePath)) { + qt4Project()->destroyProFileReader(reader); + info.error = Qt4TargetInformation::ProParserError; + return info; + } + + // Extract data + const QDir baseProjectDirectory = QFileInfo(project()->file()->fileName()).absoluteDir(); + const QString relSubDir = baseProjectDirectory.relativeFilePath(QFileInfo(proFilePath).path()); + const QDir baseBuildDirectory = buildConfiguration->buildDirectory(); + const QString baseDir = baseBuildDirectory.absoluteFilePath(relSubDir); + //qDebug()<<relSubDir<<baseDir; + + // Working Directory + if (reader->contains("DESTDIR")) { + //qDebug() << "reader contains destdir:" << reader->value("DESTDIR"); + info.workingDir = reader->value("DESTDIR"); + if (QDir::isRelativePath(info.workingDir)) { + info.workingDir = baseDir + QLatin1Char('/') + info.workingDir; + //qDebug() << "was relative and expanded to" << info.workingDir; + } + } else { + //qDebug() << "reader didn't contain DESTDIR, setting to " << baseDir; + info.workingDir = baseDir; + } + + info.target = reader->value("TARGET"); + if (info.target.isEmpty()) + info.target = QFileInfo(proFilePath).baseName(); + +#if defined (Q_OS_MAC) + if (reader->values("CONFIG").contains("app_bundle")) { + info.workingDir += QLatin1Char('/') + + info.target + + QLatin1String(".app/Contents/MacOS"); + } +#endif + + info.workingDir = QDir::cleanPath(info.workingDir); + + QString wd = info.workingDir; + if (!reader->contains("DESTDIR") + && reader->values("CONFIG").contains("debug_and_release") + && reader->values("CONFIG").contains("debug_and_release_target")) { + // If we don't have a destdir and debug and release is set + // then the executable is in a debug/release folder + //qDebug() << "reader has debug_and_release_target"; + QString qmakeBuildConfig = "release"; + if (buildConfiguration->qmakeBuildConfiguration() & QtVersion::DebugBuild) + qmakeBuildConfig = "debug"; + wd += QLatin1Char('/') + qmakeBuildConfig; + } + + info.executable = QDir::cleanPath(wd + QLatin1Char('/') + info.target); + //qDebug() << "##### updateTarget sets:" << info.workingDir << info.executable; + +#if defined (Q_OS_WIN) + info.executable += QLatin1String(".exe"); +#endif + + qt4Project()->destroyProFileReader(reader); + info.error = Qt4TargetInformation::NoError; + return info; +} + +Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName, QtVersion *qtversion, + QtVersion::QmakeBuildConfigs qmakeBuildConfiguration, + QStringList additionalArguments) +{ + Q_ASSERT(qtversion); + bool debug = qmakeBuildConfiguration & QtVersion::DebugBuild; + + // Add the buildconfiguration + Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(this); + bc->setDisplayName(displayName); + + QMakeStep *qmakeStep = new QMakeStep(bc); + bc->insertBuildStep(0, qmakeStep); + + MakeStep *makeStep = new MakeStep(bc); + bc->insertBuildStep(1, makeStep); + + MakeStep* cleanStep = new MakeStep(bc); + cleanStep->setClean(true); + cleanStep->setUserArguments(QStringList() << "clean"); + bc->insertCleanStep(0, cleanStep); + if (!additionalArguments.isEmpty()) + qmakeStep->setUserArguments(additionalArguments); + + // set some options for qmake and make + if (qmakeBuildConfiguration & QtVersion::BuildAll) // debug_and_release => explicit targets + makeStep->setUserArguments(QStringList() << (debug ? "debug" : "release")); + + bc->setQMakeBuildConfiguration(qmakeBuildConfiguration); + + // Finally set the qt version & ToolChain + bc->setQtVersion(qtversion); + ToolChain::ToolChainType defaultTc = preferredToolChainType(filterToolChainTypes(bc->qtVersion()->possibleToolChainTypes())); + bc->setToolChainType(defaultTc); + addBuildConfiguration(bc); + + return bc; +} + +Qt4BuildConfigurationFactory *Qt4Target::buildConfigurationFactory() const +{ + return m_buildConfigurationFactory; +} + +void Qt4Target::addRunConfigurationForPath(const QString &proFilePath) +{ + if (id() == QLatin1String(DESKTOP_TARGET_ID)) + addRunConfiguration(new Qt4RunConfiguration(this, proFilePath)); + else if (id() == QLatin1String(S60_EMULATOR_TARGET_ID)) + addRunConfiguration(new S60EmulatorRunConfiguration(this, proFilePath)); + else if (id() == QLatin1String(S60_DEVICE_TARGET_ID)) + addRunConfiguration(new S60DeviceRunConfiguration(this, proFilePath)); + else if (id() == QLatin1String(MAEMO_EMULATOR_TARGET_ID) || + id() == QLatin1String(MAEMO_DEVICE_TARGET_ID)) + addRunConfiguration(new MaemoRunConfiguration(this, proFilePath)); +} + +QList<ToolChain::ToolChainType> Qt4Target::filterToolChainTypes(const QList<ToolChain::ToolChainType> &candidates) const +{ + QList<ToolChain::ToolChainType> tmp(candidates); + if (id() == QLatin1String(S60_EMULATOR_TARGET_ID)) { + if (tmp.contains(ToolChain::WINSCW)) + return QList<ToolChain::ToolChainType>() << ToolChain::WINSCW; + else + return QList<ToolChain::ToolChainType>(); + } else if (id() == QLatin1String(S60_DEVICE_TARGET_ID)) { + tmp.removeAll(ToolChain::WINSCW); + return tmp; + } + return tmp; +} + +ToolChain::ToolChainType Qt4Target::preferredToolChainType(const QList<ToolChain::ToolChainType> &candidates) const +{ + ToolChain::ToolChainType preferredType = ToolChain::INVALID; + if (id() == QLatin1String(S60_EMULATOR_TARGET_ID) && + candidates.contains(ToolChain::WINSCW)) + preferredType = ToolChain::WINSCW; + if (!candidates.isEmpty()) + preferredType = candidates.at(0); + return preferredType; +} + +bool Qt4Target::fromMap(const QVariantMap &map) +{ + if (!Target::fromMap(map)) + return false; + + if (displayName().isEmpty()) + setDisplayName(displayNameForId(id())); + if (icon().isNull()) + setIcon(iconForId(id())); + + return true; +} + +void Qt4Target::updateQtVersion() +{ + setEnabled(project()->supportedTargetIds().contains(id())); +} + +void Qt4Target::onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) +{ + Q_ASSERT(bc); + Qt4BuildConfiguration *qt4bc(qobject_cast<Qt4BuildConfiguration *>(bc)); + Q_ASSERT(qt4bc); + connect(qt4bc, SIGNAL(targetInformationChanged()), + this, SLOT(changeTargetInformation())); +} + +void Qt4Target::changeTargetInformation() +{ + ProjectExplorer::BuildConfiguration *bc(qobject_cast<ProjectExplorer::BuildConfiguration *>(sender())); + if (bc && bc == activeBuildConfiguration()) + emit targetInformationChanged(); +} diff --git a/src/plugins/qt4projectmanager/qt4target.h b/src/plugins/qt4projectmanager/qt4target.h new file mode 100644 index 0000000000..9b240e8f03 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt4target.h @@ -0,0 +1,133 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QT4TARGET_H +#define QT4TARGET_H + +#include "qtversionmanager.h" + +#include "qt4buildconfiguration.h" + +#include <projectexplorer/target.h> + +namespace Qt4ProjectManager { + +class Qt4Project; + +namespace Internal { + +const char * const DESKTOP_TARGET_ID("Qt4ProjectManager.Target.DesktopTarget"); +const char * const S60_EMULATOR_TARGET_ID("Qt4ProjectManager.Target.S60EmulatorTarget"); +const char * const S60_DEVICE_TARGET_ID("Qt4ProjectManager.Target.S60DeviceTarget"); +const char * const MAEMO_EMULATOR_TARGET_ID("Qt4ProjectManager.Target.MaemoEmulatorTarget"); +const char * const MAEMO_DEVICE_TARGET_ID("Qt4ProjectManager.Target.MaemoDeviceTarget"); + +class ProFileReader; +class Qt4ProFileNode; +class Qt4TargetFactory; + +struct Qt4TargetInformation +{ + enum ErrorCode { + NoError, + InvalidProjectError, + ProParserError + }; + + ErrorCode error; + QString workingDir; + QString target; + QString executable; +}; + +class Qt4Target : public ProjectExplorer::Target +{ + Q_OBJECT + friend class Qt4TargetFactory; + +public: + Qt4Target(Qt4Project *parent, const QString &id); + virtual ~Qt4Target(); + + Qt4BuildConfiguration *activeBuildConfiguration() const; + Qt4ProjectManager::Qt4Project *qt4Project() const; + + Qt4TargetInformation targetInformation(Internal::Qt4BuildConfiguration *buildConfiguration, + const QString &proFilePath); + + Internal::Qt4BuildConfiguration *addQt4BuildConfiguration(QString displayName, + QtVersion *qtversion, + QtVersion::QmakeBuildConfigs qmakeBuildConfiguration, + QStringList additionalArguments = QStringList()); + void addRunConfigurationForPath(const QString &proFilePath); + + Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const; + + QList<ProjectExplorer::ToolChain::ToolChainType> filterToolChainTypes(const QList<ProjectExplorer::ToolChain::ToolChainType> &candidates) const; + ProjectExplorer::ToolChain::ToolChainType preferredToolChainType(const QList<ProjectExplorer::ToolChain::ToolChainType> &candidates) const; + +signals: + /// convenience signal, emitted if either the active buildconfiguration emits + /// targetInformationChanged() or if the active build configuration changes + void targetInformationChanged(); + +protected: + bool fromMap(const QVariantMap &map); + +private slots: + void updateQtVersion(); + void onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); + void changeTargetInformation(); + +private: + Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory; +}; + +class Qt4TargetFactory : public ProjectExplorer::ITargetFactory +{ + Q_OBJECT + +public: + Qt4TargetFactory(QObject *parent = 0); + ~Qt4TargetFactory(); + + QStringList availableCreationIds(ProjectExplorer::Project *parent) const; + QString displayNameForId(const QString &id) const; + + bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; + Internal::Qt4Target *create(ProjectExplorer::Project *parent, const QString &id); + bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; + Internal::Qt4Target *restore(ProjectExplorer::Project *parent, const QVariantMap &map); +}; + +} // namespace Internal + +} // namespace Qt4ProjectManager + +#endif // QT4TARGET_H diff --git a/src/plugins/qt4projectmanager/qtoptionspage.cpp b/src/plugins/qt4projectmanager/qtoptionspage.cpp index c7f1417292..9fad97c148 100644 --- a/src/plugins/qt4projectmanager/qtoptionspage.cpp +++ b/src/plugins/qt4projectmanager/qtoptionspage.cpp @@ -107,7 +107,7 @@ QString QtOptionsPage::displayCategory() const QWidget *QtOptionsPage::createPage(QWidget *parent) { QtVersionManager *vm = QtVersionManager::instance(); - m_widget = new QtOptionsPageWidget(parent, vm->versions(), vm->defaultVersion()); + m_widget = new QtOptionsPageWidget(parent, vm->versions()); if (m_searchKeywords.isEmpty()) m_searchKeywords = m_widget->searchKeywords(); return m_widget; @@ -122,7 +122,7 @@ void QtOptionsPage::apply() QList<QtVersion *> versions; foreach(const QSharedPointerQtVersion &spv, m_widget->versions()) versions.push_back(new QtVersion(*spv)); - vm->setNewQtVersions(versions, m_widget->defaultVersion()); + vm->setNewQtVersions(versions); } bool QtOptionsPage::matches(const QString &s) const @@ -133,7 +133,7 @@ bool QtOptionsPage::matches(const QString &s) const //----------------------------------------------------- -QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> versions, QtVersion *defaultVersion) +QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> versions) : QWidget(parent) , m_debuggingHelperOkPixmap(QLatin1String(":/extensionsystem/images/ok.png")) , m_debuggingHelperErrorPixmap(QLatin1String(":/extensionsystem/images/error.png")) @@ -142,7 +142,6 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> ver , m_specifyNameString(tr("<specify a name>")) , m_specifyPathString(tr("<specify a qmake location>")) , m_ui(new Internal::Ui::QtVersionManager()) - , m_defaultVersion(versions.indexOf(defaultVersion)) { // Initialize m_versions foreach(QtVersion *version, versions) @@ -182,15 +181,10 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> ver item->setText(1, QDir::toNativeSeparators(version->qmakeCommand())); item->setData(0, Qt::UserRole, version->uniqueId()); - if (version->isValid()) { + if (version->isValid()) item->setData(2, Qt::DecorationRole, version->hasDebuggingHelper() ? m_debuggingHelperOkIcon : m_debuggingHelperErrorIcon); - } else { + else item->setData(2, Qt::DecorationRole, QIcon()); - } - - m_ui->defaultCombo->addItem(version->displayName()); - if (i == m_defaultVersion) - m_ui->defaultCombo->setCurrentIndex(i); } m_ui->qtdirList->expandAll(); @@ -221,9 +215,6 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> ver connect(m_ui->qtdirList, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(versionChanged(QTreeWidgetItem *, QTreeWidgetItem *))); - connect(m_ui->defaultCombo, SIGNAL(currentIndexChanged(int)), - this, SLOT(defaultChanged(int))); - connect(m_ui->msvcComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(msvcVersionChanged())); @@ -356,14 +347,8 @@ void QtOptionsPageWidget::addQtDir() m_ui->nameEdit->setText(newVersion->displayName()); m_ui->qmakePath->setPath(newVersion->qmakeCommand()); - m_ui->defaultCombo->addItem(newVersion->displayName()); m_ui->nameEdit->setFocus(); m_ui->nameEdit->selectAll(); - - if (!m_versions.at(m_defaultVersion)->isValid()) { - m_defaultVersion = m_versions.count() - 1; - m_ui->defaultCombo->setCurrentIndex(m_versions.count() - 1); - } } void QtOptionsPageWidget::removeQtDir() @@ -373,13 +358,6 @@ void QtOptionsPageWidget::removeQtDir() if (index < 0) return; - for (int i = 0; i < m_ui->defaultCombo->count(); ++i) { - if (m_ui->defaultCombo->itemText(i) == item->text(0)) { - m_ui->defaultCombo->removeItem(i); - break; - } - } - delete item; m_versions.removeAt(index); @@ -602,18 +580,6 @@ void QtOptionsPageWidget::onMingwBrowsed() updateState(); } -void QtOptionsPageWidget::defaultChanged(int) -{ - for (int i=0; i<m_ui->defaultCombo->count(); ++i) { - if (m_versions.at(i)->displayName() == m_ui->defaultCombo->currentText()) { - m_defaultVersion = i; - return; - } - } - - m_defaultVersion = 0; -} - void QtOptionsPageWidget::updateCurrentQtName() { QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem(); @@ -623,8 +589,6 @@ void QtOptionsPageWidget::updateCurrentQtName() return; m_versions[currentItemIndex]->setDisplayName(m_ui->nameEdit->text()); currentItem->setText(0, m_versions[currentItemIndex]->displayName()); - - m_ui->defaultCombo->setItemText(currentItemIndex, m_versions[currentItemIndex]->displayName()); } @@ -661,7 +625,6 @@ void QtOptionsPageWidget::fixQtVersionName(int index) // set new name m_versions[index]->setDisplayName(name); treeItemForIndex(index)->setText(0, name); - m_ui->defaultCombo->setItemText(index, name); // Now check again... fixQtVersionName(index); @@ -750,11 +713,6 @@ QList<QSharedPointerQtVersion> QtOptionsPageWidget::versions() const return m_versions; } -int QtOptionsPageWidget::defaultVersion() const -{ - return m_defaultVersion; -} - QString QtOptionsPageWidget::searchKeywords() const { QString rc; diff --git a/src/plugins/qt4projectmanager/qtoptionspage.h b/src/plugins/qt4projectmanager/qtoptionspage.h index 7441437d1f..fb7c5af51c 100644 --- a/src/plugins/qt4projectmanager/qtoptionspage.h +++ b/src/plugins/qt4projectmanager/qtoptionspage.h @@ -76,10 +76,9 @@ class QtOptionsPageWidget : public QWidget Q_OBJECT Q_DISABLE_COPY(QtOptionsPageWidget) public: - QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> versions, QtVersion *defaultVersion); + QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> versions); ~QtOptionsPageWidget(); QList<QSharedPointerQtVersion> versions() const; - int defaultVersion() const; void finish(); QString searchKeywords() const; @@ -115,7 +114,6 @@ private slots: void makeS60Visible(bool visible); void onQtBrowsed(); void onMingwBrowsed(); - void defaultChanged(int index); void updateCurrentQtName(); void updateCurrentQMakeLocation(); void updateCurrentMingwDirectory(); diff --git a/src/plugins/qt4projectmanager/qtuicodemodelsupport.cpp b/src/plugins/qt4projectmanager/qtuicodemodelsupport.cpp index a25d0a0596..173fb9d1a9 100644 --- a/src/plugins/qt4projectmanager/qtuicodemodelsupport.cpp +++ b/src/plugins/qt4projectmanager/qtuicodemodelsupport.cpp @@ -31,6 +31,8 @@ #include "qt4buildconfiguration.h" #include "qt4project.h" +#include "qt4target.h" + #include <designer/formwindoweditor.h> using namespace Qt4ProjectManager; @@ -118,9 +120,9 @@ void Qt4UiCodeModelSupport::setFileName(const QString &name) bool Qt4UiCodeModelSupport::runUic(const QString &ui) const { - Qt4BuildConfiguration *qt4bc = m_project->activeQt4BuildConfiguration(); + Qt4BuildConfiguration *qt4bc = m_project->activeTarget()->activeBuildConfiguration(); QProcess uic; - uic.setEnvironment(m_project->activeBuildConfiguration()->environment().toStringList()); + uic.setEnvironment(qt4bc->environment().toStringList()); uic.start(qt4bc->qtVersion()->uicCommand(), QStringList(), QIODevice::ReadWrite); uic.waitForStarted(); uic.write(ui.toUtf8()); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 9b0b495c68..5d72de30f1 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -30,6 +30,7 @@ #include "qtversionmanager.h" #include "qt4projectmanagerconstants.h" +#include "qt4target.h" #include "profilereader.h" #include "qt-maemo/maemomanager.h" @@ -64,7 +65,6 @@ using namespace Qt4ProjectManager::Internal; using ProjectExplorer::DebuggingHelperLibrary; static const char *QtVersionsSectionName = "QtVersions"; -static const char *defaultQtVersionKey = "DefaultQtVersion"; static const char *newQtVersionsKey = "NewQtVersions"; static const char *PATH_AUTODETECTION_SOURCE = "PATH"; @@ -77,7 +77,6 @@ QtVersionManager::QtVersionManager() { m_self = this; QSettings *s = Core::ICore::instance()->settings(); - m_defaultVersion = s->value(defaultQtVersionKey, 0).toInt(); m_idcount = 1; int size = s->beginReadArray(QtVersionsSectionName); @@ -140,22 +139,6 @@ QtVersionManager::QtVersionManager() updateDocumentation(); - if (m_defaultVersion > m_versions.size() || m_defaultVersion < 0) { - // Invalid default version, correct that... - for(int i = 0; i < m_versions.size(); ++i) { - QtVersion *version = m_versions.at(i); - if (version->isAutodetected() && version->autodetectionSource() == PATH_AUTODETECTION_SOURCE && version->isValid()) { - m_defaultVersion = i; - break; - } - } - } - - if (m_defaultVersion > m_versions.size() || m_defaultVersion < 0) { - // Still invalid? Use the first one - m_defaultVersion = 0; - } - // cannot call from ctor, needs to get connected extenernally first QTimer::singleShot(0, this, SLOT(updateExamples())); } @@ -194,6 +177,33 @@ void QtVersionManager::removeVersion(QtVersion *version) delete version; } +bool QtVersionManager::supportsTargetId(const QString &id) const +{ + foreach (QtVersion *version, m_versions) { + if (version->supportsTargetId(id)) + return true; + } + return false; +} + +QList<QtVersion *> QtVersionManager::versionsForTargetId(const QString &id) const +{ + QList<QtVersion *> targetVersions; + foreach (QtVersion *version, m_versions) { + if (version->supportsTargetId(id)) + targetVersions.append(version); + } + return targetVersions; +} + +QSet<QString> QtVersionManager::supportedTargetIds() const +{ + QSet<QString> results; + foreach (QtVersion *version, m_versions) + results.unite(version->supportedTargetIds()); + return results; +} + void QtVersionManager::updateDocumentation() { Help::HelpManager *helpManager @@ -214,14 +224,13 @@ void QtVersionManager::updateDocumentation() void QtVersionManager::updateExamples() { QList<QtVersion *> versions; - versions.append(defaultVersion()); versions.append(m_versions); QString examplesPath; QString docPath; QString demosPath; QtVersion *version = 0; - // try to find a version which has both, demos and examples, starting with default Qt + // try to find a version which has both, demos and examples foreach (version, versions) { if (version->hasExamples()) examplesPath = version->examplesPath(); @@ -249,7 +258,6 @@ void QtVersionManager::updateUniqueIdToIndexMap() void QtVersionManager::writeVersionsIntoSettings() { QSettings *s = Core::ICore::instance()->settings(); - s->setValue(defaultQtVersionKey, m_defaultVersion); s->beginWriteArray(QtVersionsSectionName); for (int i = 0; i < m_versions.size(); ++i) { const QtVersion *version = m_versions.at(i); @@ -288,10 +296,7 @@ QtVersion *QtVersionManager::version(int id) const if (pos != -1) return m_versions.at(pos); - if (m_defaultVersion < m_versions.count()) - return m_versions.at(m_defaultVersion); - else - return m_emptyVersion; + return m_emptyVersion; } void QtVersionManager::addNewVersionsFromInstaller() @@ -324,7 +329,6 @@ void QtVersionManager::addNewVersionsFromInstaller() newVersionsValue = settings->value(QLatin1String("Installer/")+newQtVersionsKey).toString(); QStringList newVersionsList = newVersionsValue.split(';', QString::SkipEmptyParts); - bool defaultVersionWasReset = false; foreach (const QString &newVersion, newVersionsList) { QStringList newVersionData = newVersion.split('='); if (newVersionData.count() >= 2) { @@ -353,10 +357,6 @@ void QtVersionManager::addNewVersionsFromInstaller() // clean up delete version; } - if (!defaultVersionWasReset) { - m_defaultVersion = versionWasAlreadyInList? m_defaultVersion : m_versions.count() - 1; - defaultVersionWasReset = true; - } } } } @@ -388,16 +388,11 @@ void QtVersionManager::updateSystemVersion() PATH_AUTODETECTION_SOURCE); m_versions.prepend(version); updateUniqueIdToIndexMap(); - if (m_versions.size() > 1) // we had other versions before adding system version - ++m_defaultVersion; } -QtVersion *QtVersionManager::defaultVersion() const +QtVersion *QtVersionManager::emptyVersion() const { - if (m_defaultVersion < m_versions.count()) - return m_versions.at(m_defaultVersion); - else - return m_emptyVersion; + return m_emptyVersion; } class SortByUniqueId @@ -422,7 +417,7 @@ bool QtVersionManager::equals(QtVersion *a, QtVersion *b) return true; } -void QtVersionManager::setNewQtVersions(QList<QtVersion *> newVersions, int newDefaultVersion) +void QtVersionManager::setNewQtVersions(QList<QtVersion *> newVersions) { // We want to preserve the same order as in the settings dialog // so we sort a copy @@ -477,19 +472,11 @@ void QtVersionManager::setNewQtVersions(QList<QtVersion *> newVersions, int newD updateDocumentation(); updateUniqueIdToIndexMap(); - bool emitDefaultChanged = false; - if (m_defaultVersion != newDefaultVersion) { - m_defaultVersion = newDefaultVersion; - emitDefaultChanged = true; - } - updateExamples(); writeVersionsIntoSettings(); if (!changedVersions.isEmpty()) emit qtVersionsChanged(changedVersions); - if (emitDefaultChanged) - emit defaultQtVersionChanged(); } /// @@ -575,7 +562,6 @@ QtVersion::QtVersion() QtVersion::~QtVersion() { - } QString QtVersion::toHtml() const @@ -1091,6 +1077,33 @@ QString QtVersion::linguistCommand() const return m_linguistCommand; } +bool QtVersion::supportsTargetId(const QString &id) const +{ + return supportedTargetIds().contains(id); +} + +QSet<QString> QtVersion::supportedTargetIds() const +{ + QSet<QString> result; + QList<ProjectExplorer::ToolChain::ToolChainType> tcs(possibleToolChainTypes()); + + if (tcs.contains(ProjectExplorer::ToolChain::WINSCW)) + result.insert(QLatin1String(S60_EMULATOR_TARGET_ID)); + if (tcs.contains(ProjectExplorer::ToolChain::RVCT_ARMV5) || + tcs.contains(ProjectExplorer::ToolChain::RVCT_ARMV6) || + tcs.contains(ProjectExplorer::ToolChain::GCCE) || + tcs.contains(ProjectExplorer::ToolChain::GCCE_GNUPOC)) + result.insert(QLatin1String(S60_DEVICE_TARGET_ID)); + if (tcs.contains(ToolChain::GCC_MAEMO)) { + result.insert(QLatin1String(MAEMO_EMULATOR_TARGET_ID)); + result.insert(QLatin1String(MAEMO_DEVICE_TARGET_ID)); + } + // If the version is not for a specific device, then assume desktop + if (result.isEmpty() && !tcs.isEmpty()) + result.insert(QLatin1String(DESKTOP_TARGET_ID)); + return result; +} + QList<QSharedPointer<ProjectExplorer::ToolChain> > QtVersion::toolChains() const { updateToolChainAndMkspec(); @@ -1113,14 +1126,6 @@ QList<ProjectExplorer::ToolChain::ToolChainType> QtVersion::possibleToolChainTyp return types; } -ProjectExplorer::ToolChain::ToolChainType QtVersion::defaultToolchainType() const -{ - const QList<ProjectExplorer::ToolChain::ToolChainType> & list = possibleToolChainTypes(); - if (list.isEmpty()) - return ProjectExplorer::ToolChain::INVALID; - return list.first(); -} - // if none, then it's INVALID everywhere this function is called void QtVersion::updateToolChainAndMkspec() const { @@ -1128,11 +1133,11 @@ void QtVersion::updateToolChainAndMkspec() const if (m_toolChainUpToDate) return; + m_toolChains.clear(); + if (!isValid()) return; - m_toolChains.clear(); - // qDebug()<<"Finding mkspec for"<<qmakeCommand(); // no .qmake.cache so look at the default mkspec @@ -1240,10 +1245,13 @@ void QtVersion::updateToolChainAndMkspec() const makefileGenerator == QLatin1String("SYMBIAN_SBSV2")) { if (S60Manager *s60mgr = S60Manager::instance()) { # ifdef Q_OS_WIN - m_toolChains << ToolChainPtr(s60mgr->createGCCEToolChain(this)) - << ToolChainPtr(s60mgr->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV5)) - << ToolChainPtr(s60mgr->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV6)) - << ToolChainPtr(s60mgr->createWINSCWToolChain(this)); + if (!gcceDirectory().isEmpty()) + m_toolChains << ToolChainPtr(s60mgr->createGCCEToolChain(this)); + if (!qgetenv("RVCT22BIN").isEmpty()) + m_toolChains << ToolChainPtr(s60mgr->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV5)) + << ToolChainPtr(s60mgr->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV6)); + if (!mwcDirectory().isEmpty()) + m_toolChains << ToolChainPtr(s60mgr->createWINSCWToolChain(this)); # else m_toolChains << ToolChainPtr(s60mgr->createGCCE_GnuPocToolChain(this)) << ToolChainPtr(s60mgr->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV6_GNUPOC)); @@ -1303,6 +1311,7 @@ QString QtVersion::mwcDirectory() const void QtVersion::setMwcDirectory(const QString &directory) { m_mwcDirectory = directory; + m_toolChainUpToDate = false; } QString QtVersion::s60SDKDirectory() const { @@ -1312,6 +1321,7 @@ QString QtVersion::s60SDKDirectory() const void QtVersion::setS60SDKDirectory(const QString &directory) { m_s60SDKDirectory = directory; + m_toolChainUpToDate = false; } QString QtVersion::gcceDirectory() const @@ -1322,6 +1332,7 @@ QString QtVersion::gcceDirectory() const void QtVersion::setGcceDirectory(const QString &directory) { m_gcceDirectory = directory; + m_toolChainUpToDate = false; } QString QtVersion::mingwDirectory() const diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index 093448cc1e..5bbaa8e8e4 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -75,8 +75,10 @@ public: QString designerCommand() const; QString linguistCommand() const; + bool supportsTargetId(const QString &id) const; + QSet<QString> supportedTargetIds() const; + QList<ProjectExplorer::ToolChain::ToolChainType> possibleToolChainTypes() const; - ProjectExplorer::ToolChain::ToolChainType defaultToolchainType() const; ProjectExplorer::ToolChain *toolChain(ProjectExplorer::ToolChain::ToolChainType type) const; /// @returns the name of the mkspec, which is generally not enough @@ -123,6 +125,7 @@ public: bool hasDemos() const; QString demosPath() const; + // All valid Ids are >= 0 int uniqueId() const; bool isQt64Bit() const; @@ -197,23 +200,36 @@ public: QtVersionManager(); ~QtVersionManager(); + // This will *always* return at least one (Qt in Path), even if that is + // unconfigured. QList<QtVersion *> versions() const; + // Note: DO NOT STORE THIS POINTER! + // The QtVersionManager will delete it at random times and you will + // need to get a new pointer by calling this method again! QtVersion *version(int id) const; - QtVersion *defaultVersion() const; + QtVersion *emptyVersion() const; QtVersion *qtVersionForQMakeBinary(const QString &qmakePath); + // Used by the projectloadwizard void addVersion(QtVersion *version); void removeVersion(QtVersion *version); + // Target Support: + bool supportsTargetId(const QString &id) const; + // This returns a list of versions that support the target with the given id. + // @return A list of QtVersions that supports a target. This list may be empty! + QList<QtVersion *> versionsForTargetId(const QString &id) const; + QSet<QString> supportedTargetIds() const; + // Static Methods static QPair<QtVersion::QmakeBuildConfigs, QStringList> scanMakeFile(const QString &directory, QtVersion::QmakeBuildConfigs defaultBuildConfig); static QString findQMakeBinaryFromMakefile(const QString &directory); bool isValidId(int id) const; + signals: - void defaultQtVersionChanged(); void qtVersionsChanged(const QList<int> &uniqueIds); void updateExamples(QString, QString, QString); @@ -232,7 +248,7 @@ private: static QtVersion::QmakeBuildConfigs qmakeBuildConfigFromCmdArgs(QList<QMakeAssignment> *assignments, QtVersion::QmakeBuildConfigs defaultBuildConfig); // Used by QtOptionsPage - void setNewQtVersions(QList<QtVersion *> newVersions, int newDefaultVersion); + void setNewQtVersions(QList<QtVersion *> newVersions); // Used by QtVersion int getUniqueId(); void writeVersionsIntoSettings(); @@ -244,7 +260,6 @@ private: void updateUniqueIdToIndexMap(); QtVersion *m_emptyVersion; - int m_defaultVersion; QList<QtVersion *> m_versions; QMap<int, int> m_uniqueIdToIndex; int m_idcount; diff --git a/src/plugins/qt4projectmanager/qtversionmanager.ui b/src/plugins/qt4projectmanager/qtversionmanager.ui index 90cbdd9dfd..4016df1541 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.ui +++ b/src/plugins/qt4projectmanager/qtversionmanager.ui @@ -2,6 +2,14 @@ <ui version="4.0"> <class>Qt4ProjectManager::Internal::QtVersionManager</class> <widget class="QWidget" name="Qt4ProjectManager::Internal::QtVersionManager"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>375</width> + <height>474</height> + </rect> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="versionListGroupBox"> @@ -107,7 +115,7 @@ </widget> </item> <item row="1" column="1"> - <widget class="Utils::PathChooser" name="qmakePath"/> + <widget class="Utils::PathChooser" name="qmakePath" native="true"/> </item> <item row="2" column="0"> <widget class="QLabel" name="mingwLabel"> @@ -117,7 +125,7 @@ </widget> </item> <item row="2" column="1"> - <widget class="Utils::PathChooser" name="mingwPath"/> + <widget class="Utils::PathChooser" name="mingwPath" native="true"/> </item> <item row="3" column="0"> <widget class="QLabel" name="msvcLabel"> @@ -165,7 +173,7 @@ p, li { white-space: pre-wrap; } </widget> </item> <item row="4" column="1"> - <widget class="Utils::PathChooser" name="s60SDKPath"/> + <widget class="Utils::PathChooser" name="s60SDKPath" native="true"/> </item> <item row="5" column="0"> <widget class="QLabel" name="gcceLabel"> @@ -175,7 +183,7 @@ p, li { white-space: pre-wrap; } </widget> </item> <item row="5" column="1"> - <widget class="Utils::PathChooser" name="gccePath"/> + <widget class="Utils::PathChooser" name="gccePath" native="true"/> </item> <item row="6" column="0"> <widget class="QLabel" name="mwcLabel"> @@ -185,7 +193,7 @@ p, li { white-space: pre-wrap; } </widget> </item> <item row="6" column="1"> - <widget class="Utils::PathChooser" name="mwcPath"/> + <widget class="Utils::PathChooser" name="mwcPath" native="true"/> </item> <item row="7" column="0"> <widget class="QLabel" name="debuggingHelperLabel"> @@ -237,27 +245,6 @@ p, li { white-space: pre-wrap; } </layout> </widget> </item> - <item> - <layout class="QFormLayout" name="defaultFormLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="defaultLabel"> - <property name="text"> - <string>Default Qt Version:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QComboBox" name="defaultCombo"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - </layout> - </item> </layout> </widget> <customwidgets> @@ -278,7 +265,6 @@ p, li { white-space: pre-wrap; } <tabstop>msvcComboBox</tabstop> <tabstop>showLogButton</tabstop> <tabstop>rebuildButton</tabstop> - <tabstop>defaultCombo</tabstop> </tabstops> <resources/> <connections/> |