Reintroduced a way to edit project dependencies

Dependencies between projects can now be edited in the Projects mode.
You can simply check for each project the projects that it depends on,
and they will be built first. A message box pops up when you try to
create a circular dependency.

Could use some testing.
This commit is contained in:
Thorbjørn Lindeijer
2009-01-16 16:30:22 +01:00
parent d78d5f564e
commit 0728e78afb
20 changed files with 376 additions and 460 deletions

View File

@@ -215,11 +215,6 @@ ProjectExplorer::IProjectManager *CMakeProject::projectManager() const
return m_manager; return m_manager;
} }
QList<Core::IFile *> CMakeProject::dependencies()
{
return QList<Core::IFile *>();
}
QList<ProjectExplorer::Project *> CMakeProject::dependsOn() QList<ProjectExplorer::Project *> CMakeProject::dependsOn()
{ {
return QList<Project *>(); return QList<Project *>();

View File

@@ -73,7 +73,6 @@ public:
virtual Core::IFile *file() const; virtual Core::IFile *file() const;
virtual ProjectExplorer::IProjectManager *projectManager() const; virtual ProjectExplorer::IProjectManager *projectManager() const;
virtual QList<Core::IFile *> dependencies(); //NBS TODO remove
virtual QList<ProjectExplorer::Project *> dependsOn(); //NBS TODO implement dependsOn virtual QList<ProjectExplorer::Project *> dependsOn(); //NBS TODO implement dependsOn
virtual bool isApplication() const; virtual bool isApplication() const;

View File

@@ -66,7 +66,7 @@ class PROJECTEXPLORER_EXPORT IBuildParserFactory
Q_OBJECT Q_OBJECT
public: public:
IBuildParserFactory() {}; IBuildParserFactory() {}
virtual ~IBuildParserFactory(); virtual ~IBuildParserFactory();
virtual bool canCreate(const QString & name) const = 0; virtual bool canCreate(const QString & name) const = 0;
virtual BuildParserInterface * create(const QString & name) const = 0; virtual BuildParserInterface * create(const QString & name) const = 0;

View File

@@ -1,245 +0,0 @@
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
#include "dependenciesdialog.h"
#include "project.h"
#include "session.h"
#include <QtCore/QVector>
#include <QtCore/QDebug>
#include <QtCore/QAbstractTableModel>
#include <QtGui/QPushButton>
#include <QtGui/QHeaderView>
namespace ProjectExplorer {
namespace Internal {
// ------ DependencyModel
class DependencyModel : public QAbstractTableModel {
public:
typedef ProjectExplorer::Project Project;
typedef DependenciesDialog::ProjectList ProjectList;
DependencyModel(SessionManager *sln, const ProjectList &projectList, QObject * parent = 0);
virtual int rowCount(const QModelIndex&) const { return m_projects.size(); }
virtual int columnCount(const QModelIndex&) const { return m_projects.size(); }
virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
virtual Qt::ItemFlags flags ( const QModelIndex & index ) const;
QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
// Apply changed items
unsigned apply(SessionManager *sln) const;
void resetDependencies();
private:
struct Entry {
Entry(SessionManager *sln, Project *rootProject, Project *dependentProject);
Entry() : m_dependentProject(0), m_dependent(false), m_defaultValue(false), m_canAddDependency(false) {}
Project* m_dependentProject;
bool m_dependent;
bool m_defaultValue;
bool m_canAddDependency;
};
// column
typedef QVector<Entry> ProjectDependencies;
typedef QList<ProjectDependencies> Projects;
Projects m_projects;
ProjectList m_projectList;
};
DependencyModel::Entry::Entry(SessionManager *sln,
Project *rootProject,
Project *dependentProject) :
m_dependentProject(dependentProject),
m_dependent(sln->hasDependency(rootProject, dependentProject)),
m_defaultValue(m_dependent),
m_canAddDependency(sln->canAddDependency(rootProject, dependentProject))
{
}
DependencyModel::DependencyModel(SessionManager *sln,
const ProjectList &projectList,
QObject * parent) :
QAbstractTableModel(parent),
m_projectList(projectList)
{
const int count = projectList.size();
for (int p = 0; p < count; p++) {
Project *rootProject = projectList.at(p);
ProjectDependencies dependencies;
dependencies.reserve(count);
for (int d = 0; d < count ; d++)
dependencies.push_back(p == d ? Entry() : Entry(sln, rootProject, projectList.at(d)));
m_projects += dependencies;
}
}
QVariant DependencyModel::data ( const QModelIndex & index, int role ) const
{
static const QVariant empty = QVariant(QString());
// TO DO: find a checked icon
static const QVariant checked = QVariant(QString(QLatin1Char('x')));
const int p = index.column();
const int d = index.row();
switch (role) {
case Qt::EditRole:
return QVariant(m_projects[p][d].m_dependent);
case Qt::DisplayRole:
return m_projects[p][d].m_dependent ? checked : empty;
default:
break;
}
return QVariant();
}
bool DependencyModel::setData ( const QModelIndex & index, const QVariant & value, int role)
{
switch (role) {
case Qt::EditRole: {
const int p = index.column();
const int d = index.row();
if (d == p)
return false;
Entry &e(m_projects[p][d]);
e.m_dependent = value.toBool();
emit dataChanged(index, index);
}
return true;
default:
break;
}
return false;
}
Qt::ItemFlags DependencyModel::flags ( const QModelIndex & index ) const
{
const int p = index.column();
const int d = index.row();
if (d == p)
return 0;
const Entry &e(m_projects[p][d]);
Qt::ItemFlags rc = Qt::ItemIsEnabled|Qt::ItemIsUserCheckable | Qt::ItemIsSelectable;
if (e.m_canAddDependency)
rc |= Qt::ItemIsEditable;
return rc;
}
QVariant DependencyModel::headerData ( int section, Qt::Orientation , int role ) const
{
switch (role) {
case Qt::DisplayRole:
return QVariant(m_projectList.at(section)->name());
default:
break;
}
return QVariant();
}
void DependencyModel::resetDependencies()
{
if (const int count = m_projectList.size()) {
for (int p = 0; p < count; p++)
for (int d = 0; d < count; d++)
m_projects[p][d].m_dependent = false;
reset();
}
}
unsigned DependencyModel::apply(SessionManager *sln) const
{
unsigned rc = 0;
const int count = m_projectList.size();
for (int p = 0; p < count; p++) {
Project *rootProject = m_projectList.at(p);
for (int d = 0; d < count; d++) {
if (d != p) {
const Entry &e(m_projects[p][d]);
if (e.m_dependent != e. m_defaultValue) {
rc++;
if (e.m_dependent) {
sln->addDependency(rootProject, e.m_dependentProject);
} else {
sln->removeDependency(rootProject, e.m_dependentProject);
}
}
}
}
}
return rc;
}
// ------ DependenciesDialog
DependenciesDialog::DependenciesDialog(QWidget *parent, SessionManager *sln) :
QDialog(parent),
m_sln(sln),
m_projectList(m_sln->projects()),
m_model(new DependencyModel(sln, m_projectList))
{
m_ui.setupUi(this);
m_ui.buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
QPushButton *resetButton = m_ui.buttonBox->addButton (QDialogButtonBox::Reset);
connect(resetButton, SIGNAL(clicked()), this, SLOT(reset()));
m_ui.dependencyTable->setModel(m_model);
}
void DependenciesDialog::accept()
{
m_model->apply(m_sln);
QDialog::accept();
}
void DependenciesDialog::reset()
{
m_model->resetDependencies();
}
DependenciesDialog::~DependenciesDialog()
{
}
}
}

View File

@@ -1,84 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ProjectExplorer::Internal::DependenciesDialog</class>
<widget class="QDialog" name="ProjectExplorer::Internal::DependenciesDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>492</width>
<height>435</height>
</rect>
</property>
<property name="windowTitle">
<string>Project Dependencies</string>
</property>
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>9</number>
</property>
<item>
<widget class="QTableView" name="dependencyTable">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<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::DependenciesDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>142</x>
<y>285</y>
</hint>
<hint type="destinationlabel">
<x>142</x>
<y>155</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ProjectExplorer::Internal::DependenciesDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>142</x>
<y>285</y>
</hint>
<hint type="destinationlabel">
<x>142</x>
<y>155</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -0,0 +1,217 @@
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
#include "dependenciespanel.h"
#include "project.h"
#include "session.h"
#include <coreplugin/fileiconprovider.h>
#include <QtCore/QVector>
#include <QtCore/QDebug>
#include <QtCore/QAbstractListModel>
#include <QtGui/QHeaderView>
#include <QtGui/QMessageBox>
#include <QtGui/QPushButton>
namespace ProjectExplorer {
namespace Internal {
///
/// DependenciesModel
///
class DependenciesModel : public QAbstractListModel
{
public:
DependenciesModel(SessionManager *session, Project *project, QObject *parent = 0);
int rowCount(const QModelIndex &index) const;
int columnCount(const QModelIndex &index) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
Qt::ItemFlags flags(const QModelIndex &index) const;
private:
SessionManager *m_session;
Project *m_project;
QList<Project *> m_projects;
};
DependenciesModel::DependenciesModel(SessionManager *session,
Project *project,
QObject *parent)
: QAbstractListModel(parent)
, m_session(session)
, m_project(project)
, m_projects(session->projects())
{
// We can't select ourselves as a dependency
m_projects.removeAll(m_project);
}
int DependenciesModel::rowCount(const QModelIndex &index) const
{
return index.isValid() ? 0 : m_projects.size();
}
int DependenciesModel::columnCount(const QModelIndex &index) const
{
return index.isValid() ? 0 : 1;
}
QVariant DependenciesModel::data(const QModelIndex &index, int role) const
{
const Project *p = m_projects.at(index.row());
switch (role) {
case Qt::DisplayRole:
return p->name();
case Qt::CheckStateRole:
return m_session->hasDependency(m_project, p) ? Qt::Checked : Qt::Unchecked;
case Qt::DecorationRole:
return Core::FileIconProvider::instance()->icon(QFileInfo(p->file()->fileName()));
default:
return QVariant();
}
}
bool DependenciesModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
qDebug() << index << value << role << value.toBool();
if (role == Qt::CheckStateRole) {
const Project *p = m_projects.at(index.row());
const Qt::CheckState c = static_cast<Qt::CheckState>(value.toInt());
if (c == Qt::Checked) {
if (m_session->addDependency(m_project, p)) {
emit dataChanged(index, index);
return true;
} else {
QMessageBox::warning(0, tr("Unable to add dependency"),
tr("This would create a circular dependency."));
}
} else if (c == Qt::Unchecked) {
if (m_session->hasDependency(m_project, p)) {
m_session->removeDependency(m_project, p);
emit dataChanged(index, index);
return true;
}
}
}
return false;
}
Qt::ItemFlags DependenciesModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags rc = QAbstractListModel::flags(index);
if (index.column() == 0)
rc |= Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
return rc;
}
///
/// DependenciesWidget
///
class DependenciesWidget : public QWidget
{
public:
DependenciesWidget(SessionManager *session, Project *project,
QWidget *parent = 0);
private:
Ui::DependenciesWidget m_ui;
SessionManager *m_session;
DependenciesModel *m_model;
};
DependenciesWidget::DependenciesWidget(SessionManager *session,
Project *project,
QWidget *parent)
: QWidget(parent)
, m_session(session)
, m_model(new DependenciesModel(session, project, this))
{
m_ui.setupUi(this);
m_ui.dependenciesView->setModel(m_model);
m_ui.dependenciesView->setHeaderHidden(true);
}
///
/// DependenciesPanel
///
DependenciesPanel::DependenciesPanel(SessionManager *session, Project *project)
: PropertiesPanel()
, m_widget(new DependenciesWidget(session, project))
{
}
DependenciesPanel::~DependenciesPanel()
{
delete m_widget;
}
QString DependenciesPanel::name() const
{
return tr("Dependencies");
}
QWidget *DependenciesPanel::widget()
{
return m_widget;
}
///
/// DependenciesPanelFactory
///
DependenciesPanelFactory::DependenciesPanelFactory(SessionManager *session)
: m_session(session)
{
}
bool DependenciesPanelFactory::supports(Project * /* project */)
{
return true;
}
PropertiesPanel *DependenciesPanelFactory::createPanel(Project *project)
{
return new DependenciesPanel(m_session, project);
}
} // namespace Internal
} // namespace ProjectExplorer

View File

@@ -34,9 +34,10 @@
#ifndef DEPENDENCIESDIALOG_H #ifndef DEPENDENCIESDIALOG_H
#define DEPENDENCIESDIALOG_H #define DEPENDENCIESDIALOG_H
#include "ui_dependenciesdialog.h" #include "iprojectproperties.h"
#include "ui_dependenciespanel.h"
#include <QtGui/QDialog> #include <QtGui/QWidget>
namespace ProjectExplorer { namespace ProjectExplorer {
@@ -45,27 +46,32 @@ class SessionManager;
namespace Internal { namespace Internal {
class DependencyModel; class DependenciesWidget;
// NBS kill DependenciesDialog? class DependenciesPanelFactory : public IPanelFactory
class DependenciesDialog : public QDialog {
public:
DependenciesPanelFactory(SessionManager *session);
bool supports(Project *project);
PropertiesPanel *createPanel(Project *project);
private:
SessionManager *m_session;
};
class DependenciesPanel : public PropertiesPanel
{ {
Q_OBJECT Q_OBJECT
public: public:
typedef QList<ProjectExplorer::Project *> ProjectList; DependenciesPanel(SessionManager *session, Project *project);
~DependenciesPanel();
DependenciesDialog(QWidget *parent, SessionManager *sln); QString name() const;
virtual ~DependenciesDialog(); QWidget *widget();
public slots:
virtual void accept();
void reset();
private: private:
Ui::DependenciesDialog m_ui; DependenciesWidget *m_widget;
SessionManager *m_sln;
ProjectList m_projectList;
DependencyModel *m_model;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ProjectExplorer::Internal::DependenciesWidget</class>
<widget class="QWidget" name="ProjectExplorer::Internal::DependenciesWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>502</width>
<height>375</height>
</rect>
</property>
<property name="windowTitle">
<string>Project Dependencies</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QTreeView" name="dependenciesView"/>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Project Dependencies:</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -73,7 +73,6 @@ private slots:
void currentEncodingChanged(int index); void currentEncodingChanged(int index);
private: private:
Ui::EditorSettingsPropertiesPage m_ui; Ui::EditorSettingsPropertiesPage m_ui;
Project *m_project; Project *m_project;
QList<QTextCodec *> m_codecs; QList<QTextCodec *> m_codecs;

View File

@@ -39,8 +39,6 @@
#include <coreplugin/icontext.h> #include <coreplugin/icontext.h>
#include <QtGui/QWidget>
namespace ProjectExplorer { namespace ProjectExplorer {
class PropertiesPanel; class PropertiesPanel;
@@ -57,7 +55,7 @@ class PROJECTEXPLORER_EXPORT PropertiesPanel : public Core::IContext
{ {
Q_OBJECT Q_OBJECT
public: public:
virtual void finish() {}; virtual void finish() {}
virtual QString name() const = 0; virtual QString name() const = 0;
// IContext // IContext

View File

@@ -46,7 +46,6 @@
#include <QtCore/QTextCodec> #include <QtCore/QTextCodec>
using namespace ProjectExplorer; using namespace ProjectExplorer;
using ExtensionSystem::PluginManager;
Project::Project() Project::Project()
: m_activeRunConfiguration(0), : m_activeRunConfiguration(0),
@@ -54,6 +53,14 @@ Project::Project()
{ {
} }
Project::~Project()
{
qDeleteAll(m_buildSteps);
qDeleteAll(m_cleanSteps);
qDeleteAll(m_buildConfigurationValues);
delete m_editorConfiguration;
}
void Project::insertBuildStep(int position, BuildStep *step) void Project::insertBuildStep(int position, BuildStep *step)
{ {
m_buildSteps.insert(position, step); m_buildSteps.insert(position, step);
@@ -508,14 +515,3 @@ void Project::setDisplayNameFor(const QString &buildConfiguration, const QString
} }
emit buildConfigurationDisplayNameChanged(buildConfiguration); emit buildConfigurationDisplayNameChanged(buildConfiguration);
} }
Project::~Project()
{
qDeleteAll(m_buildSteps);
qDeleteAll(m_cleanSteps);
qDeleteAll(m_buildConfigurationValues);
delete m_editorConfiguration;
}

View File

@@ -31,7 +31,6 @@
** **
***************************************************************************/ ***************************************************************************/
#ifndef PROJECT_H #ifndef PROJECT_H
#define PROJECT_H #define PROJECT_H
@@ -68,8 +67,7 @@ class PROJECTEXPLORER_EXPORT Project
Q_OBJECT Q_OBJECT
public: public:
// Roles to be implemented by all models that are exported // Roles to be implemented by all models that are exported via model()
// via model()
enum ModelRoles { enum ModelRoles {
// Absolute file path // Absolute file path
FilePathRole = QFileSystemModel::FilePathRole FilePathRole = QFileSystemModel::FilePathRole
@@ -82,7 +80,6 @@ public:
virtual Core::IFile *file() const = 0; virtual Core::IFile *file() const = 0;
virtual IProjectManager *projectManager() const = 0; virtual IProjectManager *projectManager() const = 0;
virtual QList<Core::IFile *> dependencies() = 0; //NBS TODO remove
virtual QList<Project *> dependsOn() = 0; //NBS TODO implement dependsOn virtual QList<Project *> dependsOn() = 0; //NBS TODO implement dependsOn
virtual bool isApplication() const = 0; virtual bool isApplication() const = 0;
@@ -133,8 +130,9 @@ public:
virtual BuildStepConfigWidget *createConfigWidget() = 0; virtual BuildStepConfigWidget *createConfigWidget() = 0;
virtual QList<BuildStepConfigWidget*> subConfigWidgets(); virtual QList<BuildStepConfigWidget*> subConfigWidgets();
// This method is called for new build configurations /* This method is called for new build configurations. You should probably
// You should probably set some default values in this method * set some default values in this method.
*/
virtual void newBuildConfiguration(const QString &buildConfiguration) = 0; virtual void newBuildConfiguration(const QString &buildConfiguration) = 0;
virtual ProjectNode *rootProjectNode() const = 0; virtual ProjectNode *rootProjectNode() const = 0;
@@ -150,19 +148,22 @@ signals:
void buildConfigurationDisplayNameChanged(const QString &buildConfiguraiton); void buildConfigurationDisplayNameChanged(const QString &buildConfiguraiton);
protected: protected:
// This method is called when the project .user file is saved. /* This method is called when the project .user file is saved. Simply call
// Simply call writer.saveValue() for each value you want to save * writer.saveValue() for each value you want to save. Make sure to always
// Make sure to always call your base class implementation * call your base class implementation.
// Note: All the values from the project/buildsteps and buildconfigurations *
// are automatically stored. * Note: All the values from the project/buildsteps and buildconfigurations
* are automatically stored.
*/
virtual void saveSettingsImpl(PersistentSettingsWriter &writer); virtual void saveSettingsImpl(PersistentSettingsWriter &writer);
// This method is called when the project is opened
// You can retrieve all the values you saved in saveSettingsImpl()
// in this method.
// Note: This function is also called if there is no .user file /* This method is called when the project is opened. You can retrieve all
// You should probably add some default build and run settings to the project * the values you saved in saveSettingsImpl() in this method.
// so that it can be build and run *
* Note: This function is also called if there is no .user file. You should
* probably add some default build and run settings to the project so that
* it can be build and run.
*/
virtual void restoreSettingsImpl(PersistentSettingsReader &reader); virtual void restoreSettingsImpl(PersistentSettingsReader &reader);
private: private:
@@ -181,4 +182,4 @@ private:
} // namespace ProjectExplorer } // namespace ProjectExplorer
#endif // PROJECTINTERFACE_H #endif // PROJECT_H

View File

@@ -34,12 +34,13 @@
#include "applicationrunconfiguration.h" #include "applicationrunconfiguration.h"
#include "allprojectsfilter.h" #include "allprojectsfilter.h"
#include "allprojectsfind.h" #include "allprojectsfind.h"
#include "currentprojectfind.h"
#include "buildmanager.h" #include "buildmanager.h"
#include "buildsettingspropertiespage.h" #include "buildsettingspropertiespage.h"
#include "editorsettingspropertiespage.h" #include "currentprojectfind.h"
#include "currentprojectfilter.h" #include "currentprojectfilter.h"
#include "customexecutablerunconfiguration.h" #include "customexecutablerunconfiguration.h"
#include "editorsettingspropertiespage.h"
#include "dependenciespanel.h"
#include "foldernavigationwidget.h" #include "foldernavigationwidget.h"
#include "iprojectmanager.h" #include "iprojectmanager.h"
#include "metatypedeclarations.h" #include "metatypedeclarations.h"
@@ -215,6 +216,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin
addAutoReleasedObject(new BuildSettingsPanelFactory); addAutoReleasedObject(new BuildSettingsPanelFactory);
addAutoReleasedObject(new RunSettingsPanelFactory); addAutoReleasedObject(new RunSettingsPanelFactory);
addAutoReleasedObject(new EditorSettingsPanelFactory); addAutoReleasedObject(new EditorSettingsPanelFactory);
addAutoReleasedObject(new DependenciesPanelFactory(m_session));
ProcessStepFactory *processStepFactory = new ProcessStepFactory; ProcessStepFactory *processStepFactory = new ProcessStepFactory;
addAutoReleasedObject(processStepFactory); addAutoReleasedObject(processStepFactory);
@@ -485,11 +487,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin
mbuild->addAction(cmd, Constants::G_BUILD_SESSION); mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD); msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD);
// dependencies action
m_dependenciesAction = new QAction(tr("Edit Dependencies..."), this);
cmd = am->registerAction(m_dependenciesAction, Constants::DEPENDENCIES, globalcontext);
mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
// build action // build action
m_buildAction = new QAction(tr("Build Project"), this); m_buildAction = new QAction(tr("Build Project"), this);
cmd = am->registerAction(m_buildAction, Constants::BUILD, globalcontext); cmd = am->registerAction(m_buildAction, Constants::BUILD, globalcontext);
@@ -622,7 +619,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin
connect(m_runActionContextMenu, SIGNAL(triggered()), this, SLOT(runProjectContextMenu())); connect(m_runActionContextMenu, SIGNAL(triggered()), this, SLOT(runProjectContextMenu()));
connect(m_cancelBuildAction, SIGNAL(triggered()), this, SLOT(cancelBuild())); connect(m_cancelBuildAction, SIGNAL(triggered()), this, SLOT(cancelBuild()));
connect(m_debugAction, SIGNAL(triggered()), this, SLOT(debugProject())); connect(m_debugAction, SIGNAL(triggered()), this, SLOT(debugProject()));
connect(m_dependenciesAction, SIGNAL(triggered()), this, SLOT(editDependencies()));
connect(m_unloadAction, SIGNAL(triggered()), this, SLOT(unloadProject())); connect(m_unloadAction, SIGNAL(triggered()), this, SLOT(unloadProject()));
connect(m_clearSession, SIGNAL(triggered()), this, SLOT(clearSession())); connect(m_clearSession, SIGNAL(triggered()), this, SLOT(clearSession()));
connect(m_taskAction, SIGNAL(triggered()), this, SLOT(goToTaskWindow())); connect(m_taskAction, SIGNAL(triggered()), this, SLOT(goToTaskWindow()));
@@ -701,7 +697,7 @@ void ProjectExplorerPlugin::unloadProject()
QList<Core::IFile*> filesToSave; QList<Core::IFile*> filesToSave;
filesToSave << fi; filesToSave << fi;
filesToSave << m_currentProject->dependencies(); // FIXME: What we want here is to check whether we need to safe any of the pro/pri files in this project
// check the number of modified files // check the number of modified files
int readonlycount = 0; int readonlycount = 0;
@@ -1203,13 +1199,13 @@ void ProjectExplorerPlugin::updateActions()
m_rebuildSessionAction->setEnabled(hasProjects && !building); m_rebuildSessionAction->setEnabled(hasProjects && !building);
m_cleanSessionAction->setEnabled(hasProjects && !building); m_cleanSessionAction->setEnabled(hasProjects && !building);
m_cancelBuildAction->setEnabled(building); m_cancelBuildAction->setEnabled(building);
m_dependenciesAction->setEnabled(hasProjects && !building);
updateRunAction(); updateRunAction();
updateTaskActions(); updateTaskActions();
} }
// NBS TODO check projectOrder() // NBS TODO check projectOrder()
// what we want here is all the projects pro depends on // what we want here is all the projects pro depends on
QStringList ProjectExplorerPlugin::allFilesWithDependencies(Project *pro) QStringList ProjectExplorerPlugin::allFilesWithDependencies(Project *pro)
@@ -1467,14 +1463,6 @@ void ProjectExplorerPlugin::cancelBuild()
m_buildManager->cancel(); m_buildManager->cancel();
} }
void ProjectExplorerPlugin::editDependencies()
{
if (debug)
qDebug() << "ProjectExplorerPlugin::editDependencies";
m_session->editDependencies();
}
void ProjectExplorerPlugin::addToRecentProjects(const QString &fileName) void ProjectExplorerPlugin::addToRecentProjects(const QString &fileName)
{ {
if (debug) if (debug)

View File

@@ -138,7 +138,6 @@ private slots:
void cleanSession(); void cleanSession();
void cancelBuild(); void cancelBuild();
void debugProject(); void debugProject();
void editDependencies();
void loadAction(); void loadAction();
void unloadProject(); void unloadProject();
void clearSession(); void clearSession();
@@ -228,7 +227,6 @@ private:
QAction *m_runActionContextMenu; QAction *m_runActionContextMenu;
QAction *m_cancelBuildAction; QAction *m_cancelBuildAction;
QAction *m_debugAction; QAction *m_debugAction;
QAction *m_dependenciesAction;
QAction *m_taskAction; QAction *m_taskAction;
QAction *m_addNewFileAction; QAction *m_addNewFileAction;
QAction *m_addExistingFilesAction; QAction *m_addExistingFilesAction;

View File

@@ -15,7 +15,7 @@ HEADERS += projectexplorer.h \
persistentsettings.h \ persistentsettings.h \
projectfilewizardextension.h \ projectfilewizardextension.h \
session.h \ session.h \
dependenciesdialog.h \ dependenciespanel.h \
allprojectsfilter.h \ allprojectsfilter.h \
buildparserinterface.h \ buildparserinterface.h \
projectexplorerconstants.h \ projectexplorerconstants.h \
@@ -62,7 +62,7 @@ SOURCES += projectexplorer.cpp \
persistentsettings.cpp \ persistentsettings.cpp \
projectfilewizardextension.cpp \ projectfilewizardextension.cpp \
session.cpp \ session.cpp \
dependenciesdialog.cpp \ dependenciespanel.cpp \
allprojectsfilter.cpp \ allprojectsfilter.cpp \
currentprojectfilter.cpp \ currentprojectfilter.cpp \
scriptwrappers.cpp \ scriptwrappers.cpp \
@@ -94,7 +94,7 @@ SOURCES += projectexplorer.cpp \
nodesvisitor.cpp \ nodesvisitor.cpp \
projectmodels.cpp \ projectmodels.cpp \
currentprojectfind.cpp currentprojectfind.cpp
FORMS += dependenciesdialog.ui \ FORMS += dependenciespanel.ui \
buildsettingspropertiespage.ui \ buildsettingspropertiespage.ui \
processstep.ui \ processstep.ui \
editorsettingspropertiespage.ui \ editorsettingspropertiespage.ui \

View File

@@ -33,7 +33,6 @@
#include "session.h" #include "session.h"
#include "dependenciesdialog.h"
#include "project.h" #include "project.h"
#include "projectexplorer.h" #include "projectexplorer.h"
#include "projectexplorerconstants.h" #include "projectexplorerconstants.h"
@@ -59,6 +58,7 @@
#include <QtCore/QFuture> #include <QtCore/QFuture>
#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QtGui/QApplication>
#include <QtGui/QMainWindow> #include <QtGui/QMainWindow>
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
@@ -118,7 +118,6 @@ private:
using namespace ProjectExplorer; using namespace ProjectExplorer;
using Internal::SessionFile; using Internal::SessionFile;
using Internal::DependenciesDialog;
void SessionFile::sessionLoadingProgress() void SessionFile::sessionLoadingProgress()
@@ -452,7 +451,28 @@ bool SessionManager::recursiveDependencyCheck(const QString &newDep, const QStri
return true; return true;
} }
bool SessionManager::hasDependency(Project *project, Project *depProject) const /*
* TODO: The dependency management exposes an interface based on projects, but
* is internally purely string based. This is suboptimal. Probably it would be
* nicer to map the filenames to projects on load and only map it back to
* filenames when saving.
*/
QList<Project *> SessionManager::dependencies(const Project *project) const
{
const QString &proName = project->file()->fileName();
const QStringList &proDeps = m_file->m_depMap.value(proName);
QList<Project *> projects;
foreach (const QString &dep, proDeps) {
if (Project *pro = projectForFile(dep))
projects += pro;
}
return projects;
}
bool SessionManager::hasDependency(const Project *project, const Project *depProject) const
{ {
const QString &proName = project->file()->fileName(); const QString &proName = project->file()->fileName();
const QString &depName = depProject->file()->fileName(); const QString &depName = depProject->file()->fileName();
@@ -461,7 +481,7 @@ bool SessionManager::hasDependency(Project *project, Project *depProject) const
return proDeps.contains(depName); return proDeps.contains(depName);
} }
bool SessionManager::canAddDependency(Project *project, Project *depProject) const bool SessionManager::canAddDependency(const Project *project, const Project *depProject) const
{ {
const QString &newDep = project->file()->fileName(); const QString &newDep = project->file()->fileName();
const QString &checkDep = depProject->file()->fileName(); const QString &checkDep = depProject->file()->fileName();
@@ -469,7 +489,7 @@ bool SessionManager::canAddDependency(Project *project, Project *depProject) con
return recursiveDependencyCheck(newDep, checkDep); return recursiveDependencyCheck(newDep, checkDep);
} }
bool SessionManager::addDependency(Project *project, Project *depProject) bool SessionManager::addDependency(const Project *project, const Project *depProject)
{ {
const QString &proName = project->file()->fileName(); const QString &proName = project->file()->fileName();
const QString &depName = depProject->file()->fileName(); const QString &depName = depProject->file()->fileName();
@@ -487,6 +507,20 @@ bool SessionManager::addDependency(Project *project, Project *depProject)
return true; return true;
} }
void SessionManager::removeDependency(const Project *project, const Project *depProject)
{
const QString &proName = project->file()->fileName();
const QString &depName = depProject->file()->fileName();
QStringList proDeps = m_file->m_depMap.value(proName);
proDeps.removeAll(depName);
if (proDeps.isEmpty()) {
m_file->m_depMap.remove(proName);
} else {
m_file->m_depMap[proName] = proDeps;
}
}
void SessionManager::setStartupProject(Project *startupProject) void SessionManager::setStartupProject(Project *startupProject)
{ {
if (debug) if (debug)
@@ -505,21 +539,6 @@ Project *SessionManager::startupProject() const
return m_file->m_startupProject; return m_file->m_startupProject;
} }
void SessionManager::removeDependency(Project *project,
Project *depProject)
{
const QString &proName = project->file()->fileName();
const QString &depName = depProject->file()->fileName();
QStringList proDeps = m_file->m_depMap.value(proName);
proDeps.removeAll(depName);
if (proDeps.isEmpty()) {
m_file->m_depMap.remove(proName);
} else {
m_file->m_depMap[proName] = proDeps;
}
}
void SessionManager::addProject(Project *project) void SessionManager::addProject(Project *project)
{ {
addProjects(QList<Project*>() << project); addProjects(QList<Project*>() << project);
@@ -702,12 +721,6 @@ bool SessionManager::clear()
return success; return success;
} }
void SessionManager::editDependencies()
{
DependenciesDialog dlg(0, this);
dlg.exec();
}
const QList<Project *> &SessionManager::projects() const const QList<Project *> &SessionManager::projects() const
{ {
return m_file->m_projects; return m_file->m_projects;

View File

@@ -123,16 +123,13 @@ public:
void removeProject(Project *project); void removeProject(Project *project);
void removeProjects(QList<Project *> remove); void removeProjects(QList<Project *> remove);
void editDependencies();
void setStartupProject(Project *startupProject); void setStartupProject(Project *startupProject);
// NBS think about dependency management again. QList<Project *> dependencies(const Project *project) const;
// Probably kill these here bool hasDependency(const Project *project, const Project *depProject) const;
bool canAddDependency(Project *project, Project *depProject) const; bool canAddDependency(const Project *project, const Project *depProject) const;
bool hasDependency(Project *project, Project *depProject) const; bool addDependency(const Project *project, const Project *depProject);
// adds the 'requiredProject' as a dependency to 'project' void removeDependency(const Project *project, const Project *depProject);
bool addDependency(Project *project, Project *depProject);
void removeDependency(Project *project, Project *depProject);
Core::IFile *file() const; Core::IFile *file() const;
Project *startupProject() const; Project *startupProject() const;

View File

@@ -569,17 +569,6 @@ QStringList Qt4Project::files(FilesMode fileMode) const
return files; return files;
} }
QList<Core::IFile *> Qt4Project::dependencies()
{
QList<Core::IFile *> result;
// TODO profile cache is no longer
// ProFileCache *cache = m_manager->proFileCache();
// foreach (const QString &file, cache->dependencies(m_rootProjectNode)) {
// result << cache->fileInterface(file);
// }
return result;
}
QList<ProjectExplorer::Project*> Qt4Project::dependsOn() QList<ProjectExplorer::Project*> Qt4Project::dependsOn()
{ {
// NBS implement dependsOn // NBS implement dependsOn

View File

@@ -74,7 +74,12 @@ using ProjectExplorer::ResourceType;
using ProjectExplorer::UnknownFileType; using ProjectExplorer::UnknownFileType;
// Known file types of a Qt 4 project // Known file types of a Qt 4 project
static const char* qt4FileTypes[] = {"CppHeaderFiles", "CppSourceFiles", "Qt4FormFiles", "Qt4ResourceFiles" }; static const char* qt4FileTypes[] = {
"CppHeaderFiles",
"CppSourceFiles",
"Qt4FormFiles",
"Qt4ResourceFiles"
};
Qt4Manager::Qt4Manager(Qt4ProjectManagerPlugin *plugin, Core::ICore *core) : Qt4Manager::Qt4Manager(Qt4ProjectManagerPlugin *plugin, Core::ICore *core) :
m_mimeType(QLatin1String(Qt4ProjectManager::Constants::PROFILE_MIMETYPE)), m_mimeType(QLatin1String(Qt4ProjectManager::Constants::PROFILE_MIMETYPE)),