OSDN Git Service

56504d56ec6bf87b304e193d80e40725b50b0d78
[qt-creator-jp/qt-creator-jp.git] / src / plugins / genericprojectmanager / genericprojectnodes.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 "genericprojectnodes.h"
35 #include "genericproject.h"
36
37 #include <coreplugin/ifile.h>
38 #include <projectexplorer/projectexplorer.h>
39
40 #include <QtCore/QFileInfo>
41
42 using namespace GenericProjectManager;
43 using namespace GenericProjectManager::Internal;
44
45 GenericProjectNode::GenericProjectNode(GenericProject *project, Core::IFile *projectFile)
46     : ProjectExplorer::ProjectNode(projectFile->fileName()),
47       m_project(project),
48       m_projectFile(projectFile)
49 {
50     setDisplayName(QFileInfo(projectFile->fileName()).completeBaseName());
51 }
52
53 GenericProjectNode::~GenericProjectNode()
54 { }
55
56 Core::IFile *GenericProjectNode::projectFile() const
57 { return m_projectFile; }
58
59 QString GenericProjectNode::projectFilePath() const
60 { return m_projectFile->fileName(); }
61
62 void GenericProjectNode::refresh()
63 {
64     using namespace ProjectExplorer;
65
66     // remove the existing nodes.
67     removeFileNodes(fileNodes(), this);
68     removeFolderNodes(subFolderNodes(), this);
69
70     //ProjectExplorerPlugin::instance()->setCurrentNode(0); // ### remove me
71
72     FileNode *projectFilesNode = new FileNode(m_project->filesFileName(),
73                                               ProjectFileType,
74                                               /* generated = */ false);
75
76     FileNode *projectIncludesNode = new FileNode(m_project->includesFileName(),
77                                                  ProjectFileType,
78                                                  /* generated = */ false);
79
80     FileNode *projectConfigNode = new FileNode(m_project->configFileName(),
81                                                ProjectFileType,
82                                                /* generated = */ false);
83
84     QStringList files = m_project->files();
85     files.removeAll(m_project->filesFileName());
86     files.removeAll(m_project->includesFileName());
87     files.removeAll(m_project->configFileName());
88
89     addFileNodes(QList<FileNode *>()
90                  << projectFilesNode
91                  << projectIncludesNode
92                  << projectConfigNode,
93                  this);
94
95     QStringList filePaths;
96     QHash<QString, QStringList> filesInPath;
97     const QString base = QFileInfo(path()).absolutePath();
98     const QDir baseDir(base);
99
100     foreach (const QString &absoluteFileName, files) {
101         QFileInfo fileInfo(absoluteFileName);
102         const QString absoluteFilePath = fileInfo.path();
103         QString relativeFilePath;
104
105         if (absoluteFilePath.startsWith(base)) {
106             relativeFilePath = absoluteFilePath.mid(base.length() + 1);
107         } else {
108             // `file' is not part of the project.
109             relativeFilePath = baseDir.relativeFilePath(absoluteFilePath);
110         }
111
112         if (! filePaths.contains(relativeFilePath))
113             filePaths.append(relativeFilePath);
114
115         filesInPath[relativeFilePath].append(absoluteFileName);
116     }
117
118     foreach (const QString &filePath, filePaths) {
119         FolderNode *folder = findOrCreateFolderByName(filePath);
120
121         QList<FileNode *> fileNodes;
122         foreach (const QString &file, filesInPath.value(filePath)) {
123             FileType fileType = SourceType; // ### FIXME
124             FileNode *fileNode = new FileNode(file, fileType, /*generated = */ false);
125             fileNodes.append(fileNode);
126         }
127
128         addFileNodes(fileNodes, folder);
129     }
130
131     m_folderByName.clear();
132 }
133
134 ProjectExplorer::FolderNode *GenericProjectNode::findOrCreateFolderByName(const QStringList &components, int end)
135 {
136     if (! end)
137         return 0;
138
139     QString folderName;
140     for (int i = 0; i < end; ++i) {
141         folderName.append(components.at(i));
142         folderName += QLatin1Char('/'); // ### FIXME
143     }
144
145     const QString component = components.at(end - 1);
146
147     if (component.isEmpty())
148         return this;
149
150     else if (FolderNode *folder = m_folderByName.value(folderName))
151         return folder;
152
153     const QString baseDir = QFileInfo(path()).path();
154     FolderNode *folder = new FolderNode(baseDir + QLatin1Char('/') + folderName);
155     folder->setDisplayName(component);
156     m_folderByName.insert(folderName, folder);
157
158     FolderNode *parent = findOrCreateFolderByName(components, end - 1);
159     if (! parent)
160         parent = this;
161     addFolderNodes(QList<FolderNode*>() << folder, parent);
162
163     return folder;
164 }
165
166 ProjectExplorer::FolderNode *GenericProjectNode::findOrCreateFolderByName(const QString &filePath)
167 {
168     QStringList components = filePath.split(QLatin1Char('/'));
169     return findOrCreateFolderByName(components, components.length());
170 }
171
172 bool GenericProjectNode::hasBuildTargets() const
173 {
174     return true;
175 }
176
177 QList<ProjectExplorer::ProjectNode::ProjectAction> GenericProjectNode::supportedActions(Node *node) const
178 {
179     Q_UNUSED(node);
180     return QList<ProjectAction>()
181         << AddNewFile
182         << AddExistingFile
183         << RemoveFile;
184 }
185
186 bool GenericProjectNode::canAddSubProject(const QString &proFilePath) const
187 {
188     Q_UNUSED(proFilePath)
189     return false;
190 }
191
192 bool GenericProjectNode::addSubProjects(const QStringList &proFilePaths)
193 {
194     Q_UNUSED(proFilePaths)
195     return false;
196 }
197
198 bool GenericProjectNode::removeSubProjects(const QStringList &proFilePaths)
199 {
200     Q_UNUSED(proFilePaths)
201     return false;
202 }
203
204 bool GenericProjectNode::addFiles(const ProjectExplorer::FileType fileType,
205                                   const QStringList &filePaths, QStringList *notAdded)
206 {
207     Q_UNUSED(fileType)
208     Q_UNUSED(notAdded)
209
210     return m_project->addFiles(filePaths);
211 }
212
213 bool GenericProjectNode::removeFiles(const ProjectExplorer::FileType fileType,
214                                      const QStringList &filePaths, QStringList *notRemoved)
215 {
216     Q_UNUSED(fileType)
217     Q_UNUSED(notRemoved)
218
219     return m_project->removeFiles(filePaths);
220 }
221
222 bool GenericProjectNode::deleteFiles(const ProjectExplorer::FileType fileType,
223                                      const QStringList &filePaths)
224 {
225     Q_UNUSED(fileType)
226     Q_UNUSED(filePaths)
227     return false;
228 }
229
230 bool GenericProjectNode::renameFile(const ProjectExplorer::FileType fileType,
231                                     const QString &filePath, const QString &newFilePath)
232 {
233     Q_UNUSED(fileType)
234     Q_UNUSED(filePath)
235     Q_UNUSED(newFilePath)
236     return false;
237 }
238
239 QList<ProjectExplorer::RunConfiguration *> GenericProjectNode::runConfigurationsFor(Node *node)
240 {
241     Q_UNUSED(node)
242     return QList<ProjectExplorer::RunConfiguration *>();
243 }