diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2017-12-04 13:53:38 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2017-12-12 13:44:09 +0000 |
commit | 7c35a3810023b7cb02550ef3ef6af62826545827 (patch) | |
tree | 1524096544cf17b5b9e4de35693bf26d0ee44398 | |
parent | 34b8ed14842ab360604e8d30993772fe474d22d6 (diff) |
Session: Move all functionality related to Nodes into ProjectTree
Do no longer expose Nodes from the SessionManager's API. These are now
exclusively handled by the ProjectTree.
Change-Id: I585c2ac919462073870363436e767640775d9045
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
16 files changed, 78 insertions, 83 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp index 7f33bdd20f..2a5cf769a8 100644 --- a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp +++ b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp @@ -31,13 +31,12 @@ #include "cmakekitinformation.h" #include <texteditor/codeassist/assistinterface.h> -#include <projectexplorer/projecttree.h> -#include <projectexplorer/project.h> #include <projectexplorer/kit.h> +#include <projectexplorer/project.h> +#include <projectexplorer/session.h> #include <projectexplorer/target.h> #include <coreplugin/editormanager/editormanager.h> -#include <projectexplorer/session.h> using namespace CMakeProjectManager::Internal; using namespace TextEditor; diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index 777b7fce2b..d2ae4e9f43 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -36,7 +36,7 @@ #include <coreplugin/progressmanager/progressmanager.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectnodes.h> -#include <projectexplorer/session.h> +#include <projectexplorer/projecttree.h> #include <texteditor/basefilefind.h> #include <utils/algorithm.h> @@ -560,7 +560,7 @@ static void displayResults(SearchResult *search, QFutureWatcher<CPlusPlus::Usage if (Utils::contains(parameters.filesToRename, Utils::equal(&Node::filePath, result.path))) continue; - Node *node = SessionManager::nodeForFile(result.path); + Node *node = ProjectTree::nodeForFile(result.path); if (!node) // Not part of any project continue; diff --git a/src/plugins/designer/codemodelhelpers.cpp b/src/plugins/designer/codemodelhelpers.cpp index 82bb28383d..b0b575f2cb 100644 --- a/src/plugins/designer/codemodelhelpers.cpp +++ b/src/plugins/designer/codemodelhelpers.cpp @@ -27,8 +27,8 @@ #include <cpptools/cppmodelmanager.h> -#include <projectexplorer/projectexplorer.h> #include <projectexplorer/project.h> +#include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> #include <QCoreApplication> diff --git a/src/plugins/designer/qtcreatorintegration.cpp b/src/plugins/designer/qtcreatorintegration.cpp index efd35e4287..e752e3cdd7 100644 --- a/src/plugins/designer/qtcreatorintegration.cpp +++ b/src/plugins/designer/qtcreatorintegration.cpp @@ -42,6 +42,7 @@ #include <texteditor/texteditor.h> #include <texteditor/textdocument.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/projecttree.h> #include <projectexplorer/session.h> #include <utils/asconst.h> #include <utils/mimetypes/mimedatabase.h> diff --git a/src/plugins/projectexplorer/editorconfiguration.cpp b/src/plugins/projectexplorer/editorconfiguration.cpp index 01060baacb..f011eb3a7e 100644 --- a/src/plugins/projectexplorer/editorconfiguration.cpp +++ b/src/plugins/projectexplorer/editorconfiguration.cpp @@ -24,9 +24,9 @@ ****************************************************************************/ #include "editorconfiguration.h" -#include "session.h" -#include "projectexplorer.h" #include "project.h" +#include "projectexplorer.h" +#include "session.h" #include <utils/algorithm.h> diff --git a/src/plugins/projectexplorer/jsonwizard/jsonsummarypage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonsummarypage.cpp index 27b4b682ab..840c59d0f2 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonsummarypage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonsummarypage.cpp @@ -29,6 +29,7 @@ #include "../project.h" #include "../projectexplorerconstants.h" #include "../projectnodes.h" +#include "../projecttree.h" #include "../session.h" #include "../projecttree.h" @@ -245,7 +246,7 @@ void JsonSummaryPage::updateFileList() void JsonSummaryPage::updateProjectData(FolderNode *node) { - Project *project = SessionManager::projectForNode(node); + Project *project = ProjectTree::projectForNode(node); m_wizard->setValue(QLatin1String(KEY_SELECTED_PROJECT), QVariant::fromValue(project)); m_wizard->setValue(QLatin1String(KEY_SELECTED_NODE), QVariant::fromValue(node)); diff --git a/src/plugins/projectexplorer/projectfilewizardextension.cpp b/src/plugins/projectexplorer/projectfilewizardextension.cpp index e6bf826e7b..7f0dd8a77f 100644 --- a/src/plugins/projectexplorer/projectfilewizardextension.cpp +++ b/src/plugins/projectexplorer/projectfilewizardextension.cpp @@ -27,6 +27,7 @@ #include "projectexplorer.h" #include "session.h" #include "projectnodes.h" +#include "projecttree.h" #include "projectwizardpage.h" #include <utils/algorithm.h> @@ -247,7 +248,7 @@ void ProjectFileWizardExtension::applyCodeStyle(GeneratedFile *file) const return; // don't modify files like *.ui *.pro FolderNode *folder = m_context->page->currentNode(); - Project *baseProject = SessionManager::projectForNode(folder); + Project *baseProject = ProjectTree::projectForNode(folder); ICodeStylePreferencesFactory *factory = TextEditorSettings::codeStyleFactory(languageId); diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 6d7e7c007a..16639b9423 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -156,7 +156,7 @@ void ProjectTree::update() void ProjectTree::updateFromProjectTreeWidget(ProjectTreeWidget *widget) { Node *currentNode = widget->currentNode(); - Project *project = SessionManager::projectForNode(currentNode); + Project *project = projectForNode(currentNode); setCurrent(currentNode, project); } @@ -175,7 +175,7 @@ void ProjectTree::updateFromNode(Node *node) { Project *project; if (node) - project = SessionManager::projectForNode(node); + project = projectForNode(node); else project = SessionManager::startupProject(); @@ -321,7 +321,7 @@ bool ProjectTree::hasFocus(ProjectTreeWidget *widget) void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &globalPos, Node *node) { QMenu *contextMenu = nullptr; - Project *project = SessionManager::projectForNode(node); + Project *project = projectForNode(node); emit s_instance->aboutToShowContextMenu(project, node); if (!node) { @@ -403,6 +403,40 @@ void ProjectTree::forEachNode(const std::function<void(Node *)> &task) } } +Project *ProjectTree::projectForNode(Node *node) +{ + if (!node) + return nullptr; + + FolderNode *folder = node->asFolderNode(); + if (!folder) + folder = node->parentFolderNode(); + + while (folder && folder->parentFolderNode()) + folder = folder->parentFolderNode(); + + return Utils::findOrDefault(SessionManager::projects(), [folder](const Project *pro) { + return pro->containerNode() == folder; + }); +} + +Node *ProjectTree::nodeForFile(const FileName &fileName) +{ + Node *node = nullptr; + for (const Project *project : SessionManager::projects()) { + if (ProjectNode *projectNode = project->rootProjectNode()) { + projectNode->forEachGenericNode([&](Node *n) { + if (n->filePath() == fileName) { + // prefer file nodes + if (!node || (node->nodeType() != NodeType::File && n->nodeType() == NodeType::File)) + node = n; + } + }); + } + } + return node; +} + void ProjectTree::hideContextMenu() { m_focusForContextMenu = nullptr; diff --git a/src/plugins/projectexplorer/projecttree.h b/src/plugins/projectexplorer/projecttree.h index 6691ccf45d..67b8db99c6 100644 --- a/src/plugins/projectexplorer/projecttree.h +++ b/src/plugins/projectexplorer/projecttree.h @@ -71,10 +71,13 @@ public: static void registerTreeManager(const TreeManagerFunction &treeChange); static void applyTreeManager(FolderNode *folder); + // Nodes: static bool hasNode(const Node *node); - static void forEachNode(const std::function<void(Node *)> &task); + static Project *projectForNode(Node *node); + static Node *nodeForFile(const Utils::FileName &fileName); + void collapseAll(); // for nodes to emit signals, do not call unless you are a node diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 35608f9155..01402cc326 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -203,7 +203,9 @@ QList<Project *> SessionManager::dependencies(const Project *project) QList<Project *> projects; foreach (const QString &dep, proDeps) { - if (Project *pro = projectForFile(Utils::FileName::fromString(dep))) + const Utils::FileName fn = Utils::FileName::fromString(dep); + Project *pro = Utils::findOrDefault(d->m_projects, [&fn](Project *p) { return p->projectFilePath() == fn; }); + if (pro) projects += pro; } @@ -624,53 +626,10 @@ QList<Project *> SessionManager::projectOrder(const Project *project) return result; } -// node for file returns a randomly selected node if there are multiple -// prefer to use nodesForFile and figure out which node you want -Node *SessionManager::nodeForFile(const Utils::FileName &fileName) -{ - Node *node = nullptr; - for (Project *project : d->m_projects) { - if (ProjectNode *projectNode = project->rootProjectNode()) { - projectNode->forEachGenericNode([&](Node *n) { - if (n->filePath() == fileName) { - // prefer file nodes - if (!node || (node->nodeType() != NodeType::File && n->nodeType() == NodeType::File)) - node = n; - } - }); - } - } - return node; -} - -Project *SessionManager::projectForNode(Node *node) -{ - if (!node) - return nullptr; - - FolderNode *folder = node->asFolderNode(); - if (!folder) - folder = node->parentFolderNode(); - - while (folder && folder->parentFolderNode()) - folder = folder->parentFolderNode(); - - for (Project *pro : d->m_projects) { - if (pro->containerNode() == folder) - return pro; - } - return nullptr; -} - Project *SessionManager::projectForFile(const Utils::FileName &fileName) { - const QList<Project *> &projectList = projects(); - foreach (Project *p, projectList) { - if (p->isKnownFile(fileName)) - return p; - } - - return nullptr; + return Utils::findOrDefault(SessionManager::projects(), + [&fileName](const Project *p) { return p->isKnownFile(fileName); }); } void SessionManager::configureEditor(IEditor *editor, const QString &fileName) diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index 9558b6bbfb..938a7bc5fe 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -31,9 +31,9 @@ #include <utils/persistentsettings.h> +#include <QDateTime> #include <QString> #include <QStringList> -#include <QDateTime> namespace Core { class IEditor; } @@ -43,8 +43,6 @@ class Project; class Target; class BuildConfiguration; class DeployConfiguration; -class Node; - enum class SetActive { Cascade, NoCascade }; class PROJECTEXPLORER_EXPORT SessionManager : public QObject @@ -110,10 +108,8 @@ public: static QVariant value(const QString &name); // NBS rewrite projectOrder (dependency management) - static QList<Project *> projectOrder(const Project *project = 0); + static QList<Project *> projectOrder(const Project *project = nullptr); - static Project *projectForNode(Node *node); - static Node *nodeForFile(const Utils::FileName &fileName); static Project *projectForFile(const Utils::FileName &fileName); static QStringList projectsForSessionName(const QString &session); diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp index a4cd157c71..99e9ed8a6d 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp @@ -75,13 +75,13 @@ namespace Internal { static Node *currentEditorNode() { Core::IDocument *doc = Core::EditorManager::currentDocument(); - return doc ? SessionManager::nodeForFile(doc->filePath()) : 0; + return doc ? ProjectTree::nodeForFile(doc->filePath()) : nullptr; } static QbsProject *currentEditorProject() { Core::IDocument *doc = Core::EditorManager::currentDocument(); - return doc ? qobject_cast<QbsProject *>(SessionManager::projectForFile(doc->filePath())) : 0; + return doc ? qobject_cast<QbsProject *>(SessionManager::projectForFile(doc->filePath())) : nullptr; } bool QbsProjectManagerPlugin::initialize(const QStringList &arguments, QString *errorMessage) diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp index bfcc2f3d50..a75eb56e24 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp @@ -194,8 +194,8 @@ void QmakeManager::buildFile() { if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) { const Utils::FileName file = currentDocument->filePath(); - Node *n = SessionManager::nodeForFile(file); - FileNode *node = n ? n->asFileNode() : 0; + Node *n = ProjectTree::nodeForFile(file); + FileNode *node = n ? n->asFileNode() : nullptr; Project *project = SessionManager::projectForFile(file); if (project && node) diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp index 17a1684fad..8ae76b5390 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp @@ -53,9 +53,9 @@ #include <coreplugin/editormanager/ieditor.h> #include <projectexplorer/buildmanager.h> -#include <projectexplorer/session.h> #include <projectexplorer/projectmanager.h> #include <projectexplorer/projecttree.h> +#include <projectexplorer/session.h> #include <projectexplorer/target.h> #include <texteditor/texteditoractionhandler.h> @@ -414,7 +414,7 @@ void QmakeProjectManagerPlugin::enableBuildFileMenus(const Utils::FileName &file bool visible = false; bool enabled = false; - if (Node *node = SessionManager::nodeForFile(file)) { + if (Node *node = ProjectTree::nodeForFile(file)) { if (Project *project = SessionManager::projectForFile(file)) { if (const FileNode *fileNode = node->asFileNode()) { const FileType type = fileNode->fileType(); diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 929a0bda47..f72939d36f 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -40,9 +40,10 @@ #include <coreplugin/vcsmanager.h> #include <coreplugin/icore.h> #include <coreplugin/messagebox.h> -#include <projectexplorer/session.h> #include <projectexplorer/projectnodes.h> #include <projectexplorer/project.h> +#include <projectexplorer/projecttree.h> +#include <projectexplorer/session.h> #include <qmakeprojectmanager/qmakenodes.h> #include <qmakeprojectmanager/qmakeproject.h> @@ -327,7 +328,7 @@ Utils::FileName DocumentManager::currentFilePath() QStringList DocumentManager::isoIconsQmakeVariableValue(const QString &proPath) { - ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(proPath)); + ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(proPath)); if (!node) { qCWarning(documentManagerLog) << "No node for .pro:" << proPath; return QStringList(); @@ -350,7 +351,7 @@ QStringList DocumentManager::isoIconsQmakeVariableValue(const QString &proPath) bool DocumentManager::setIsoIconsQmakeVariableValue(const QString &proPath, const QStringList &value) { - ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(proPath)); + ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(proPath)); if (!node) { qCWarning(documentManagerLog) << "No node for .pro:" << proPath; return false; @@ -380,7 +381,7 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists, { Utils::FileName qmlFileName = QmlDesignerPlugin::instance()->currentDesignDocument()->fileName(); ProjectExplorer::Project *project = ProjectExplorer::SessionManager::projectForFile(qmlFileName); - ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(qmlFileName)->parentFolderNode(); + ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(qmlFileName)->parentFolderNode(); ProjectExplorer::Node *iconQrcFileNode = nullptr; while (node && !iconQrcFileNode) { @@ -419,11 +420,11 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists, *resourceFilePath = project->projectDirectory().toString() + "/" + isoIconsQrcFile; // We assume that the .pro containing the QML file is an acceptable place to add the .qrc file. - ProjectExplorer::ProjectNode *projectNode = ProjectExplorer::SessionManager::nodeForFile(qmlFileName)->parentProjectNode(); + ProjectExplorer::ProjectNode *projectNode = ProjectExplorer::ProjectTree::nodeForFile(qmlFileName)->parentProjectNode(); *resourceFileProPath = projectNode->filePath().toString(); } else { // We found the QRC file that we want. - QString projectDirectory = ProjectExplorer::SessionManager::projectForNode(iconQrcFileNode)->projectDirectory().toString(); + QString projectDirectory = ProjectExplorer::ProjectTree::projectForNode(iconQrcFileNode)->projectDirectory().toString(); *resourceFilePath = projectDirectory + "/" + isoIconsQrcFile; } @@ -432,7 +433,7 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists, bool DocumentManager::isoProFileSupportsAddingExistingFiles(const QString &resourceFileProPath) { - ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(resourceFileProPath)); + ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(resourceFileProPath)); if (!node || !node->parentFolderNode()) return false; ProjectExplorer::ProjectNode *projectNode = node->parentFolderNode()->asProjectNode(); @@ -448,7 +449,7 @@ bool DocumentManager::isoProFileSupportsAddingExistingFiles(const QString &resou bool DocumentManager::addResourceFileToIsoProject(const QString &resourceFileProPath, const QString &resourceFilePath) { - ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(resourceFileProPath)); + ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(resourceFileProPath)); if (!node || !node->parentFolderNode()) return false; ProjectExplorer::ProjectNode *projectNode = node->parentFolderNode()->asProjectNode(); diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index ff58c4cb1f..d3f9fe65e0 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -39,9 +39,9 @@ #include <qmljs/qmljspropertyreader.h> #include <qmljs/qmljsrewriter.h> #include <qmljstools/qmljsrefactoringchanges.h> -#include <projectexplorer/session.h> -#include <projectexplorer/projectnodes.h> #include <projectexplorer/project.h> +#include <projectexplorer/projectnodes.h> +#include <projectexplorer/projecttree.h> #include <utils/fileutils.h> @@ -192,7 +192,7 @@ public: if (path == QFileInfo(currentFileName).path()) { // hack for the common case, next version should use the wizard ProjectExplorer::Node * oldFileNode = - ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(currentFileName)); + ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(currentFileName)); if (oldFileNode) { ProjectExplorer::FolderNode *containingFolder = oldFileNode->parentFolderNode(); if (containingFolder) |