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

318 lines
10 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
namespace {
const char * const PROJECT_FILE_POSTFIX(".user");
const char * const EDITOR_SETTINGS_KEY("ProjectExplorer.Project.EditorSettings");
} // namespace
// -------------------------------------------------------------------------
// Project
// -------------------------------------------------------------------------
Project::Project() :
m_activeBuildConfiguration(0),
m_activeRunConfiguration(0),
m_editorConfiguration(new EditorConfiguration())
2008-12-02 12:01:29 +01:00
{
}
Project::~Project()
{
qDeleteAll(m_buildConfigurations);
2009-10-09 18:46:44 +02:00
qDeleteAll(m_runConfigurations);
delete m_editorConfiguration;
}
QString Project::makeUnique(const QString &preferredName, const QStringList &usedNames)
{
if (!usedNames.contains(preferredName))
return preferredName;
int i = 2;
QString tryName = preferredName + QString::number(i);
while (usedNames.contains(tryName))
tryName = preferredName + QString::number(++i);
return tryName;
}
void Project::addBuildConfiguration(BuildConfiguration *configuration)
2008-12-02 12:01:29 +01:00
{
2010-01-15 11:54:11 +01:00
QTC_ASSERT(configuration && !m_buildConfigurations.contains(configuration), 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 = makeUnique(configurationDisplayName, displayNames);
configuration->setDisplayName(configurationDisplayName);
2008-12-02 12:01:29 +01:00
// add it
m_buildConfigurations.push_back(configuration);
2008-12-02 12:01:29 +01:00
emit addedBuildConfiguration(configuration);
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_buildConfigurations.contains(configuration))
2008-12-02 12:01:29 +01:00
return;
m_buildConfigurations.removeOne(configuration);
2008-12-02 12:01:29 +01:00
emit removedBuildConfiguration(configuration);
delete configuration;
2008-12-02 12:01:29 +01:00
}
QList<BuildConfiguration *> Project::buildConfigurations() const
2008-12-02 12:01:29 +01:00
{
return m_buildConfigurations;
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
void Project::saveSettings()
{
PersistentSettingsWriter writer;
saveSettingsImpl(writer);
writer.save(file()->fileName() + QLatin1String(PROJECT_FILE_POSTFIX), "QtCreatorProject");
2008-12-02 12:01:29 +01:00
}
bool Project::restoreSettings()
2008-12-02 12:01:29 +01:00
{
PersistentSettingsReader reader;
reader.load(file()->fileName() + QLatin1String(PROJECT_FILE_POSTFIX));
if (!restoreSettingsImpl(reader))
return false;
2008-12-02 12:01:29 +01:00
if (!m_activeBuildConfiguration && !m_buildConfigurations.isEmpty())
setActiveBuildConfiguration(m_buildConfigurations.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)
{
const QList<BuildConfiguration *> bcs = buildConfigurations();
2010-01-11 10:22:55 +01:00
// For compatibility with older versions the "name" is saved as a string instead of a number
writer.saveValue("activebuildconfiguration", QString::number(bcs.indexOf(m_activeBuildConfiguration)));
2008-12-02 12:01:29 +01:00
//save buildsettings
QStringList buildConfigurationNames;
for(int i=0; i < bcs.size(); ++i) {
writer.saveValue("buildConfiguration-" + QString::number(i), bcs.at(i)->toMap());
buildConfigurationNames << QString::number(i);
2008-12-02 12:01:29 +01:00
}
writer.saveValue("buildconfigurations", buildConfigurationNames);
2008-12-02 12:01:29 +01:00
// Running
int i = 0;
int activeId = 0;
foreach (RunConfiguration* rc, m_runConfigurations) {
writer.saveValue("RunConfiguration" + QString().setNum(i), rc->toMap());
2008-12-02 12:01:29 +01:00
if (rc == m_activeRunConfiguration)
activeId = i;
++i;
}
writer.setPrefix(QString::null);
writer.saveValue("activeRunConfiguration", activeId);
writer.saveValue(QLatin1String(EDITOR_SETTINGS_KEY), m_editorConfiguration->toMap());
2008-12-02 12:01:29 +01:00
}
bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
2008-12-02 12:01:29 +01:00
{
// 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) {
QVariantMap temp(reader.restoreValue("buildConfiguration-" + buildConfigurationName).toMap());
BuildConfiguration *bc = buildConfigurationFactory()->restore(this, temp);
2009-11-27 12:09:53 +01:00
addBuildConfiguration(bc);
2008-12-02 12:01:29 +01:00
}
2009-11-30 13:58:06 +01:00
{ // Try restoring the active configuration
QString activeConfigurationName = reader.restoreValue("activebuildconfiguration").toString();
int index = buildConfigurationNames.indexOf(activeConfigurationName);
if (index != -1)
m_activeBuildConfiguration = buildConfigurations().at(index);
else if (!buildConfigurations().isEmpty())
m_activeBuildConfiguration = buildConfigurations().at(0);
else
m_activeBuildConfiguration = 0;
}
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 {
QVariantMap values(reader.restoreValue("RunConfiguration" + QString().setNum(i)).toMap());
if (values.isEmpty())
2008-12-02 12:01:29 +01:00
break;
2008-12-09 11:07:24 +01:00
foreach (IRunConfigurationFactory *factory, factories) {
if (factory->canRestore(this, values)) {
RunConfiguration* rc = factory->restore(this, values);
if (!rc)
continue;
2008-12-02 12:01:29 +01:00
addRunConfiguration(rc);
if (i == activeId)
setActiveRunConfiguration(rc);
}
}
++i;
}
if (!activeRunConfiguration() && !m_runConfigurations.isEmpty())
2008-12-02 12:01:29 +01:00
setActiveRunConfiguration(m_runConfigurations.at(0));
QVariantMap tmp = reader.restoreValue(QLatin1String(EDITOR_SETTINGS_KEY)).toMap();
return m_editorConfiguration->fromMap(tmp);
2008-12-02 12:01:29 +01:00
}
BuildConfiguration *Project::activeBuildConfiguration() const
2008-12-02 12:01:29 +01:00
{
return m_activeBuildConfiguration;
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 && m_buildConfigurations.contains(configuration)) {
m_activeBuildConfiguration = configuration;
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
{
2010-01-15 11:54:11 +01:00
QTC_ASSERT(runConfiguration && !m_runConfigurations.contains(runConfiguration), return);
2008-12-02 12:01:29 +01:00
m_runConfigurations.push_back(runConfiguration);
emit addedRunConfiguration(runConfiguration);
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->displayName()<<"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(runConfiguration);
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;
}
QByteArray Project::predefinedMacros(const QString &) const
{
return QByteArray();
}
QStringList Project::includePaths(const QString &) const
{
return QStringList();
}
QStringList Project::frameworkPaths(const QString &) const
{
return QStringList();
}
QString Project::generatedUiHeader(const QString & /* formFile */) const
{
return QString();
}