summaryrefslogtreecommitdiffstats
path: root/lib/interfaces/kdevproject.h
blob: 1827a1d09b9c06be71e98cc992a5abc4787f6b31 (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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/* This file is part of the KDE project
   Copyright (C) 2001 Matthias Hoelzer-Kluepfel <[email protected]>
   Copyright (C) 2001-2002 Bernd Gehrmann <[email protected]>
   Copyright (C) 2002-2003 Roberto Raggi <[email protected]>
   Copyright (C) 2002 Simon Hausmann <[email protected]>
   Copyright (C) 2003 Jens Dagerbo <[email protected]>
   Copyright (C) 2003 Mario Scalas <[email protected]>
   Copyright (C) 2003-2004 Alexander Dymo <[email protected]>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.
*/
#ifndef KDEVPROJECT_H
#define KDEVPROJECT_H

#include "kdevplugin.h"
#include "domutil.h"

#include <qstringlist.h>
#include <qmap.h>

/**
@file kdevproject.h
KDevelop project interface.
*/

class QTimer;

/**
KDevelop project interface.
Plugins implementing the KDevProject interfaces are used to manage projects.

Project can be considered as a way of grouping files (in text editors) or
as a way of providing support for a build system (like it is done in KDevelop IDE buildtools).
*/
class KDevProject: public KDevPlugin
{
    Q_OBJECT
public:
    /**Constructs a project plugin.
    @param info Important information about the plugin - plugin internal and generic
    (GUI) name, description, a list of authors, etc. That information is used to show
    plugin information in various places like "about application" dialog, plugin selector
    dialog, etc. Plugin does not take ownership on info object, also its lifetime should
    be equal to the lifetime of the plugin.
    @param parent The parent object for the plugin. Parent object must implement @ref KDevApi
    interface. Otherwise the plugin will not be constructed.
    @param name The internal name which identifies the plugin.*/
    KDevProject(const KDevPluginInfo *info, QObject *parent=0, const char *name=0);
    /**Destructor.*/
    virtual ~KDevProject();

    /**Options of the project plugin.*/
    enum Options {
        UsesOtherBuildSystem = 0        /**<Project uses unknown or unspecified build system or build system is not used at all.*/,
        UsesAutotoolsBuildSystem = 1    /**<Project uses autotools for building.*/,
        UsesQMakeBuildSystem =2         /**<Project uses qmake for building.*/
    };

    /**This method is invoked when the project is opened
    (i.e. actually just after this class has been
    instantiated).
    @param dirName The project directory, which should afterwards be returned by
    the projectDirectory() method.
    @param projectName The project name, which is equivalent
    to the project file name without the suffix.*/
    virtual void openProject(const QString &dirName, const QString &projectName);

    /**This method is invoked when the project is about to be closed.*/
    virtual void closeProject() = 0;

    /**Reimplement this method to set project plugin options. Default implementation
    returns KDevProject::UsesOtherBuildSystem.*/
    virtual Options options() const;

    /**@return The canonical absolute directory of the project. Canonical means that
    a path does not contain symbolic links or redundant "." or ".." elements.*/
    virtual QString projectDirectory() const = 0;

    /**Returns the name of the project.*/
    virtual QString projectName() const = 0;

    /**@return The environment variables that sould be set before running mainProgram().*/
    virtual DomUtil::PairList runEnvironmentVars() const = 0;

    /**@return The path to main binary program of the project.
    @param relative if true then the path returned is relative to the project directory.*/
    virtual QString mainProgram() const = 0;

    /**Absolute path (directory) from where the mainProgram() should be run.*/
    virtual QString runDirectory() const = 0;

    /**The command line arguments that the mainProgram() should be run with.*/
    virtual QString runArguments() const = 0;

    /**The command line arguments that the mainProgram() should be debugged with.*/
    virtual QString debugArguments() const = 0;

    /**Returns the path (relative to the project directory)
    of the active directory. All newly automatically generated
    classes and files are usually added here.*/
    virtual QString activeDirectory() const = 0;

    /**@return The canonical build directory of the project.
    If the separate build directory is not supported, this should
    return the same as projectDiretory(). Canonical means that
    a path does not contain symbolic links or redundant "." or ".." elements.*/
    virtual QString buildDirectory() const = 0;

    /**@return The list of all files in the project. The names are relative to
    the project directory.*/
    virtual QStringList allFiles() const = 0;

    /**@return The list of files that are part of the distribution but not under
    project control. Used mainly to package and publish extra files among with the project.*/
    virtual QStringList distFiles() const = 0;

    /**Adds a list of files to the project. Provided for convenience when adding many files.
    @param fileList The list of file names relative to the project directory.*/
    virtual void addFiles(const QStringList &fileList) = 0;

    /**Adds a file to the project.
    @param fileName The file name relative to the project directory.*/
    virtual void addFile(const QString &fileName)= 0;

    /**Removes a list of files from the project. Provided for convenience when removing many files.
    @param fileList The list of file names relative to the project directory.*/
    virtual void removeFiles(const QStringList& fileList)= 0;

    /**Removes a file from the project.
    @param fileName The file name relative to the project directory.*/
    virtual void removeFile(const QString &fileName) = 0;

    /**Notifies the project about changes to the files. Provided for
    convenience when changing many files.
    @param fileList The list of file names relative to the project directory..*/
    virtual void changedFiles(const QStringList &fileList);

    /**Notifies the project of a change to one of the files.
    @param fileName The file name relative to the project directory.*/
    virtual void changedFile(const QString &fileName);

    /**@return true if the file @p absFileName is a part of the project.
    @param absFileName Absolute name of a file to check.*/
    virtual bool isProjectFile(const QString &absFileName);

    /**@return The path (relative to the project directory) of the file @p absFileName.
    @param absFileName Absolute name of a file.*/
    virtual QString relativeProjectFile(const QString &absFileName);

    /**@return The list of files known to the project through symlinks.*/
    virtual QStringList symlinkProjectFiles();

protected:

    /** Default implementation of runDirectory method.
     *  Uses 'projectPluginName' to obtain configuration from
     *  project DOM and returns:
     *
     *   if /<projectPluginName>/run/directoryradio == executable
     *        The directory where the executable is.
     *   if /<projectPluginName>/run/directoryradio == build
     *        The build directory.
     *   if /kdevautoproject/run/directoryradio == custom
     *        The custom directory absolute path.
     * Derived classes are supposed to explicitly call this implementation
     */
    QString defaultRunDirectory(const QString& projectPluginName) const;

private slots:
    void buildFileMap();
    void slotBuildFileMap();
    void slotAddFilesToFileMap(const QStringList & fileList );
    void slotRemoveFilesFromFileMap(const QStringList & fileList );

signals:
    /**Emitted when a new list of files has been added to the
    project. Provided for convenience when many files were added.
    @param fileList The file names relative to the project directory.*/
    void addedFilesToProject(const QStringList& fileList);

    /**Emitted when a list of files has been removed from the project.
    Provided for convenience when many files were removed.
    @param fileList The file names relative to the project directory.*/
    void removedFilesFromProject(const QStringList& fileList);

    /**Emitted when a list of files has changed in the project.
    @param fileList The file names relative to the project directory.*/
    void changedFilesInProject(const QStringList& fileList);

    /**Emitted when one compile related command (make, make install, make ...) ends sucessfuly.
    Used to reparse the files after a sucessful compilation.*/
    void projectCompiled();

    /**Emitted when the active directory of the project changes
     * @param olddir The old active directory
     * @param newdir The new active directory
     */
    void activeDirectoryChanged( const QString& olddir, const QString& newdir );

private:
    class Private;
    Private *d;
};

#endif