aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer/projectexplorer.h
blob: 0c737aa9ab7a74925353ac78aa2d507fe1cdebb0 (plain)
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
187
188
189
190
191
192
193
194
195
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#pragma once

#include "projectexplorer_export.h"

#include <extensionsystem/iplugin.h>

#include <utils/expected.h>
#include <utils/filepath.h>
#include <utils/id.h>

#include <QPair>

#include <optional>

QT_BEGIN_NAMESPACE
class QPoint;
class QThreadPool;
QT_END_NAMESPACE

namespace Core {
class OutputWindow;
} // Core

namespace ProjectExplorer {
class CustomParserSettings;
class FolderNode;
class Node;
class Project;
class RunControl;
class RunConfiguration;

namespace Internal {
class AppOutputSettings;
class MiniProjectTargetSelector;
}

class RecentProjectsEntry
{
public:
    Utils::FilePath filePath;
    QString displayName;
    bool exists = true;
};

using RecentProjectsEntries = QList<RecentProjectsEntry>;

class PROJECTEXPLORER_EXPORT OpenProjectResult
{
public:
    OpenProjectResult(const QList<Project *> &projects, const QList<Project *> &alreadyOpen,
                      const QString &errorMessage)
        : m_projects(projects), m_alreadyOpen(alreadyOpen),
          m_errorMessage(errorMessage)
    { }

    explicit operator bool() const
    {
        return m_errorMessage.isEmpty() && m_alreadyOpen.isEmpty();
    }

    Project *project() const
    {
        return m_projects.isEmpty() ? nullptr : m_projects.first();
    }

    QList<Project *> projects() const
    {
        return m_projects;
    }

    QString errorMessage() const
    {
        return m_errorMessage;
    }

    QList<Project *> alreadyOpen() const
    {
        return m_alreadyOpen;
    }

private:
    QList<Project *> m_projects;
    QList<Project *> m_alreadyOpen;
    QString m_errorMessage;
};

class PROJECTEXPLORER_EXPORT ProjectExplorerPlugin : public ExtensionSystem::IPlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ProjectExplorer.json")

    friend class ProjectExplorerPluginPrivate;

public:
    ProjectExplorerPlugin();
    ~ProjectExplorerPlugin() override;

    static ProjectExplorerPlugin *instance();

    static OpenProjectResult openProject(const Utils::FilePath &filePath);
    static OpenProjectResult openProjects(const Utils::FilePaths &filePaths);
    static void showOpenProjectError(const OpenProjectResult &result);
    static void openProjectWelcomePage(const Utils::FilePath &filePath);
    static void unloadProject(Project *project);

    static bool saveModifiedFiles();

    static void showContextMenu(QWidget *view, const QPoint &globalPos, Node *node);

    //PluginInterface
    bool initialize(const QStringList &arguments, QString *errorMessage) override;
    void extensionsInitialized() override;
    bool delayedInitialize() override;
    ShutdownFlag aboutToShutdown() override;

    static void setAppOutputSettings(const Internal::AppOutputSettings &settings);
    static const Internal::AppOutputSettings &appOutputSettings();

    static void setCustomParsers(const QList<CustomParserSettings> &settings);
    static void addCustomParser(const CustomParserSettings &settings);
    static void removeCustomParser(Utils::Id id);
    static const QList<CustomParserSettings> customParsers();

    static void startRunControl(RunControl *runControl);
    static void showOutputPaneForRunControl(RunControl *runControl);

    static QList<std::pair<Utils::FilePath, Utils::FilePath>>
    renameFiles(const QList<std::pair<Node *, Utils::FilePath>> &nodesAndNewFilePaths);

#ifdef WITH_TESTS
    static bool renameFile(const Utils::FilePath &source, const Utils::FilePath &target,
                           Project *project = nullptr);
#endif

    static QStringList projectFilePatterns();
    static bool isProjectFile(const Utils::FilePath &filePath);
    static RecentProjectsEntries recentProjects();

    static void renameFilesForSymbol(const QString &oldSymbolName, const QString &newSymbolName,
                                     const Utils::FilePaths &files, bool preferLowerCaseFileNames);

    static Utils::expected_str<void> canRunStartupProject(Utils::Id runMode);
    static void runProject(Project *pro, Utils::Id, const bool forceSkipDeploy = false);
    static void runStartupProject(Utils::Id runMode, bool forceSkipDeploy = false);
    static void runRunConfiguration(RunConfiguration *rc, Utils::Id runMode,
                             const bool forceSkipDeploy = false);
    static QList<RunControl *> allRunControls();

    static void addExistingFiles(FolderNode *folderNode, const Utils::FilePaths &filePaths);

    static void initiateInlineRenaming();

    static QStringList projectFileGlobs();

    static QThreadPool *sharedThreadPool();
    static Internal::MiniProjectTargetSelector *targetSelector();

    static void openNewProjectDialog();
    static void openOpenProjectDialog();

    static void updateActions();

    static void activateProjectPanel(Utils::Id panelId);
    static void clearRecentProjects();
    static void removeFromRecentProjects(const Utils::FilePath &filePath);

    static void updateRunActions();

    static Core::OutputWindow *buildSystemOutput();

signals:
    // Is emitted when a project has been added/removed,
    // or the file list of a specific project has changed.
    void fileListChanged();

    void recentProjectsChanged();

    void settingsChanged();
    void customParsersChanged();

    void runActionsUpdated();

    void filesRenamed(const QList<std::pair<Utils::FilePath, Utils::FilePath>> &oldAndNewPaths);

private:
    static bool coreAboutToClose();
    void handleCommandLineArguments(const QStringList &arguments);
    static std::optional<std::pair<Utils::FilePath, Utils::FilePath>>
    renameFile(Node *node, const QString &newFilePath);
};

} // namespace ProjectExplorer