OSDN Git Service

6cf057442bd96d1fd8f1dab164e1f2c56c77b551
[qt-creator-jp/qt-creator-jp.git] / src / plugins / qmlprojectmanager / qmlprojectnodes.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
8 **
9 ** No Commercial Usage
10 **
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 **
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights.  These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
31 **
32 **************************************************************************/
33
34 #include "qmlprojectnodes.h"
35 #include "qmlprojectmanager.h"
36 #include "qmlproject.h"
37
38 #include <coreplugin/ifile.h>
39 #include <coreplugin/fileiconprovider.h>
40 #include <projectexplorer/projectexplorer.h>
41
42 #include <QtCore/QFileInfo>
43 #include <QtCore/QDir>
44 #include <QtCore/QTextStream>
45 #include <QtGui/QStyle>
46
47 namespace QmlProjectManager {
48 namespace Internal {
49
50 QmlProjectNode::QmlProjectNode(QmlProject *project, Core::IFile *projectFile)
51     : ProjectExplorer::ProjectNode(QFileInfo(projectFile->fileName()).absoluteFilePath()),
52       m_project(project),
53       m_projectFile(projectFile)
54 {
55     setDisplayName(QFileInfo(projectFile->fileName()).completeBaseName());
56     // make overlay
57     const QSize desiredSize = QSize(16, 16);
58     const QIcon projectBaseIcon(QLatin1String(":/qmlproject/images/qmlfolder.png"));
59     const QPixmap projectPixmap = Core::FileIconProvider::overlayIcon(QStyle::SP_DirIcon,
60                                                                       projectBaseIcon,
61                                                                       desiredSize);
62     setIcon(QIcon(projectPixmap));
63 }
64
65 QmlProjectNode::~QmlProjectNode()
66 { }
67
68 Core::IFile *QmlProjectNode::projectFile() const
69 { return m_projectFile; }
70
71 QString QmlProjectNode::projectFilePath() const
72 { return m_projectFile->fileName(); }
73
74 void QmlProjectNode::refresh()
75 {
76     using namespace ProjectExplorer;
77
78     // remove the existing nodes.
79     removeFileNodes(fileNodes(), this);
80     removeFolderNodes(subFolderNodes(), this);
81
82     //ProjectExplorerPlugin::instance()->setCurrentNode(0); // ### remove me
83
84     FileNode *projectFilesNode = new FileNode(m_project->filesFileName(),
85                                               ProjectFileType,
86                                               /* generated = */ false);
87
88     QStringList files = m_project->files();
89     files.removeAll(m_project->filesFileName());
90
91     addFileNodes(QList<FileNode *>()
92                  << projectFilesNode,
93                  this);
94
95     QHash<QString, QStringList> filesInDirectory;
96
97     foreach (const QString &fileName, files) {
98         QFileInfo fileInfo(fileName);
99
100         QString absoluteFilePath;
101         QString relativeDirectory;
102
103         if (fileInfo.isAbsolute()) {
104             // plain old file format
105             absoluteFilePath = fileInfo.filePath();
106             relativeDirectory = m_project->projectDir().relativeFilePath(fileInfo.path());
107         } else {
108             absoluteFilePath = m_project->projectDir().absoluteFilePath(fileInfo.filePath());
109             relativeDirectory = fileInfo.path();
110             if (relativeDirectory == ".")
111                 relativeDirectory.clear();
112         }
113
114         filesInDirectory[relativeDirectory].append(absoluteFilePath);
115     }
116
117     foreach (const QString &directory, filesInDirectory.keys()) {
118         FolderNode *folder = findOrCreateFolderByName(directory);
119
120         QList<FileNode *> fileNodes;
121         foreach (const QString &file, filesInDirectory.value(directory)) {
122             FileType fileType = SourceType; // ### FIXME
123             FileNode *fileNode = new FileNode(file, fileType, /*generated = */ false);
124             fileNodes.append(fileNode);
125         }
126
127         addFileNodes(fileNodes, folder);
128     }
129
130     m_folderByName.clear();
131 }
132
133 ProjectExplorer::FolderNode *QmlProjectNode::findOrCreateFolderByName(const QStringList &components, int end)
134 {
135     if (! end)
136         return 0;
137
138     QString baseDir = QFileInfo(path()).path();
139
140     QString folderName;
141     for (int i = 0; i < end; ++i) {
142         folderName.append(components.at(i));
143         folderName += QLatin1Char('/'); // ### FIXME
144     }
145
146     const QString component = components.at(end - 1);
147
148     if (component.isEmpty())
149         return this;
150
151     else if (FolderNode *folder = m_folderByName.value(folderName))
152         return folder;
153
154     FolderNode *folder = new FolderNode(baseDir + '/' + folderName);
155     folder->setDisplayName(component);
156
157     m_folderByName.insert(folderName, folder);
158
159     FolderNode *parent = findOrCreateFolderByName(components, end - 1);
160     if (! parent)
161         parent = this;
162
163     addFolderNodes(QList<FolderNode*>() << folder, parent);
164
165     return folder;
166 }
167
168 ProjectExplorer::FolderNode *QmlProjectNode::findOrCreateFolderByName(const QString &filePath)
169 {
170     QStringList components = filePath.split(QLatin1Char('/'));
171     return findOrCreateFolderByName(components, components.length());
172 }
173
174 bool QmlProjectNode::hasBuildTargets() const
175 {
176     return true;
177 }
178
179 QList<ProjectExplorer::ProjectNode::ProjectAction> QmlProjectNode::supportedActions(Node *node) const
180 {
181     Q_UNUSED(node);
182     QList<ProjectAction> actions;
183     actions.append(AddNewFile);
184     actions.append(EraseFile);
185     actions.append(Rename);
186     return actions;
187 }
188
189 bool QmlProjectNode::canAddSubProject(const QString &proFilePath) const
190 {
191     Q_UNUSED(proFilePath)
192     return false;
193 }
194
195 bool QmlProjectNode::addSubProjects(const QStringList &proFilePaths)
196 {
197     Q_UNUSED(proFilePaths)
198     return false;
199 }
200
201 bool QmlProjectNode::removeSubProjects(const QStringList &proFilePaths)
202 {
203     Q_UNUSED(proFilePaths)
204     return false;
205 }
206
207 bool QmlProjectNode::addFiles(const ProjectExplorer::FileType /*fileType*/,
208                               const QStringList &filePaths, QStringList * /*notAdded*/)
209 {
210     return m_project->addFiles(filePaths);
211 }
212
213 bool QmlProjectNode::removeFiles(const ProjectExplorer::FileType /*fileType*/,
214                                  const QStringList & /*filePaths*/, QStringList * /*notRemoved*/)
215 {
216     return false;
217 }
218
219 bool QmlProjectNode::deleteFiles(const ProjectExplorer::FileType /*fileType*/,
220                                  const QStringList & /*filePaths*/)
221 {
222     return true;
223 }
224
225 bool QmlProjectNode::renameFile(const ProjectExplorer::FileType /*fileType*/,
226                                     const QString & /*filePath*/, const QString & /*newFilePath*/)
227 {
228     return true;
229 }
230
231 QList<ProjectExplorer::RunConfiguration *> QmlProjectNode::runConfigurationsFor(Node *node)
232 {
233     Q_UNUSED(node)
234     return QList<ProjectExplorer::RunConfiguration *>();
235 }
236
237 } // namespace Internal
238 } // namespace QmlProjectManager