summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRadovan Zivkovic <pivonroll@gmail.com>2013-05-29 00:17:13 +0200
committerOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-03-11 19:54:54 +0100
commitcce791af9739ce38caa7ad88dde36ae44d767c1f (patch)
treeb59823fc49601ec6ef35ca962cc19bb8702a85dc
parentfa1a67730d146dec1cb4d8cdb744486165b0aaec (diff)
downloadqt-creator-cce791af9739ce38caa7ad88dde36ae44d767c1f.tar.gz
Files, folders and filters can now be added/removed.
Change-Id: I05b0fff0dfbe04544c69b56c85b4311dfe2072f8 Reviewed-by: Bojan Petrovic <bojan85@gmail.com>
-rw-r--r--src/plugins/vcprojectmanager/menuhandler.cpp167
-rw-r--r--src/plugins/vcprojectmanager/menuhandler.h12
-rw-r--r--src/plugins/vcprojectmanager/vcmakestep.cpp6
-rw-r--r--src/plugins/vcprojectmanager/vcproject.cpp4
-rw-r--r--src/plugins/vcprojectmanager/vcproject.h2
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanagerconstants.h9
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/files.cpp71
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/files.h10
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/filter.cpp12
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/filter.h2
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/folder.cpp12
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/folder.h1
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.cpp561
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/vcdocprojectnodes.h106
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp6
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h3
-rw-r--r--src/plugins/vcprojectmanager/widgets/vccontainernamedialog.cpp60
-rw-r--r--src/plugins/vcprojectmanager/widgets/vccontainernamedialog.h60
-rw-r--r--src/plugins/vcprojectmanager/widgets/vccontainernamewidget.ui109
-rw-r--r--src/plugins/vcprojectmanager/widgets/widgets.pri9
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