File indexing completed on 2024-05-12 04:37:43
0001 /* 0002 SPDX-FileCopyrightText: 2007-2008 Hamish Rodda <rodda@kde.org> 0003 SPDX-FileCopyrightText: 2009 Lior Mualem <lior.m.kde@gmail.com> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #ifndef KDEVPLATFORM_CLASSMODEL_H 0009 #define KDEVPLATFORM_CLASSMODEL_H 0010 0011 #include <QAbstractItemModel> 0012 #include "classmodelnode.h" 0013 0014 #include <language/languageexport.h> 0015 0016 class ClassBrowserPlugin; 0017 0018 namespace KDevelop { 0019 class TopDUContext; 0020 class IDocument; 0021 class DUContext; 0022 class IProject; 0023 class DUChainBase; 0024 class IndexedQualifiedIdentifier; 0025 } 0026 0027 namespace ClassModelNodes { 0028 class Node; 0029 class FilteredAllClassesFolder; 0030 class FilteredProjectFolder; 0031 class FolderNode; 0032 class IdentifierNode; 0033 } 0034 0035 /// The model interface accessible from the nodes. 0036 class NodesModelInterface 0037 { 0038 public: 0039 virtual ~NodesModelInterface(); 0040 0041 public: 0042 enum Feature { 0043 AllProjectsClasses = 0x1, 0044 BaseAndDerivedClasses = 0x2, 0045 ClassInternals = 0x4 0046 }; 0047 Q_DECLARE_FLAGS(Features, Feature) 0048 0049 virtual void nodesLayoutAboutToBeChanged(ClassModelNodes::Node* a_parent) = 0; 0050 virtual void nodesLayoutChanged(ClassModelNodes::Node* a_parent) = 0; 0051 virtual void nodesAboutToBeRemoved(ClassModelNodes::Node* a_parent, int a_first, int a_last) = 0; 0052 virtual void nodesRemoved(ClassModelNodes::Node* a_parent) = 0; 0053 virtual void nodesAboutToBeAdded(ClassModelNodes::Node* a_parent, int a_pos, int a_size) = 0; 0054 virtual void nodesAdded(ClassModelNodes::Node* a_parent) = 0; 0055 virtual Features features() const = 0; 0056 }; 0057 0058 /** 0059 * @short A model that holds a convenient representation of the defined class in the project 0060 * 0061 * This model doesn't have much code in it, it mostly acts as a glue between the different 0062 * nodes and the tree view. 0063 * 0064 * The nodes are defined in the namespace @ref ClassModelNodes 0065 */ 0066 class KDEVPLATFORMLANGUAGE_EXPORT ClassModel 0067 : public QAbstractItemModel 0068 , public NodesModelInterface 0069 { 0070 Q_OBJECT 0071 0072 public: 0073 ClassModel(); 0074 ~ClassModel() override; 0075 0076 public: 0077 /// Retrieve the DU object related to the specified index. 0078 /// @note DUCHAINS READER LOCK MUST BE TAKEN! 0079 KDevelop::DUChainBase* duObjectForIndex(const QModelIndex& a_index); 0080 0081 /// Call this to retrieve the index for the node associated with the specified id. 0082 QModelIndex indexForIdentifier(const KDevelop::IndexedQualifiedIdentifier& a_id); 0083 0084 /// Return the model index associated with the given node. 0085 QModelIndex index(ClassModelNodes::Node* a_node) const; 0086 0087 inline void setFeatures(NodesModelInterface::Features features); 0088 inline NodesModelInterface::Features features() const override { return m_features; } 0089 0090 public Q_SLOTS: 0091 /// Call this to update the filter string for the search results folder. 0092 void updateFilterString(const QString& a_newFilterString); 0093 0094 /// removes the project-specific node 0095 void removeProjectNode(KDevelop::IProject* project); 0096 /// adds the project-specific node 0097 void addProjectNode(KDevelop::IProject* project); 0098 0099 private: // NodesModelInterface overrides 0100 void nodesLayoutAboutToBeChanged(ClassModelNodes::Node* a_parent) override; 0101 void nodesLayoutChanged(ClassModelNodes::Node* a_parent) override; 0102 void nodesAboutToBeRemoved(ClassModelNodes::Node* a_parent, int a_first, int a_last) override; 0103 void nodesRemoved(ClassModelNodes::Node* a_parent) override; 0104 void nodesAboutToBeAdded(ClassModelNodes::Node* a_parent, int a_pos, int a_size) override; 0105 void nodesAdded(ClassModelNodes::Node* a_parent) override; 0106 0107 private: 0108 /// Main level node - it's usually invisible. 0109 ClassModelNodes::Node* m_topNode; 0110 ClassModelNodes::FilteredAllClassesFolder* m_allClassesNode; 0111 QMap<KDevelop::IProject*, ClassModelNodes::FilteredProjectFolder*> m_projectNodes; 0112 NodesModelInterface::Features m_features; 0113 0114 public Q_SLOTS: 0115 /// This slot needs to be attached to collapsed signal in the tree view. 0116 void collapsed(const QModelIndex& index); 0117 /// This slot needs to be attached to expanded signal in the tree view. 0118 void expanded(const QModelIndex& index); 0119 0120 public: // QAbstractItemModel overrides 0121 QFlags<Qt::ItemFlag> flags(const QModelIndex&) const override; 0122 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; 0123 QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; 0124 int rowCount(const QModelIndex& parent = QModelIndex()) const override; 0125 int columnCount(const QModelIndex& parent = QModelIndex()) const override; 0126 0127 bool hasChildren(const QModelIndex& parent = QModelIndex()) const override; 0128 0129 QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; 0130 QModelIndex parent(const QModelIndex& child) const override; 0131 }; 0132 0133 inline void ClassModel::setFeatures(Features features) 0134 { m_features = features; } 0135 0136 Q_DECLARE_OPERATORS_FOR_FLAGS(NodesModelInterface::Features) 0137 0138 #endif