qt4nodes.h 6.6 KB
Newer Older
1
/**************************************************************************
con's avatar
con committed
2
3
4
**
** This file is part of Qt Creator
**
5
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
con's avatar
con committed
6
7
8
**
** Contact:  Qt Software Information (qt-info@nokia.com)
**
9
** Commercial Usage
10
**
11
12
13
14
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
15
**
16
** GNU Lesser General Public License Usage
17
**
18
19
20
21
22
23
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24
**
25
26
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.
con's avatar
con committed
27
**
28
**************************************************************************/
hjk's avatar
hjk committed
29

con's avatar
con committed
30
31
32
33
#ifndef QT4NODES_H
#define QT4NODES_H

#include <projectexplorer/projectnodes.h>
34
#include <projectexplorer/project.h>
con's avatar
con committed
35
36
37
38

#include <QtCore/QHash>
#include <QtCore/QStringList>
#include <QtCore/QTimer>
39
40
#include <QtCore/QDateTime>
#include <QtCore/QMap>
con's avatar
con committed
41
42
43
44
45
46
47
48
49
50

// defined in proitems.h
QT_BEGIN_NAMESPACE
class ProFile;
QT_END_NAMESPACE

namespace Core {
class ICore;
}

51
52
53
54
namespace ProjectExplorer {
class FileWatcher;
}

con's avatar
con committed
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
namespace Qt4ProjectManager {

// Import base classes into namespace
using ProjectExplorer::Node;
using ProjectExplorer::FileNode;
using ProjectExplorer::FolderNode;
using ProjectExplorer::ProjectNode;
using ProjectExplorer::NodesWatcher;

// Import enums into namespace
using ProjectExplorer::NodeType;
using ProjectExplorer::FileNodeType;
using ProjectExplorer::FolderNodeType;
using ProjectExplorer::ProjectNodeType;

using ProjectExplorer::UnknownFileType;
using ProjectExplorer::ProjectFileType;

class Qt4Project;

namespace Internal {

using ProjectExplorer::FileType;
class ProFileReader;

//  Type of projects
enum Qt4ProjectType {
    InvalidProject = 0,
    ApplicationTemplate,
    LibraryTemplate,
    ScriptTemplate,
    SubDirsTemplate
};

// Other variables of interest
enum Qt4Variable {
    DefinesVar = 1,
    IncludePathVar,
    CxxCompilerVar,
    UiDirVar,
    MocDirVar
};

class Qt4PriFileNode;
class Qt4ProFileNode;

// Implements ProjectNode for qt4 pro files
102
103
class Qt4PriFileNode : public ProjectExplorer::ProjectNode
{
con's avatar
con committed
104
105
106
    Q_OBJECT
    Q_DISABLE_COPY(Qt4PriFileNode)
public:
107
    Qt4PriFileNode(Qt4Project *project, Qt4ProFileNode* qt4ProFileNode, const QString &filePath);
con's avatar
con committed
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

    void update(ProFile *includeFile, ProFileReader *reader);

// ProjectNode interface
    QList<ProjectAction> supportedActions() const;

    bool hasTargets() const { return false; }

    bool addSubProjects(const QStringList &proFilePaths);
    bool removeSubProjects(const QStringList &proFilePaths);

    bool addFiles(const FileType fileType, const QStringList &filePaths,
                  QStringList *notAdded = 0);
    bool removeFiles(const FileType fileType, const QStringList &filePaths,
                     QStringList *notRemoved = 0);
    bool renameFile(const FileType fileType,
                    const QString &filePath, const QString &newFilePath);

protected:
    void clear();
    static QStringList varNames(FileType type);

    enum ChangeType {
        AddToProFile,
        RemoveFromProFile
    };

    bool changeIncludes(ProFile *includeFile,
                       const QStringList &proFilePaths,
                       ChangeType change);

    void changeFiles(const FileType fileType,
                     const QStringList &filePaths,
                     QStringList *notChanged,
                     ChangeType change);
143
144
145
146

    QString buildDir() const;
    ProFileReader *createProFileReader() const;

147
148
149
private slots:
    void scheduleUpdate();

con's avatar
con committed
150
private:
151
    void save(ProFile *includeFile);
con's avatar
con committed
152
153
154
155
    bool priFileWritable(const QString &path);
    bool saveModifiedEditors(const QString &path);

    Qt4Project *m_project;
156
    Qt4ProFileNode *m_qt4ProFileNode;
con's avatar
con committed
157
158
    QString m_projectFilePath;
    QString m_projectDir;
159
160
161

    // TODO we might be better off using an IFile* and the FileManager for
    // watching changes to the .pro and .pri files on disk
162
    ProjectExplorer::FileWatcher *m_fileWatcher;
con's avatar
con committed
163
164
165
166
167
168

    // managed by Qt4ProFileNode
    friend class Qt4ProFileNode;
};

// Implements ProjectNode for qt4 pro files
169
170
class Qt4ProFileNode : public Qt4PriFileNode
{
con's avatar
con committed
171
172
173
174
175
176
    Q_OBJECT
    Q_DISABLE_COPY(Qt4ProFileNode)
public:
    Qt4ProFileNode(Qt4Project *project,
                   const QString &filePath,
                   QObject *parent = 0);
dt's avatar
dt committed
177
    ~Qt4ProFileNode();
con's avatar
con committed
178
179
180
181
182
183
184
185

    bool hasTargets() const;

    Qt4ProjectType projectType() const;

    QStringList variableValue(const Qt4Variable var) const;

public slots:
186
    void scheduleUpdate();
con's avatar
con committed
187
188
    void update();
private slots:
189
    void buildStateChanged(ProjectExplorer::Project*);
con's avatar
con committed
190

191
private:
dt's avatar
dt committed
192
    void updateUiFiles();
con's avatar
con committed
193
194
195
196
197
198
199
200
    Qt4ProFileNode *createSubProFileNode(const QString &path);

    QStringList uiDirPaths(ProFileReader *reader) const;
    QStringList mocDirPaths(ProFileReader *reader) const;
    QStringList includePaths(ProFileReader *reader) const;
    QStringList subDirsPaths(ProFileReader *reader) const;
    QStringList qBuildSubDirsPaths(const QString &scanDir)  const;

201

con's avatar
con committed
202
203
204
205
206
207

    void invalidate();

    Qt4ProjectType m_projectType;
    QHash<Qt4Variable, QStringList> m_varValues;
    bool m_isQBuildProject;
208
    QTimer m_updateTimer;
con's avatar
con committed
209

210
    QMap<QString, QDateTime> m_uitimestamps;
con's avatar
con committed
211
212
213
    friend class Qt4NodeHierarchy;
};

214
215
class Qt4NodesWatcher : public ProjectExplorer::NodesWatcher
{
con's avatar
con committed
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
    Q_OBJECT
    Q_DISABLE_COPY(Qt4NodesWatcher)
public:
    Qt4NodesWatcher(QObject *parent = 0);

signals:
    void projectTypeChanged(Qt4ProjectManager::Internal::Qt4ProFileNode *projectNode,
                            const Qt4ProjectManager::Internal::Qt4ProjectType oldType,
                            const Qt4ProjectManager::Internal::Qt4ProjectType newType);

    void variablesChanged(Qt4ProFileNode *projectNode,
                          const QHash<Qt4Variable, QStringList> &oldValues,
                          const QHash<Qt4Variable, QStringList> &newValues);

    void proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *projectNode);

private:
    // let them emit signals
    friend class Qt4ProFileNode;
    friend class Qt4PriFileNode;
};

} // namespace Internal
} // namespace Qt4ProjectManager

#endif // QT4NODES_H