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