diff options
| author | Radovan Zivkovic <pivonroll@gmail.com> | 2013-05-29 00:17:13 +0200 |
|---|---|---|
| committer | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-03-11 19:54:54 +0100 |
| commit | cce791af9739ce38caa7ad88dde36ae44d767c1f (patch) | |
| tree | b59823fc49601ec6ef35ca962cc19bb8702a85dc | |
| parent | fa1a67730d146dec1cb4d8cdb744486165b0aaec (diff) | |
| download | qt-creator-cce791af9739ce38caa7ad88dde36ae44d767c1f.tar.gz | |
Files, folders and filters can now be added/removed.
Change-Id: I05b0fff0dfbe04544c69b56c85b4311dfe2072f8
Reviewed-by: Bojan Petrovic <bojan85@gmail.com>
20 files changed, 1152 insertions, 70 deletions
diff --git a/src/plugins/vcprojectmanager/menuhandler.cpp b/src/plugins/vcprojectmanager/menuhandler.cpp index 049a45498d..bd94e6a7e7 100644 --- a/src/plugins/vcprojectmanager/menuhandler.cpp +++ b/src/plugins/vcprojectmanager/menuhandler.cpp @@ -43,6 +43,7 @@ #include "vcprojectfile.h" #include "vcprojectmodel/vcprojectdocument.h" #include "vcprojectmodel/vcdocumentmodel.h" +#include "widgets/vccontainernamedialog.h" namespace VcProjectManager { namespace Internal { @@ -73,15 +74,34 @@ void MenuHandler::initialize() Core::ActionManager::createMenu(ProjectExplorer::Constants::M_PROJECTCONTEXT); Core::ActionContainer *subProjectContextMenu = Core::ActionManager::createMenu(ProjectExplorer::Constants::M_SUBPROJECTCONTEXT); + Core::ActionContainer *folderContextMenu = + Core::ActionManager::createMenu(ProjectExplorer::Constants::M_FOLDERCONTEXT); + + // versions 2003 and 2005 + m_addFilter = new QAction(tr("Add Filter..."), this); + Core::Command *cmd = Core::ActionManager::registerAction(m_addFilter, Constants::VC_PROJECT_ADD_FILTER_ACTION, + projectContext); + cmd->setAttribute(Core::Command::CA_Hide); + projectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); + subProjectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); + folderContextMenu->addAction(cmd, ProjectExplorer::Constants::G_FOLDER_FILES); + + m_removeFilter = new QAction(tr("Remove Filter"), this); + cmd = Core::ActionManager::registerAction(m_removeFilter, Constants::VC_PROJECT_REMOVE_FILTER_ACTION, + projectContext); + cmd->setAttribute(Core::Command::CA_Hide); + folderContextMenu->addAction(cmd, ProjectExplorer::Constants::G_FOLDER_FILES); m_projectProperties = new QAction(tr("Show Properties..."), this); - Core::Command *cmd = Core::ActionManager::registerAction(m_projectProperties, Constants::VC_PROJECT_SHOW_PROPERTIES_ACTION, + cmd = Core::ActionManager::registerAction(m_projectProperties, Constants::VC_PROJECT_SHOW_PROPERTIES_ACTION, projectContext); cmd->setAttribute(Core::Command::CA_Hide); projectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); subProjectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); connect(m_projectProperties, SIGNAL(triggered()), this, SLOT(onShowProjectSettings())); + connect(m_addFilter, SIGNAL(triggered()), this, SLOT(onAddFilter())); + connect(m_removeFilter, SIGNAL(triggered()), this, SLOT(onRemoveFilter())); } void MenuHandler::initialize2005() @@ -92,15 +112,50 @@ void MenuHandler::initialize2005() Core::ActionManager::createMenu(ProjectExplorer::Constants::M_PROJECTCONTEXT); Core::ActionContainer *subProjectContextMenu = Core::ActionManager::createMenu(ProjectExplorer::Constants::M_SUBPROJECTCONTEXT); + Core::ActionContainer *folderContextMenu = + Core::ActionManager::createMenu(ProjectExplorer::Constants::M_FOLDERCONTEXT); + + // version 2005 + m_addFolder2005 = new QAction(tr("Add Folder..."), this); + Core::Command *cmd = Core::ActionManager::registerAction(m_addFolder2005, Constants::VC_PROJECT_ADD_FOLDER_ACTION, + project2005Context); + cmd->setAttribute(Core::Command::CA_Hide); + projectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); + subProjectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); + folderContextMenu->addAction(cmd, ProjectExplorer::Constants::G_FOLDER_FILES); + + m_addFilter2005 = new QAction(tr("Add Filter..."), this); + cmd = Core::ActionManager::registerAction(m_addFilter2005, Constants::VC_PROJECT_ADD_FILTER_ACTION, + project2005Context); + cmd->setAttribute(Core::Command::CA_Hide); + projectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); + subProjectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); + folderContextMenu->addAction(cmd, ProjectExplorer::Constants::G_FOLDER_FILES); + + m_removeFolder2005 = new QAction(tr("Remove Folder"), this); + cmd = Core::ActionManager::registerAction(m_removeFolder2005, Constants::VC_PROJECT_REMOVE_FOLDER_ACTION, + project2005Context); + cmd->setAttribute(Core::Command::CA_Hide); + folderContextMenu->addAction(cmd, ProjectExplorer::Constants::G_FOLDER_FILES); + + m_removeFilter2005 = new QAction(tr("Remove Filter"), this); + cmd = Core::ActionManager::registerAction(m_removeFilter2005, Constants::VC_PROJECT_REMOVE_FILTER_ACTION, + project2005Context); + cmd->setAttribute(Core::Command::CA_Hide); + folderContextMenu->addAction(cmd, ProjectExplorer::Constants::G_FOLDER_FILES); m_projectProperties2005 = new QAction(tr("Show Properties..."), this); - Core::Command *cmd = Core::ActionManager::registerAction(m_projectProperties2005, Constants::VC_PROJECT_SHOW_PROPERTIES_ACTION, + cmd = Core::ActionManager::registerAction(m_projectProperties2005, Constants::VC_PROJECT_SHOW_PROPERTIES_ACTION, project2005Context); cmd->setAttribute(Core::Command::CA_Hide); projectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); subProjectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_FILES); connect(m_projectProperties2005, SIGNAL(triggered()), this, SLOT(onShowProjectSettings())); + connect(m_addFilter2005, SIGNAL(triggered()), this, SLOT(onAddFilter())); + connect(m_removeFilter2005, SIGNAL(triggered()), this, SLOT(onRemoveFilter())); + connect(m_addFolder2005, SIGNAL(triggered()), this, SLOT(onAddFolder())); + connect(m_removeFolder2005, SIGNAL(triggered()), this, SLOT(onRemoveFolder())); } void MenuHandler::onShowProjectSettings() @@ -111,5 +166,113 @@ void MenuHandler::onShowProjectSettings() project->showSettingsDialog(); } +void MenuHandler::onAddFile() +{ + QString fileName; + + ProjectExplorer::ProjectExplorerPlugin *projExplPlugin = ProjectExplorer::ProjectExplorerPlugin::instance(); + ProjectExplorer::Node *node = projExplPlugin->currentNode(); + + if (node) { + if (node->nodeType() == ProjectExplorer::FolderNodeType) { + VcFolderNode *folderNode = static_cast<VcFolderNode *>(node); + folderNode->addFileNode(fileName); + } + + if (node->nodeType() == ProjectExplorer::ProjectFileType) { + VcDocProjectNode *projectNode = static_cast<VcDocProjectNode *>(node); + projectNode->addFileNode(fileName); + } + } +} + +void MenuHandler::onAddFolder() +{ + VcContainerNameDialog dlg(QLatin1String("Filter:")); + + if (dlg.exec() == QDialog::Accepted) { + QString folderName = dlg.contanerName(); + ProjectExplorer::ProjectExplorerPlugin *projExplPlugin = ProjectExplorer::ProjectExplorerPlugin::instance(); + ProjectExplorer::Node *node = projExplPlugin->currentNode(); + + if (node) { + if (node->nodeType() == ProjectExplorer::FolderNodeType) { + VcFolderNode *folderNode = static_cast<VcFolderNode *>(node); + folderNode->addFolderNode(folderName); + } + + if (node->nodeType() == ProjectExplorer::ProjectFileType) { + VcDocProjectNode *projectNode = static_cast<VcDocProjectNode *>(node); + projectNode->addFolderNode(folderName); + } + } + } +} + +void MenuHandler::onAddFilter() +{ + VcContainerNameDialog dlg(QLatin1String("Filter:")); + + if (dlg.exec() == QDialog::Accepted) { + QString filterName = dlg.contanerName(); + ProjectExplorer::ProjectExplorerPlugin *projExplPlugin = ProjectExplorer::ProjectExplorerPlugin::instance(); + ProjectExplorer::Node *node = projExplPlugin->currentNode(); + + if (node) { + if (node->nodeType() == ProjectExplorer::FolderNodeType) { + VcContainerNode *folderNode = static_cast<VcContainerNode *>(node); + folderNode->addFilterNode(filterName); + } + + if (node->nodeType() == ProjectExplorer::ProjectFileType) { + VcDocProjectNode *projectNode = static_cast<VcDocProjectNode *>(node); + projectNode->addFilterNode(filterName); + } + } + } +} + +void MenuHandler::onRemoveFilter() +{ + ProjectExplorer::ProjectExplorerPlugin *projExplPlugin = ProjectExplorer::ProjectExplorerPlugin::instance(); + ProjectExplorer::Node *node = projExplPlugin->currentNode(); + + if (node && node->nodeType() == ProjectExplorer::FolderNodeType) { + VcFilterNode *filterNode = static_cast<VcFilterNode *>(node); + ProjectExplorer::FolderNode *parentNode = filterNode->parentFolderNode(); + + if (parentNode->nodeType() == ProjectExplorer::FolderNodeType) { + VcContainerNode *projectNode = static_cast<VcContainerNode *>(parentNode); + projectNode->removeFilterNode(filterNode); + } + + else if (parentNode->nodeType() == ProjectExplorer::ProjectFileType) { + VcDocProjectNode *projectNode = static_cast<VcDocProjectNode *>(parentNode); + projectNode->removeFilterNode(filterNode); + } + } +} + +void MenuHandler::onRemoveFolder() +{ + ProjectExplorer::ProjectExplorerPlugin *projExplPlugin = ProjectExplorer::ProjectExplorerPlugin::instance(); + ProjectExplorer::Node *node = projExplPlugin->currentNode(); + + if (node && node->nodeType() == ProjectExplorer::FolderNodeType) { + VcFolderNode *folderNode = static_cast<VcFolderNode *>(node); + ProjectExplorer::FolderNode *parentNode = folderNode->parentFolderNode(); + + if (parentNode->nodeType() == ProjectExplorer::FolderNodeType) { + VcFolderNode *parentFolderNode = static_cast<VcFolderNode *>(parentNode); + parentFolderNode->removeFolderNode(folderNode); + } + + else if (parentNode->nodeType() == ProjectExplorer::ProjectFileType) { + VcDocProjectNode *projectNode = static_cast<VcDocProjectNode *>(parentNode); + projectNode->removeFolderNode(folderNode); + } + } +} + } // namespace Internal } // namespace VcProjectManager diff --git a/src/plugins/vcprojectmanager/menuhandler.h b/src/plugins/vcprojectmanager/menuhandler.h index ac1c3c3509..2ebddbb0e5 100644 --- a/src/plugins/vcprojectmanager/menuhandler.h +++ b/src/plugins/vcprojectmanager/menuhandler.h @@ -54,11 +54,23 @@ private: private slots: void onShowProjectSettings(); + void onAddFile(); + void onAddFolder(); + void onAddFilter(); + void onRemoveFilter(); + void onRemoveFolder(); private: static MenuHandler *m_instance; QAction *m_projectProperties; + QAction *m_addFilter; + QAction *m_removeFilter; + QAction *m_projectProperties2005; + QAction *m_addFolder2005; + QAction *m_addFilter2005; + QAction *m_removeFolder2005; + QAction *m_removeFilter2005; }; } // namespace Internal diff --git a/src/plugins/vcprojectmanager/vcmakestep.cpp b/src/plugins/vcprojectmanager/vcmakestep.cpp index 56ea909929..f074afa5c7 100644 --- a/src/plugins/vcprojectmanager/vcmakestep.cpp +++ b/src/plugins/vcprojectmanager/vcmakestep.cpp @@ -252,7 +252,8 @@ VcMakeStepFactory::~VcMakeStepFactory() bool VcMakeStepFactory::canCreate(ProjectExplorer::BuildStepList *parent, const Core::Id id) const { - if (parent->target()->project()->id() == Constants::VC_PROJECT_ID) + if (parent->target()->project()->id() == Constants::VC_PROJECT_ID || + parent->target()->project()->id() == Constants::VC_PROJECT_2005_ID) return id == MS_ID; return false; } @@ -295,7 +296,8 @@ ProjectExplorer::BuildStep *VcMakeStepFactory::restore(ProjectExplorer::BuildSte QList<Core::Id> VcMakeStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const { - if (parent->target() && parent->target()->project() && parent->target()->project()->id() == Constants::VC_PROJECT_ID) + if (parent->target() && parent->target()->project() && + (parent->target()->project()->id() == Constants::VC_PROJECT_ID || parent->target()->project()->id() == Constants::VC_PROJECT_2005_ID)) return QList<Core::Id>() << Core::Id(MS_ID); return QList<Core::Id>(); diff --git a/src/plugins/vcprojectmanager/vcproject.cpp b/src/plugins/vcprojectmanager/vcproject.cpp index c7511eeebe..dbce08f22f 100644 --- a/src/plugins/vcprojectmanager/vcproject.cpp +++ b/src/plugins/vcprojectmanager/vcproject.cpp @@ -84,7 +84,7 @@ VcProject::VcProject(VcManager *projectManager, const QString &projectFilePath, : m_projectManager(projectManager) , m_projectFile(new VcProjectFile(projectFilePath, docVersion)) { - if (docVersion == VcProjectManager::Internal::VcDocConstants::DV_MSVC_2005) + if (m_projectFile->documentModel()->vcProjectDocument()->documentVersion() == VcDocConstants::DV_MSVC_2005) setProjectContext(Core::Context(Constants::VC_PROJECT_2005_ID)); else setProjectContext(Core::Context(Constants::VC_PROJECT_ID)); @@ -199,7 +199,7 @@ void VcProject::onSettingsDialogAccepted() { VcProjectDocumentWidget *settingsWidget = qobject_cast<VcProjectDocumentWidget *>(QObject::sender()); m_projectFile->documentModel()->saveToFile(m_projectFile->filePath()); - disconnect(settingsWidget, SIGNAL(accepted()), this, SLOT(onSettingsDialogAccepted())); + settingsWidget->deleteLater(); } bool VcProject::fromMap(const QVariantMap &map) diff --git a/src/plugins/vcprojectmanager/vcproject.h b/src/plugins/vcprojectmanager/vcproject.h index a276e3df3c..1f0b76a029 100644 --- a/src/plugins/vcprojectmanager/vcproject.h +++ b/src/plugins/vcprojectmanager/vcproject.h @@ -33,7 +33,6 @@ #include "vcprojectmodel/vcprojectdocument_constants.h" #include "msbuildversionmanager.h" -#include <projectexplorer/buildstep.h> #include <projectexplorer/namedwidget.h> #include <projectexplorer/project.h> @@ -51,6 +50,7 @@ namespace Internal { class VcProjectFile; class VcDocProjectNode; class VcManager; +class VcFolderNode; class VcProject : public ProjectExplorer::Project { diff --git a/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h b/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h index 0397425a7b..06ade80016 100644 --- a/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h +++ b/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h @@ -36,7 +36,7 @@ namespace VcProjectManager { namespace Constants { const char VCPROJ_MIMETYPE[] = "text/x-vc-project"; // TODO: is this good enough? -const char VC_PROJECT_ID[] = "VcProject.VcProject"; // 2003 and 2008 version +const char VC_PROJECT_ID[] = "VcProject.VcProject"; // 2003 and 2008 version const char VC_PROJECT_2005_ID[] = "VcProject.VcProject2005"; // 2005 version const char VC_PROJECT_CONTEXT[] = "VcProject.ProjectContext"; const char VC_PROJECT_TARGET_ID[] = "VcProject.DefaultVcProjectTarget"; @@ -60,6 +60,13 @@ const char VC_PROJECT_SCHEMA_2008_QUIALIFIER[] = "Schema2008"; const char VC_PROJECT_KIT_INFO_ID[] = "VcProject.KitInformation"; const char VC_PROJECT_SHOW_PROPERTIES_ACTION[] = "VcProject.ShowPropertiesAction"; +const char VC_PROJECT_ADD_NEW_FILE_ACTION[] = "VcProject.AddNewFileAction"; +const char VC_PROJECT_ADD_EXISTING_FILES_ACTION[] = "VcProject.AddExistingFilesAction"; +const char VC_PROJECT_REMOVE_FILE_ACTION[] = "VcProject.RemoveFileAction"; +const char VC_PROJECT_ADD_FOLDER_ACTION[] = "VcProject.AddFolderAction"; +const char VC_PROJECT_ADD_FILTER_ACTION[] = "VcProject.AddFilterAction"; +const char VC_PROJECT_REMOVE_FOLDER_ACTION[] = "VcProject.RemoveFolderAction"; +const char VC_PROJECT_REMOVE_FILTER_ACTION[] = "VcProject.RemoveFilterAction"; enum SchemaVersion { diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/files.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/files.cpp index fe2fe4e97b..a857447f5e 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/files.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/files.cpp @@ -71,6 +71,18 @@ void Files::removeFilter(Filter::Ptr filter) m_private->removeFilter(filter); } +void Files::removeFilter(const QString &filterName) +{ + QList<Filter::Ptr> filters = m_private->filters(); + + foreach (Filter::Ptr filter, filters) { + if (filter->name() == filterName) { + m_private->removeFilter(filter); + return; + } + } +} + QList<Filter::Ptr > Files::filters() const { return m_private->filters(); @@ -101,6 +113,25 @@ File::Ptr Files::file(const QString &relativePath) const return m_private->file(relativePath); } +bool Files::fileExists(const QString &relativeFilePath) const +{ + QList<File::Ptr> files = m_private->files(); + + foreach (File::Ptr filePtr, files) { + if (filePtr->relativePath() == relativeFilePath) + return true; + } + + QList<Filter::Ptr> filters = m_private->filters(); + + foreach (Filter::Ptr filterPtr, filters) { + if (filterPtr->fileExists(relativeFilePath)) + return true; + } + + return false; +} + void Files::allProjectFiles(QStringList &sl) const { QList<Filter::Ptr > filters = m_private->filters(); @@ -189,6 +220,33 @@ Files *Files2005::clone() const return new Files2005(*this); } +bool Files2005::fileExists(const QString &relativeFilePath) const +{ + QList<File::Ptr> files = m_private->files(); + + foreach (File::Ptr filePtr, files) { + if (filePtr->relativePath() == relativeFilePath) + return true; + } + + QList<Filter::Ptr> filters = m_private->filters(); + + foreach (Filter::Ptr filterPtr, filters) { + if (filterPtr->fileExists(relativeFilePath)) + return true; + } + + QSharedPointer<Files2005_Private> files_p = m_private.staticCast<Files2005_Private>(); + QList<Folder::Ptr> folders = files_p->folders(); + + foreach (Folder::Ptr folderPtr, folders) { + if (folderPtr->fileExists(relativeFilePath)) + return true; + } + + return false; +} + void Files2005::addFolder(Folder::Ptr newFolder) { QSharedPointer<Files2005_Private> files_p = m_private.staticCast<Files2005_Private>(); @@ -201,6 +259,19 @@ void Files2005::removeFolder(Folder::Ptr folder) files_p->removeFolder(folder); } +void Files2005::removeFolder(const QString &folderName) +{ + QSharedPointer<Files2005_Private> files_p = m_private.staticCast<Files2005_Private>(); + QList<Folder::Ptr> folders = files_p->folders(); + + foreach (Folder::Ptr folder, folders) { + if (folder->name() == folderName) { + files_p->removeFolder(folder); + return; + } + } +} + QList<Folder::Ptr > Files2005::folders() const { QSharedPointer<Files2005_Private> files_p = m_private.staticCast<Files2005_Private>(); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/files.h b/src/plugins/vcprojectmanager/vcprojectmodel/files.h index 57501833ee..15497dfd27 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/files.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/files.h @@ -56,6 +56,7 @@ public: void addFilter(Filter::Ptr newFilter); void removeFilter(Filter::Ptr filter); + void removeFilter(const QString &filterName); QList<Filter::Ptr > filters() const; Filter::Ptr filter(const QString &filterName) const; @@ -63,6 +64,7 @@ public: void removeFile(File::Ptr file); QList<File::Ptr > files() const; File::Ptr file(const QString &relativePath) const; + virtual bool fileExists(const QString &relativeFilePath) const; virtual void allProjectFiles(QStringList &sl) const; @@ -77,6 +79,8 @@ protected: class Files2003 : public Files { public: + typedef QSharedPointer<Files2003> Ptr; + Files2003(VcProjectDocument *parentProjectDocument); Files2003(const Files2003 &files); Files2003& operator=(const Files2003 &files); @@ -88,6 +92,8 @@ public: class Files2005 : public Files { public: + typedef QSharedPointer<Files2005> Ptr; + Files2005(VcProjectDocument *parentProjectDocument); Files2005(const Files2005 &files); Files2005& operator=(const Files2005 &files); @@ -95,9 +101,11 @@ public: bool isEmpty() const; Files* clone() const; + bool fileExists(const QString &relativeFilePath) const; void addFolder(Folder::Ptr newFolder); void removeFolder(Folder::Ptr folder); + void removeFolder(const QString &folderName); QList<Folder::Ptr > folders() const; Folder::Ptr folder(const QString &folderName) const; @@ -107,6 +115,8 @@ public: class Files2008 : public Files { public: + typedef QSharedPointer<Files2008> Ptr; + Files2008(VcProjectDocument *parentProjectDocument); Files2008(const Files2008 &files); Files2008& operator=(const Files2008 &files); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/filter.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/filter.cpp index 8c0ec425f8..79d1aeeb9b 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/filter.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/filter.cpp @@ -128,6 +128,18 @@ QList<File::Ptr > Filter::files() const return m_filterType->files(); } +bool Filter::fileExists(const QString &relativeFilePath) +{ + QList<File::Ptr> files = m_filterType->files(); + + foreach (File::Ptr filePtr, files) { + if (filePtr->relativePath() == relativeFilePath) + return true; + } + + return false; +} + QString Filter::attributeValue(const QString &attributeName) const { return m_filterType->attributeValue(attributeName); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/filter.h b/src/plugins/vcprojectmanager/vcprojectmodel/filter.h index 8cb5e0cfaf..cc325f100e 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/filter.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/filter.h @@ -64,6 +64,7 @@ public: void removeFile(File::Ptr file); void removeFile(const QString &relativeFilePath); QList<File::Ptr > files() const; + bool fileExists(const QString &relativeFilePath); QString attributeValue(const QString &attributeName) const; void setAttribute(const QString &attributeName, const QString &attributeValue); @@ -74,7 +75,6 @@ public: private: FilterType::Ptr m_filterType; - VcDocConstants::DocumentVersion m_docVersion; }; } // namespace Internal diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/folder.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/folder.cpp index 5f0dd6f069..24443548f0 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/folder.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/folder.cpp @@ -128,6 +128,18 @@ File::Ptr Folder::file(const QString &relativeFilePath) const return m_folderType->file(relativeFilePath); } +bool Folder::fileExists(const QString &relativeFilePath) +{ + QList<File::Ptr> files = m_folderType->files(); + + foreach (File::Ptr filePtr, files) { + if (filePtr->relativePath() == relativeFilePath) + return true; + } + + return false; +} + void Folder::addFolder(Folder::Ptr folder) { m_folderType->addFolder(folder); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/folder.h b/src/plugins/vcprojectmanager/vcprojectmodel/folder.h index d05bd69cd2..ef50d26faf 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/folder.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/folder.h @@ -63,6 +63,7 @@ public: 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); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.cpp index b8fc6e39b0..c3fa262a3c 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.cpp @@ -34,8 +34,10 @@ #include "filter.h" #include "file.h" #include "files.h" +#include "filefactory.h" #include <QFileInfo> +#include <projectexplorer/projectexplorer.h> namespace VcProjectManager { namespace Internal { @@ -57,82 +59,325 @@ void VcFileNode::readChildren(VcDocProjectNode *vcDocProj) } -VcFolderNode::VcFolderNode(Folder *folderModel, VcDocProjectNode *vcDocProjNode) - : FolderNode(folderModel->name()), - m_vcFolderModel(folderModel), - m_vcFilterModel(0) +VcContainerNode::VcContainerNode(const QString &folderPath) + : ProjectExplorer::FolderNode(folderPath) { - readChildren(vcDocProjNode); } -VcFolderNode::VcFolderNode(Filter *filterModel, VcDocProjectNode *vcDocProjNode) - : FolderNode(filterModel->name()), - m_vcFilterModel(filterModel), - m_vcFolderModel(0) +VcContainerNode::~VcContainerNode() { - readChildren(vcDocProjNode); } -VcFolderNode::~VcFolderNode() +VcContainerNode::VcContainerType VcContainerNode::vcContainerType() const { + return m_vcContainerType; } -void VcFolderNode::appendFolderNode(VcFolderNode *folderNode) + +VcFilterNode::VcFilterNode(Filter *filterModel, VcDocProjectNode *vcDocProjNode) + : VcContainerNode(filterModel->name()), + m_vcFilterModel(filterModel) { - if (m_subFolderNodes.contains(folderNode)) - return; - m_subFolderNodes.append(folderNode); + m_parentVcDocProjNode = vcDocProjNode; + m_vcContainerType = VcContainerType_Filter; + readChildren(); +} + +VcFilterNode::~VcFilterNode() +{ +} + +void VcFilterNode::addFileNode(const QString &filePath) +{ + File *file = new File(m_parentVcDocProjNode->m_vcProjectModel); + file->setRelativePath(filePath); + VcFileNode *fileNode = new VcFileNode(file, m_parentVcDocProjNode); + + if (!appendFileNode(fileNode)) { + delete file; + delete fileNode; + } } -void VcFolderNode::appendFileNode(VcFileNode *fileNode) +bool VcFilterNode::appendFileNode(VcFileNode *fileNode) { + if (!m_vcFilterModel || !fileNode || !fileNode->m_vcFileModel) + return false; + if (m_fileNodes.contains(fileNode)) + return false; + else { + foreach (ProjectExplorer::FileNode *fNode, m_fileNodes) { + VcFileNode *vcFileNode = qobject_cast<VcFileNode *>(fNode); + + if (vcFileNode && + vcFileNode->m_vcFileModel && + vcFileNode->m_vcFileModel->relativePath() == fileNode->m_vcFileModel->relativePath()) + return false; + } + } + + File::Ptr filePtr = File::Ptr(fileNode->m_vcFileModel); + m_vcFilterModel->addFile(filePtr); + QList<ProjectExplorer::FileNode *> vcFileNodes; + vcFileNodes << fileNode; + m_parentVcDocProjNode->addFileNodes(vcFileNodes, this); + return true; +} + +void VcFilterNode::addFilterNode(const QString &name) +{ + Filter *filter = new Filter(m_parentVcDocProjNode->m_vcProjectModel); + filter->setName(name); + VcFilterNode *filterNode = new VcFilterNode(filter, m_parentVcDocProjNode); + + if (!appendFilterNode(filterNode)) { + delete filter; + delete filterNode; + } +} + +bool VcFilterNode::appendFilterNode(VcFilterNode *folderNode) +{ + if (!m_vcFilterModel || !folderNode || !folderNode->m_vcFilterModel) + return false; + + if (m_subFolderNodes.contains(folderNode)) + return false; + else { + foreach (ProjectExplorer::FolderNode *fNode, m_subFolderNodes) { + VcFilterNode *vcFilterNode = qobject_cast<VcFilterNode *>(fNode); + + if (vcFilterNode && + vcFilterNode->m_vcFilterModel && + vcFilterNode->m_vcFilterModel->name() == folderNode->m_vcFilterModel->name()) + return false; + } + } + + Filter::Ptr filterPtr = Filter::Ptr(folderNode->m_vcFilterModel); + m_vcFilterModel->addFilter(filterPtr); + QList<ProjectExplorer::FolderNode *> vcFolderNodes; + vcFolderNodes << folderNode; + m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); + m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); + return true; +} + +void VcFilterNode::removeFilterNode(VcFilterNode *filterNode) +{ + if (!filterNode || !filterNode->m_vcFilterModel) return; - m_fileNodes.append(fileNode); + + QString filterName = filterNode->m_vcFilterModel->name(); + + QList<ProjectExplorer::FolderNode *> folderNodesToRemove; + folderNodesToRemove << filterNode; + m_parentVcDocProjNode->removeFolderNodes(folderNodesToRemove, this); + + m_vcFilterModel->removeFilter(filterName); + m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); } -void VcFolderNode::readChildren(VcDocProjectNode *docProjNode) +void VcFilterNode::readChildren() { - if (m_vcFilterModel) { - QList<Filter::Ptr > filters = m_vcFilterModel->filters(); - QList<File::Ptr > files = m_vcFilterModel->files(); + QList<Filter::Ptr > filters = m_vcFilterModel->filters(); + QList<File::Ptr > files = m_vcFilterModel->files(); - QList<ProjectExplorer::FolderNode *> vcFolderNodes; - foreach (Filter::Ptr filter, filters) - vcFolderNodes.append(new VcFolderNode(filter.data(), docProjNode)); + QList<ProjectExplorer::FolderNode *> vcFolderNodes; + foreach (Filter::Ptr filter, filters) + vcFolderNodes.append(new VcFilterNode(filter.data(), m_parentVcDocProjNode)); - docProjNode->addFolderNodes(vcFolderNodes, this); + m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); - QList<ProjectExplorer::FileNode *> vcFileNodes; - foreach (File::Ptr file, files) - vcFileNodes.append(new VcFileNode(file.data(), docProjNode)); + QList<ProjectExplorer::FileNode *> vcFileNodes; + foreach (File::Ptr file, files) + vcFileNodes.append(new VcFileNode(file.data(), m_parentVcDocProjNode)); + + m_parentVcDocProjNode->addFileNodes(vcFileNodes, this); +} + + +VcFolderNode::VcFolderNode(Folder *folderModel, VcDocProjectNode *vcDocProjNode) + : VcContainerNode(folderModel->name()), + m_vcFolderModel(folderModel) +{ + m_parentVcDocProjNode = vcDocProjNode; + m_vcContainerType = VcContainerType_Folder; + readChildren(); +} - docProjNode->addFileNodes(vcFileNodes, this); +VcFolderNode::~VcFolderNode() +{ +} + +void VcFolderNode::addFileNode(const QString &filePath) +{ + File *file = new File(m_parentVcDocProjNode->m_vcProjectModel); + file->setRelativePath(filePath); + VcFileNode *fileNode = new VcFileNode(file, m_parentVcDocProjNode); + + if (!appendFileNode(fileNode)) { + delete file; + delete fileNode; } +} - else if (m_vcFolderModel) { - QList<Filter::Ptr > filters = m_vcFolderModel->filters(); - QList<Folder::Ptr > folders = m_vcFolderModel->folders(); - QList<File::Ptr > files = m_vcFolderModel->files(); +bool VcFolderNode::appendFileNode(VcFileNode *fileNode) +{ + if (!m_vcFolderModel || !fileNode || !fileNode->m_vcFileModel) + return false; - QList<ProjectExplorer::FolderNode *> vcFolderNodes; - foreach (Filter::Ptr filter, filters) - vcFolderNodes.append(new VcFolderNode(filter.data(), docProjNode)); + if (m_fileNodes.contains(fileNode)) + return false; + else { + foreach (ProjectExplorer::FileNode *fNode, m_fileNodes) { + VcFileNode *vcFileNode = qobject_cast<VcFileNode *>(fNode); + + if (vcFileNode && + vcFileNode->m_vcFileModel && + vcFileNode->m_vcFileModel->relativePath() == fileNode->m_vcFileModel->relativePath()) + return false; + } + } - docProjNode->addFolderNodes(vcFolderNodes, this); + File::Ptr filePtr = File::Ptr(fileNode->m_vcFileModel); + m_vcFolderModel->addFile(filePtr); + QList<ProjectExplorer::FileNode *> vcFileNodes; + vcFileNodes << fileNode; + m_parentVcDocProjNode->addFileNodes(vcFileNodes, this); + return true; +} - vcFolderNodes.clear(); - foreach (Folder::Ptr folder, folders) - vcFolderNodes.append(new VcFolderNode(folder.data(), docProjNode)); +void VcFolderNode::addFilterNode(const QString &name) +{ + Filter *filter = new Filter(m_parentVcDocProjNode->m_vcProjectModel); + filter->setName(name); + VcFilterNode *filterNode = new VcFilterNode(filter, m_parentVcDocProjNode); - docProjNode->addFolderNodes(vcFolderNodes, this); + if (!appendFilterNode(filterNode)) { + delete filter; + delete filterNode; + } +} - QList<ProjectExplorer::FileNode *> vcFileNodes; - foreach (File::Ptr file, files) - vcFileNodes.append(new VcFileNode(file.data(), docProjNode)); +bool VcFolderNode::appendFilterNode(VcFilterNode *filterNode) +{ + if (!m_vcFolderModel && !filterNode && !filterNode->m_vcFilterModel) + return false; - docProjNode->addFileNodes(vcFileNodes, this); + if (m_subFolderNodes.contains(filterNode)) + return false; + else { + foreach (ProjectExplorer::FolderNode *fNode, m_subFolderNodes) { + VcFilterNode *vcFilterNode = qobject_cast<VcFilterNode *>(fNode); + + if (vcFilterNode && + vcFilterNode->m_vcFilterModel && + vcFilterNode->m_vcFilterModel->name() == filterNode->m_vcFilterModel->name()) + return false; + } } + + Filter::Ptr filterPtr = Filter::Ptr(filterNode->m_vcFilterModel); + m_vcFolderModel->addFilter(filterPtr); + QList<ProjectExplorer::FolderNode *> vcFolderNodes; + vcFolderNodes << filterNode; + m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); + m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); + return true; +} + +void VcFolderNode::removeFilterNode(VcFilterNode *filterNode) +{ + if (!filterNode || !filterNode->m_vcFilterModel) + return; + + QString filterName = filterNode->m_vcFilterModel->name(); + + QList<ProjectExplorer::FolderNode *> folderNodesToRemove; + folderNodesToRemove << filterNode; + m_parentVcDocProjNode->removeFolderNodes(folderNodesToRemove, this); + + m_vcFolderModel->removeFilter(filterName); + 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->setName(name); + VcFolderNode *folderNode = new VcFolderNode(folder, m_parentVcDocProjNode); + + if (!appendFolderNode(folderNode)) { + delete folder; + delete folderNode; + } +} + +bool VcFolderNode::appendFolderNode(VcFolderNode *folderNode) +{ + if (!m_vcFolderModel || !folderNode || !folderNode->m_vcFolderModel) + return false; + + if (m_subFolderNodes.contains(folderNode)) + return false; + else { + foreach (ProjectExplorer::FolderNode *fNode, m_subFolderNodes) { + VcFolderNode *vcFolderNode = qobject_cast<VcFolderNode *>(fNode); + + if (vcFolderNode && + vcFolderNode->m_vcFolderModel && + vcFolderNode->m_vcFolderModel->name() == folderNode->m_vcFolderModel->name()) + return false; + } + } + + Folder::Ptr folderPtr = Folder::Ptr(folderNode->m_vcFolderModel); + m_vcFolderModel->addFolder(folderPtr); + QList<ProjectExplorer::FolderNode *> vcFolderNodes; + vcFolderNodes << folderNode; + m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); + m_parentVcDocProjNode->m_vcProjectModel->saveToFile(m_parentVcDocProjNode->m_vcProjectModel->filePath()); + return true; +} + +void VcFolderNode::removeFolderNode(VcFolderNode *node) +{ + if (!node) + return; + + // Folder *vcFolderModel = node->m_vcFolderModel; + + // QList<ProjectExplorer::FolderNode *> folderNodesToRemove; + // folderNodesToRemove << node; + // m_parentVcDocProjNode->removeFileNodes(folderNodesToRemove, this); + +} + +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 (Filter::Ptr filter, filters) + vcFolderNodes.append(new VcFilterNode(filter.data(), m_parentVcDocProjNode)); + + m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); + + vcFolderNodes.clear(); + foreach (Folder::Ptr folder, folders) + vcFolderNodes.append(new VcFolderNode(folder.data(), m_parentVcDocProjNode)); + + m_parentVcDocProjNode->addFolderNodes(vcFolderNodes, this); + + QList<ProjectExplorer::FileNode *> vcFileNodes; + foreach (File::Ptr file, files) + vcFileNodes.append(new VcFileNode(file.data(), m_parentVcDocProjNode)); + + m_parentVcDocProjNode->addFileNodes(vcFileNodes, this); } @@ -146,7 +391,7 @@ VcDocProjectNode::VcDocProjectNode(VcProjectDocument *vcProjectModel) QList<ProjectExplorer::FolderNode *> vcFolderNodes; foreach (Filter::Ptr filter, filters) - vcFolderNodes.append(new VcFolderNode(filter.data(), this)); + vcFolderNodes.append(new VcFilterNode(filter.data(), this)); addFolderNodes(vcFolderNodes, this); @@ -170,7 +415,7 @@ VcDocProjectNode::VcDocProjectNode(VcProjectDocument *vcProjectModel) QList<ProjectExplorer::FolderNode *> vcFolderNodes; foreach (Filter::Ptr filter, filters) - vcFolderNodes.append(new VcFolderNode(filter.data(), this)); + vcFolderNodes.append(new VcFilterNode(filter.data(), this)); addFolderNodes(vcFolderNodes, this); @@ -194,8 +439,18 @@ bool VcDocProjectNode::hasBuildTargets() const QList<ProjectExplorer::ProjectNode::ProjectAction> VcDocProjectNode::supportedActions(ProjectExplorer::Node *node) const { - Q_UNUSED(node) - return QList<ProjectExplorer::ProjectNode::ProjectAction>(); + QList<ProjectExplorer::ProjectNode::ProjectAction> actions; + + actions << AddNewFile + << AddExistingFile; + + ProjectExplorer::FileNode *fileNode = qobject_cast<ProjectExplorer::FileNode *>(node); + if (fileNode && fileNode->fileType() != ProjectExplorer::ProjectFileType) { + actions << Rename; + actions << RemoveFile; + } + + return actions; } bool VcDocProjectNode::canAddSubProject(const QString &proFilePath) const @@ -218,10 +473,63 @@ bool VcDocProjectNode::removeSubProjects(const QStringList &proFilePaths) bool VcDocProjectNode::addFiles(const ProjectExplorer::FileType fileType, const QStringList &filePaths, QStringList *notAdded) { + // add files like in VS + // if () + + // add files to the node which called it Q_UNUSED(fileType) - Q_UNUSED(filePaths) - Q_UNUSED(notAdded) - return false; + + ProjectExplorer::ProjectExplorerPlugin *projExplPlugin = ProjectExplorer::ProjectExplorerPlugin::instance(); + ProjectExplorer::Node *node = projExplPlugin->currentNode(); + + QStringList filesNotAdded; + bool anyFileAdded = false; + + if (node->nodeType() == ProjectExplorer::FolderNodeType) { + VcContainerNode *vcContainerNode = static_cast<VcContainerNode *>(node); + + if (vcContainerNode) { + foreach (const QString &filePath, filePaths) { + QString relativeFilePath = m_vcProjectModel->fileRelativePath(filePath); + + // if file is already in the project don't add it + if (m_vcProjectModel->files()->fileExists(relativeFilePath)) + filesNotAdded << filePath; + + else { + vcContainerNode->addFileNode(relativeFilePath); + anyFileAdded = true; + } + } + } + } + + if (node->nodeType() == ProjectExplorer::ProjectFileType) { + VcDocProjectNode *projectNode = static_cast<VcDocProjectNode *>(node); + + if (projectNode) { + foreach (const QString &filePath, filePaths) { + QString relativeFilePath = m_vcProjectModel->fileRelativePath(filePath); + + // if file is already in the project don't add it + if (m_vcProjectModel->files()->fileExists(relativeFilePath)) + filesNotAdded << filePath; + + else { + projectNode->addFileNode(relativeFilePath); + anyFileAdded = true; + } + } + } + } + + if (notAdded) + *notAdded = filesNotAdded; + + if (anyFileAdded) + m_vcProjectModel->saveToFile(m_vcProjectModel->filePath()); + + return filesNotAdded.isEmpty(); } bool VcDocProjectNode::removeFiles(const ProjectExplorer::FileType fileType, const QStringList &filePaths, QStringList *notRemoved) @@ -264,5 +572,154 @@ QString VcDocProjectNode::projectDirectory() const return fileInfo.canonicalPath(); } +void VcDocProjectNode::addFileNode(const QString &filePath) +{ + File *file = new File(m_vcProjectModel); + file->setRelativePath(filePath); + VcFileNode *fileNode = new VcFileNode(file, this); + + if (!appendFileNode(fileNode)) { + delete file; + delete fileNode; + } +} + +void VcDocProjectNode::addFolderNode(const QString &name) +{ + Folder *folder = new Folder(m_vcProjectModel); + folder->setName(name); + VcFolderNode *folderNode = new VcFolderNode(folder, this); + + if (!appendFolderNode(folderNode)) { + delete folder; + delete folderNode; + } +} + +void VcDocProjectNode::addFilterNode(const QString &name) +{ + Filter *filter = new Filter(m_vcProjectModel); + filter->setName(name); + VcFilterNode *folderNode = new VcFilterNode(filter, this); + + if (!appendFilterNode(folderNode)) { + delete filter; + delete folderNode; + } +} + +bool VcDocProjectNode::appendFolderNode(VcFolderNode *folderNode) +{ + if (!m_vcProjectModel || m_vcProjectModel->documentVersion() != VcDocConstants::DV_MSVC_2005) + return false; + + if (!folderNode || !folderNode->m_vcFolderModel) + return false; + + if (m_subFolderNodes.contains(folderNode)) + return false; + else { + foreach (ProjectExplorer::FolderNode *fNode, m_subFolderNodes) { + VcFolderNode *vcFolderNode = qobject_cast<VcFolderNode *>(fNode); + + if (vcFolderNode && + vcFolderNode->m_vcFolderModel && + folderNode->m_vcFolderModel && + vcFolderNode->m_vcFolderModel->name() == folderNode->m_vcFolderModel->name()) + return false; + } + } + + Folder::Ptr folderPtr = Folder::Ptr(folderNode->m_vcFolderModel); + m_vcProjectModel->files().staticCast<Files2005>()->addFolder(folderPtr); + QList<ProjectExplorer::FolderNode *> vcFolderNodes; + vcFolderNodes << folderNode; + addFolderNodes(vcFolderNodes, this); + m_vcProjectModel->saveToFile(m_vcProjectModel->filePath()); + return true; +} + +bool VcDocProjectNode::appendFilterNode(VcFilterNode *filterNode) +{ + if (!m_vcProjectModel || !filterNode || !filterNode->m_vcFilterModel) + return false; + + if (m_subFolderNodes.contains(filterNode)) + return false; + else { + foreach (ProjectExplorer::FolderNode *fNode, m_subFolderNodes) { + VcFilterNode *vcFolderNode = qobject_cast<VcFilterNode *>(fNode); + + if (vcFolderNode->m_vcFilterModel && vcFolderNode->m_vcFilterModel->name() == filterNode->m_vcFilterModel->name()) + return false; + } + } + + Filter::Ptr filterPtr = Filter::Ptr(filterNode->m_vcFilterModel); + m_vcProjectModel->files()->addFilter(filterPtr); + QList<ProjectExplorer::FolderNode *> vcFolderNodes; + vcFolderNodes << filterNode; + addFolderNodes(vcFolderNodes, this); + m_vcProjectModel->saveToFile(m_vcProjectModel->filePath()); + return true; +} + +bool VcDocProjectNode::appendFileNode(VcFileNode *fileNode) +{ + if (!m_vcProjectModel || !fileNode || !fileNode->m_vcFileModel) + return false; + + if (m_fileNodes.contains(fileNode)) + return false; + else { + foreach (ProjectExplorer::FileNode *fNode, m_fileNodes) { + VcFileNode *vcFileNode = qobject_cast<VcFileNode *>(fNode); + + if (vcFileNode->m_vcFileModel && vcFileNode->m_vcFileModel->relativePath() == fileNode->m_vcFileModel->relativePath()) + return false; + } + } + + File::Ptr filePtr = File::Ptr(fileNode->m_vcFileModel); + m_vcProjectModel->files()->addFile(filePtr); + QList<ProjectExplorer::FileNode *> vcFileNodes; + vcFileNodes << fileNode; + addFileNodes(vcFileNodes, this); + return true; +} + +void VcDocProjectNode::removeFilterNode(VcFilterNode *filterNode) +{ + if (!m_vcProjectModel || !filterNode || !filterNode->m_vcFilterModel) + return; + + QString filterName = filterNode->m_vcFilterModel->name(); + + QList<ProjectExplorer::FolderNode *> folderNodesToRemove; + folderNodesToRemove << filterNode; + removeFolderNodes(folderNodesToRemove, this); + + m_vcProjectModel->files()->removeFilter(filterName); + m_vcProjectModel->saveToFile(m_vcProjectModel->filePath()); +} + +void VcDocProjectNode::removeFolderNode(VcFolderNode *folderNode) +{ + if (!m_vcProjectModel || m_vcProjectModel->documentVersion() != VcDocConstants::DV_MSVC_2005) + return; + + if (!folderNode || !folderNode->m_vcFolderModel) + return; + + QString folderName = folderNode->m_vcFolderModel->name(); + + QList<ProjectExplorer::FolderNode *> folderNodesToRemove; + folderNodesToRemove << folderNode; + removeFolderNodes(folderNodesToRemove, this); + + m_vcProjectModel->files().staticCast<Files2005>()->removeFolder(folderName); + m_vcProjectModel->saveToFile(m_vcProjectModel->filePath()); +} + } // namespace Internal } // namespace VcProjectManager diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.h b/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.h index f49ce2db56..3e0e7c8c0e 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.h @@ -43,6 +43,12 @@ class VcDocProjectNode; class VcFileNode : public ProjectExplorer::FileNode { + Q_OBJECT + + friend class VcFolderNode; + friend class VcDocProjectNode; + friend class VcFilterNode; + public: VcFileNode(File *fileModel, VcDocProjectNode *vcDocProject); ~VcFileNode(); @@ -54,28 +60,106 @@ private: File *m_vcFileModel; }; -class VcFolderNode : public ProjectExplorer::FolderNode +class VcFilterNode; + +class VcContainerNode : public ProjectExplorer::FolderNode +{ + Q_OBJECT + + friend class VcFileNode; + friend class VcDocProjectNode; + +public: + enum VcContainerType { + VcContainerType_Filter, + VcContainerType_Folder + }; + + VcContainerNode(const QString &folderPath); + ~VcContainerNode(); + + VcContainerType vcContainerType() const; + + virtual void addFileNode(const QString &filePath) = 0; + virtual bool appendFileNode(VcFileNode *fileNode) = 0; + + virtual void addFilterNode(const QString &name) = 0; + virtual bool appendFilterNode(VcFilterNode *folderNode) = 0; + + virtual void removeFilterNode(VcFilterNode *filterNode) = 0; + +protected: + VcContainerType m_vcContainerType; + VcDocProjectNode *m_parentVcDocProjNode; +}; + +class VcFilterNode : public VcContainerNode +{ + Q_OBJECT + + friend class VcFileNode; + friend class VcDocProjectNode; + friend class VcFolderNode; + +public: + VcFilterNode(Filter *filterModel, VcDocProjectNode *vcDocProjNode); + ~VcFilterNode(); + + void addFileNode(const QString &filePath); + bool appendFileNode(VcFileNode *fileNode); + + void addFilterNode(const QString &name); + bool appendFilterNode(VcFilterNode *folderNode); + + void removeFilterNode(VcFilterNode *filterNode); + +protected: + void readChildren(); + +private: + Filter *m_vcFilterModel; +}; + +class VcFolderNode : public VcContainerNode { + Q_OBJECT + + friend class VcFileNode; + friend class VcDocProjectNode; + friend class VcFilterNode; + public: VcFolderNode(Folder *folderModel, VcDocProjectNode *vcDocProjNode); - VcFolderNode(Filter *filterModel, VcDocProjectNode *vcDocProjNode); ~VcFolderNode(); - void appendFolderNode(VcFolderNode *folderNode); - void appendFileNode(VcFileNode *fileNode); + void addFileNode(const QString &filePath); + bool appendFileNode(VcFileNode *fileNode); + + void addFilterNode(const QString &name); + bool appendFilterNode(VcFilterNode *folderNode); + + void removeFilterNode(VcFilterNode *filterNode); + + void addFolderNode(const QString &name); // only for VS 2005 + bool appendFolderNode(VcFolderNode *folderNode); // only for VS 2005 + + void removeFolderNode(VcFolderNode *node); protected: - void readChildren(VcDocProjectNode *docProjNode); + void readChildren(); private: Folder *m_vcFolderModel; - Filter *m_vcFilterModel; }; class VcDocProjectNode : public ProjectExplorer::ProjectNode { + Q_OBJECT + friend class VcFolderNode; friend class VcFileNode; + friend class VcFilterNode; + public: VcDocProjectNode(VcProjectDocument* vcProjectModel); ~VcDocProjectNode(); @@ -100,6 +184,16 @@ public: QString projectDirectory() const; + void addFileNode(const QString &filePath); + void addFolderNode(const QString &name); // only for VS 2005 + void addFilterNode(const QString &name); + bool appendFolderNode(VcFolderNode *folderNode); // only for VS 2005 + bool appendFilterNode(VcFilterNode *filterNode); + bool appendFileNode(VcFileNode *fileNode); + + void removeFilterNode(VcFilterNode *filterNode); + void removeFolderNode(VcFolderNode *folderNode); + private: VcProjectDocument *m_vcProjectModel; }; diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp index c61486b98f..123874c3da 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp @@ -30,6 +30,7 @@ #include "vcprojectdocument.h" #include <QDomElement> +#include <QDir> #include <QFile> #include <QStringList> #include <QTextStream> @@ -88,6 +89,11 @@ void VcProjectDocument::allProjectFiles(QStringList &sl) const m_files->allProjectFiles(sl); } +QString VcProjectDocument::fileRelativePath(const QString &filePath) +{ + return QFileInfo(m_filePath).absoluteDir().relativeFilePath(filePath); +} + Configurations::Ptr VcProjectDocument::configurations() const { return m_configurations; diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h index eb0e9b58dc..0871d4833b 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h @@ -61,6 +61,9 @@ public: virtual MsBuildInformation::MsBuildVersion minSupportedMsBuildVersion() const = 0; virtual MsBuildInformation::MsBuildVersion maxSupportedMsBuildVersion() const = 0; + // helper function, used to create a relative path to a file, path is relative to a project's file path + QString fileRelativePath(const QString &filePath); + Configurations::Ptr configurations() const; Platforms::Ptr platforms() const; Files::Ptr files() const; diff --git a/src/plugins/vcprojectmanager/widgets/vccontainernamedialog.cpp b/src/plugins/vcprojectmanager/widgets/vccontainernamedialog.cpp new file mode 100644 index 0000000000..ce8a302511 --- /dev/null +++ b/src/plugins/vcprojectmanager/widgets/vccontainernamedialog.cpp @@ -0,0 +1,60 @@ +/************************************************************************** +** +** Copyright (c) 2013 Bojan Petrovic +** Copyright (c) 2013 Radovan Zivkvoic +** 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. +** +****************************************************************************/ +#include "vccontainernamedialog.h" +#include "ui_vccontainernamewidget.h" + +namespace VcProjectManager { +namespace Internal { + +VcContainerNameDialog::VcContainerNameDialog(const QString &containerType, QWidget *parent) : + QDialog(parent), + ui(new Ui::VcContainerNameWidget) +{ + ui->setupUi(this); + ui->m_containerTypeLabel->setText(containerType); +} + +VcContainerNameDialog::~VcContainerNameDialog() +{ + delete ui; +} + +QString VcContainerNameDialog::contanerName() const +{ + return ui->m_containerName->text(); +} + +void VcContainerNameDialog::setContainerName(const QString &name) +{ + ui->m_containerName->setText(name); +} + +} // namespace Internal +} // namespace VcProjectManager diff --git a/src/plugins/vcprojectmanager/widgets/vccontainernamedialog.h b/src/plugins/vcprojectmanager/widgets/vccontainernamedialog.h new file mode 100644 index 0000000000..519a0f6868 --- /dev/null +++ b/src/plugins/vcprojectmanager/widgets/vccontainernamedialog.h @@ -0,0 +1,60 @@ +/************************************************************************** +** +** Copyright (c) 2013 Bojan Petrovic +** Copyright (c) 2013 Radovan Zivkvoic +** 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_VCCONTAINERNAMEWIDGET_H +#define VCPROJECTMANAGER_INTERNAL_VCCONTAINERNAMEWIDGET_H + +#include <QDialog> + +namespace VcProjectManager { +namespace Internal { + +namespace Ui { +class VcContainerNameWidget; +} + +class VcContainerNameDialog : public QDialog +{ + Q_OBJECT + +public: + explicit VcContainerNameDialog(const QString &containerType, QWidget *parent = 0); + ~VcContainerNameDialog(); + + QString contanerName() const; + void setContainerName(const QString &name); + +private: + Ui::VcContainerNameWidget *ui; +}; + + +} // namespace Internal +} // namespace VcProjectManager +#endif // VCPROJECTMANAGER_INTERNAL_VCCONTAINERNAMEWIDGET_H diff --git a/src/plugins/vcprojectmanager/widgets/vccontainernamewidget.ui b/src/plugins/vcprojectmanager/widgets/vccontainernamewidget.ui new file mode 100644 index 0000000000..504ad527ac --- /dev/null +++ b/src/plugins/vcprojectmanager/widgets/vccontainernamewidget.ui @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>VcProjectManager::Internal::VcContainerNameWidget</class> + <widget class="QDialog" name="VcProjectManager::Internal::VcContainerNameWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>239</width> + <height>69</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>69</height> + </size> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="m_containerTypeLabel"> + <property name="minimumSize"> + <size> + <width>80</width> + <height>20</height> + </size> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="m_containerName"> + <property name="minimumSize"> + <size> + <width>30</width> + <height>20</height> + </size> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QDialogButtonBox" name="m_buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>m_buttonBox</sender> + <signal>accepted()</signal> + <receiver>VcProjectManager::Internal::VcContainerNameWidget</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>m_buttonBox</sender> + <signal>rejected()</signal> + <receiver>VcProjectManager::Internal::VcContainerNameWidget</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/plugins/vcprojectmanager/widgets/widgets.pri b/src/plugins/vcprojectmanager/widgets/widgets.pri index 508ca692ad..1c3fb1d079 100644 --- a/src/plugins/vcprojectmanager/widgets/widgets.pri +++ b/src/plugins/vcprojectmanager/widgets/widgets.pri @@ -7,7 +7,8 @@ HEADERS += \ widgets/configurationswidget.h \ widgets/basicconfigurationwidget.h \ widgets/schemaoptionswidget.h \ - widgets/vcprojectkitconfigwidget.h + widgets/vcprojectkitconfigwidget.h \ + widgets/vccontainernamedialog.h SOURCES += \ widgets/vcnodewidget.cpp \ @@ -18,10 +19,12 @@ SOURCES += \ widgets/configurationswidget.cpp \ widgets/basicconfigurationwidget.cpp \ widgets/schemaoptionswidget.cpp \ - widgets/vcprojectkitconfigwidget.cpp + widgets/vcprojectkitconfigwidget.cpp \ + widgets/vccontainernamedialog.cpp FORMS += \ widgets/projectsettingswidget.ui \ widgets/configurationswidget.ui \ - widgets/schemaoptionswidget.ui + widgets/schemaoptionswidget.ui \ + widgets/vccontainernamewidget.ui |
