File indexing completed on 2024-05-12 04:37:43

0001 /*
0002     SPDX-FileCopyrightText: 2009 Lior Mualem <lior.m.kde@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "allclassesfolder.h"
0008 
0009 #include "../../interfaces/icore.h"
0010 #include <interfaces/iproject.h>
0011 #include <interfaces/iprojectcontroller.h>
0012 
0013 #include <KLocalizedString>
0014 
0015 using namespace KDevelop;
0016 using namespace ClassModelNodes;
0017 
0018 //////////////////////////////////////////////////////////////////////////////
0019 //////////////////////////////////////////////////////////////////////////////
0020 
0021 AllClassesFolder::AllClassesFolder(NodesModelInterface* a_model)
0022     : DocumentClassesFolder(i18n("All projects classes"), a_model)
0023 {
0024 }
0025 
0026 void AllClassesFolder::nodeCleared()
0027 {
0028     DocumentClassesFolder::nodeCleared();
0029 
0030     disconnect(
0031         ICore::self()->projectController(), &IProjectController::projectOpened, this, &AllClassesFolder::projectOpened);
0032     disconnect(
0033         ICore::self()->projectController(), &IProjectController::projectClosing, this,
0034         &AllClassesFolder::projectClosing);
0035 }
0036 
0037 void AllClassesFolder::populateNode()
0038 {
0039     DocumentClassesFolder::populateNode();
0040 
0041     // Get notification for future project addition / removal.
0042     connect(
0043         ICore::self()->projectController(), &IProjectController::projectOpened, this, &AllClassesFolder::projectOpened);
0044     connect(
0045         ICore::self()->projectController(), &IProjectController::projectClosing, this,
0046         &AllClassesFolder::projectClosing);
0047 
0048     // Parse each existing project file
0049     const auto projects = ICore::self()->projectController()->projects();
0050     for (IProject* project : projects) {
0051         projectOpened(project);
0052     }
0053 }
0054 
0055 void AllClassesFolder::projectClosing(KDevelop::IProject* project)
0056 {
0057     // Run over all the files in the project.
0058     const auto files = project->fileSet();
0059     for (const IndexedString& file : files) {
0060         closeDocument(file);
0061     }
0062 }
0063 
0064 void AllClassesFolder::projectOpened(KDevelop::IProject* project)
0065 {
0066     // Run over all the files in the project.
0067     const auto files = project->fileSet();
0068     for (const IndexedString& file : files) {
0069         parseDocument(file);
0070     }
0071 
0072     recursiveSort();
0073 }
0074 
0075 //////////////////////////////////////////////////////////////////////////////
0076 //////////////////////////////////////////////////////////////////////////////
0077 
0078 FilteredAllClassesFolder::FilteredAllClassesFolder(NodesModelInterface* a_model)
0079     : AllClassesFolder(a_model)
0080 {
0081 }
0082 
0083 void FilteredAllClassesFolder::updateFilterString(const QString& a_newFilterString)
0084 {
0085     m_filterString = a_newFilterString;
0086 
0087     if (isPopulated()) {
0088 #if 1 // Choose speed over correctness.
0089         // Close the node and re-open it should be quicker than reload each document
0090         // and remove individual nodes (at the cost of losing the current selection).
0091         performPopulateNode(true);
0092 #else
0093         bool hadChanges = false;
0094 
0095         // Reload the documents.
0096         foreach (const IndexedString& file, getAllOpenDocuments())
0097             hadChanges |= updateDocument(file);
0098 
0099         // Sort if we've updated documents.
0100         if (hadChanges)
0101             recursiveSort();
0102         else
0103         {
0104             // If nothing changed, the title changed so mark the node as updated.
0105             m_model->nodesLayoutAboutToBeChanged(this);
0106             m_model->nodesLayoutChanged(this);
0107         }
0108 #endif
0109     } else
0110     {
0111         // Displayed name changed only...
0112         m_model->nodesLayoutAboutToBeChanged(this);
0113         m_model->nodesLayoutChanged(this);
0114     }
0115 }
0116 
0117 bool FilteredAllClassesFolder::isClassFiltered(const KDevelop::QualifiedIdentifier& a_id)
0118 {
0119     return !a_id.last().toString().contains(m_filterString, Qt::CaseInsensitive);
0120 }
0121 
0122 #include "moc_allclassesfolder.cpp"