From 0728e78afb7228460ed440075e05f38fd371c59b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= <thorbjorn.lindeijer@nokia.com> Date: Fri, 16 Jan 2009 16:30:22 +0100 Subject: [PATCH] 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. --- src/plugins/bookmarks/bookmarkmanager.cpp | 2 +- .../cmakeprojectmanager/cmakeproject.cpp | 5 - .../cmakeprojectmanager/cmakeproject.h | 1 - .../projectexplorer/buildparserinterface.h | 2 +- .../projectexplorer/dependenciesdialog.cpp | 245 ------------------ .../projectexplorer/dependenciesdialog.ui | 84 ------ .../projectexplorer/dependenciespanel.cpp | 217 ++++++++++++++++ ...pendenciesdialog.h => dependenciespanel.h} | 38 +-- .../projectexplorer/dependenciespanel.ui | 44 ++++ .../editorsettingspropertiespage.h | 1 - .../projectexplorer/iprojectproperties.h | 4 +- src/plugins/projectexplorer/project.cpp | 20 +- src/plugins/projectexplorer/project.h | 43 +-- .../projectexplorer/projectexplorer.cpp | 24 +- src/plugins/projectexplorer/projectexplorer.h | 2 - .../projectexplorer/projectexplorer.pro | 6 +- src/plugins/projectexplorer/session.cpp | 65 +++-- src/plugins/projectexplorer/session.h | 13 +- src/plugins/qt4projectmanager/qt4project.cpp | 11 - .../qt4projectmanager/qt4projectmanager.cpp | 7 +- 20 files changed, 375 insertions(+), 459 deletions(-) delete mode 100644 src/plugins/projectexplorer/dependenciesdialog.cpp delete mode 100644 src/plugins/projectexplorer/dependenciesdialog.ui create mode 100644 src/plugins/projectexplorer/dependenciespanel.cpp rename src/plugins/projectexplorer/{dependenciesdialog.h => dependenciespanel.h} (73%) create mode 100644 src/plugins/projectexplorer/dependenciespanel.ui diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp index 735afc37989..86b5d889dbd 100644 --- a/src/plugins/bookmarks/bookmarkmanager.cpp +++ b/src/plugins/bookmarks/bookmarkmanager.cpp @@ -563,7 +563,7 @@ TextEditor::ITextEditor *BookmarkManager::currentTextEditor() const } /* Returns the current session. */ -SessionManager* BookmarkManager::sessionManager() const +SessionManager *BookmarkManager::sessionManager() const { ExtensionSystem::PluginManager *pm = m_core->pluginManager(); ProjectExplorerPlugin *pe = pm->getObject<ProjectExplorerPlugin>(); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 0f5029c8eaf..effe432e36a 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -215,11 +215,6 @@ ProjectExplorer::IProjectManager *CMakeProject::projectManager() const return m_manager; } -QList<Core::IFile *> CMakeProject::dependencies() -{ - return QList<Core::IFile *>(); -} - QList<ProjectExplorer::Project *> CMakeProject::dependsOn() { return QList<Project *>(); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index cdabdf1d084..a71ca7c8b00 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -73,7 +73,6 @@ public: virtual Core::IFile *file() const; virtual ProjectExplorer::IProjectManager *projectManager() const; - virtual QList<Core::IFile *> dependencies(); //NBS TODO remove virtual QList<ProjectExplorer::Project *> dependsOn(); //NBS TODO implement dependsOn virtual bool isApplication() const; diff --git a/src/plugins/projectexplorer/buildparserinterface.h b/src/plugins/projectexplorer/buildparserinterface.h index 6dba4dfec00..2857926e18d 100644 --- a/src/plugins/projectexplorer/buildparserinterface.h +++ b/src/plugins/projectexplorer/buildparserinterface.h @@ -66,7 +66,7 @@ class PROJECTEXPLORER_EXPORT IBuildParserFactory Q_OBJECT public: - IBuildParserFactory() {}; + IBuildParserFactory() {} virtual ~IBuildParserFactory(); virtual bool canCreate(const QString & name) const = 0; virtual BuildParserInterface * create(const QString & name) const = 0; diff --git a/src/plugins/projectexplorer/dependenciesdialog.cpp b/src/plugins/projectexplorer/dependenciesdialog.cpp deleted file mode 100644 index 9c78de543ad..00000000000 --- a/src/plugins/projectexplorer/dependenciesdialog.cpp +++ /dev/null @@ -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() -{ -} - -} -} diff --git a/src/plugins/projectexplorer/dependenciesdialog.ui b/src/plugins/projectexplorer/dependenciesdialog.ui deleted file mode 100644 index 31a70dae983..00000000000 --- a/src/plugins/projectexplorer/dependenciesdialog.ui +++ /dev/null @@ -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> diff --git a/src/plugins/projectexplorer/dependenciespanel.cpp b/src/plugins/projectexplorer/dependenciespanel.cpp new file mode 100644 index 00000000000..bc83f7408a4 --- /dev/null +++ b/src/plugins/projectexplorer/dependenciespanel.cpp @@ -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 diff --git a/src/plugins/projectexplorer/dependenciesdialog.h b/src/plugins/projectexplorer/dependenciespanel.h similarity index 73% rename from src/plugins/projectexplorer/dependenciesdialog.h rename to src/plugins/projectexplorer/dependenciespanel.h index 1dd8621a1ed..73c7755620c 100644 --- a/src/plugins/projectexplorer/dependenciesdialog.h +++ b/src/plugins/projectexplorer/dependenciespanel.h @@ -34,9 +34,10 @@ #ifndef DEPENDENCIESDIALOG_H #define DEPENDENCIESDIALOG_H -#include "ui_dependenciesdialog.h" +#include "iprojectproperties.h" +#include "ui_dependenciespanel.h" -#include <QtGui/QDialog> +#include <QtGui/QWidget> namespace ProjectExplorer { @@ -45,27 +46,32 @@ class SessionManager; namespace Internal { -class DependencyModel; +class DependenciesWidget; -// NBS kill DependenciesDialog? -class DependenciesDialog : public QDialog +class DependenciesPanelFactory : public IPanelFactory { - Q_OBJECT public: - typedef QList<ProjectExplorer::Project *> ProjectList; + DependenciesPanelFactory(SessionManager *session); + + bool supports(Project *project); + PropertiesPanel *createPanel(Project *project); + +private: + SessionManager *m_session; +}; - DependenciesDialog(QWidget *parent, SessionManager *sln); - virtual ~DependenciesDialog(); -public slots: - virtual void accept(); - void reset(); +class DependenciesPanel : public PropertiesPanel +{ + Q_OBJECT +public: + DependenciesPanel(SessionManager *session, Project *project); + ~DependenciesPanel(); + QString name() const; + QWidget *widget(); private: - Ui::DependenciesDialog m_ui; - SessionManager *m_sln; - ProjectList m_projectList; - DependencyModel *m_model; + DependenciesWidget *m_widget; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/dependenciespanel.ui b/src/plugins/projectexplorer/dependenciespanel.ui new file mode 100644 index 00000000000..83fc95b1a3b --- /dev/null +++ b/src/plugins/projectexplorer/dependenciespanel.ui @@ -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> diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.h b/src/plugins/projectexplorer/editorsettingspropertiespage.h index 3be9f229c4f..45da4817675 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.h +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.h @@ -73,7 +73,6 @@ private slots: void currentEncodingChanged(int index); private: - Ui::EditorSettingsPropertiesPage m_ui; Project *m_project; QList<QTextCodec *> m_codecs; diff --git a/src/plugins/projectexplorer/iprojectproperties.h b/src/plugins/projectexplorer/iprojectproperties.h index aab3b504331..aa823f49010 100644 --- a/src/plugins/projectexplorer/iprojectproperties.h +++ b/src/plugins/projectexplorer/iprojectproperties.h @@ -39,8 +39,6 @@ #include <coreplugin/icontext.h> -#include <QtGui/QWidget> - namespace ProjectExplorer { class PropertiesPanel; @@ -57,7 +55,7 @@ class PROJECTEXPLORER_EXPORT PropertiesPanel : public Core::IContext { Q_OBJECT public: - virtual void finish() {}; + virtual void finish() {} virtual QString name() const = 0; // IContext diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 3f377b52a11..961ad1a7708 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -46,7 +46,6 @@ #include <QtCore/QTextCodec> using namespace ProjectExplorer; -using ExtensionSystem::PluginManager; Project::Project() : 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) { m_buildSteps.insert(position, step); @@ -508,14 +515,3 @@ void Project::setDisplayNameFor(const QString &buildConfiguration, const QString } emit buildConfigurationDisplayNameChanged(buildConfiguration); } - - -Project::~Project() -{ - qDeleteAll(m_buildSteps); - qDeleteAll(m_cleanSteps); - qDeleteAll(m_buildConfigurationValues); - delete m_editorConfiguration; -} - - diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 2a30a0e20f3..9a8c7bf0cbe 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -31,7 +31,6 @@ ** ***************************************************************************/ - #ifndef PROJECT_H #define PROJECT_H @@ -50,7 +49,7 @@ #include <QtGui/QIcon> namespace Core { - class IFile; +class IFile; } namespace ProjectExplorer { @@ -68,8 +67,7 @@ class PROJECTEXPLORER_EXPORT Project Q_OBJECT public: - // Roles to be implemented by all models that are exported - // via model() + // Roles to be implemented by all models that are exported via model() enum ModelRoles { // Absolute file path FilePathRole = QFileSystemModel::FilePathRole @@ -82,12 +80,11 @@ public: virtual Core::IFile *file() 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 bool isApplication() const = 0; - //Build/Clean Step functions + // Build/Clean Step functions QList<BuildStep *> buildSteps() const; void insertBuildStep(int position, BuildStep *step); void removeBuildStep(int position); @@ -97,7 +94,7 @@ public: void insertCleanStep(int position, BuildStep *step); void removeCleanStep(int position); - //Build configuration + // Build configuration void addBuildConfiguration(const QString &name); void removeBuildConfiguration(const QString &name); void copyBuildConfiguration(const QString &source, const QString &dest); @@ -133,8 +130,9 @@ public: virtual BuildStepConfigWidget *createConfigWidget() = 0; virtual QList<BuildStepConfigWidget*> subConfigWidgets(); - // This method is called for new build configurations - // You should probably set some default values in this method + /* This method is called for new build configurations. You should probably + * set some default values in this method. + */ virtual void newBuildConfiguration(const QString &buildConfiguration) = 0; virtual ProjectNode *rootProjectNode() const = 0; @@ -150,19 +148,22 @@ signals: void buildConfigurationDisplayNameChanged(const QString &buildConfiguraiton); protected: - // This method is called when the project .user file is saved. - // Simply call writer.saveValue() for each value you want to save - // Make sure to always call your base class implementation - // Note: All the values from the project/buildsteps and buildconfigurations - // are automatically stored. + /* This method is called when the project .user file is saved. Simply call + * writer.saveValue() for each value you want to save. Make sure to always + * call your base class implementation. + * + * Note: All the values from the project/buildsteps and buildconfigurations + * are automatically stored. + */ 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 - // You should probably add some default build and run settings to the project - // so that it can be build and run + /* 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. 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); private: @@ -181,4 +182,4 @@ private: } // namespace ProjectExplorer -#endif // PROJECTINTERFACE_H +#endif // PROJECT_H diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 5e41913db02..20e4e15fc8a 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -34,12 +34,13 @@ #include "applicationrunconfiguration.h" #include "allprojectsfilter.h" #include "allprojectsfind.h" -#include "currentprojectfind.h" #include "buildmanager.h" #include "buildsettingspropertiespage.h" -#include "editorsettingspropertiespage.h" +#include "currentprojectfind.h" #include "currentprojectfilter.h" #include "customexecutablerunconfiguration.h" +#include "editorsettingspropertiespage.h" +#include "dependenciespanel.h" #include "foldernavigationwidget.h" #include "iprojectmanager.h" #include "metatypedeclarations.h" @@ -215,6 +216,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin addAutoReleasedObject(new BuildSettingsPanelFactory); addAutoReleasedObject(new RunSettingsPanelFactory); addAutoReleasedObject(new EditorSettingsPanelFactory); + addAutoReleasedObject(new DependenciesPanelFactory(m_session)); ProcessStepFactory *processStepFactory = new ProcessStepFactory; addAutoReleasedObject(processStepFactory); @@ -485,11 +487,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin mbuild->addAction(cmd, Constants::G_BUILD_SESSION); 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 m_buildAction = new QAction(tr("Build Project"), this); 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_cancelBuildAction, SIGNAL(triggered()), this, SLOT(cancelBuild())); 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_clearSession, SIGNAL(triggered()), this, SLOT(clearSession())); connect(m_taskAction, SIGNAL(triggered()), this, SLOT(goToTaskWindow())); @@ -701,7 +697,7 @@ void ProjectExplorerPlugin::unloadProject() QList<Core::IFile*> filesToSave; 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 int readonlycount = 0; @@ -1203,13 +1199,13 @@ void ProjectExplorerPlugin::updateActions() m_rebuildSessionAction->setEnabled(hasProjects && !building); m_cleanSessionAction->setEnabled(hasProjects && !building); m_cancelBuildAction->setEnabled(building); - m_dependenciesAction->setEnabled(hasProjects && !building); updateRunAction(); updateTaskActions(); } + // NBS TODO check projectOrder() // what we want here is all the projects pro depends on QStringList ProjectExplorerPlugin::allFilesWithDependencies(Project *pro) @@ -1467,14 +1463,6 @@ void ProjectExplorerPlugin::cancelBuild() m_buildManager->cancel(); } -void ProjectExplorerPlugin::editDependencies() -{ - if (debug) - qDebug() << "ProjectExplorerPlugin::editDependencies"; - - m_session->editDependencies(); -} - void ProjectExplorerPlugin::addToRecentProjects(const QString &fileName) { if (debug) diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index ff58e7ba8c6..94e25159928 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -138,7 +138,6 @@ private slots: void cleanSession(); void cancelBuild(); void debugProject(); - void editDependencies(); void loadAction(); void unloadProject(); void clearSession(); @@ -228,7 +227,6 @@ private: QAction *m_runActionContextMenu; QAction *m_cancelBuildAction; QAction *m_debugAction; - QAction *m_dependenciesAction; QAction *m_taskAction; QAction *m_addNewFileAction; QAction *m_addExistingFilesAction; diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index bbb8a4c74d9..e345ff1c1ce 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -15,7 +15,7 @@ HEADERS += projectexplorer.h \ persistentsettings.h \ projectfilewizardextension.h \ session.h \ - dependenciesdialog.h \ + dependenciespanel.h \ allprojectsfilter.h \ buildparserinterface.h \ projectexplorerconstants.h \ @@ -62,7 +62,7 @@ SOURCES += projectexplorer.cpp \ persistentsettings.cpp \ projectfilewizardextension.cpp \ session.cpp \ - dependenciesdialog.cpp \ + dependenciespanel.cpp \ allprojectsfilter.cpp \ currentprojectfilter.cpp \ scriptwrappers.cpp \ @@ -94,7 +94,7 @@ SOURCES += projectexplorer.cpp \ nodesvisitor.cpp \ projectmodels.cpp \ currentprojectfind.cpp -FORMS += dependenciesdialog.ui \ +FORMS += dependenciespanel.ui \ buildsettingspropertiespage.ui \ processstep.ui \ editorsettingspropertiespage.ui \ diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index ef848ff178b..f5b83d162cd 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -33,7 +33,6 @@ #include "session.h" -#include "dependenciesdialog.h" #include "project.h" #include "projectexplorer.h" #include "projectexplorerconstants.h" @@ -59,6 +58,7 @@ #include <QtCore/QFuture> #include <QtCore/QSettings> +#include <QtGui/QApplication> #include <QtGui/QMainWindow> #include <QtGui/QMessageBox> @@ -118,7 +118,6 @@ private: using namespace ProjectExplorer; using Internal::SessionFile; -using Internal::DependenciesDialog; void SessionFile::sessionLoadingProgress() @@ -452,7 +451,28 @@ bool SessionManager::recursiveDependencyCheck(const QString &newDep, const QStri 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 &depName = depProject->file()->fileName(); @@ -461,7 +481,7 @@ bool SessionManager::hasDependency(Project *project, Project *depProject) const 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 &checkDep = depProject->file()->fileName(); @@ -469,7 +489,7 @@ bool SessionManager::canAddDependency(Project *project, Project *depProject) con 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 &depName = depProject->file()->fileName(); @@ -487,6 +507,20 @@ bool SessionManager::addDependency(Project *project, Project *depProject) 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) { if (debug) @@ -505,21 +539,6 @@ Project *SessionManager::startupProject() const 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) { addProjects(QList<Project*>() << project); @@ -702,12 +721,6 @@ bool SessionManager::clear() return success; } -void SessionManager::editDependencies() -{ - DependenciesDialog dlg(0, this); - dlg.exec(); -} - const QList<Project *> &SessionManager::projects() const { return m_file->m_projects; diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index 49d15b7e8df..f8768ab468b 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -123,16 +123,13 @@ public: void removeProject(Project *project); void removeProjects(QList<Project *> remove); - void editDependencies(); void setStartupProject(Project *startupProject); - // NBS think about dependency management again. - // Probably kill these here - bool canAddDependency(Project *project, Project *depProject) const; - bool hasDependency(Project *project, Project *depProject) const; - // adds the 'requiredProject' as a dependency to 'project' - bool addDependency(Project *project, Project *depProject); - void removeDependency(Project *project, Project *depProject); + QList<Project *> dependencies(const Project *project) const; + bool hasDependency(const Project *project, const Project *depProject) const; + bool canAddDependency(const Project *project, const Project *depProject) const; + bool addDependency(const Project *project, const Project *depProject); + void removeDependency(const Project *project, const Project *depProject); Core::IFile *file() const; Project *startupProject() const; diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 611d4930b40..cb5d99a642b 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -569,17 +569,6 @@ QStringList Qt4Project::files(FilesMode fileMode) const 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() { // NBS implement dependsOn diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp index 792ae2aed45..c589d2eb865 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp @@ -74,7 +74,12 @@ using ProjectExplorer::ResourceType; using ProjectExplorer::UnknownFileType; // 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) : m_mimeType(QLatin1String(Qt4ProjectManager::Constants::PROFILE_MIMETYPE)), -- GitLab