summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp67
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h23
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.cpp180
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.h22
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro2
-rw-r--r--src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp71
-rw-r--r--src/plugins/cmakeprojectmanager/cmakerunconfiguration.h30
-rw-r--r--src/plugins/cmakeprojectmanager/cmaketarget.cpp204
-rw-r--r--src/plugins/cmakeprojectmanager/cmaketarget.h93
-rw-r--r--src/plugins/cmakeprojectmanager/makestep.cpp7
-rw-r--r--src/plugins/debugger/debuggerrunner.cpp5
-rw-r--r--src/plugins/genericprojectmanager/genericbuildconfiguration.cpp53
-rw-r--r--src/plugins/genericprojectmanager/genericbuildconfiguration.h24
-rw-r--r--src/plugins/genericprojectmanager/genericmakestep.cpp11
-rw-r--r--src/plugins/genericprojectmanager/genericproject.cpp35
-rw-r--r--src/plugins/genericprojectmanager/genericproject.h39
-rw-r--r--src/plugins/genericprojectmanager/genericprojectmanager.pro2
-rw-r--r--src/plugins/genericprojectmanager/generictarget.cpp175
-rw-r--r--src/plugins/genericprojectmanager/generictarget.h97
-rw-r--r--src/plugins/projectexplorer/abstractprocessstep.cpp3
-rw-r--r--src/plugins/projectexplorer/addtargetdialog.cpp71
-rw-r--r--src/plugins/projectexplorer/addtargetdialog.h64
-rw-r--r--src/plugins/projectexplorer/addtargetdialog.ui77
-rw-r--r--src/plugins/projectexplorer/applicationrunconfiguration.cpp8
-rw-r--r--src/plugins/projectexplorer/applicationrunconfiguration.h4
-rw-r--r--src/plugins/projectexplorer/buildconfiguration.cpp53
-rw-r--r--src/plugins/projectexplorer/buildconfiguration.h27
-rw-r--r--src/plugins/projectexplorer/buildmanager.cpp19
-rw-r--r--src/plugins/projectexplorer/buildsettingspropertiespage.cpp139
-rw-r--r--src/plugins/projectexplorer/buildsettingspropertiespage.h13
-rw-r--r--src/plugins/projectexplorer/buildstep.h8
-rw-r--r--src/plugins/projectexplorer/buildstepspage.cpp4
-rw-r--r--src/plugins/projectexplorer/buildstepspage.h6
-rw-r--r--src/plugins/projectexplorer/customexecutablerunconfiguration.cpp40
-rw-r--r--src/plugins/projectexplorer/customexecutablerunconfiguration.h21
-rw-r--r--src/plugins/projectexplorer/dependenciespanel.cpp20
-rw-r--r--src/plugins/projectexplorer/dependenciespanel.h5
-rw-r--r--src/plugins/projectexplorer/editorsettingspropertiespage.cpp20
-rw-r--r--src/plugins/projectexplorer/editorsettingspropertiespage.h5
-rw-r--r--src/plugins/projectexplorer/iprojectproperties.h17
-rw-r--r--src/plugins/projectexplorer/miniprojecttargetselector.cpp381
-rw-r--r--src/plugins/projectexplorer/miniprojecttargetselector.h78
-rw-r--r--src/plugins/projectexplorer/project.cpp280
-rw-r--r--src/plugins/projectexplorer/project.h84
-rw-r--r--src/plugins/projectexplorer/projectexplorer.cpp88
-rw-r--r--src/plugins/projectexplorer/projectexplorer.h2
-rw-r--r--src/plugins/projectexplorer/projectexplorer.pro20
-rw-r--r--src/plugins/projectexplorer/projectexplorerconstants.h3
-rw-r--r--src/plugins/projectexplorer/projectwindow.cpp105
-rw-r--r--src/plugins/projectexplorer/projectwindow.h6
-rw-r--r--src/plugins/projectexplorer/runconfiguration.cpp140
-rw-r--r--src/plugins/projectexplorer/runconfiguration.h51
-rw-r--r--src/plugins/projectexplorer/runsettingspropertiespage.cpp57
-rw-r--r--src/plugins/projectexplorer/runsettingspropertiespage.h11
-rw-r--r--src/plugins/projectexplorer/target.cpp321
-rw-r--r--src/plugins/projectexplorer/target.h154
-rw-r--r--src/plugins/projectexplorer/targetselector.cpp56
-rw-r--r--src/plugins/projectexplorer/targetselector.h4
-rw-r--r--src/plugins/projectexplorer/targetsettingspanel.cpp272
-rw-r--r--src/plugins/projectexplorer/targetsettingspanel.h104
-rw-r--r--src/plugins/projectexplorer/targetsettingswidget.cpp15
-rw-r--r--src/plugins/projectexplorer/targetsettingswidget.h3
-rw-r--r--src/plugins/projectexplorer/targetsettingswidget.ui7
-rw-r--r--src/plugins/projectexplorer/userfileaccessor.cpp176
-rw-r--r--src/plugins/qmlinspector/qmlinspectormode.cpp3
-rw-r--r--src/plugins/qmlprojectmanager/qmlproject.cpp80
-rw-r--r--src/plugins/qmlprojectmanager/qmlproject.h57
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectconstants.h1
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectmanager.pro6
-rw-r--r--src/plugins/qmlprojectmanager/qmltarget.cpp151
-rw-r--r--src/plugins/qmlprojectmanager/qmltarget.h86
-rw-r--r--src/plugins/qt4projectmanager/externaleditors.cpp8
-rw-r--r--src/plugins/qt4projectmanager/makestep.cpp3
-rw-r--r--src/plugins/qt4projectmanager/projectloadwizard.cpp65
-rw-r--r--src/plugins/qt4projectmanager/qmakestep.cpp15
-rw-r--r--src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp3
-rw-r--r--src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp172
-rw-r--r--src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h31
-rw-r--r--src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp78
-rw-r--r--src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h22
-rw-r--r--src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp77
-rw-r--r--src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h21
-rw-r--r--src/plugins/qt4projectmanager/qt-s60/s60manager.cpp5
-rw-r--r--src/plugins/qt4projectmanager/qt4buildconfiguration.cpp182
-rw-r--r--src/plugins/qt4projectmanager/qt4buildconfiguration.h43
-rw-r--r--src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp10
-rw-r--r--src/plugins/qt4projectmanager/qt4nodes.cpp3
-rw-r--r--src/plugins/qt4projectmanager/qt4project.cpp357
-rw-r--r--src/plugins/qt4projectmanager/qt4project.h48
-rw-r--r--src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp79
-rw-r--r--src/plugins/qt4projectmanager/qt4projectmanager.cpp13
-rw-r--r--src/plugins/qt4projectmanager/qt4projectmanager.pro2
-rw-r--r--src/plugins/qt4projectmanager/qt4runconfiguration.cpp85
-rw-r--r--src/plugins/qt4projectmanager/qt4runconfiguration.h21
-rw-r--r--src/plugins/qt4projectmanager/qt4target.cpp398
-rw-r--r--src/plugins/qt4projectmanager/qt4target.h133
-rw-r--r--src/plugins/qt4projectmanager/qtoptionspage.cpp52
-rw-r--r--src/plugins/qt4projectmanager/qtoptionspage.h4
-rw-r--r--src/plugins/qt4projectmanager/qtuicodemodelsupport.cpp6
-rw-r--r--src/plugins/qt4projectmanager/qtversionmanager.cpp133
-rw-r--r--src/plugins/qt4projectmanager/qtversionmanager.h25
-rw-r--r--src/plugins/qt4projectmanager/qtversionmanager.ui40
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/>