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

294 lines
8.0 KiB
C++
Raw Normal View History

/**************************************************************************
2008-12-02 12:01:29 +01:00
**
** This file is part of Qt Creator
**
2011-01-11 16:28:15 +01:00
** Copyright (c) 2011 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
**
2010-12-17 16:01:08 +01:00
** No Commercial Usage
**
2010-12-17 16:01:08 +01:00
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** 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.
**
2010-12-17 16:01:08 +01:00
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
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 "editorconfiguration.h"
#include "environment.h"
2008-12-02 12:01:29 +01:00
#include "projectexplorer.h"
#include "projectexplorerconstants.h"
#include "projectnodes.h"
#include "target.h"
#include "userfileaccessor.h"
2008-12-02 12:01:29 +01:00
#include <coreplugin/ifile.h>
#include <extensionsystem/pluginmanager.h>
#include <limits>
2008-12-09 15:25:01 +01:00
#include <utils/qtcassert.h>
2008-12-02 12:01:29 +01:00
namespace {
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
namespace ProjectExplorer {
// -------------------------------------------------------------------------
// Project
// -------------------------------------------------------------------------
class ProjectPrivate {
public:
ProjectPrivate();
QList<Target *> m_targets;
Target *m_activeTarget;
EditorConfiguration *m_editorConfiguration;
};
ProjectPrivate::ProjectPrivate() :
m_activeTarget(0),
m_editorConfiguration(new EditorConfiguration())
2008-12-02 12:01:29 +01:00
{
}
Project::Project() : d(new ProjectPrivate)
{
}
Project::~Project()
{
qDeleteAll(d->m_targets);
delete d->m_editorConfiguration;
}
bool Project::hasActiveBuildSettings() const
{
return activeTarget() &&
activeTarget()->buildConfigurationFactory();
}
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::changeEnvironment()
{
Target *t(qobject_cast<Target *>(sender()));
if (t == activeTarget())
emit environmentChanged();
}
void Project::addTarget(Target *t)
{
QTC_ASSERT(t && !d->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 targetDisplayName = t->displayName();
QStringList displayNames;
foreach (const Target *target, d->m_targets)
displayNames << target->displayName();
targetDisplayName = makeUnique(targetDisplayName, displayNames);
t->setDefaultDisplayName(targetDisplayName);
2008-12-02 12:01:29 +01:00
// add it
d->m_targets.push_back(t);
connect(t, SIGNAL(environmentChanged()),
SLOT(changeEnvironment()));
emit addedTarget(t);
// check activeTarget:
if (activeTarget() == 0)
setActiveTarget(t);
2008-12-02 12:01:29 +01:00
}
void Project::removeTarget(Target *target)
2008-12-02 12:01:29 +01:00
{
QTC_ASSERT(target && d->m_targets.contains(target), return);
2008-12-02 12:01:29 +01:00
emit aboutToRemoveTarget(target);
2008-12-02 12:01:29 +01:00
d->m_targets.removeOne(target);
emit removedTarget(target);
if (target == activeTarget()) {
if (d->m_targets.isEmpty())
setActiveTarget(0);
else
setActiveTarget(d->m_targets.at(0));
}
delete target;
2008-12-02 12:01:29 +01:00
}
QList<Target *> Project::targets() const
2008-12-02 12:01:29 +01:00
{
return d->m_targets;
2008-12-02 12:01:29 +01:00
}
Target *Project::activeTarget() const
{
return d->m_activeTarget;
}
void Project::setActiveTarget(Target *target)
{
if ((!target && !d->m_targets.isEmpty()) ||
(target && d->m_targets.contains(target) && d->m_activeTarget != target)) {
d->m_activeTarget = target;
emit activeTargetChanged(d->m_activeTarget);
emit environmentChanged();
}
}
Target *Project::target(const QString &id) const
2009-05-06 16:33:43 +02:00
{
foreach (Target * target, d->m_targets) {
if (target->id() == id)
return target;
}
return 0;
2009-05-06 16:33:43 +02:00
}
2008-12-02 12:01:29 +01:00
void Project::saveSettings()
{
UserFileAccessor accessor;
accessor.saveSettings(this, toMap());
2008-12-02 12:01:29 +01:00
}
bool Project::restoreSettings()
2008-12-02 12:01:29 +01:00
{
UserFileAccessor accessor;
QVariantMap map(accessor.restoreSettings(this));
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<Target *> ts = targets();
QVariantMap map;
map.insert(QLatin1String(ACTIVE_TARGET_KEY), ts.indexOf(d->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());
2008-12-02 12:01:29 +01:00
map.insert(QLatin1String(EDITOR_SETTINGS_KEY), d->m_editorConfiguration->toMap());
return map;
2008-12-02 12:01:29 +01:00
}
QString Project::projectDirectory() const
{
return projectDirectory(file()->fileName());
}
QString Project::projectDirectory(const QString &proFile)
{
if (proFile.isEmpty())
return QString();
QFileInfo info(proFile);
return info.absoluteDir().path();
}
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());
d->m_editorConfiguration->fromMap(values);
2008-12-02 12:01:29 +01:00
}
bool ok;
int maxI(map.value(QLatin1String(TARGET_COUNT_KEY), 0).toInt(&ok));
if (!ok || maxI < 0)
maxI = 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(TARGET_KEY_PREFIX) + QString::number(i));
if (!map.contains(key)) {
qWarning() << key << "was not found in data.";
return false;
}
QVariantMap targetMap = map.value(key).toMap();
QList<ITargetFactory *> factories =
ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>();
Target *t = 0;
2011-01-17 14:17:32 +01:00
if (target(idFromMap(targetMap))) {
qWarning() << "Duplicated target id found, not restoring second target with id"<<idFromMap(targetMap)<<"(Continuing)";
} else {
foreach (ITargetFactory *factory, factories) {
if (factory->canRestore(this, targetMap)) {
t = factory->restore(this, targetMap);
break;
}
}
if (!t) {
qWarning() << "Restoration of a target failed! (Continuing)";
continue;
}
addTarget(t);
if (i == active)
setActiveTarget(t);
}
2009-11-30 13:58:06 +01:00
}
return true;
2008-12-02 12:01:29 +01:00
}
EditorConfiguration *Project::editorConfiguration() const
{
return d->m_editorConfiguration;
2008-12-02 12:01:29 +01:00
}
QString Project::generatedUiHeader(const QString & /* formFile */) const
{
return QString();
}
} // namespace ProjectExplorer