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