1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
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
16 ** GNU Lesser General Public License Usage
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.
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.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
34 #include "qmlprojectnodes.h"
35 #include "qmlprojectmanager.h"
36 #include "qmlproject.h"
38 #include <coreplugin/ifile.h>
39 #include <coreplugin/fileiconprovider.h>
40 #include <projectexplorer/projectexplorer.h>
42 #include <QtCore/QFileInfo>
43 #include <QtCore/QDir>
44 #include <QtCore/QTextStream>
45 #include <QtGui/QStyle>
47 namespace QmlProjectManager {
50 QmlProjectNode::QmlProjectNode(QmlProject *project, Core::IFile *projectFile)
51 : ProjectExplorer::ProjectNode(QFileInfo(projectFile->fileName()).absoluteFilePath()),
53 m_projectFile(projectFile)
55 setDisplayName(QFileInfo(projectFile->fileName()).completeBaseName());
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,
62 setIcon(QIcon(projectPixmap));
65 QmlProjectNode::~QmlProjectNode()
68 Core::IFile *QmlProjectNode::projectFile() const
69 { return m_projectFile; }
71 QString QmlProjectNode::projectFilePath() const
72 { return m_projectFile->fileName(); }
74 void QmlProjectNode::refresh()
76 using namespace ProjectExplorer;
78 // remove the existing nodes.
79 removeFileNodes(fileNodes(), this);
80 removeFolderNodes(subFolderNodes(), this);
82 //ProjectExplorerPlugin::instance()->setCurrentNode(0); // ### remove me
84 FileNode *projectFilesNode = new FileNode(m_project->filesFileName(),
86 /* generated = */ false);
88 QStringList files = m_project->files();
89 files.removeAll(m_project->filesFileName());
91 addFileNodes(QList<FileNode *>()
95 QHash<QString, QStringList> filesInDirectory;
97 foreach (const QString &fileName, files) {
98 QFileInfo fileInfo(fileName);
100 QString absoluteFilePath;
101 QString relativeDirectory;
103 if (fileInfo.isAbsolute()) {
104 // plain old file format
105 absoluteFilePath = fileInfo.filePath();
106 relativeDirectory = m_project->projectDir().relativeFilePath(fileInfo.path());
108 absoluteFilePath = m_project->projectDir().absoluteFilePath(fileInfo.filePath());
109 relativeDirectory = fileInfo.path();
110 if (relativeDirectory == ".")
111 relativeDirectory.clear();
114 filesInDirectory[relativeDirectory].append(absoluteFilePath);
117 foreach (const QString &directory, filesInDirectory.keys()) {
118 FolderNode *folder = findOrCreateFolderByName(directory);
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);
127 addFileNodes(fileNodes, folder);
130 m_folderByName.clear();
133 ProjectExplorer::FolderNode *QmlProjectNode::findOrCreateFolderByName(const QStringList &components, int end)
138 QString baseDir = QFileInfo(path()).path();
141 for (int i = 0; i < end; ++i) {
142 folderName.append(components.at(i));
143 folderName += QLatin1Char('/'); // ### FIXME
146 const QString component = components.at(end - 1);
148 if (component.isEmpty())
151 else if (FolderNode *folder = m_folderByName.value(folderName))
154 FolderNode *folder = new FolderNode(baseDir + '/' + folderName);
155 folder->setDisplayName(component);
157 m_folderByName.insert(folderName, folder);
159 FolderNode *parent = findOrCreateFolderByName(components, end - 1);
163 addFolderNodes(QList<FolderNode*>() << folder, parent);
168 ProjectExplorer::FolderNode *QmlProjectNode::findOrCreateFolderByName(const QString &filePath)
170 QStringList components = filePath.split(QLatin1Char('/'));
171 return findOrCreateFolderByName(components, components.length());
174 bool QmlProjectNode::hasBuildTargets() const
179 QList<ProjectExplorer::ProjectNode::ProjectAction> QmlProjectNode::supportedActions(Node *node) const
182 QList<ProjectAction> actions;
183 actions.append(AddNewFile);
184 actions.append(EraseFile);
185 actions.append(Rename);
189 bool QmlProjectNode::canAddSubProject(const QString &proFilePath) const
191 Q_UNUSED(proFilePath)
195 bool QmlProjectNode::addSubProjects(const QStringList &proFilePaths)
197 Q_UNUSED(proFilePaths)
201 bool QmlProjectNode::removeSubProjects(const QStringList &proFilePaths)
203 Q_UNUSED(proFilePaths)
207 bool QmlProjectNode::addFiles(const ProjectExplorer::FileType /*fileType*/,
208 const QStringList &filePaths, QStringList * /*notAdded*/)
210 return m_project->addFiles(filePaths);
213 bool QmlProjectNode::removeFiles(const ProjectExplorer::FileType /*fileType*/,
214 const QStringList & /*filePaths*/, QStringList * /*notRemoved*/)
219 bool QmlProjectNode::deleteFiles(const ProjectExplorer::FileType /*fileType*/,
220 const QStringList & /*filePaths*/)
225 bool QmlProjectNode::renameFile(const ProjectExplorer::FileType /*fileType*/,
226 const QString & /*filePath*/, const QString & /*newFilePath*/)
231 QList<ProjectExplorer::RunConfiguration *> QmlProjectNode::runConfigurationsFor(Node *node)
234 return QList<ProjectExplorer::RunConfiguration *>();
237 } // namespace Internal
238 } // namespace QmlProjectManager