diff options
author | Radovan Zivkovic <pivonroll@gmail.com> | 2013-09-24 00:59:52 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-03-11 19:54:57 +0100 |
commit | a5d062b9db49e3ff36eccd37c338a1b2a158e40c (patch) | |
tree | 043d2b715841df34b7f611813da53257dd4945a1 | |
parent | 4e787157b6a8cbf61cfb210d90d890d8a1399958 (diff) | |
download | qt-creator-a5d062b9db49e3ff36eccd37c338a1b2a158e40c.tar.gz |
Filter and Folder classes now implement IFileContainer interface.
Change-Id: If6aca14658c1242e37b17f7fda64dab0949bdf42
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
15 files changed, 471 insertions, 515 deletions
diff --git a/src/plugins/vcprojectmanager/interfaces/ifile.h b/src/plugins/vcprojectmanager/interfaces/ifile.h index 85f74e34e5..033e1a70c0 100644 --- a/src/plugins/vcprojectmanager/interfaces/ifile.h +++ b/src/plugins/vcprojectmanager/interfaces/ifile.h @@ -31,6 +31,7 @@ #define VCPROJECTMANAGER_INTERNAL_IFILE_H #include <QString> +#include <projectexplorer/projectnodes.h> #include "../vcprojectmodel/ivcprojectnodemodel.h" @@ -48,8 +49,11 @@ public: virtual QString relativePath() const = 0; virtual void setRelativePath(const QString &path) = 0; + virtual QString canonicalPath() const = 0; virtual ConfigurationContainer* configurationContainer() const = 0; virtual IAttributeContainer* attributeContainer() const = 0; + virtual IFile* clone() const = 0; + virtual ProjectExplorer::FileType fileType() const = 0; }; } // namespace Internal diff --git a/src/plugins/vcprojectmanager/interfaces/ifilecontainer.h b/src/plugins/vcprojectmanager/interfaces/ifilecontainer.h new file mode 100644 index 0000000000..9ba14d0ac1 --- /dev/null +++ b/src/plugins/vcprojectmanager/interfaces/ifilecontainer.h @@ -0,0 +1,70 @@ +/************************************************************************** +** +** Copyright (c) 2013 Bojan Petrovic +** Copyright (c) 2013 Radovan Zivkovic +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** 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. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ +#ifndef VCPROJECTMANAGER_INTERNAL_IFILECONTAINER_H +#define VCPROJECTMANAGER_INTERNAL_IFILECONTAINER_H + +#include "../vcprojectmodel/ivcprojectnodemodel.h" + +namespace VcProjectManager { +namespace Internal { + +class IFile; +class IAttributeContainer; + +class IFileContainer : public IVcProjectXMLNode +{ +public: + virtual ~IFileContainer() {} + + virtual QString containerType() const = 0; + + virtual void addFile(IFile *file) = 0; + virtual IFile* file(int index) const = 0; + virtual int fileCount() const = 0; + virtual void removeFile(IFile *file) = 0; + + virtual void addFileContainer(IFileContainer *fileContainer) = 0; + virtual int childCount() const = 0; + virtual IFileContainer* fileContainer(int index) const = 0; + virtual void removeFileContainer(IFileContainer *fileContainer) = 0; + virtual IAttributeContainer *attributeContainer() const = 0; + + virtual QString name() const = 0; + virtual void setName(const QString &name) = 0; + + virtual void allFiles(QStringList &sl) const = 0; + virtual bool fileExists(const QString &relativeFilePath) const = 0; + virtual IFileContainer* clone() const = 0; +}; + +} // namespace Internal +} // namespace VcProjectManager + +#endif // VCPROJECTMANAGER_INTERNAL_IFILECONTAINER_H diff --git a/src/plugins/vcprojectmanager/interfaces/interfaces.pri b/src/plugins/vcprojectmanager/interfaces/interfaces.pri index 14c2940c27..2adb38ad3c 100644 --- a/src/plugins/vcprojectmanager/interfaces/interfaces.pri +++ b/src/plugins/vcprojectmanager/interfaces/interfaces.pri @@ -11,4 +11,4 @@ HEADERS += \ interfaces/iattributedescriptiondataitem.h \ interfaces/iconfigurations.h \ interfaces/ifile.h \ - interfaces/ifile.h + interfaces/ifilecontainer.h diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/file.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/file.cpp index 9d002ddd77..f38f7736ab 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/file.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/file.cpp @@ -156,6 +156,11 @@ void File::setRelativePath(const QString &relativePath) m_relativePath = relativePath; } +IFile *File::clone() const +{ + return new File(*this); +} + ProjectExplorer::FileType File::fileType() const { const Core::MimeDatabase *mdb = Core::ICore::mimeDatabase(); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/file.h b/src/plugins/vcprojectmanager/vcprojectmodel/file.h index f5615490db..2b40a4629b 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/file.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/file.h @@ -63,7 +63,7 @@ public: QString relativePath() const; void setRelativePath(const QString &relativePath); - + IFile* clone() const; ProjectExplorer::FileType fileType() const; QString canonicalPath() const; private: diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/files.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/files.cpp index f8317da2cd..f951875312 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/files.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/files.cpp @@ -63,10 +63,10 @@ QDomNode Files::toXMLDomNode(QDomDocument &domXMLDocument) const { QDomElement fileNode = domXMLDocument.createElement(QLatin1String("Files")); - foreach (const File::Ptr &file, m_files) + foreach (IFile *file, m_files) fileNode.appendChild(file->toXMLDomNode(domXMLDocument)); - foreach (const Filter::Ptr &filter, m_filters) + foreach (IFileContainer *filter, m_filters) fileNode.appendChild(filter->toXMLDomNode(domXMLDocument)); return fileNode; @@ -77,12 +77,12 @@ bool Files::isEmpty() const return m_files.isEmpty() && m_filters.isEmpty(); } -void Files::addFilter(Filter::Ptr newFilter) +void Files::addFilter(IFileContainer *newFilter) { if (m_filters.contains(newFilter)) return; - foreach (const Filter::Ptr &filter, m_filters) { + foreach (IFileContainer *filter, m_filters) { if (filter->name() == newFilter->name()) return; } @@ -90,14 +90,14 @@ void Files::addFilter(Filter::Ptr newFilter) m_filters.append(newFilter); } -void Files::removeFilter(Filter::Ptr filter) +void Files::removeFilter(IFileContainer *filter) { m_filters.removeAll(filter); } void Files::removeFilter(const QString &filterName) { - foreach (const Filter::Ptr &filter, m_filters) { + foreach (IFileContainer *filter, m_filters) { if (filter->name() == filterName) { removeFilter(filter); return; @@ -105,26 +105,17 @@ void Files::removeFilter(const QString &filterName) } } -QList<Filter::Ptr> Files::filters() const +QList<IFileContainer *> Files::fileContainers() const { return m_filters; } -Filter::Ptr Files::filter(const QString &filterName) const -{ - foreach (const Filter::Ptr &filter, m_filters) { - if (filter->name() == filterName) - return filter; - } - return Filter::Ptr(); -} - -void Files::addFile(File::Ptr newFile) +void Files::addFile(IFile *newFile) { if (m_files.contains(newFile)) return; - foreach (const File::Ptr &file, m_files) { + foreach (IFile *file, m_files) { if (file->relativePath() == newFile->relativePath()) return; } @@ -132,33 +123,33 @@ void Files::addFile(File::Ptr newFile) m_files.append(newFile); } -void Files::removeFile(File::Ptr file) +void Files::removeFile(IFile *file) { m_files.removeAll(file); } -QList<File::Ptr> Files::files() const +QList<IFile *> Files::files() const { return m_files; } -File::Ptr Files::file(const QString &relativePath) const +IFile* Files::file(const QString &relativePath) const { - foreach (const File::Ptr &file, m_files) { + foreach (IFile *file, m_files) { if (file->relativePath() == relativePath) return file; } - return File::Ptr(); + return 0; } bool Files::fileExists(const QString &relativeFilePath) const { - foreach (const File::Ptr &filePtr, m_files) { + foreach (IFile *filePtr, m_files) { if (filePtr->relativePath() == relativeFilePath) return true; } - foreach (const Filter::Ptr &filterPtr, m_filters) { + foreach (IFileContainer *filterPtr, m_filters) { if (filterPtr->fileExists(relativeFilePath)) return true; } @@ -168,10 +159,10 @@ bool Files::fileExists(const QString &relativeFilePath) const void Files::allProjectFiles(QStringList &sl) const { - foreach (const Filter::Ptr &filter, m_filters) + foreach (IFileContainer *filter, m_filters) filter->allFiles(sl); - foreach (const File::Ptr &file, m_files) + foreach (IFile *file, m_files) sl.append(file->canonicalPath()); } @@ -185,11 +176,11 @@ Files::Files(const Files &files) m_files.clear(); m_filters.clear(); - foreach (const File::Ptr &file, files.m_files) - m_files.append(File::Ptr(new File(*file))); + foreach (IFile *file, files.m_files) + m_files.append(file->clone()); - foreach (const Filter::Ptr &filter, files.m_filters) - m_filters.append(Filter::Ptr(new Filter(*filter))); + foreach (IFileContainer *filter, files.m_filters) + m_filters.append(filter->clone()); } Files &Files::operator=(const Files &files) @@ -198,18 +189,18 @@ Files &Files::operator=(const Files &files) m_files.clear(); m_filters.clear(); - foreach (const File::Ptr &file, files.m_files) - m_files.append(File::Ptr(new File(*file))); + foreach (IFile *file, files.m_files) + m_files.append(file->clone()); - foreach (const Filter::Ptr &filter, files.m_filters) - m_filters.append(Filter::Ptr(new Filter(*filter))); + foreach (IFileContainer *filter, files.m_filters) + m_filters.append(filter->clone()); } return *this; } void Files::processFile(const QDomNode &fileNode) { - File::Ptr file(new File(m_parentProject)); + IFile *file = new File(m_parentProject); file->processNode(fileNode); m_files.append(file); @@ -225,7 +216,7 @@ void Files::processFile(const QDomNode &fileNode) void Files::processFilter(const QDomNode &filterNode) { - Filter::Ptr filter(new Filter(m_parentProject)); + IFileContainer *filter = new Filter(QLatin1String("Filter"), m_parentProject); filter->processNode(filterNode); m_filters.append(filter); @@ -277,8 +268,8 @@ Files2005::Files2005(const Files2005 &files) { m_folders.clear(); - foreach (const Folder::Ptr &folder, files.m_folders) - m_folders.append(Folder::Ptr(new Folder(*folder))); + foreach (IFileContainer *folder, files.m_folders) + m_folders.append(folder->clone()); } Files2005 &Files2005::operator=(const Files2005 &files) @@ -287,8 +278,8 @@ Files2005 &Files2005::operator=(const Files2005 &files) Files::operator =(files); m_folders.clear(); - foreach (const Folder::Ptr &folder, files.m_folders) - m_folders.append(Folder::Ptr(new Folder(*folder))); + foreach (IFileContainer *folder, files.m_folders) + m_folders.append(folder->clone()); } return *this; } @@ -320,13 +311,13 @@ QDomNode Files2005::toXMLDomNode(QDomDocument &domXMLDocument) const { QDomElement fileNode = domXMLDocument.createElement(QLatin1String("Files")); - foreach (const File::Ptr &file, m_files) + foreach (IFile *file, m_files) fileNode.appendChild(file->toXMLDomNode(domXMLDocument)); - foreach (const Filter::Ptr &filter, m_filters) + foreach (IFileContainer *filter, m_filters) fileNode.appendChild(filter->toXMLDomNode(domXMLDocument)); - foreach (const Folder::Ptr &folder, m_folders) + foreach (IFileContainer *folder, m_folders) fileNode.appendChild(folder->toXMLDomNode(domXMLDocument)); return fileNode; @@ -344,17 +335,17 @@ Files *Files2005::clone() const bool Files2005::fileExists(const QString &relativeFilePath) const { - foreach (const File::Ptr &filePtr, m_files) { + foreach (IFile *filePtr, m_files) { if (filePtr->relativePath() == relativeFilePath) return true; } - foreach (const Filter::Ptr &filterPtr, m_filters) { + foreach (IFileContainer *filterPtr, m_filters) { if (filterPtr->fileExists(relativeFilePath)) return true; } - foreach (const Folder::Ptr &folderPtr, m_folders) { + foreach (IFileContainer *folderPtr, m_folders) { if (folderPtr->fileExists(relativeFilePath)) return true; } @@ -362,12 +353,12 @@ bool Files2005::fileExists(const QString &relativeFilePath) const return false; } -void Files2005::addFolder(Folder::Ptr newFolder) +void Files2005::addFolder(IFileContainer *newFolder) { if (m_folders.contains(newFolder)) return; - foreach (const Folder::Ptr &folder, m_folders) { + foreach (IFileContainer *folder, m_folders) { if (folder->name() == newFolder->name()) return; } @@ -375,50 +366,46 @@ void Files2005::addFolder(Folder::Ptr newFolder) m_folders.append(newFolder); } -void Files2005::removeFolder(Folder::Ptr folder) -{ - m_folders.removeAll(folder); -} - void Files2005::removeFolder(const QString &folderName) { - foreach (const Folder::Ptr &folder, m_folders) { + foreach (IFileContainer *folder, m_folders) { if (folder->name() == folderName) { - removeFolder(folder); + m_folders.removeOne(folder); + delete folder; return; } } } -QList<Folder::Ptr> Files2005::folders() const +QList<IFileContainer *> Files2005::folders() const { return m_folders; } -Folder::Ptr Files2005::folder(const QString &folderName) const +IFileContainer *Files2005::folder(const QString &folderName) const { - foreach (const Folder::Ptr &folder, m_folders) { + foreach (IFileContainer *folder, m_folders) { if (folder->name() == folderName) return folder; } - return Folder::Ptr(); + return 0; } void Files2005::allProjectFiles(QStringList &sl) const { - foreach (const Filter::Ptr &filter, m_filters) + foreach (IFileContainer *filter, m_filters) filter->allFiles(sl); - foreach (const Folder::Ptr &filter, m_folders) + foreach (IFileContainer *filter, m_folders) filter->allFiles(sl); - foreach (const File::Ptr &file, m_files) + foreach (IFile *file, m_files) sl.append(file->canonicalPath()); } void Files2005::processFile(const QDomNode &fileNode) { - File::Ptr file(new File(m_parentProject)); + IFile *file = new File(m_parentProject); file->processNode(fileNode); m_files.append(file); @@ -436,7 +423,7 @@ void Files2005::processFile(const QDomNode &fileNode) void Files2005::processFilter(const QDomNode &filterNode) { - Filter::Ptr filter(new Filter(m_parentProject)); + IFileContainer *filter = new Filter(QLatin1String("Filter"), m_parentProject); filter->processNode(filterNode); m_filters.append(filter); @@ -454,7 +441,7 @@ void Files2005::processFilter(const QDomNode &filterNode) void Files2005::processFolder(const QDomNode &folderNode) { - Folder::Ptr folder(new Folder(m_parentProject)); + IFileContainer *folder = new Folder(QLatin1String("Folder"), m_parentProject); folder->processNode(folderNode); m_folders.append(folder); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/files.h b/src/plugins/vcprojectmanager/vcprojectmodel/files.h index 921e5b20c8..be35e13ff3 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/files.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/files.h @@ -57,16 +57,15 @@ public: */ virtual Files* clone() const = 0; - void addFilter(Filter::Ptr newFilter); - void removeFilter(Filter::Ptr filter); + void addFilter(IFileContainer *newFilter); + void removeFilter(IFileContainer *filter); void removeFilter(const QString &filterName); - QList<Filter::Ptr> filters() const; - Filter::Ptr filter(const QString &filterName) const; + QList<IFileContainer *> fileContainers() const; - void addFile(File::Ptr file); - void removeFile(File::Ptr file); - QList<File::Ptr> files() const; - File::Ptr file(const QString &relativePath) const; + void addFile(IFile *file); + void removeFile(IFile *file); + QList<IFile *> files() const; + IFile *file(const QString &relativePath) const; virtual bool fileExists(const QString &relativeFilePath) const; virtual void allProjectFiles(QStringList &sl) const; @@ -79,8 +78,8 @@ protected: virtual void processFile(const QDomNode &fileNode); virtual void processFilter(const QDomNode &filterNode); - QList<Filter::Ptr> m_filters; - QList<File::Ptr> m_files; + QList<IFileContainer *> m_filters; + QList<IFile *> m_files; VcProjectDocument *m_parentProject; }; @@ -114,11 +113,10 @@ public: Files* clone() const; bool fileExists(const QString &relativeFilePath) const; - void addFolder(Folder::Ptr newFolder); - void removeFolder(Folder::Ptr folder); + void addFolder(IFileContainer *newFolder); void removeFolder(const QString &folderName); - QList<Folder::Ptr> folders() const; - Folder::Ptr folder(const QString &folderName) const; + QList<IFileContainer *> folders() const; + IFileContainer* folder(const QString &folderName) const; void allProjectFiles(QStringList &sl) const; @@ -127,7 +125,7 @@ protected: void processFilter(const QDomNode &filterNode); void processFolder(const QDomNode &folderNode); - QList<Folder::Ptr> m_folders; + QList<IFileContainer *> m_folders; }; class Files2008 : public Files diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/filter.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/filter.cpp index 211516255f..6ca8fd4ce9 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/filter.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/filter.cpp @@ -32,26 +32,31 @@ #include <QFileInfo> #include "vcprojectdocument.h" +#include "generalattributecontainer.h" namespace VcProjectManager { namespace Internal { -Filter::Filter(VcProjectDocument *parentProjectDoc) - : m_parentProjectDoc(parentProjectDoc) +Filter::Filter(const QString &containerType, VcProjectDocument *parentProjectDoc) + : m_parentProjectDoc(parentProjectDoc), + m_containerType(containerType) { + m_attributeContainer = new GeneralAttributeContainer; } Filter::Filter(const Filter &filter) { m_parentProjectDoc = filter.m_parentProjectDoc; - m_anyAttribute = filter.m_anyAttribute; m_name = filter.m_name; + m_containerType = filter.m_containerType; + m_attributeContainer = new GeneralAttributeContainer; + *(m_attributeContainer) = *(filter.m_attributeContainer); - foreach (const File::Ptr &file, filter.m_files) - m_files.append(File::Ptr(new File(*file))); + foreach (IFile *file, filter.m_files) + m_files.append(file->clone()); - foreach (const Filter::Ptr &filt, filter.m_filters) - m_filters.append(Filter::Ptr(new Filter(*filt))); + foreach (IFileContainer *filt, filter.m_fileContainers) + m_fileContainers.append(filt->clone()); } Filter &Filter::operator =(const Filter &filter) @@ -59,21 +64,29 @@ Filter &Filter::operator =(const Filter &filter) if (this != &filter) { m_name = filter.m_name; m_parentProjectDoc = filter.m_parentProjectDoc; - m_anyAttribute = filter.m_anyAttribute; + m_containerType = filter.m_containerType; + *(m_attributeContainer) = *(filter.m_attributeContainer); + m_files.clear(); - m_filters.clear(); + m_fileContainers.clear(); - foreach (const File::Ptr &file, filter.m_files) - m_files.append(File::Ptr(new File(*file))); + foreach (IFile *file, filter.m_files) + m_files.append(file->clone()); - foreach (const Filter::Ptr &filt, filter.m_filters) - m_filters.append(Filter::Ptr(new Filter(*filt))); + foreach (IFileContainer *filt, filter.m_fileContainers) + m_fileContainers.append(filt->clone()); } return *this; } Filter::~Filter() { + delete m_attributeContainer; +} + +QString Filter::containerType() const +{ + return m_containerType; } void Filter::processNode(const QDomNode &node) @@ -104,17 +117,13 @@ QDomNode Filter::toXMLDomNode(QDomDocument &domXMLDocument) const { QDomElement fileNode = domXMLDocument.createElement(QLatin1String("Filter")); fileNode.setAttribute(QLatin1String("Name"), m_name); - QHashIterator<QString, QString> it(m_anyAttribute); - while (it.hasNext()) { - it.next(); - fileNode.setAttribute(it.key(), it.value()); - } + m_attributeContainer->appendToXMLNode(fileNode); - foreach (const File::Ptr &file, m_files) + foreach (IFile *file, m_files) fileNode.appendChild(file->toXMLDomNode(domXMLDocument)); - foreach (const Filter::Ptr &filter, m_filters) + foreach (IFileContainer *filter, m_fileContainers) fileNode.appendChild(filter->toXMLDomNode(domXMLDocument)); return fileNode; @@ -130,45 +139,12 @@ void Filter::setName(const QString &name) m_name = name; } -void Filter::addFilter(Filter::Ptr filter) -{ - if (m_filters.contains(filter)) - return; - - foreach (const Filter::Ptr &filt, m_filters) { - if (filt->name() == filter->name()) - return; - } - - m_filters.append(filter); -} - -void Filter::removeFilter(Filter::Ptr filter) -{ - m_filters.removeAll(filter); -} - -void Filter::removeFilter(const QString &filterName) -{ - foreach (const Filter::Ptr &filter, m_filters) { - if (filter->name() == filterName) { - removeFilter(filter); - return; - } - } -} - -QList<Filter::Ptr> Filter::filters() const -{ - return m_filters; -} - -void Filter::addFile(File::Ptr file) +void Filter::addFile(IFile *file) { if (m_files.contains(file)) return; - foreach (const File::Ptr &f, m_files) { + foreach (IFile *f, m_files) { if (f->relativePath() == file->relativePath()) return; } @@ -176,83 +152,110 @@ void Filter::addFile(File::Ptr file) m_files.append(file); } -void Filter::removeFile(File::Ptr file) +void Filter::removeFile(IFile *file) { m_files.removeAll(file); } void Filter::removeFile(const QString &relativeFilePath) { - foreach (const File::Ptr &file, m_files) { + foreach (IFile *file, m_files) { if (file->relativePath() == relativeFilePath) { removeFile(file); + delete file; return; } } } -File::Ptr Filter::file(const QString &relativePath) const +IFile* Filter::file(const QString &relativePath) const { - foreach (const File::Ptr &file, m_files) { + foreach (IFile *file, m_files) { if (file->relativePath() == relativePath) return file; } - return File::Ptr(); + return 0; } -QList<File::Ptr> Filter::files() const +QList<IFile *> Filter::files() const { return m_files; } -bool Filter::fileExists(const QString &relativeFilePath) +IFile *Filter::file(int index) const { - foreach (const File::Ptr &filePtr, m_files) { - if (filePtr->relativePath() == relativeFilePath) - return true; - } + if (0 <= index && index < m_files.size()) + return m_files[index]; + return 0; +} - foreach (const Filter::Ptr &filterPtr, m_filters) { - if (filterPtr->fileExists(relativeFilePath)) - return true; - } +int Filter::fileCount() const +{ + return m_files.size(); +} - return false; +void Filter::addFileContainer(IFileContainer *fileContainer) +{ + if (!fileContainer && m_fileContainers.contains(fileContainer)) + return; + + m_fileContainers.append(fileContainer); +} + +int Filter::childCount() const +{ + return m_fileContainers.size(); } -QString Filter::attributeValue(const QString &attributeName) const +IFileContainer *Filter::fileContainer(int index) const { - return m_anyAttribute.value(attributeName); + if (0 <= index && index < m_fileContainers.size()) + return m_fileContainers[index]; + return 0; } -void Filter::setAttribute(const QString &attributeName, const QString &attributeValue) +void Filter::removeFileContainer(IFileContainer *fileContainer) { - m_anyAttribute.insert(attributeName, attributeValue); + m_fileContainers.removeAll(fileContainer); } -void Filter::clearAttribute(const QString &attributeName) +IAttributeContainer *Filter::attributeContainer() const { - if (m_anyAttribute.contains(attributeName)) - m_anyAttribute.insert(attributeName, QString()); + return m_attributeContainer; } -void Filter::removeAttribute(const QString &attributeName) +bool Filter::fileExists(const QString &relativeFilePath) const { - m_anyAttribute.remove(attributeName); + foreach (IFile *filePtr, m_files) { + if (filePtr->relativePath() == relativeFilePath) + return true; + } + + foreach (IFileContainer *filterPtr, m_fileContainers) { + if (filterPtr->fileExists(relativeFilePath)) + return true; + } + + return false; } void Filter::allFiles(QStringList &sl) const { - foreach (const Filter::Ptr &filter, m_filters) + foreach (IFileContainer *filter, m_fileContainers) filter->allFiles(sl); - foreach (const File::Ptr &file, m_files) + foreach (IFile *file, m_files) sl.append(file->canonicalPath()); } +IFileContainer *Filter::clone() const +{ + return new Filter(*this); +} + void Filter::processFile(const QDomNode &fileNode) { - File::Ptr file(new File(m_parentProjectDoc)); + IFile *file = new File(m_parentProjectDoc); file->processNode(fileNode); addFile(file); @@ -268,9 +271,9 @@ void Filter::processFile(const QDomNode &fileNode) void Filter::processFilter(const QDomNode &filterNode) { - Filter::Ptr filter(new Filter(m_parentProjectDoc)); + IFileContainer *filter = new Filter(QLatin1String("Filter"), m_parentProjectDoc); filter->processNode(filterNode); - addFilter(filter); + addFileContainer(filter); // process next sibling QDomNode nextSibling = filterNode.nextSibling(); @@ -296,7 +299,7 @@ void Filter::processNodeAttributes(const QDomElement &element) m_name = domElement.value(); else - m_anyAttribute.insert(domElement.name(), domElement.value()); + m_attributeContainer->setAttribute(domElement.name(), domElement.value()); } } } diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/filter.h b/src/plugins/vcprojectmanager/vcprojectmodel/filter.h index 77249cf4db..8c13d2e844 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/filter.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/filter.h @@ -32,22 +32,23 @@ #include "ivcprojectnodemodel.h" #include "file.h" +#include "../interfaces/ifilecontainer.h" namespace VcProjectManager { namespace Internal { class Filter; -class Filter : public IVcProjectXMLNode +class Filter : public IFileContainer { public: - typedef QSharedPointer<Filter> Ptr; - - Filter(VcProjectDocument *parentProjectDoc); + Filter(const QString &containerType, VcProjectDocument *parentProjectDoc); Filter(const Filter &filter); Filter& operator=(const Filter &filter); ~Filter(); + QString containerType() const; + void processNode(const QDomNode &node); VcNodeWidget* createSettingsWidget(); QDomNode toXMLDomNode(QDomDocument &domXMLDocument) const; @@ -55,24 +56,22 @@ public: QString name() const; void setName(const QString &name); - void addFilter(Filter::Ptr filter); - void removeFilter(Filter::Ptr filter); - void removeFilter(const QString &filterName); - QList<Filter::Ptr> filters() const; - - void addFile(File::Ptr file); - void removeFile(File::Ptr file); + void addFile(IFile *file); + void removeFile(IFile *file); void removeFile(const QString &relativeFilePath); - File::Ptr file(const QString &relativePath) const; - QList<File::Ptr> files() const; - bool fileExists(const QString &relativeFilePath); - - QString attributeValue(const QString &attributeName) const; - void setAttribute(const QString &attributeName, const QString &attributeValue); - void clearAttribute(const QString &attributeName); - void removeAttribute(const QString &attributeName); + IFile *file(const QString &relativePath) const; + QList<IFile *> files() const; + IFile *file(int index) const; + int fileCount() const; + void addFileContainer(IFileContainer *fileContainer); + int childCount() const; + IFileContainer *fileContainer(int index) const; + void removeFileContainer(IFileContainer *fileContainer); + IAttributeContainer *attributeContainer() const; + bool fileExists(const QString &relativeFilePath) const; void allFiles(QStringList &sl) const; + IFileContainer* clone() const; private: void processFile(const QDomNode &fileNode); @@ -80,10 +79,11 @@ private: void processNodeAttributes(const QDomElement &element); QString m_name; - QHash<QString, QString> m_anyAttribute; - QList<QSharedPointer<Filter> > m_filters; - QList<File::Ptr> m_files; + QList<IFileContainer *> m_fileContainers; + QList<IFile *> m_files; VcProjectDocument *m_parentProjectDoc; + IAttributeContainer *m_attributeContainer; + QString m_containerType; }; } // namespace Internal diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/folder.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/folder.cpp index cc3301cfd9..b5177a4f66 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/folder.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/folder.cpp @@ -32,29 +32,31 @@ #include <QFileInfo> #include "vcprojectdocument.h" +#include "generalattributecontainer.h" namespace VcProjectManager { namespace Internal { -Folder::Folder(VcProjectDocument *parentProjectDoc) - : m_parentProjectDoc(parentProjectDoc) +Folder::Folder(const QString &containerType, VcProjectDocument *parentProjectDoc) + : m_parentProjectDoc(parentProjectDoc), + m_containerName(containerType) { + m_attributeContainer = new GeneralAttributeContainer; } Folder::Folder(const Folder &folder) { m_parentProjectDoc = folder.m_parentProjectDoc; m_name = folder.m_name; - m_anyAttribute = folder.m_anyAttribute; + m_attributeContainer = new GeneralAttributeContainer; + *m_attributeContainer = *(folder.m_attributeContainer); + m_containerName = folder.m_containerName; - foreach (const File::Ptr &file, folder.m_files) - m_files.append(File::Ptr(new File(*file))); + foreach (IFile *file, folder.m_files) + m_files.append(file->clone()); - foreach (const Filter::Ptr &filter, folder.m_filters) - m_filters.append(Filter::Ptr(new Filter(*filter))); - - foreach (const Folder::Ptr &fold, folder.m_folders) - m_folders.append(Folder::Ptr(new Folder(*fold))); + foreach (IFileContainer *filter, folder.m_fileContainers) + m_fileContainers.append(filter->clone()); } Folder &Folder::operator =(const Folder &folder) @@ -62,20 +64,19 @@ Folder &Folder::operator =(const Folder &folder) if (this != &folder) { m_parentProjectDoc = folder.m_parentProjectDoc; m_name = folder.m_name; - m_anyAttribute = folder.m_anyAttribute; + m_containerName = folder.m_containerName; + *m_attributeContainer = *(folder.m_attributeContainer); + qDeleteAll(m_files); + qDeleteAll(m_fileContainers); m_files.clear(); - m_folders.clear(); - m_filters.clear(); - - foreach (const File::Ptr &file, folder.m_files) - m_files.append(File::Ptr(new File(*file))); + m_fileContainers.clear(); - foreach (const Filter::Ptr &filter, folder.m_filters) - m_filters.append(Filter::Ptr(new Filter(*filter))); + foreach (IFile *file, folder.m_files) + m_files.append(file->clone()); - foreach (const Folder::Ptr &fold, folder.m_folders) - m_folders.append(Folder::Ptr(new Folder(*fold))); + foreach (IFileContainer *filter, folder.m_fileContainers) + m_fileContainers.append(filter->clone()); } return *this; @@ -85,6 +86,11 @@ Folder::~Folder() { } +QString Folder::containerType() const +{ + return m_containerName; +} + void Folder::processNode(const QDomNode &node) { if (node.isNull()) @@ -113,91 +119,41 @@ VcNodeWidget *Folder::createSettingsWidget() QDomNode Folder::toXMLDomNode(QDomDocument &domXMLDocument) const { - QDomElement fileNode = domXMLDocument.createElement(QLatin1String("Folder")); + QDomElement fileNode = domXMLDocument.createElement(m_containerName); fileNode.setAttribute(QLatin1String("Name"), m_name); - QHashIterator<QString, QString> it(m_anyAttribute); + m_attributeContainer->appendToXMLNode(fileNode); - while (it.hasNext()) { - it.next(); - fileNode.setAttribute(it.key(), it.value()); - } - - foreach (const File::Ptr &file, m_files) + foreach (IFile *file, m_files) fileNode.appendChild(file->toXMLDomNode(domXMLDocument)); - foreach (const Filter::Ptr &filter, m_filters) + foreach (IFileContainer *filter, m_fileContainers) fileNode.appendChild(filter->toXMLDomNode(domXMLDocument)); - foreach (const Folder::Ptr &folder, m_folders) - fileNode.appendChild(folder->toXMLDomNode(domXMLDocument)); - return fileNode; } -void Folder::addFilter(Filter::Ptr filter) -{ - if (m_filters.contains(filter)) - return; - - foreach (const Filter::Ptr &filt, m_filters) { - if (filt->name() == filter->name()) - return; - } - - m_filters.append(filter); -} - -void Folder::removeFilter(Filter::Ptr filter) -{ - m_filters.removeAll(filter); -} - -void Folder::removeFilter(const QString &filterName) -{ - foreach (const Filter::Ptr &filter, m_filters) { - if (filter->name() == filterName) { - removeFilter(filter); - return; - } - } -} - -QList<Filter::Ptr> Folder::filters() const -{ - return m_filters; -} - -Filter::Ptr Folder::filter(const QString &filterName) const -{ - foreach (const Filter::Ptr &filter, m_filters) { - if (filter->name() == filterName) - return filter; - } - return Filter::Ptr(); -} - -void Folder::addFile(File::Ptr file) +void Folder::addFile(IFile *file) { if (m_files.contains(file)) return; - foreach (const File::Ptr &f, m_files) { + foreach (IFile *f, m_files) { if (f->relativePath() == file->relativePath()) return; } m_files.append(file); } -void Folder::removeFile(File::Ptr file) +void Folder::removeFile(IFile *file) { m_files.removeAll(file); } void Folder::removeFile(const QString &relativeFilePath) { - foreach (const File::Ptr &file, m_files) { + foreach (IFile *file, m_files) { if (file->relativePath() == relativeFilePath) { removeFile(file); return; @@ -205,79 +161,75 @@ void Folder::removeFile(const QString &relativeFilePath) } } -QList<File::Ptr> Folder::files() const +QList<IFile *> Folder::files() const { return m_files; } -File::Ptr Folder::file(const QString &relativeFilePath) const +IFile *Folder::file(const QString &relativeFilePath) const { - foreach (const File::Ptr &file, m_files) { + foreach (IFile *file, m_files) { if (file->relativePath() == relativeFilePath) return file; } - return File::Ptr(); + return 0; } -bool Folder::fileExists(const QString &relativeFilePath) +IFile *Folder::file(int index) const { - foreach (const File::Ptr &filePtr, m_files) { - if (filePtr->relativePath() == relativeFilePath) - return true; - } - - foreach (const Filter::Ptr &filterPtr, m_filters) { - if (filterPtr->fileExists(relativeFilePath)) - return true; - } - - foreach (const Folder::Ptr &folderPtr, m_folders) { - if (folderPtr->fileExists(relativeFilePath)) - return true; - } + if (0 <= index && index < m_files.size()) + return m_files[index]; + return 0; +} - return false; +int Folder::fileCount() const +{ + return m_files.size(); } -void Folder::addFolder(Folder::Ptr folder) +void Folder::addFileContainer(IFileContainer *fileContainer) { - if (m_folders.contains(folder)) + if (!fileContainer && m_fileContainers.contains(fileContainer)) return; - foreach (const Folder::Ptr &f, m_folders) { - if (f->name() == folder->name()) - return; - } - m_folders.append(folder); + m_fileContainers.append(fileContainer); } -void Folder::removeFolder(Folder::Ptr folder) +int Folder::childCount() const { - m_folders.removeAll(folder); + return m_fileContainers.size(); } -void Folder::removeFolder(const QString &folderName) +IFileContainer *Folder::fileContainer(int index) const { - foreach (const Folder::Ptr &f, m_folders) { - if (f->name() == folderName) { - removeFolder(f); - return; - } - } + if (0 <= index && index < m_fileContainers.size()) + return m_fileContainers[index]; + return 0; +} + +void Folder::removeFileContainer(IFileContainer *fileContainer) +{ + m_fileContainers.removeAll(fileContainer); } -QList<Folder::Ptr> Folder::folders() const +IAttributeContainer *Folder::attributeContainer() const { - return m_folders; + return m_attributeContainer; } -Folder::Ptr Folder::folder(const QString &folderName) const +bool Folder::fileExists(const QString &relativeFilePath) const { - foreach (const Folder::Ptr &folder, m_folders) { - if (folder->name() == folderName) - return folder; + foreach (IFile *filePtr, m_files) { + if (filePtr->relativePath() == relativeFilePath) + return true; } - return Folder::Ptr(); + + foreach (IFileContainer *filterPtr, m_fileContainers) { + if (filterPtr->fileExists(relativeFilePath)) + return true; + } + + return false; } QString Folder::name() const @@ -290,42 +242,23 @@ void Folder::setName(const QString &name) m_name = name; } -QString Folder::attributeValue(const QString &attributeName) const -{ - return m_anyAttribute.value(attributeName); -} - -void Folder::setAttribute(const QString &attributeName, const QString &attributeValue) -{ - m_anyAttribute.insert(attributeName, attributeValue); -} - -void Folder::clearAttribute(const QString &attributeName) +void Folder::allFiles(QStringList &sl) const { - if (m_anyAttribute.contains(attributeName)) - m_anyAttribute.insert(attributeName, QString()); -} + foreach (IFileContainer *filter, m_fileContainers) + filter->allFiles(sl); -void Folder::removeAttribute(const QString &attributeName) -{ - m_anyAttribute.remove(attributeName); + foreach (IFile *file, m_files) + sl.append(file->canonicalPath()); } -void Folder::allFiles(QStringList &sl) +IFileContainer *Folder::clone() const { - foreach (const Filter::Ptr &filter, m_filters) - filter->allFiles(sl); - - foreach (const Folder::Ptr &filter, m_folders) - filter->allFiles(sl); - - foreach (const File::Ptr &file, m_files) - sl.append(file->canonicalPath()); + return new Folder(*this); } void Folder::processFile(const QDomNode &fileNode) { - File::Ptr file(new File(m_parentProjectDoc)); + IFile *file = new File(m_parentProjectDoc); file->processNode(fileNode); m_files.append(file); @@ -343,9 +276,9 @@ void Folder::processFile(const QDomNode &fileNode) void Folder::processFilter(const QDomNode &filterNode) { - Filter::Ptr filter(new Filter(m_parentProjectDoc)); + IFileContainer *filter = new Filter(QLatin1String("Filter"), m_parentProjectDoc); filter->processNode(filterNode); - m_filters.append(filter); + m_fileContainers.append(filter); // process next sibling QDomNode nextSibling = filterNode.nextSibling(); @@ -361,9 +294,9 @@ void Folder::processFilter(const QDomNode &filterNode) void Folder::processFolder(const QDomNode &folderNode) { - Folder::Ptr folder(new Folder(m_parentProjectDoc)); + IFileContainer *folder = new Folder(QLatin1String("Folder"), m_parentProjectDoc); folder->processNode(folderNode); - m_folders.append(folder); + m_fileContainers.append(folder); // process next sibling QDomNode nextSibling = folderNode.nextSibling(); @@ -391,7 +324,7 @@ void Folder::processNodeAttributes(const QDomElement &element) setName(domElement.value()); else - setAttribute(domElement.name(), domElement.value()); + m_attributeContainer->setAttribute(domElement.name(), domElement.value()); } } } diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/folder.h b/src/plugins/vcprojectmanager/vcprojectmodel/folder.h index 7641564420..bf15e4a49e 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/folder.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/folder.h @@ -30,56 +30,46 @@ #ifndef VCPROJECTMANAGER_INTERNAL_FOLDER_H #define VCPROJECTMANAGER_INTERNAL_FOLDER_H -#include "ivcprojectnodemodel.h" - #include "file.h" #include "filter.h" +#include "../interfaces/ifilecontainer.h" namespace VcProjectManager { namespace Internal { -class Folder : public IVcProjectXMLNode +class Folder : public IFileContainer { public: - typedef QSharedPointer<Folder> Ptr; - - Folder(VcProjectDocument *parentProjectDoc); + Folder(const QString &containerType, VcProjectDocument *parentProjectDoc); Folder(const Folder &folder); Folder& operator=(const Folder &folder); ~Folder(); + QString containerType() const; + void processNode(const QDomNode &node); VcNodeWidget* createSettingsWidget(); QDomNode toXMLDomNode(QDomDocument &domXMLDocument) const; - void addFilter(Filter::Ptr filter); - void removeFilter(Filter::Ptr filter); - void removeFilter(const QString &filterName); - QList<Filter::Ptr> filters() const; - Filter::Ptr filter(const QString &filterName) const; - - void addFile(File::Ptr file); - void removeFile(File::Ptr file); + void addFile(IFile *file); + void removeFile(IFile *file); void removeFile(const QString &relativeFilePath); - QList<File::Ptr> files() const; - File::Ptr file(const QString &relativeFilePath) const; - bool fileExists(const QString &relativeFilePath); - - void addFolder(Folder::Ptr folder); - void removeFolder(Folder::Ptr folder); - void removeFolder(const QString &folderName); - QList<Folder::Ptr> folders() const; - Folder::Ptr folder(const QString &folderName) const; + QList<IFile *> files() const; + IFile* file(const QString &relativeFilePath) const; + IFile *file(int index) const; + int fileCount() const; + void addFileContainer(IFileContainer *fileContainer); + int childCount() const; + IFileContainer* fileContainer(int index) const; + void removeFileContainer(IFileContainer *fileContainer); + IAttributeContainer *attributeContainer() const; + bool fileExists(const QString &relativeFilePath) const; QString name() const; void setName(const QString &name); - QString attributeValue(const QString &attributeName) const; - void setAttribute(const QString &attributeName, const QString &attributeValue); - void clearAttribute(const QString &attributeName); - void removeAttribute(const QString &attributeName); - - void allFiles(QStringList &sl); + void allFiles(QStringList &sl) const; + IFileContainer* clone() const; private: void processFile(const QDomNode &fileNode); @@ -87,13 +77,13 @@ private: void processFolder(const QDomNode &folderNode); void processNodeAttributes(const QDomElement &element); - QList<QSharedPointer<Folder> > m_folders; - QList<File::Ptr> m_files; - QList<Filter::Ptr> m_filters; + QList<IFile *> m_files; + QList<IFileContainer *> m_fileContainers; QString m_name; // required - QHash<QString, QString> m_anyAttribute; VcProjectDocument *m_parentProjectDoc; + IAttributeContainer *m_attributeContainer; + QString m_containerName; }; } // namespace Internal diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.cpp index 470ab669f5..9f9733f67a 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.cpp @@ -41,7 +41,7 @@ namespace VcProjectManager { namespace Internal { -VcFileNode::VcFileNode(File *fileModel, VcDocProjectNode *vcDocProject) +VcFileNode::VcFileNode(IFile *fileModel, VcDocProjectNode *vcDocProject) : ProjectExplorer::FileNode(fileModel->canonicalPath(), fileModel->fileType(), false), m_vcFileModel(fileModel) { @@ -91,7 +91,7 @@ VcFileNode *VcContainerNode::findFileNode(const QString &filePath) } -VcFilterNode::VcFilterNode(Filter *filterModel, VcDocProjectNode *vcDocProjNode) +VcFilterNode::VcFilterNode(VcProjectManager::Internal::IFileContainer *filterModel, VcDocProjectNode *vcDocProjNode) : VcContainerNode(filterModel->name()), m_vcFilterModel(filterModel) { @@ -134,8 +134,7 @@ bool VcFilterNode::appendFileNode(VcFileNode *fileNode) } } - File::Ptr filePtr = File::Ptr(fileNode->m_vcFileModel); - m_vcFilterModel->addFile(filePtr); + m_vcFilterModel->addFile(fileNode->m_vcFileModel); QList<ProjectExplorer::FileNode *> vcFileNodes; vcFileNodes << fileNode; m_parentVcDocProjNode->addFileNodes(vcFileNodes, this); @@ -144,7 +143,7 @@ bool VcFilterNode::appendFileNode(VcFileNode *fileNode) void VcFilterNode::addFilterNode(const QString &name) { - Filter *filter = new Filter(m_parentVcDocProjNode->m_vcProjectModel); + Filter *filter = new Filter(QLatin1String("Filter"), m_parentVcDocProjNode->m_vcProjectModel); filter->setName(name); VcFilterNode *filterNode = new VcFilterNode(filter, m_parentVcDocProjNode); @@ -154,12 +153,12 @@ void VcFilterNode::addFilterNode(const QString &name) } } -bool VcFilterNode::appendFilterNode(VcFilterNode *folderNode) +bool VcFilterNode::appendFilterNode(VcFilterNode *filterNode) { - if (!m_vcFilterModel || !folderNode || !folderNode->m_vcFilterModel) + if (!m_vcFilterModel || !filterNode || !filterNode->m_vcFilterModel) return false; - if (m_subFolderNodes.contains(folderNode)) + if (m_subFolderNodes.contains(filterNode)) return false; else { foreach (ProjectExplorer::FolderNode *fNode, m_subFolderNodes) { @@ -167,15 +166,14 @@ bool VcFilterNode::appendFilterNode(VcFilterNode *folderNode) if (vcFilterNode && vcFilterNode->m_vcFilterModel && - vcFilterNode->m_vcFilterModel->name() == folderNode->m_vcFilterModel->name()) + vcFilterNode->m_vcFilterModel->name() == filterNode->m_vcFilterModel->name()) return false; } } - Filter::Ptr filterPtr = Filter::Ptr(folderNode->m_vcFilterModel); - m_vcFilterModel->addFilter(filterPtr); + m_vcFilterModel->addFileContainer(filterNode->m_vcFilterModel); QList<ProjectExplorer::FolderNode *> vcFolderNodes; - vcFolderNodes << folderNode; + vcFolderNodes << filterNode; m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); return true; @@ -186,13 +184,13 @@ void VcFilterNode::removeFilterNode(VcFilterNode *filterNode) if (!filterNode || !filterNode->m_vcFilterModel) return; - QString filterName = filterNode->m_vcFilterModel->name(); + IFileContainer *filter = filterNode->m_vcFilterModel; QList<ProjectExplorer::FolderNode *> folderNodesToRemove; folderNodesToRemove << filterNode; m_parentVcDocProjNode->removeFolderNodes(folderNodesToRemove, this); - m_vcFilterModel->removeFilter(filterName); + m_vcFilterModel->removeFileContainer(filter); m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); } @@ -201,38 +199,42 @@ void VcFilterNode::removeFileNode(VcFileNode *fileNode) if (!fileNode || !fileNode->m_vcFileModel) return; - QString relativePath = fileNode->m_vcFileModel->relativePath(); + IFile *file = fileNode->m_vcFileModel; QList<ProjectExplorer::FileNode *> fileNodesToRemove; fileNodesToRemove << fileNode; m_parentVcDocProjNode->removeFileNodes(fileNodesToRemove, this); - File::Ptr filePtr = m_vcFilterModel->file(relativePath); - - m_vcFilterModel->removeFile(filePtr); + m_vcFilterModel->removeFile(file); m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); } void VcFilterNode::readChildren() { - QList<Filter::Ptr> filters = m_vcFilterModel->filters(); - QList<File::Ptr> files = m_vcFilterModel->files(); - QList<ProjectExplorer::FolderNode *> vcFolderNodes; - foreach (const Filter::Ptr &filter, filters) - vcFolderNodes.append(new VcFilterNode(filter.data(), m_parentVcDocProjNode)); + + for (int i = 0; i < m_vcFilterModel->childCount(); ++i) { + IFileContainer *fileCont = m_vcFilterModel->fileContainer(i); + if (fileCont) + vcFolderNodes.append(new VcFilterNode(fileCont, m_parentVcDocProjNode)); + } m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); QList<ProjectExplorer::FileNode *> vcFileNodes; - foreach (const File::Ptr &file, files) - vcFileNodes.append(new VcFileNode(file.data(), m_parentVcDocProjNode)); + + for (int i = 0; i < m_vcFilterModel->fileCount(); ++i) { + IFile *file = m_vcFilterModel->file(i); + + if (file) + vcFileNodes.append(new VcFileNode(file, m_parentVcDocProjNode)); + } m_parentVcDocProjNode->addFileNodes(vcFileNodes, this); } -VcFolderNode::VcFolderNode(Folder *folderModel, VcDocProjectNode *vcDocProjNode) +VcFolderNode::VcFolderNode(VcProjectManager::Internal::IFileContainer *folderModel, VcDocProjectNode *vcDocProjNode) : VcContainerNode(folderModel->name()), m_vcFolderModel(folderModel) { @@ -275,8 +277,7 @@ bool VcFolderNode::appendFileNode(VcFileNode *fileNode) } } - File::Ptr filePtr = File::Ptr(fileNode->m_vcFileModel); - m_vcFolderModel->addFile(filePtr); + m_vcFolderModel->addFile(fileNode->m_vcFileModel); QList<ProjectExplorer::FileNode *> vcFileNodes; vcFileNodes << fileNode; m_parentVcDocProjNode->addFileNodes(vcFileNodes, this); @@ -285,7 +286,7 @@ bool VcFolderNode::appendFileNode(VcFileNode *fileNode) void VcFolderNode::addFilterNode(const QString &name) { - Filter *filter = new Filter(m_parentVcDocProjNode->m_vcProjectModel); + Filter *filter = new Filter(QLatin1String("Filter"), m_parentVcDocProjNode->m_vcProjectModel); filter->setName(name); VcFilterNode *filterNode = new VcFilterNode(filter, m_parentVcDocProjNode); @@ -313,8 +314,7 @@ bool VcFolderNode::appendFilterNode(VcFilterNode *filterNode) } } - Filter::Ptr filterPtr = Filter::Ptr(filterNode->m_vcFilterModel); - m_vcFolderModel->addFilter(filterPtr); + m_vcFolderModel->addFileContainer(filterNode->m_vcFilterModel); QList<ProjectExplorer::FolderNode *> vcFolderNodes; vcFolderNodes << filterNode; m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); @@ -327,15 +327,13 @@ void VcFolderNode::removeFileNode(VcFileNode *fileNode) if (!fileNode || !fileNode->m_vcFileModel) return; - QString relativePath = fileNode->m_vcFileModel->relativePath(); + IFile *file = fileNode->m_vcFileModel; QList<ProjectExplorer::FileNode *> fileNodesToRemove; fileNodesToRemove << fileNode; m_parentVcDocProjNode->removeFileNodes(fileNodesToRemove, this); - File::Ptr filePtr = m_vcFolderModel->file(relativePath); - - m_vcFolderModel->removeFile(filePtr); + m_vcFolderModel->removeFile(file); m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); } @@ -344,19 +342,19 @@ void VcFolderNode::removeFilterNode(VcFilterNode *filterNode) if (!filterNode || !filterNode->m_vcFilterModel) return; - QString filterName = filterNode->m_vcFilterModel->name(); + IFileContainer *filter = filterNode->m_vcFilterModel; QList<ProjectExplorer::FolderNode *> folderNodesToRemove; folderNodesToRemove << filterNode; m_parentVcDocProjNode->removeFolderNodes(folderNodesToRemove, this); - m_vcFolderModel->removeFilter(filterName); + m_vcFolderModel->removeFileContainer(filter); m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); } void VcFolderNode::addFolderNode(const QString &name) { - Folder *folder = new Folder(m_parentVcDocProjNode->m_vcProjectModel); + Folder *folder = new Folder(QLatin1String("Folder"), m_parentVcDocProjNode->m_vcProjectModel); folder->setName(name); VcFolderNode *folderNode = new VcFolderNode(folder, m_parentVcDocProjNode); @@ -384,8 +382,7 @@ bool VcFolderNode::appendFolderNode(VcFolderNode *folderNode) } } - Folder::Ptr folderPtr = Folder::Ptr(folderNode->m_vcFolderModel); - m_vcFolderModel->addFolder(folderPtr); + m_vcFolderModel->addFileContainer(folderNode->m_vcFolderModel); QList<ProjectExplorer::FolderNode *> vcFolderNodes; vcFolderNodes << folderNode; m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); @@ -398,37 +395,37 @@ void VcFolderNode::removeFolderNode(VcFolderNode *folderNode) if (!folderNode || !folderNode->m_vcFolderModel) return; - QString folderName = folderNode->m_vcFolderModel->name(); + IFileContainer *folder = folderNode->m_vcFolderModel; QList<ProjectExplorer::FolderNode *> folderNodesToRemove; folderNodesToRemove << folderNode; m_parentVcDocProjNode->removeFolderNodes(folderNodesToRemove, this); - m_vcFolderModel->removeFolder(folderName); + m_vcFolderModel->removeFileContainer(folder); m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); } void VcFolderNode::readChildren() { - QList<Filter::Ptr> filters = m_vcFolderModel->filters(); - QList<Folder::Ptr> folders = m_vcFolderModel->folders(); - QList<File::Ptr> files = m_vcFolderModel->files(); - QList<ProjectExplorer::FolderNode *> vcFolderNodes; - foreach (const Filter::Ptr &filter, filters) - vcFolderNodes.append(new VcFilterNode(filter.data(), m_parentVcDocProjNode)); - - m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); - vcFolderNodes.clear(); - foreach (const Folder::Ptr &folder, folders) - vcFolderNodes.append(new VcFolderNode(folder.data(), m_parentVcDocProjNode)); + for (int i = 0; i < m_vcFolderModel->childCount(); ++i) { + IFileContainer *fileCont = m_vcFolderModel->fileContainer(i); + if (fileCont && fileCont->containerType() == QLatin1String("Filter")) + vcFolderNodes.append(new VcFilterNode(fileCont, m_parentVcDocProjNode)); + else if (fileCont && fileCont->containerType() == QLatin1String("Folder")) + vcFolderNodes.append(new VcFolderNode(fileCont, m_parentVcDocProjNode)); + } m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); QList<ProjectExplorer::FileNode *> vcFileNodes; - foreach (const File::Ptr &file, files) - vcFileNodes.append(new VcFileNode(file.data(), m_parentVcDocProjNode)); + + for (int i = 0; i < m_vcFolderModel->fileCount(); ++i) { + IFile *file = m_vcFolderModel->file(i); + if (file) + vcFileNodes.append(new VcFileNode(file, m_parentVcDocProjNode)); + } m_parentVcDocProjNode->addFileNodes(vcFileNodes, this); } @@ -440,42 +437,42 @@ VcDocProjectNode::VcDocProjectNode(VcProjectDocument *vcProjectModel) { if (m_vcProjectModel->documentVersion() == VcDocConstants::DV_MSVC_2005) { QSharedPointer<Files2005> files2005 = m_vcProjectModel->files().staticCast<Files2005>(); - QList<Filter::Ptr> filters = files2005->filters(); + QList<IFileContainer *> filters = files2005->fileContainers(); QList<ProjectExplorer::FolderNode *> vcFolderNodes; - foreach (const Filter::Ptr &filter, filters) - vcFolderNodes.append(new VcFilterNode(filter.data(), this)); + foreach (IFileContainer *filter, filters) + vcFolderNodes.append(new VcFilterNode(filter, this)); addFolderNodes(vcFolderNodes, this); - QList<Folder::Ptr> folders = files2005->folders(); + QList<IFileContainer *> folders = files2005->folders(); vcFolderNodes.clear(); - foreach (const Folder::Ptr &folder, folders) - vcFolderNodes.append(new VcFolderNode(folder.data(), this)); + foreach (IFileContainer *folder, folders) + vcFolderNodes.append(new VcFolderNode(folder, this)); addFolderNodes(vcFolderNodes, this); - QList<File::Ptr> files = files2005->files(); + QList<IFile *> files = files2005->files(); QList<ProjectExplorer::FileNode *> vcFileNodes; - foreach (const File::Ptr &file, files) - vcFileNodes.append(new VcFileNode(file.data(), this)); + foreach (IFile *file, files) + vcFileNodes.append(new VcFileNode(file, this)); addFileNodes(vcFileNodes, this); } else { - QList<Filter::Ptr> filters = m_vcProjectModel->files()->filters(); + QList<IFileContainer *> filters = m_vcProjectModel->files()->fileContainers(); QList<ProjectExplorer::FolderNode *> vcFolderNodes; - foreach (const Filter::Ptr &filter, filters) - vcFolderNodes.append(new VcFilterNode(filter.data(), this)); + foreach (IFileContainer *filter, filters) + vcFolderNodes.append(new VcFilterNode(filter, this)); addFolderNodes(vcFolderNodes, this); - QList<File::Ptr> files = m_vcProjectModel->files()->files(); + QList<IFile *> files = m_vcProjectModel->files()->files(); QList<ProjectExplorer::FileNode *> vcFileNodes; - foreach (const File::Ptr &file, files) - vcFileNodes.append(new VcFileNode(file.data(), this)); + foreach (IFile *file, files) + vcFileNodes.append(new VcFileNode(file, this)); addFileNodes(vcFileNodes, this); } @@ -672,7 +669,7 @@ void VcDocProjectNode::addFileNode(const QString &filePath) void VcDocProjectNode::addFolderNode(const QString &name) { - Folder *folder = new Folder(m_vcProjectModel); + Folder *folder = new Folder(QLatin1String("Folder"), m_vcProjectModel); folder->setName(name); VcFolderNode *folderNode = new VcFolderNode(folder, this); @@ -684,7 +681,7 @@ void VcDocProjectNode::addFolderNode(const QString &name) void VcDocProjectNode::addFilterNode(const QString &name) { - Filter *filter = new Filter(m_vcProjectModel); + Filter *filter = new Filter(QLatin1String("Filter"), m_vcProjectModel); filter->setName(name); VcFilterNode *folderNode = new VcFilterNode(filter, this); @@ -716,8 +713,7 @@ bool VcDocProjectNode::appendFolderNode(VcFolderNode *folderNode) } } - Folder::Ptr folderPtr = Folder::Ptr(folderNode->m_vcFolderModel); - m_vcProjectModel->files().staticCast<Files2005>()->addFolder(folderPtr); + m_vcProjectModel->files().staticCast<Files2005>()->addFolder(folderNode->m_vcFolderModel); QList<ProjectExplorer::FolderNode *> vcFolderNodes; vcFolderNodes << folderNode; addFolderNodes(vcFolderNodes, this); @@ -741,8 +737,7 @@ bool VcDocProjectNode::appendFilterNode(VcFilterNode *filterNode) } } - Filter::Ptr filterPtr = Filter::Ptr(filterNode->m_vcFilterModel); - m_vcProjectModel->files()->addFilter(filterPtr); + m_vcProjectModel->files()->addFilter(filterNode->m_vcFilterModel); QList<ProjectExplorer::FolderNode *> vcFolderNodes; vcFolderNodes << filterNode; addFolderNodes(vcFolderNodes, this); @@ -766,8 +761,7 @@ bool VcDocProjectNode::appendFileNode(VcFileNode *fileNode) } } - File::Ptr filePtr = File::Ptr(fileNode->m_vcFileModel); - m_vcProjectModel->files()->addFile(filePtr); + m_vcProjectModel->files()->addFile(fileNode->m_vcFileModel); QList<ProjectExplorer::FileNode *> vcFileNodes; vcFileNodes << fileNode; addFileNodes(vcFileNodes, this); @@ -818,7 +812,7 @@ void VcDocProjectNode::removeFileNode(VcFileNode *fileNode) fileNodesToRemove << fileNode; removeFileNodes(fileNodesToRemove, this); - File::Ptr filePtr = m_vcProjectModel->files()->file(relativePath); + IFile *filePtr = m_vcProjectModel->files()->file(relativePath); m_vcProjectModel->files()->removeFile(filePtr); m_vcProjectModel->saveToFile(m_vcProjectModel->filePath()); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.h b/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.h index 7bf99b22ae..f64856405b 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.h @@ -36,9 +36,8 @@ namespace VcProjectManager { namespace Internal { class VcProjectDocument; -class Folder; -class Filter; -class File; +class IFileContainer; +class IFile; class VcDocProjectNode; class VcFileNode : public ProjectExplorer::FileNode @@ -50,14 +49,14 @@ class VcFileNode : public ProjectExplorer::FileNode friend class VcFilterNode; public: - VcFileNode(File *fileModel, VcDocProjectNode *vcDocProject); + VcFileNode(IFile *fileModel, VcDocProjectNode *vcDocProject); ~VcFileNode(); protected: void readChildren(VcDocProjectNode *vcDocProj); private: - File *m_vcFileModel; + IFile *m_vcFileModel; }; class VcFilterNode; @@ -136,14 +135,14 @@ class VcFilterNode : public VcContainerNode friend class VcFolderNode; public: - VcFilterNode(Filter *filterModel, VcDocProjectNode *vcDocProjNode); + VcFilterNode(IFileContainer *filterModel, VcDocProjectNode *vcDocProjNode); ~VcFilterNode(); void addFileNode(const QString &filePath); bool appendFileNode(VcFileNode *fileNode); void addFilterNode(const QString &name); - bool appendFilterNode(VcFilterNode *folderNode); + bool appendFilterNode(VcFilterNode *filterNode); void removeFilterNode(VcFilterNode *filterNode); void removeFileNode(VcFileNode *fileNode); @@ -152,7 +151,7 @@ protected: void readChildren(); private: - Filter *m_vcFilterModel; + IFileContainer *m_vcFilterModel; }; // used only for VS 2005 projects @@ -165,7 +164,7 @@ class VcFolderNode : public VcContainerNode friend class VcFilterNode; public: - VcFolderNode(Folder *folderModel, VcDocProjectNode *vcDocProjNode); + VcFolderNode(IFileContainer *folderModel, VcDocProjectNode *vcDocProjNode); ~VcFolderNode(); void addFileNode(const QString &filePath); @@ -186,7 +185,7 @@ protected: void readChildren(); private: - Folder *m_vcFolderModel; + IFileContainer *m_vcFolderModel; }; class VcDocProjectNode : public ProjectExplorer::ProjectNode diff --git a/src/plugins/vcprojectmanager/widgets/configurationswidgets.cpp b/src/plugins/vcprojectmanager/widgets/configurationswidgets.cpp index 261757d9e0..61c81b590c 100644 --- a/src/plugins/vcprojectmanager/widgets/configurationswidgets.cpp +++ b/src/plugins/vcprojectmanager/widgets/configurationswidgets.cpp @@ -98,7 +98,7 @@ void ConfigurationsBaseWidget::saveData() foreach (IConfiguration *newConfig, m_newConfigurations) m_configs->addConfiguration(newConfig); - QHashIterator<QSharedPointer<File>, QList<IConfiguration*> > fileConfigIt(m_newFilesConfigurations); + QHashIterator<IFile*, QList<IConfiguration*> > fileConfigIt(m_newFilesConfigurations); while (fileConfigIt.hasNext()) { fileConfigIt.next(); @@ -299,59 +299,34 @@ void ConfigurationsBaseWidget::addConfigurationToFiles(const QString ©FromCo { Files::Ptr docFiles = m_vcProjDoc->files(); if (docFiles) { - QList<Filter::Ptr> filters = docFiles->filters(); + QList<IFileContainer *> filters = docFiles->fileContainers(); - foreach (Filter::Ptr filter, filters) + foreach (IFileContainer *filter, filters) addConfigurationToFilesInFilter(filter, copyFromConfig, targetConfigName); - QList<File::Ptr> files = docFiles->files(); + QList<IFile *> files = docFiles->files(); - foreach (File::Ptr file, files) + foreach (IFile *file, files) addConfigurationToFile(file, copyFromConfig, targetConfigName); - - Files2005::Ptr docFiles2005 = docFiles.dynamicCast<Files2005>(); - - if (docFiles2005) { - QList<Folder::Ptr> folders = docFiles2005->folders(); - - foreach (Folder::Ptr folder, folders) - addConfigurationToFilesInFolder(folder, copyFromConfig, targetConfigName); - } } } -void ConfigurationsBaseWidget::addConfigurationToFilesInFilter(QSharedPointer<Filter> filterPtr, const QString ©FromConfig, const QString &targetConfigName) +void ConfigurationsBaseWidget::addConfigurationToFilesInFilter(IFileContainer *filterPtr, const QString ©FromConfig, const QString &targetConfigName) { - QList<Filter::Ptr> filters = filterPtr->filters(); - - foreach (Filter::Ptr filter, filters) - addConfigurationToFilesInFilter(filter, copyFromConfig, targetConfigName); - - QList<File::Ptr> files = filterPtr->files(); - - foreach (File::Ptr file, files) - addConfigurationToFile(file, copyFromConfig, targetConfigName); -} - -void ConfigurationsBaseWidget::addConfigurationToFilesInFolder(QSharedPointer<Folder> folderPtr, const QString ©FromConfig, const QString &targetConfigName) -{ - QList<Filter::Ptr> filters = folderPtr->filters(); - - foreach (Filter::Ptr filter, filters) - addConfigurationToFilesInFilter(filter, copyFromConfig, targetConfigName); - - QList<Folder::Ptr> folders = folderPtr->folders(); - - foreach (Folder::Ptr folder, folders) - addConfigurationToFilesInFolder(folder, copyFromConfig, targetConfigName); - - QList<File::Ptr> files = folderPtr->files(); + for (int i = 0; i < filterPtr->childCount(); ++i) { + IFileContainer *fileContainer = filterPtr->fileContainer(i); + if (fileContainer) + addConfigurationToFilesInFilter(fileContainer, copyFromConfig, targetConfigName); + } - foreach (File::Ptr file, files) - addConfigurationToFile(file, copyFromConfig, targetConfigName); + for (int i = 0; i < filterPtr->fileCount(); ++i) { + IFile *file = filterPtr->file(i); + if (file) + addConfigurationToFile(file, copyFromConfig, targetConfigName); + } } -void ConfigurationsBaseWidget::addConfigurationToFile(QSharedPointer<File> filePtr, const QString ©FromConfig, const QString &targetConfigName) +void ConfigurationsBaseWidget::addConfigurationToFile(IFile *filePtr, const QString ©FromConfig, const QString &targetConfigName) { IConfiguration *configPtr = filePtr->configurationContainer()->configuration(copyFromConfig); diff --git a/src/plugins/vcprojectmanager/widgets/configurationswidgets.h b/src/plugins/vcprojectmanager/widgets/configurationswidgets.h index c53587b71a..d1c82024af 100644 --- a/src/plugins/vcprojectmanager/widgets/configurationswidgets.h +++ b/src/plugins/vcprojectmanager/widgets/configurationswidgets.h @@ -43,9 +43,8 @@ class Configurations; class Configuration; class VcProjectDocument; class ConfigurationsWidget; -class Filter; -class Folder; -class File; +class IFile; +class IFileContainer; class ConfigurationsBaseWidget : public VcNodeWidget { @@ -67,9 +66,8 @@ protected: IConfiguration* createConfiguration(const QString &configNameWithPlatform) const; IConfiguration* configInNewConfigurations(const QString &configNameWithPlatform) const; void addConfigurationToFiles(const QString ©FromConfig, const QString &targetConfigName); - void addConfigurationToFilesInFilter(QSharedPointer<Filter> filterPtr, const QString ©FromConfig, const QString &targetConfigName); - void addConfigurationToFilesInFolder(QSharedPointer<Folder> folderPtr, const QString ©FromConfig, const QString &targetConfigName); - void addConfigurationToFile(QSharedPointer<File> filePtr, const QString ©FromConfig, const QString &targetConfigName); + void addConfigurationToFilesInFilter(IFileContainer *filterPtr, const QString ©FromConfig, const QString &targetConfigName); + void addConfigurationToFile(IFile *filePtr, const QString ©FromConfig, const QString &targetConfigName); Configurations *m_configs; VcProjectDocument *m_vcProjDoc; @@ -79,7 +77,7 @@ protected: QList<QString> m_removedConfigurations; QMap<IConfiguration*, QString> m_renamedConfigurations; // <oldName, newName> - QHash<QSharedPointer<File>, QList<IConfiguration*> > m_newFilesConfigurations; + QHash<IFile*, QList<IConfiguration*> > m_newFilesConfigurations; }; class Configurations2003Widget : public ConfigurationsBaseWidget |