diff options
author | Tobias Hunger <tobias.hunger@nokia.com> | 2010-02-08 15:50:06 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@nokia.com> | 2010-02-09 16:57:37 +0100 |
commit | d1bdfcc363970eca53077cdab79de2d3cf24218a (patch) | |
tree | 100cc0dc41f660b72277fa018c8a46454d0686b4 /src | |
parent | 8ee2521fe53cec55534b079b0d5b21b6b028676f (diff) | |
download | qt-creator-d1bdfcc363970eca53077cdab79de2d3cf24218a.tar.gz |
Integrate target support
* Ease cross device development by introducing 'targets' which
group build- and runsettings that are valid for this one target
Most of the kudos for the code review go to dt. Con, thorbjorn,
ckandler and others did also review parts of this patch.
Reviewed-by: dt
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/> |