From e5f8a31b9ef7ab90959c6ed62af14b838b3934d6 Mon Sep 17 00:00:00 2001 From: dt Date: Tue, 24 Aug 2010 17:17:11 +0200 Subject: [PATCH] Fix File/New in the deployment folders. That is tell the user that those files need not be added to any project, and show "" for them on the last wizard page. This fixes Add/New for the QML/OTHER_FILES folder structure, except for the virtual folder itself. Reviewed-By: Jarek Kobus --- .../genericprojectnodes.cpp | 3 +- .../projectexplorer/projectexplorer.cpp | 13 ++--- .../projectfilewizardextension.cpp | 49 ++++++++++++++++--- src/plugins/projectexplorer/projectnodes.cpp | 6 +++ src/plugins/projectexplorer/projectnodes.h | 11 ++++- .../projectexplorer/projectwizardpage.cpp | 11 +++++ .../projectexplorer/projectwizardpage.h | 3 ++ .../projectexplorer/projectwizardpage.ui | 25 +++++++--- .../qmlprojectmanager/qmlprojectnodes.cpp | 2 +- src/plugins/qt4projectmanager/qt4nodes.cpp | 26 ++++++++-- src/plugins/qt4projectmanager/qt4nodes.h | 2 + .../qtsingleapplication.cpp | 1 - 12 files changed, 127 insertions(+), 25 deletions(-) diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp index 2664f5a26c6..61e43a82046 100644 --- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp +++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp @@ -174,7 +174,8 @@ QList GenericProjectNode::supported { Q_UNUSED(node); return QList() - << AddFile + << AddNewFile + << AddExistingFile << RemoveFile; } diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index d8584451a1c..227d20e0ed4 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -162,12 +162,12 @@ struct ProjectExplorerPluginPrivate { QAction *m_debugAction; QAction *m_addNewFileAction; QAction *m_addExistingFilesAction; - QAction *m_openFileAction; - QAction *m_showInGraphicalShell; - QAction *m_openTerminalHere; QAction *m_removeFileAction; QAction *m_deleteFileAction; QAction *m_renameFileAction; + QAction *m_openFileAction; + QAction *m_showInGraphicalShell; + QAction *m_openTerminalHere; QAction *m_projectSelectorAction; QAction *m_projectSelectorActionMenu; @@ -724,6 +724,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er globalcontext); mfilec->addAction(cmd, Constants::G_FILE_OTHER); + // delete file action d->m_deleteFileAction = new QAction(tr("Delete File..."), this); cmd = am->registerAction(d->m_deleteFileAction, ProjectExplorer::Constants::DELETEFILE, globalcontext); @@ -1968,6 +1969,7 @@ void ProjectExplorerPlugin::updateContextMenuActions(Node *node) d->m_removeFileAction->setEnabled(false); d->m_deleteFileAction->setEnabled(false); + d->m_addExistingFilesAction->setVisible(true); d->m_removeFileAction->setVisible(true); d->m_deleteFileAction->setVisible(true); @@ -1976,9 +1978,8 @@ void ProjectExplorerPlugin::updateContextMenuActions(Node *node) d->m_currentNode->projectNode()->supportedActions(node); if (qobject_cast(d->m_currentNode)) { - bool addFilesEnabled = actions.contains(ProjectNode::AddFile); - d->m_addExistingFilesAction->setEnabled(addFilesEnabled); - d->m_addNewFileAction->setEnabled(addFilesEnabled); + d->m_addNewFileAction->setEnabled(actions.contains(ProjectNode::AddNewFile)); + d->m_addExistingFilesAction->setEnabled(actions.contains(ProjectNode::AddExistingFile)); d->m_renameFileAction->setEnabled(actions.contains(ProjectNode::Rename)); } else if (qobject_cast(d->m_currentNode)) { // Enable and show remove / delete in magic ways: diff --git a/src/plugins/projectexplorer/projectfilewizardextension.cpp b/src/plugins/projectexplorer/projectfilewizardextension.cpp index 69df21df82d..a432e5cfb1a 100644 --- a/src/plugins/projectexplorer/projectfilewizardextension.cpp +++ b/src/plugins/projectexplorer/projectfilewizardextension.cpp @@ -65,24 +65,29 @@ namespace Internal { class AllProjectNodesVisitor : public NodesVisitor { public: - static ProjectNodeList allProjects(); + AllProjectNodesVisitor(ProjectNode::ProjectAction action) + : m_action(action) + {} + + static ProjectNodeList allProjects(ProjectNode::ProjectAction action); virtual void visitProjectNode(ProjectNode *node); private: ProjectNodeList m_projectNodes; + ProjectNode::ProjectAction m_action; }; -ProjectNodeList AllProjectNodesVisitor::allProjects() +ProjectNodeList AllProjectNodesVisitor::allProjects(ProjectNode::ProjectAction action) { - AllProjectNodesVisitor visitor; + AllProjectNodesVisitor visitor(action); ProjectExplorerPlugin::instance()->session()->sessionNode()->accept(&visitor); return visitor.m_projectNodes; } void AllProjectNodesVisitor::visitProjectNode(ProjectNode *node) { - if (node->supportedActions(node).contains(ProjectNode::AddFile)) + if (node->supportedActions(node).contains(m_action)) m_projectNodes.push_back(node); } @@ -179,6 +184,16 @@ ProjectFileWizardExtension::~ProjectFileWizardExtension() delete m_context; } +static QList findDeployProject(const QList &projects, + QString &commonPath) +{ + QList filtered; + foreach (const ProjectEntry &project, projects) + if (project.node->deploysFolder(commonPath)) + filtered << project; + return filtered; +} + // Find the project the new files should be added to given their common // path. Either a direct match on the directory or the directory with // the longest matching path (list containing"/project/subproject1" matching @@ -219,7 +234,28 @@ void ProjectFileWizardExtension::firstExtensionPageShown(const QListcommonDirectory = Utils::commonPath(fileNames); m_context->page->setFilesDisplay(m_context->commonDirectory, fileNames); // Find best project (Entry at 0 is 'None'). - const int bestProjectIndex = findMatchingProject(m_context->projects, m_context->commonDirectory); + + int bestProjectIndex = -1; + + QList deployingProjects = findDeployProject(m_context->projects, m_context->commonDirectory); + if (!deployingProjects.isEmpty()) { + // Oh we do have someone that deploys it + // then the best match is NONE + // We display a label explaining that and rename to + // + m_context->page->setNoneLabel(tr("")); + + QString text = tr("The files are implicitly added to the projects:\n"); + foreach (ProjectEntry project, deployingProjects) + text += project.fileName + "\n"; + + m_context->page->setAdditionalInfo(text); + bestProjectIndex = -1; + } else { + bestProjectIndex = findMatchingProject(m_context->projects, m_context->commonDirectory); + m_context->page->setNoneLabel(tr("")); + } + if (bestProjectIndex == -1) { m_context->page->setCurrentProjectIndex(0); } else { @@ -290,7 +326,8 @@ void ProjectFileWizardExtension::initProjectChoices(bool enabled) // Sort by base name and purge duplicated entries (resulting from dependencies) // via Map. ProjectEntryMap entryMap; - foreach(ProjectNode *n, AllProjectNodesVisitor::allProjects()) + + foreach(ProjectNode *n, AllProjectNodesVisitor::allProjects(ProjectNode::AddNewFile)) entryMap.insert(ProjectEntry(n), true); // Collect names const ProjectEntryMap::const_iterator cend = entryMap.constEnd(); diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index b5516691df3..581c19b62c7 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -261,6 +261,12 @@ QList ProjectNode::subProjectNodes() const \function bool ProjectNode::renameFile(const FileType, const QString &, const QString &) */ +bool ProjectNode::deploysFolder(const QString &folder) const +{ + Q_UNUSED(folder); + return false; +} + QList ProjectNode::watchers() const { return m_watchers; diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index f8de9aeea0b..1545f33ccba 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -159,8 +159,15 @@ public: enum ProjectAction { AddSubProject, RemoveSubProject, - AddFile, + // Let's the user select to which project file + // the file is added + AddNewFile, + AddExistingFile, + // Removes a file from the project, optionally also + // delete it on disc RemoveFile, + // Deletes a file from the file system, informs the project + // that a file was deleted // DeleteFile is a define on windows... EraseFile, Rename @@ -191,6 +198,8 @@ public: virtual bool renameFile(const FileType fileType, const QString &filePath, const QString &newFilePath) = 0; + // by default returns false + virtual bool deploysFolder(const QString &folder) const; QList watchers() const; diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index 3053548daa4..b37f529e2b7 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -74,6 +74,17 @@ void ProjectWizardPage::setCurrentProjectIndex(int idx) m_ui->projectComboBox->setCurrentIndex(idx); } +void ProjectWizardPage::setNoneLabel(const QString &label) +{ + m_ui->projectComboBox->setItemText(0, label); +} + +void ProjectWizardPage::setAdditionalInfo(const QString &text) +{ + m_ui->additionalInfo->setText(text); + m_ui->additionalInfo->setVisible(!text.isEmpty()); +} + void ProjectWizardPage::setVersionControls(const QStringList &vcs) { m_ui->addToVersionControlComboBox->clear(); diff --git a/src/plugins/projectexplorer/projectwizardpage.h b/src/plugins/projectexplorer/projectwizardpage.h index f06bf74d69e..73df81e9a48 100644 --- a/src/plugins/projectexplorer/projectwizardpage.h +++ b/src/plugins/projectexplorer/projectwizardpage.h @@ -52,6 +52,9 @@ public: int currentProjectIndex() const; void setCurrentProjectIndex(int); + void setNoneLabel(const QString &label); + void setAdditionalInfo(const QString &text); + void setVersionControls(const QStringList &); int versionControlIndex() const; diff --git a/src/plugins/projectexplorer/projectwizardpage.ui b/src/plugins/projectexplorer/projectwizardpage.ui index 716c33413eb..5c98f5ed692 100644 --- a/src/plugins/projectexplorer/projectwizardpage.ui +++ b/src/plugins/projectexplorer/projectwizardpage.ui @@ -6,8 +6,8 @@ 0 0 - 619 - 414 + 226 + 184 @@ -37,9 +37,12 @@ false + + QComboBox::AdjustToContents + - + Add to &version control: @@ -49,9 +52,19 @@ - + + + + + + + + true + + + @@ -89,8 +102,8 @@ 0 0 - 611 - 328 + 218 + 83 diff --git a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp index 3f4b2da88a3..2be16f01eb2 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp @@ -176,7 +176,7 @@ QList QmlProjectNode::supportedActi { Q_UNUSED(node); QList actions; - actions.append(AddFile); + actions.append(AddNewFile); return actions; } diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 630179d89c7..9f3087634b2 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -702,6 +702,20 @@ void Qt4PriFileNode::folderChanged(const QString &) contents.updateSubFolders(this, this); } +bool Qt4PriFileNode::deploysFolder(const QString &folder) const +{ + QString f = folder; + if (!f.endsWith('/')) + f.append('/'); + foreach (const QString &wf, m_watchedFolders) { + if (f.startsWith(wf) + && (wf.endsWith('/') + || (wf.length() < f.length() && f.at(wf.length()) == '/'))) + return true; + } + return false; +} + QList Qt4PriFileNode::supportedActions(Node *node) const { QList actions; @@ -715,11 +729,17 @@ QList Qt4PriFileNode::supportedActions(Node *node) c switch (proFileNode->projectType()) { case ApplicationTemplate: case LibraryTemplate: - actions << AddFile; - if (m_recursiveEnumerateFiles.contains(node->path())) + actions << AddNewFile; + if (m_recursiveEnumerateFiles.contains(node->path())) { actions << EraseFile; - else + } else { actions << RemoveFile; + } + + // Only enable 'add existing file' if we don't deploy the folder + if (!deploysFolder(node->path())) + actions << AddExistingFile; + break; case SubDirsTemplate: actions << AddSubProject << RemoveSubProject; diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index b0d3c9dfccb..001c45c807f 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -154,6 +154,8 @@ public: void folderChanged(const QString &folder); + bool deploysFolder(const QString &folder) const; + protected: void clear(); static QStringList varNames(FileType type); diff --git a/src/shared/qtsingleapplication/qtsingleapplication.cpp b/src/shared/qtsingleapplication/qtsingleapplication.cpp index 28fa69657d6..a621a29a15f 100644 --- a/src/shared/qtsingleapplication/qtsingleapplication.cpp +++ b/src/shared/qtsingleapplication/qtsingleapplication.cpp @@ -100,7 +100,6 @@ bool QtSingleApplication::isRunning() return peer->isClient(); } - bool QtSingleApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout);