1 /*
2 SPDX-FileCopyrightText: 2009 Lior Mualem <lior.m.kde@gmail.com>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7 #include "allclassesfolder.h"
8
9 #include "../../interfaces/icore.h"
10 #include <interfaces/iproject.h>
11 #include <interfaces/iprojectcontroller.h>
12
13 #include <KLocalizedString>
14
15 using namespace KDevelop;
16 using namespace ClassModelNodes;
17
18 //////////////////////////////////////////////////////////////////////////////
19 //////////////////////////////////////////////////////////////////////////////
20
AllClassesFolder(NodesModelInterface * a_model)21 AllClassesFolder::AllClassesFolder(NodesModelInterface* a_model)
22 : DocumentClassesFolder(i18n("All projects classes"), a_model)
23 {
24 }
25
nodeCleared()26 void AllClassesFolder::nodeCleared()
27 {
28 DocumentClassesFolder::nodeCleared();
29
30 disconnect(
31 ICore::self()->projectController(), &IProjectController::projectOpened, this, &AllClassesFolder::projectOpened);
32 disconnect(
33 ICore::self()->projectController(), &IProjectController::projectClosing, this,
34 &AllClassesFolder::projectClosing);
35 }
36
populateNode()37 void AllClassesFolder::populateNode()
38 {
39 DocumentClassesFolder::populateNode();
40
41 // Get notification for future project addition / removal.
42 connect(
43 ICore::self()->projectController(), &IProjectController::projectOpened, this, &AllClassesFolder::projectOpened);
44 connect(
45 ICore::self()->projectController(), &IProjectController::projectClosing, this,
46 &AllClassesFolder::projectClosing);
47
48 // Parse each existing project file
49 const auto projects = ICore::self()->projectController()->projects();
50 for (IProject* project : projects) {
51 projectOpened(project);
52 }
53 }
54
projectClosing(KDevelop::IProject * project)55 void AllClassesFolder::projectClosing(KDevelop::IProject* project)
56 {
57 // Run over all the files in the project.
58 const auto files = project->fileSet();
59 for (const IndexedString& file : files) {
60 closeDocument(file);
61 }
62 }
63
projectOpened(KDevelop::IProject * project)64 void AllClassesFolder::projectOpened(KDevelop::IProject* project)
65 {
66 // Run over all the files in the project.
67 const auto files = project->fileSet();
68 for (const IndexedString& file : files) {
69 parseDocument(file);
70 }
71
72 recursiveSort();
73 }
74
75 //////////////////////////////////////////////////////////////////////////////
76 //////////////////////////////////////////////////////////////////////////////
77
FilteredAllClassesFolder(NodesModelInterface * a_model)78 FilteredAllClassesFolder::FilteredAllClassesFolder(NodesModelInterface* a_model)
79 : AllClassesFolder(a_model)
80 {
81 }
82
updateFilterString(const QString & a_newFilterString)83 void FilteredAllClassesFolder::updateFilterString(const QString& a_newFilterString)
84 {
85 m_filterString = a_newFilterString;
86
87 if (isPopulated()) {
88 #if 1 // Choose speed over correctness.
89 // Close the node and re-open it should be quicker than reload each document
90 // and remove individual nodes (at the cost of loosing the current selection).
91 performPopulateNode(true);
92 #else
93 bool hadChanges = false;
94
95 // Reload the documents.
96 foreach (const IndexedString& file, getAllOpenDocuments())
97 hadChanges |= updateDocument(file);
98
99 // Sort if we've updated documents.
100 if (hadChanges)
101 recursiveSort();
102 else
103 {
104 // If nothing changed, the title changed so mark the node as updated.
105 m_model->nodesLayoutAboutToBeChanged(this);
106 m_model->nodesLayoutChanged(this);
107 }
108 #endif
109 } else
110 {
111 // Displayed name changed only...
112 m_model->nodesLayoutAboutToBeChanged(this);
113 m_model->nodesLayoutChanged(this);
114 }
115 }
116
isClassFiltered(const KDevelop::QualifiedIdentifier & a_id)117 bool FilteredAllClassesFolder::isClassFiltered(const KDevelop::QualifiedIdentifier& a_id)
118 {
119 return !a_id.last().toString().contains(m_filterString, Qt::CaseInsensitive);
120 }
121