diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp index 3d5bc3e4ce28af079b026a80df2f0b23e5ad7bcf..2be47bdfe337f0f769f254f84d347271d19cd1bb 100644 --- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp +++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp @@ -61,6 +61,92 @@ static QStringList convertToAbsoluteFiles(const QDir &dir, const QStringList &pa return absolutePaths; } +void GenericProjectNode::refresh() +{ + using namespace ProjectExplorer; + + // remove the existing nodes. + removeFileNodes(fileNodes(), this); + removeFolderNodes(subFolderNodes(), this); + + QDir projectPath(path()); + QSettings projectInfo(projectFilePath(), QSettings::IniFormat); + + _files = convertToAbsoluteFiles(projectPath, projectInfo.value(QLatin1String("files")).toStringList()); + _generated = convertToAbsoluteFiles(projectPath, projectInfo.value(QLatin1String("generated")).toStringList()); + _includePaths = convertToAbsoluteFiles(projectPath, projectInfo.value(QLatin1String("includes")).toStringList()); + _defines = projectInfo.value(QLatin1String("defines")).toStringList(); + _toolChainId = projectInfo.value(QLatin1String("toolchain"), QLatin1String("gcc")).toString().toLower(); + + FileNode *projectFileNode = new FileNode(projectFilePath(), ProjectFileType, + /* generated = */ false); + + addFileNodes(QList<FileNode *>() << projectFileNode, this); + + QStringList filePaths; + QHash<QString, QStringList> filesInPath; + + foreach (const QString &absoluteFileName, _files) { + QFileInfo fileInfo(absoluteFileName); + const QString absoluteFilePath = fileInfo.path(); + + if (! absoluteFilePath.startsWith(path())) + continue; // `file' is not part of the project. + + const QString relativeFilePath = absoluteFilePath.mid(path().length() + 1); + + if (! filePaths.contains(relativeFilePath)) + filePaths.append(relativeFilePath); + + filesInPath[relativeFilePath].append(absoluteFileName); + } + + foreach (const QString &filePath, filePaths) { + FolderNode *folder = findOrCreateFolderByName(filePath); + + QList<FileNode *> fileNodes; + foreach (const QString &file, filesInPath.value(filePath)) { + FileType fileType = SourceType; // ### FIXME + FileNode *fileNode = new FileNode(file, fileType, /*generated = */ false); + fileNodes.append(fileNode); + } + + addFileNodes(fileNodes, folder); + } +} + +ProjectExplorer::FolderNode *GenericProjectNode::findOrCreateFolderByName(const QStringList &components, int end) +{ + if (! end) + return 0; + + QString folderName; + for (int i = 0; i < end; ++i) { + folderName.append(components.at(i)); + folderName += QLatin1Char('/'); // ### FIXME + } + + FolderNode *folder = _folderByName.value(folderName); + if (! folder) { + folder = new FolderNode(components.at(end - 1)); + _folderByName.insert(folderName, folder); + + FolderNode *parent = findOrCreateFolderByName(components, end - 1); + if (! parent) + parent = this; + addFolderNodes(QList<FolderNode*>() << folder, parent); + } + + return folder; +} + +ProjectExplorer::FolderNode *GenericProjectNode::findOrCreateFolderByName(const QString &filePath) +{ + QStringList components = filePath.split(QLatin1Char('/')); + return findOrCreateFolderByName(components, components.length()); +} + +#if 0 void GenericProjectNode::refresh() { using namespace ProjectExplorer; @@ -133,6 +219,7 @@ void GenericProjectNode::refresh() addFileNodes(fileNodes, folder); } } +#endif QStringList GenericProjectNode::files() const { return _files; } diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.h b/src/plugins/genericprojectmanager/genericprojectnodes.h index 6a44b778bc7fdb19232060b92fc67720f8458bf6..d393b03d5d9f03094ff768d9ef0fb215588979b8 100644 --- a/src/plugins/genericprojectmanager/genericprojectnodes.h +++ b/src/plugins/genericprojectmanager/genericprojectnodes.h @@ -33,6 +33,7 @@ #include <coreplugin/ifile.h> #include <projectexplorer/projectnodes.h> #include <QStringList> +#include <QHash> namespace GenericProjectManager { namespace Internal { @@ -74,6 +75,10 @@ public: QStringList defines() const; QString toolChainId() const; +private: + FolderNode *findOrCreateFolderByName(const QString &filePath); + FolderNode *findOrCreateFolderByName(const QStringList &components, int end); + private: Core::IFile *_projectFile; QStringList _files; @@ -81,6 +86,8 @@ private: QStringList _includePaths; QStringList _defines; QString _toolChainId; + + QHash<QString, FolderNode *> _folderByName; }; } // namespace Internal