1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
/*
SPDX-FileCopyrightText: 2010 Dmitry Risenberg <dmitry.risenberg@gmail.com>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#ifndef KDEVPLATFORM_PLUGIN_WATCHEDDOCUMENTSET_H
#define KDEVPLATFORM_PLUGIN_WATCHEDDOCUMENTSET_H
#include <QObject>
#include <QSet>
#include <QUrl>
#include <serialization/indexedstring.h>
#include <shell/shellexport.h>
#include "problemconstants.h"
namespace KDevelop {
class IDocument;
class IProject;
class IProjectFileManager;
class ProjectFileItem;
class Path;
class WatchedDocumentSetPrivate;
/**
* Helper class that tracks set of documents and notifies its owner whenever this set changes. Derived classes implement different tracking strategies.
*/
class KDEVPLATFORMSHELL_EXPORT WatchedDocumentSet : public QObject
{
Q_OBJECT
public:
using DocumentSet = QSet<IndexedString>;
explicit WatchedDocumentSet(QObject* parent);
~WatchedDocumentSet() override;
bool showImports() const;
void setShowImports(bool showImports);
virtual DocumentSet get() const;
virtual DocumentSet imports() const;
virtual void setCurrentDocument(const IndexedString& url);
virtual ProblemScope scope() const = 0;
Q_SIGNALS:
void changed();
protected:
const QScopedPointer<class WatchedDocumentSetPrivate> d_ptr;
Q_DECLARE_PRIVATE(WatchedDocumentSet)
};
/**
* Tracks a document that is current at any given moment.
* When a new file is activated, it becomes tracked instead of the old one.
*/
class CurrentDocumentSet : public WatchedDocumentSet
{
Q_OBJECT
public:
explicit CurrentDocumentSet(const IndexedString& document, QObject* parent);
void setCurrentDocument(const IndexedString& url) override;
ProblemScope scope() const override;
};
/**
* Tracks all open documents.
*/
class OpenDocumentSet : public WatchedDocumentSet
{
Q_OBJECT
public:
explicit OpenDocumentSet(QObject* parent);
ProblemScope scope() const override;
private Q_SLOTS:
void documentClosed(IDocument* doc);
void documentCreated(IDocument* doc);
void documentUrlChanged(IDocument* doc, const QUrl& previousUrl);
};
class ProjectSet : public WatchedDocumentSet
{
Q_OBJECT
public:
explicit ProjectSet(QObject* parent);
protected:
void trackProjectFiles(const IProjectFileManager* projectFileManager);
void stopTrackingProjectFiles(const IProjectFileManager* projectFileManager);
protected Q_SLOTS:
void fileAdded(KDevelop::ProjectFileItem*);
void fileRemoved(KDevelop::ProjectFileItem* file);
void fileRenamed(const KDevelop::Path& oldFile, KDevelop::ProjectFileItem* newFile);
protected:
virtual bool include(const IndexedString& /*url*/) const { return true; }
private:
bool m_pauseAddingFiles = false;
};
/**
* Tracks documents that are in the same project as the current file.
* If current file is not in any project, none are tracked.
*/
class CurrentProjectSet : public ProjectSet
{
Q_OBJECT
public:
explicit CurrentProjectSet(const IndexedString& document, QObject* parent);
void setCurrentDocument(const IndexedString& url) override;
ProblemScope scope() const override;
private:
void handleCurrentDocumentChange();
bool include(const IndexedString& url) const override;
QUrl m_currentDocumentUrl;
const IProject* m_currentProject = nullptr;
};
/**
* Tracks files in all open projects.
*/
class AllProjectSet : public ProjectSet
{
Q_OBJECT
public:
explicit AllProjectSet(QObject* parent);
ProblemScope scope() const override;
protected:
enum class InitFlag {
LoadOnInit,
SkipLoadOnInit,
};
explicit AllProjectSet(InitFlag initFlag, QObject* parent);
void reload();
private:
void projectOpened(const IProject* project);
void addProjectFiles(const IProject& project);
QSet<const IProjectFileManager*> m_trackedProjectFileManagers;
};
class DocumentsInPathSet : public AllProjectSet
{
Q_OBJECT
public:
explicit DocumentsInPathSet(const QString& path, QObject* parent);
ProblemScope scope() const override;
void setPath(const QString& path);
private:
bool include(const IndexedString& url) const override;
QString m_path;
};
class DocumentsInCurrentPathSet : public DocumentsInPathSet
{
Q_OBJECT
public:
explicit DocumentsInCurrentPathSet(const IndexedString& document, QObject* parent);
ProblemScope scope() const override;
void setCurrentDocument(const IndexedString& url) override;
};
class BypassSet : public WatchedDocumentSet
{
Q_OBJECT
public:
explicit BypassSet(QObject* parent);
ProblemScope scope() const override;
};
}
#endif // KDEVPLATFORM_PLUGIN_WATCHEDDOCUMENTSET_H
|