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

345 lines
11 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 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 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
}
BuildConfiguration *Project::activeBuildConfiguration() const
{
return m_activeBuildConfiguration;
}
void Project::setActiveBuildConfiguration(BuildConfiguration *configuration)
{
if (!configuration ||
m_activeBuildConfiguration == configuration ||
!m_buildConfigurations.contains(configuration))
return;
m_activeBuildConfiguration = configuration;
emit activeBuildConfigurationChanged();
}
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;
QVariantMap map(toMap());
for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i)
writer.saveValue(i.key(), i.value());
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));
2008-12-02 12:01:29 +01:00
QVariantMap map(reader.restoreValues());
2008-12-02 12:01:29 +01:00
return fromMap(map);
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
}
QVariantMap Project::toMap() const
2008-12-02 12:01:29 +01:00
{
const QList<BuildConfiguration *> bcs = buildConfigurations();
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());
2008-12-02 12:01:29 +01:00
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());
2008-12-02 12:01:29 +01:00
map.insert(QLatin1String(EDITOR_SETTINGS_KEY), m_editorConfiguration->toMap());
return map;
2008-12-02 12:01:29 +01:00
}
bool Project::fromMap(const QVariantMap &map)
2008-12-02 12:01:29 +01:00
{
if (map.contains(QLatin1String(EDITOR_SETTINGS_KEY))) {
QVariantMap values(map.value(QLatin1String(EDITOR_SETTINGS_KEY)).toMap());
if (!m_editorConfiguration->fromMap(values))
return false;
2008-12-02 12:01:29 +01:00
}
bool ok;
int maxI(map.value(QLatin1String(BC_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;
for (int i = 0; i < maxI; ++i) {
const QString key(QString::fromLatin1(BC_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)
continue;
addBuildConfiguration(bc);
if (i == activeConfiguration)
setActiveBuildConfiguration(bc);
2009-11-30 13:58:06 +01:00
}
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;
2008-12-02 12:01:29 +01:00
break;
}
if (!factory)
return false;
RunConfiguration *rc(factory->restore(this, valueMap));
if (!rc)
return false;
addRunConfiguration(rc);
if (i == activeConfiguration)
setActiveRunConfiguration(rc);
2008-12-02 12:01:29 +01:00
}
if (!activeRunConfiguration() && !m_runConfigurations.isEmpty())
2008-12-02 12:01:29 +01:00
setActiveRunConfiguration(m_runConfigurations.at(0));
return true;
2008-12-02 12:01:29 +01:00
}
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();
}