Files
qt-creator/src/plugins/projectexplorer/project.cpp

544 lines
18 KiB
C++
Raw Normal View History

/**************************************************************************
2008-12-02 12:01:29 +01:00
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2008-12-02 12:01:29 +01:00
**
** Contact: Nokia Corporation (qt-info@nokia.com)
2008-12-02 12:01:29 +01:00
**
** 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
2009-08-14 09:30:56 +02:00
** contact the sales department at http://qt.nokia.com/contact.
2008-12-02 12:01:29 +01:00
**
**************************************************************************/
2008-12-02 16:19:05 +01:00
2008-12-02 12:01:29 +01:00
#include "project.h"
2008-12-02 16:19:05 +01:00
#include "persistentsettings.h"
#include "buildconfiguration.h"
#include "environment.h"
#include "projectnodes.h"
2008-12-02 16:19:05 +01:00
#include "buildstep.h"
2008-12-02 12:01:29 +01:00
#include "projectexplorer.h"
#include "runconfiguration.h"
#include "editorconfiguration.h"
#include <coreplugin/ifile.h>
#include <extensionsystem/pluginmanager.h>
2008-12-09 15:25:01 +01:00
#include <utils/qtcassert.h>
2008-12-02 12:01:29 +01:00
#include <QtCore/QDebug>
2008-12-09 15:25:01 +01:00
#include <QtCore/QTextCodec>
2008-12-02 12:01:29 +01:00
using namespace ProjectExplorer;
using namespace ProjectExplorer::Internal;
2008-12-02 12:01:29 +01:00
Project::Project()
: m_activeRunConfiguration(0),
m_editorConfiguration(new EditorConfiguration())
{
}
Project::~Project()
{
qDeleteAll(m_buildSteps);
qDeleteAll(m_cleanSteps);
qDeleteAll(m_buildConfigurationValues);
2009-10-09 18:46:44 +02:00
qDeleteAll(m_runConfigurations);
delete m_editorConfiguration;
}
2008-12-02 12:01:29 +01:00
void Project::insertBuildStep(int position, BuildStep *step)
{
m_buildSteps.insert(position, step);
// add all BuildConfigurations
foreach (const BuildConfiguration *bc, buildConfigurations())
step->addBuildConfiguration(bc->name());
2008-12-02 12:01:29 +01:00
}
void Project::removeBuildStep(int position)
{
delete m_buildSteps.at(position);
m_buildSteps.removeAt(position);
}
void Project::moveBuildStepUp(int position)
{
BuildStep *bs = m_buildSteps.takeAt(position);
m_buildSteps.insert(position - 1, bs);
}
void Project::insertCleanStep(int position, BuildStep *step)
{
m_cleanSteps.insert(position, step);
// add all BuildConfigurations
foreach (const BuildConfiguration *bc, buildConfigurations())
step->addBuildConfiguration(bc->name());
2008-12-02 12:01:29 +01:00
}
void Project::removeCleanStep(int position)
{
delete m_cleanSteps.at(position);
m_cleanSteps.removeAt(position);
}
void Project::moveCleanStepUp(int position)
{
BuildStep *bs = m_cleanSteps.takeAt(position);
m_cleanSteps.insert(position - 1, bs);
}
QString Project::makeUnique(const QString &preferedName, const QStringList &usedNames)
{
if (!usedNames.contains(preferedName))
return preferedName;
int i = 2;
QString tryName = preferedName + QString::number(i);
while (usedNames.contains(tryName))
tryName = preferedName + QString::number(++i);
return tryName;
}
void Project::addBuildConfiguration(BuildConfiguration *configuration)
2008-12-02 12:01:29 +01:00
{
QStringList buildConfigurationNames;
foreach (const BuildConfiguration *bc, buildConfigurations())
buildConfigurationNames << bc->name();
// Check that the internal name is not taken and use a different one otherwise
QString configurationName = configuration->name();
configurationName = makeUnique(configurationName, buildConfigurationNames);
configuration->setName(configurationName);
// Check that we don't have a configuration with the same displayName
QString configurationDisplayName = configuration->displayName();
QStringList displayNames;
foreach (const BuildConfiguration *bc, m_buildConfigurationValues)
displayNames << bc->displayName();
configurationDisplayName = makeUnique(configurationDisplayName, displayNames);
configuration->setDisplayName(configurationDisplayName);
2008-12-02 12:01:29 +01:00
// add it
m_buildConfigurationValues.push_back(configuration);
2008-12-02 12:01:29 +01:00
// update build steps
2008-12-09 11:07:24 +01:00
for (int i = 0; i != m_buildSteps.size(); ++i)
m_buildSteps.at(i)->addBuildConfiguration(configuration->name());
2008-12-09 11:07:24 +01:00
for (int i = 0; i != m_cleanSteps.size(); ++i)
m_cleanSteps.at(i)->addBuildConfiguration(configuration->name());
emit addedBuildConfiguration(this, configuration->name());
2008-12-02 12:01:29 +01:00
}
void Project::removeBuildConfiguration(BuildConfiguration *configuration)
2008-12-02 12:01:29 +01:00
{
//todo: this might be error prone
if (!m_buildConfigurationValues.contains(configuration))
2008-12-02 12:01:29 +01:00
return;
m_buildConfigurationValues.removeOne(configuration);
2008-12-02 12:01:29 +01:00
2008-12-09 11:07:24 +01:00
for (int i = 0; i != m_buildSteps.size(); ++i)
m_buildSteps.at(i)->removeBuildConfiguration(configuration->name());
2008-12-09 11:07:24 +01:00
for (int i = 0; i != m_cleanSteps.size(); ++i)
m_cleanSteps.at(i)->removeBuildConfiguration(configuration->name());
2008-12-02 12:01:29 +01:00
emit removedBuildConfiguration(this, configuration->name());
delete configuration;
2008-12-02 12:01:29 +01:00
}
void Project::copyBuildConfiguration(const QString &source, const QString &dest)
{
BuildConfiguration *sourceConfiguration = buildConfiguration(source);
if (!sourceConfiguration)
2008-12-02 12:01:29 +01:00
return;
m_buildConfigurationValues.push_back(new BuildConfiguration(dest, sourceConfiguration));
2008-12-02 12:01:29 +01:00
2008-12-09 11:07:24 +01:00
for (int i = 0; i != m_buildSteps.size(); ++i)
2008-12-02 12:01:29 +01:00
m_buildSteps.at(i)->copyBuildConfiguration(source, dest);
2008-12-09 11:07:24 +01:00
for (int i = 0; i != m_cleanSteps.size(); ++i)
2008-12-02 12:01:29 +01:00
m_cleanSteps.at(i)->copyBuildConfiguration(source, dest);
emit addedBuildConfiguration(this, dest);
2008-12-02 12:01:29 +01:00
}
QList<BuildConfiguration *> Project::buildConfigurations() const
2008-12-02 12:01:29 +01:00
{
return m_buildConfigurationValues;
2008-12-02 12:01:29 +01:00
}
2009-05-06 16:33:43 +02:00
bool Project::hasBuildSettings() const
{
return true;
}
2008-12-02 12:01:29 +01:00
QList<BuildStep *> Project::buildSteps() const
{
return m_buildSteps;
}
QList<BuildStep *> Project::cleanSteps() const
{
return m_cleanSteps;
}
void Project::saveSettings()
{
PersistentSettingsWriter writer;
saveSettingsImpl(writer);
writer.save(file()->fileName() + QLatin1String(".user"), "QtCreatorProject");
}
bool Project::restoreSettings()
2008-12-02 12:01:29 +01:00
{
PersistentSettingsReader reader;
reader.load(file()->fileName() + QLatin1String(".user"));
if (!restoreSettingsImpl(reader))
return false;
2008-12-02 12:01:29 +01:00
2009-09-30 18:36:31 +02:00
if (m_activeBuildConfiguration.isEmpty() && !m_buildConfigurationValues.isEmpty())
setActiveBuildConfiguration(m_buildConfigurationValues.at(0));
2008-12-02 12:01:29 +01:00
if (!m_activeRunConfiguration && !m_runConfigurations.isEmpty())
setActiveRunConfiguration(m_runConfigurations.at(0));
return true;
2008-12-02 12:01:29 +01:00
}
QList<BuildConfigWidget*> Project::subConfigWidgets()
2008-12-02 12:01:29 +01:00
{
return QList<BuildConfigWidget*>();
2008-12-02 12:01:29 +01:00
}
void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
{
writer.saveValue("activebuildconfiguration", m_activeBuildConfiguration);
//save m_values
writer.saveValue("project", m_values);
//save buildsettings
QStringList buildConfigurationNames;
foreach (const BuildConfiguration *bc, buildConfigurations()) {
QMap<QString, QVariant> temp = bc->toMap();
writer.saveValue("buildConfiguration-" + bc->name(), temp);
buildConfigurationNames << bc->name();
2008-12-02 12:01:29 +01:00
}
QStringList buildStepNames;
2008-12-09 11:07:24 +01:00
foreach (BuildStep *buildStep, buildSteps())
2008-12-02 12:01:29 +01:00
buildStepNames << buildStep->name();
writer.saveValue("buildsteps", buildStepNames);
QStringList cleanStepNames;
2008-12-09 11:07:24 +01:00
foreach (BuildStep *cleanStep, cleanSteps())
2008-12-02 12:01:29 +01:00
cleanStepNames << cleanStep->name();
writer.saveValue("cleansteps", cleanStepNames);
writer.saveValue("buildconfigurations", buildConfigurationNames );
//save buildstep configuration
int buildstepnr = 0;
2008-12-09 11:07:24 +01:00
foreach (BuildStep *buildStep, buildSteps()) {
QMap<QString, QVariant> buildStepValues;
buildStep->storeIntoMap(buildStepValues);
writer.saveValue("buildstep" + QString().setNum(buildstepnr), buildStepValues);
2008-12-02 12:01:29 +01:00
++buildstepnr;
}
// save each buildstep/buildConfiguration combination
2008-12-09 11:07:24 +01:00
foreach (const QString &buildConfigurationName, buildConfigurationNames) {
2008-12-02 12:01:29 +01:00
buildstepnr = 0;
2008-12-09 11:07:24 +01:00
foreach (BuildStep *buildStep, buildSteps()) {
QMap<QString, QVariant> temp;
buildStep->storeIntoMap(temp);
2008-12-02 12:01:29 +01:00
writer.saveValue("buildconfiguration-" + buildConfigurationName + "-buildstep" + QString().setNum(buildstepnr), temp);
++buildstepnr;
}
}
//save cleansteps buildconfiguration
int cleanstepnr = 0;
2008-12-09 11:07:24 +01:00
foreach (BuildStep *cleanStep, cleanSteps()) {
QMap<QString, QVariant> buildStepValues;
cleanStep->storeIntoMap(buildStepValues);
writer.saveValue("cleanstep" + QString().setNum(cleanstepnr), buildStepValues);
2008-12-02 12:01:29 +01:00
++cleanstepnr;
}
// save each cleanstep/buildConfiguration combination
2008-12-09 11:07:24 +01:00
foreach (const QString &buildConfigurationName, buildConfigurationNames) {
2008-12-02 12:01:29 +01:00
cleanstepnr = 0;
2008-12-09 11:07:24 +01:00
foreach (BuildStep *cleanStep, cleanSteps()) {
QMap<QString, QVariant> temp;
cleanStep->storeIntoMap(temp);
2008-12-02 12:01:29 +01:00
writer.saveValue("buildconfiguration-" + buildConfigurationName + "-cleanstep" + QString().setNum(cleanstepnr), temp);
++cleanstepnr;
}
}
// Running
int i = 0;
int activeId = 0;
foreach (RunConfiguration* rc, m_runConfigurations) {
2008-12-02 12:01:29 +01:00
writer.setPrefix("RunConfiguration" + QString().setNum(i) + "-");
writer.saveValue("type", rc->type());
rc->save(writer);
if (rc == m_activeRunConfiguration)
activeId = i;
++i;
}
writer.setPrefix(QString::null);
writer.saveValue("activeRunConfiguration", activeId);
writer.saveValue("defaultFileEncoding", m_editorConfiguration->defaultTextCodec()->name());
}
bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
2008-12-02 12:01:29 +01:00
{
m_activeBuildConfiguration = reader.restoreValue("activebuildconfiguration").toString();
m_values = reader.restoreValue("project").toMap();
// restoring BuldConfigurations from settings
2008-12-02 12:01:29 +01:00
const QStringList buildConfigurationNames = reader.restoreValue("buildconfigurations").toStringList();
2008-12-09 11:07:24 +01:00
foreach (const QString &buildConfigurationName, buildConfigurationNames) {
BuildConfiguration *bc = new BuildConfiguration(buildConfigurationName);
addBuildConfiguration(bc);
2008-12-02 12:01:29 +01:00
QMap<QString, QVariant> temp =
reader.restoreValue("buildConfiguration-" + buildConfigurationName).toMap();
bc->setValuesFromMap(temp);
2008-12-02 12:01:29 +01:00
}
const QList<IBuildStepFactory *> buildStepFactories =
ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
//Build Settings
2008-12-02 12:01:29 +01:00
QVariant buildStepsVariant = reader.restoreValue("buildsteps");
2008-12-09 11:07:24 +01:00
if (buildStepsVariant.isValid()) {
2008-12-02 12:01:29 +01:00
// restoring BuildSteps from settings
int pos = 0;
QStringList buildStepNames = buildStepsVariant.toStringList();
for (int buildstepnr = 0; buildstepnr < buildStepNames.size(); ++buildstepnr) {
const QString &buildStepName = buildStepNames.at(buildstepnr);
BuildStep *buildStep = 0;
2008-12-09 11:07:24 +01:00
foreach (IBuildStepFactory *factory, buildStepFactories) {
if (factory->canCreate(buildStepName)) {
buildStep = factory->create(this, buildStepName);
2008-12-02 12:01:29 +01:00
insertBuildStep(pos, buildStep);
++pos;
break;
}
}
// Restoring settings
if (buildStep) {
QMap<QString, QVariant> buildStepValues = reader.restoreValue("buildstep" + QString().setNum(buildstepnr)).toMap();
buildStep->restoreFromMap(buildStepValues);
foreach (const QString &buildConfigurationName, buildConfigurationNames) {
//get the buildconfiguration for this build step
QMap<QString, QVariant> buildStepValues =
reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-buildstep" + QString().setNum(buildstepnr)).toMap();
buildStep->restoreFromMap(buildStepValues);
}
}
2008-12-02 12:01:29 +01:00
}
}
2008-12-02 12:01:29 +01:00
QVariant cleanStepsVariant = reader.restoreValue("cleansteps");
if (cleanStepsVariant.isValid()) {
QStringList cleanStepNames = cleanStepsVariant.toStringList();
2008-12-02 12:01:29 +01:00
// restoring BuildSteps from settings
int pos = 0;
for (int cleanstepnr = 0; cleanstepnr < cleanStepNames.size(); ++cleanstepnr) {
const QString &cleanStepName = cleanStepNames.at(cleanstepnr);
BuildStep *cleanStep = 0;
2008-12-09 11:07:24 +01:00
foreach (IBuildStepFactory *factory, buildStepFactories) {
if (factory->canCreate(cleanStepName)) {
cleanStep = factory->create(this, cleanStepName);
2008-12-02 12:01:29 +01:00
insertCleanStep(pos, cleanStep);
++pos;
break;
}
}
// Restoring settings
if (cleanStep) {
QMap<QString, QVariant> buildStepValues = reader.restoreValue("cleanstep" + QString().setNum(cleanstepnr)).toMap();
cleanStep->restoreFromMap(buildStepValues);
foreach (const QString &buildConfigurationName, buildConfigurationNames) {
QMap<QString, QVariant> buildStepValues =
reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-cleanstep" + QString().setNum(cleanstepnr)).toMap();
cleanStep->restoreFromMap(buildStepValues);
}
2008-12-02 12:01:29 +01:00
}
}
}
// Running
const int activeId = reader.restoreValue("activeRunConfiguration").toInt();
int i = 0;
const QList<IRunConfigurationFactory *> factories =
ExtensionSystem::PluginManager::instance()->getObjects<IRunConfigurationFactory>();
forever {
reader.setPrefix("RunConfiguration" + QString().setNum(i) + "-");
const QVariant &typeVariant = reader.restoreValue("type");
if (!typeVariant.isValid())
break;
const QString &type = typeVariant.toString();
2008-12-09 11:07:24 +01:00
foreach (IRunConfigurationFactory *factory, factories) {
if (factory->canRestore(type)) {
RunConfiguration* rc = factory->create(this, type);
2008-12-02 12:01:29 +01:00
rc->restore(reader);
addRunConfiguration(rc);
if (i == activeId)
setActiveRunConfiguration(rc);
}
}
++i;
}
reader.setPrefix(QString::null);
QTextCodec *codec = QTextCodec::codecForName(reader.restoreValue("defaultFileEncoding").toByteArray());
if (codec)
m_editorConfiguration->setDefaultTextCodec(codec);
if (!m_activeRunConfiguration && !m_runConfigurations.isEmpty())
setActiveRunConfiguration(m_runConfigurations.at(0));
return true;
2008-12-02 12:01:29 +01:00
}
void Project::setValue(const QString &name, const QVariant & value)
{
m_values.insert(name, value);
}
QVariant Project::value(const QString &name) const
{
QMap<QString, QVariant>::const_iterator it =
m_values.find(name);
2008-12-09 11:07:24 +01:00
if (it != m_values.constEnd())
2008-12-02 12:01:29 +01:00
return it.value();
else
return QVariant();
}
BuildConfiguration *Project::buildConfiguration(const QString &name) const
2008-12-02 12:01:29 +01:00
{
for (int i = 0; i != m_buildConfigurationValues.size(); ++i)
if (m_buildConfigurationValues.at(i)->name() == name)
return m_buildConfigurationValues.at(i);
return 0;
}
BuildConfiguration *Project::activeBuildConfiguration() const
2008-12-02 12:01:29 +01:00
{
return buildConfiguration(m_activeBuildConfiguration); //TODO
2008-12-02 12:01:29 +01:00
}
void Project::setActiveBuildConfiguration(BuildConfiguration *configuration)
2008-12-02 12:01:29 +01:00
{
if (m_activeBuildConfiguration != configuration->name() && m_buildConfigurationValues.contains(configuration)) {
m_activeBuildConfiguration = configuration->name();
2008-12-02 12:01:29 +01:00
emit activeBuildConfigurationChanged();
}
}
QList<RunConfiguration *> Project::runConfigurations() const
2008-12-02 12:01:29 +01:00
{
return m_runConfigurations;
}
void Project::addRunConfiguration(RunConfiguration* runConfiguration)
2008-12-02 12:01:29 +01:00
{
if (m_runConfigurations.contains(runConfiguration)) {
qWarning()<<"Not adding already existing runConfiguration"<<runConfiguration->name();
return;
}
2008-12-02 12:01:29 +01:00
m_runConfigurations.push_back(runConfiguration);
emit addedRunConfiguration(this, runConfiguration->name());
2008-12-02 12:01:29 +01:00
}
void Project::removeRunConfiguration(RunConfiguration* runConfiguration)
2008-12-02 12:01:29 +01:00
{
if(!m_runConfigurations.contains(runConfiguration)) {
qWarning()<<"Not removing runConfiguration"<<runConfiguration->name()<<"becasue it doesn't exist";
return;
}
2008-12-02 12:01:29 +01:00
if (m_activeRunConfiguration == runConfiguration) {
if (m_runConfigurations.size() <= 1)
setActiveRunConfiguration(0);
else if (m_runConfigurations.at(0) == m_activeRunConfiguration)
setActiveRunConfiguration(m_runConfigurations.at(1));
2008-12-02 12:01:29 +01:00
else
setActiveRunConfiguration(m_runConfigurations.at(0));
}
m_runConfigurations.removeOne(runConfiguration);
emit removedRunConfiguration(this, runConfiguration->name());
2009-10-09 18:46:44 +02:00
delete runConfiguration;
2008-12-02 12:01:29 +01:00
}
RunConfiguration* Project::activeRunConfiguration() const
2008-12-02 12:01:29 +01:00
{
return m_activeRunConfiguration;
}
void Project::setActiveRunConfiguration(RunConfiguration* runConfiguration)
2008-12-02 12:01:29 +01:00
{
if (runConfiguration == m_activeRunConfiguration)
return;
Q_ASSERT(m_runConfigurations.contains(runConfiguration) || runConfiguration == 0);
2008-12-02 12:01:29 +01:00
m_activeRunConfiguration = runConfiguration;
emit activeRunConfigurationChanged();
}
EditorConfiguration *Project::editorConfiguration() const
{
return m_editorConfiguration;
}
void Project::setDisplayNameFor(BuildConfiguration *configuration, const QString &displayName)
2008-12-02 12:01:29 +01:00
{
if (configuration->displayName() == displayName)
return;
QString dn = displayName;
2008-12-02 12:01:29 +01:00
QStringList displayNames;
foreach (BuildConfiguration *bc, m_buildConfigurationValues) {
if (bc != configuration)
displayNames << bc->displayName();
2008-12-02 12:01:29 +01:00
}
dn = makeUnique(displayName, displayNames);
configuration->setDisplayName(displayName);
emit buildConfigurationDisplayNameChanged(configuration->name());
2008-12-02 12:01:29 +01:00
}
QByteArray Project::predefinedMacros(const QString &) const
{
return QByteArray();
}
QStringList Project::includePaths(const QString &) const
{
return QStringList();
}
QStringList Project::frameworkPaths(const QString &) const
{
return QStringList();
}