From 95da4190671d715e7a1266cac877730679934680 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Mon, 11 Jan 2010 15:22:17 +0100
Subject: [PATCH] VCS[vcs,p4,svn,hg]: Use VCManager for delete operations.

...and its dialog prompt consistently. Rename method and
introduce overload taking IVersionControl. Add convenience slot to
VCSBasePlugin.
---
 src/plugins/coreplugin/vcsmanager.cpp         | 14 +++--
 src/plugins/coreplugin/vcsmanager.h           |  3 +-
 src/plugins/cvs/cvsplugin.cpp                 | 14 ++---
 src/plugins/cvs/cvsplugin.h                   |  1 -
 src/plugins/mercurial/constants.h             |  2 +
 src/plugins/mercurial/mercurialcontrol.cpp    |  3 +-
 src/plugins/mercurial/mercurialcontrol.h      |  1 -
 src/plugins/mercurial/mercurialplugin.cpp     | 52 +++++++++++++------
 src/plugins/mercurial/mercurialplugin.h       |  3 ++
 src/plugins/perforce/perforceplugin.cpp       | 11 +---
 src/plugins/perforce/perforceplugin.h         |  1 -
 .../projectexplorer/projectexplorer.cpp       |  2 +-
 src/plugins/subversion/subversionplugin.cpp   | 13 ++---
 src/plugins/subversion/subversionplugin.h     |  1 -
 src/plugins/vcsbase/vcsbaseplugin.cpp         | 10 ++++
 src/plugins/vcsbase/vcsbaseplugin.h           |  5 ++
 16 files changed, 79 insertions(+), 57 deletions(-)

diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp
index 5bac775e399..d9fd8318366 100644
--- a/src/plugins/coreplugin/vcsmanager.cpp
+++ b/src/plugins/coreplugin/vcsmanager.cpp
@@ -33,6 +33,7 @@
 #include "filemanager.h"
 
 #include <extensionsystem/pluginmanager.h>
+#include <utils/qtcassert.h>
 
 #include <QtCore/QString>
 #include <QtCore/QList>
@@ -133,10 +134,17 @@ IVersionControl* VCSManager::findVersionControlForDirectory(const QString &direc
     return 0;
 }
 
-bool VCSManager::showDeleteDialog(const QString &fileName)
+bool VCSManager::promptToDelete(const QString &fileName)
 {
-    IVersionControl *vc = findVersionControlForDirectory(QFileInfo(fileName).absolutePath());
-    if (!vc || !vc->supportsOperation(IVersionControl::DeleteOperation))
+    if (IVersionControl *vc = findVersionControlForDirectory(QFileInfo(fileName).absolutePath()))
+        return promptToDelete(vc, fileName);
+    return true;
+}
+
+bool VCSManager::promptToDelete(IVersionControl *vc, const QString &fileName)
+{
+    QTC_ASSERT(vc, return true)
+    if (!vc->supportsOperation(IVersionControl::DeleteOperation))
         return true;
     const QString title = QCoreApplication::translate("VCSManager", "Version Control");
     const QString msg = QCoreApplication::translate("VCSManager",
diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h
index df8932c2b38..62c28c6dccc 100644
--- a/src/plugins/coreplugin/vcsmanager.h
+++ b/src/plugins/coreplugin/vcsmanager.h
@@ -72,7 +72,8 @@ public:
     // Shows a confirmation dialog, whether the file should also be deleted
     // from revision control Calls sccDelete on the file. Returns false
     // if a failure occurs
-    bool showDeleteDialog(const QString &fileName);
+    bool promptToDelete(const QString &fileName);
+    bool promptToDelete(IVersionControl *versionControl, const QString &fileName);
 
     friend CORE_EXPORT QDebug operator<<(QDebug in, const VCSManager &);
 
diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index 929bd41b608..06a94e38824 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -261,14 +261,14 @@ bool CVSPlugin::initialize(const QStringList & /*arguments */, QString *errorMes
     connect(m_addAction, SIGNAL(triggered()), this, SLOT(addCurrentFile()));
     cvsMenu->addAction(command);
 
-    m_deleteAction = new Utils::ParameterAction(tr("Delete"), tr("Delete \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
+    m_deleteAction = new Utils::ParameterAction(tr("Delete..."), tr("Delete \"%1\"..."), Utils::ParameterAction::EnabledWithParameter, this);
     command = ami->registerAction(m_deleteAction, CMD_ID_DELETE_FILE,
         globalcontext);
     command->setAttribute(Core::Command::CA_UpdateText);
-    connect(m_deleteAction, SIGNAL(triggered()), this, SLOT(deleteCurrentFile()));
+    connect(m_deleteAction, SIGNAL(triggered()), this, SLOT(promptToDeleteCurrentFile()));
     cvsMenu->addAction(command);
 
-    m_revertAction = new Utils::ParameterAction(tr("Revert"), tr("Revert \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
+    m_revertAction = new Utils::ParameterAction(tr("Revert..."), tr("Revert \"%1\"..."), Utils::ParameterAction::EnabledWithParameter, this);
     command = ami->registerAction(m_revertAction, CMD_ID_REVERT,
         globalcontext);
     command->setAttribute(Core::Command::CA_UpdateText);
@@ -524,14 +524,6 @@ void CVSPlugin::addCurrentFile()
     vcsAdd(state.currentFileTopLevel(), state.relativeCurrentFile());
 }
 
-void CVSPlugin::deleteCurrentFile()
-{
-    const VCSBase::VCSBasePluginState state = currentState();
-    QTC_ASSERT(state.hasFile(), return)
-    if (!Core::ICore::instance()->vcsManager()->showDeleteDialog(state.currentFile()))
-        QMessageBox::warning(0, QLatin1String("CVS remove"), tr("The file '%1' could not be deleted.").arg(state.currentFile()), QMessageBox::Ok);
-}
-
 void CVSPlugin::revertCurrentFile()
 {
     const VCSBase::VCSBasePluginState state = currentState();
diff --git a/src/plugins/cvs/cvsplugin.h b/src/plugins/cvs/cvsplugin.h
index 74eb3055cc1..33cda600feb 100644
--- a/src/plugins/cvs/cvsplugin.h
+++ b/src/plugins/cvs/cvsplugin.h
@@ -99,7 +99,6 @@ public:
 
 private slots:
     void addCurrentFile();
-    void deleteCurrentFile();
     void revertCurrentFile();
     void diffProject();
     void diffCurrentFile();
diff --git a/src/plugins/mercurial/constants.h b/src/plugins/mercurial/constants.h
index aa6b1fc3334..070d2c784c4 100644
--- a/src/plugins/mercurial/constants.h
+++ b/src/plugins/mercurial/constants.h
@@ -85,6 +85,8 @@ const char * const COMMITMIMETYPE = "application/vnd.nokia.text.scs_mercurial_co
 
 //menu items
 //File menu actions
+const char * const ADD = "Mercurial.AddSingleFile";
+const char * const DELETE = "Mercurial.DeleteSingleFile";
 const char * const ANNOTATE = "Mercurial.Annotate";
 const char * const DIFF = "Mercurial.DiffSingleFile";
 const char * const LOG = "Mercurial.LogSingleFile";
diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp
index 2bfca86258a..44c6ee04a04 100644
--- a/src/plugins/mercurial/mercurialcontrol.cpp
+++ b/src/plugins/mercurial/mercurialcontrol.cpp
@@ -38,8 +38,7 @@
 using namespace Mercurial::Internal;
 
 MercurialControl::MercurialControl(MercurialClient *client)
-        :   mercurialClient(client),
-            mercurialEnabled(true)
+        :   mercurialClient(client)
 {
 }
 
diff --git a/src/plugins/mercurial/mercurialcontrol.h b/src/plugins/mercurial/mercurialcontrol.h
index 2c11637aa5a..df3b99ef64c 100644
--- a/src/plugins/mercurial/mercurialcontrol.h
+++ b/src/plugins/mercurial/mercurialcontrol.h
@@ -66,7 +66,6 @@ public slots:
 
 private:
     MercurialClient *mercurialClient;
-    bool mercurialEnabled;
 };
 
 } //namespace Internal
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index a0cc3309533..009d44375c6 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -41,6 +41,7 @@
 
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/basemode.h>
+#include <coreplugin/vcsmanager.h>
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/modemanager.h>
@@ -124,6 +125,8 @@ MercurialPlugin::MercurialPlugin() :
         optionsPage(0),
         m_client(0),
         changeLog(0),
+        m_addAction(0),
+        m_deleteAction(0),
         m_menuAction(0)
 {
     m_instance = this;
@@ -225,38 +228,59 @@ void MercurialPlugin::createFileActions(const QList<int> &context)
 {
     Core::Command *command;
 
-    annotateFile = new Utils::ParameterAction(tr("Annotate Current File"), tr("Annotate \"%1\""), Utils::ParameterAction::AlwaysEnabled, this);
+    annotateFile = new Utils::ParameterAction(tr("Annotate Current File"), tr("Annotate \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
     command = actionManager->registerAction(annotateFile, QLatin1String(Constants::ANNOTATE), context);
     command->setAttribute(Core::Command::CA_UpdateText);
     connect(annotateFile, SIGNAL(triggered()), this, SLOT(annotateCurrentFile()));
     mercurialContainer->addAction(command);
 
-    diffFile = new Utils::ParameterAction(tr("Diff Current File"), tr("Diff \"%1\""), Utils::ParameterAction::AlwaysEnabled, this);
+    diffFile = new Utils::ParameterAction(tr("Diff Current File"), tr("Diff \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
     command = actionManager->registerAction(diffFile, QLatin1String(Constants::DIFF), context);
     command->setAttribute(Core::Command::CA_UpdateText);
     command->setDefaultKeySequence(QKeySequence(tr("Alt+H,Alt+D")));
     connect(diffFile, SIGNAL(triggered()), this, SLOT(diffCurrentFile()));
     mercurialContainer->addAction(command);
 
-    logFile = new Utils::ParameterAction(tr("Log Current File"), tr("Log \"%1\""), Utils::ParameterAction::AlwaysEnabled, this);
+    logFile = new Utils::ParameterAction(tr("Log Current File"), tr("Log \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
     command = actionManager->registerAction(logFile, QLatin1String(Constants::LOG), context);
     command->setAttribute(Core::Command::CA_UpdateText);
     command->setDefaultKeySequence(QKeySequence(tr("Alt+H,Alt+L")));
     connect(logFile, SIGNAL(triggered()), this, SLOT(logCurrentFile()));
     mercurialContainer->addAction(command);
 
-    revertFile = new Utils::ParameterAction(tr("Revert Current File"), tr("Revert \"%1\""), Utils::ParameterAction::AlwaysEnabled, this);
-    command = actionManager->registerAction(revertFile, QLatin1String(Constants::REVERT), context);
-    command->setAttribute(Core::Command::CA_UpdateText);
-    connect(revertFile, SIGNAL(triggered()), this, SLOT(revertCurrentFile()));
-    mercurialContainer->addAction(command);
-
-    statusFile = new Utils::ParameterAction(tr("Status Current File"), tr("Status \"%1\""), Utils::ParameterAction::AlwaysEnabled, this);
+    statusFile = new Utils::ParameterAction(tr("Status Current File"), tr("Status \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
     command = actionManager->registerAction(statusFile, QLatin1String(Constants::STATUS), context);
     command->setAttribute(Core::Command::CA_UpdateText);
     command->setDefaultKeySequence(QKeySequence(tr("Alt+H,Alt+S")));
     connect(statusFile, SIGNAL(triggered()), this, SLOT(statusCurrentFile()));
     mercurialContainer->addAction(command);
+
+    createSeparator(context, QLatin1String("FileDirSeperator1"));
+
+    m_addAction = new Utils::ParameterAction(tr("Add"), tr("Add \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
+    command = actionManager->registerAction(m_addAction, QLatin1String(Constants::ADD), context);
+    command->setAttribute(Core::Command::CA_UpdateText);
+    connect(m_addAction, SIGNAL(triggered()), this, SLOT(addCurrentFile()));
+    mercurialContainer->addAction(command);
+
+    m_deleteAction = new Utils::ParameterAction(tr("Delete..."), tr("Delete \"%1\"..."), Utils::ParameterAction::EnabledWithParameter, this);
+    command = actionManager->registerAction(m_deleteAction, QLatin1String(Constants::DELETE), context);
+    command->setAttribute(Core::Command::CA_UpdateText);
+    connect(m_deleteAction, SIGNAL(triggered()), this, SLOT(promptToDeleteCurrentFile()));
+    mercurialContainer->addAction(command);
+
+    revertFile = new Utils::ParameterAction(tr("Revert Current File..."), tr("Revert \"%1\"..."), Utils::ParameterAction::EnabledWithParameter, this);
+    command = actionManager->registerAction(revertFile, QLatin1String(Constants::REVERT), context);
+    command->setAttribute(Core::Command::CA_UpdateText);
+    connect(revertFile, SIGNAL(triggered()), this, SLOT(revertCurrentFile()));
+    mercurialContainer->addAction(command);
+}
+
+void MercurialPlugin::addCurrentFile()
+{
+    const VCSBase::VCSBasePluginState state = currentState();
+    QTC_ASSERT(state.hasFile(), return)
+    m_client->add(state.currentFileTopLevel(), state.relativeCurrentFile());
 }
 
 void MercurialPlugin::annotateCurrentFile()
@@ -655,19 +679,15 @@ void MercurialPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
         return;
 
     const QString filename = currentState().currentFileName();
-    const bool fileEnabled = !filename.isEmpty();
     const bool repoEnabled = currentState().hasTopLevel();
 
     annotateFile->setParameter(filename);
-    annotateFile->setEnabled(fileEnabled);
     diffFile->setParameter(filename);
-    diffFile->setEnabled(fileEnabled);
     logFile->setParameter(filename);
-    logFile->setEnabled(fileEnabled);
+    m_addAction->setParameter(filename);
+    m_deleteAction->setParameter(filename);
     revertFile->setParameter(filename);
-    revertFile->setEnabled(fileEnabled);
     statusFile->setParameter(filename);
-    statusFile->setEnabled(fileEnabled);
 
     foreach (QAction *repoAction, m_repositoryActionList)
         repoAction->setEnabled(repoEnabled);
diff --git a/src/plugins/mercurial/mercurialplugin.h b/src/plugins/mercurial/mercurialplugin.h
index 6b6e9f50717..0a441965ab5 100644
--- a/src/plugins/mercurial/mercurialplugin.h
+++ b/src/plugins/mercurial/mercurialplugin.h
@@ -88,6 +88,7 @@ public:
 
 private slots:
     // File menu action Slots
+    void addCurrentFile();
     void annotateCurrentFile();
     void diffCurrentFile();
     void logCurrentFile();
@@ -156,6 +157,8 @@ private:
     QTemporaryFile *changeLog;
 
     //Menu Items (file actions)
+    Utils::ParameterAction *m_addAction;
+    Utils::ParameterAction *m_deleteAction;
     Utils::ParameterAction *annotateFile;
     Utils::ParameterAction *diffFile;
     Utils::ParameterAction *logFile;
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index d2a37da631f..d22690bd409 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -276,11 +276,11 @@ bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString * e
     connect(m_addAction, SIGNAL(triggered()), this, SLOT(addCurrentFile()));
     mperforce->addAction(command);
 
-    m_deleteAction = new Utils::ParameterAction(tr("Delete"), tr("Delete \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
+    m_deleteAction = new Utils::ParameterAction(tr("Delete..."), tr("Delete \"%1\"..."), Utils::ParameterAction::EnabledWithParameter, this);
     command = am->registerAction(m_deleteAction, CMD_ID_DELETE_FILE, globalcontext);
     command->setAttribute(Core::Command::CA_UpdateText);
     command->setDefaultText(tr("Delete File"));
-    connect(m_deleteAction, SIGNAL(triggered()), this, SLOT(deleteCurrentFile()));
+    connect(m_deleteAction, SIGNAL(triggered()), this, SLOT(promptToDeleteCurrentFile()));
     mperforce->addAction(command);
 
     m_revertFileAction = new Utils::ParameterAction(tr("Revert"), tr("Revert \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
@@ -451,13 +451,6 @@ void PerforcePlugin::addCurrentFile()
     vcsAdd(state.currentFileTopLevel(), state.relativeCurrentFile());
 }
 
-void PerforcePlugin::deleteCurrentFile()
-{
-    const VCSBase::VCSBasePluginState state = currentState();
-    QTC_ASSERT(state.hasFile(), return)
-    vcsDelete(state.currentFileTopLevel(), state.relativeCurrentFile());
-}
-
 void PerforcePlugin::revertCurrentFile()
 {
     const VCSBase::VCSBasePluginState state = currentState();
diff --git a/src/plugins/perforce/perforceplugin.h b/src/plugins/perforce/perforceplugin.h
index 8f7c3819e49..5c70ddd8b86 100644
--- a/src/plugins/perforce/perforceplugin.h
+++ b/src/plugins/perforce/perforceplugin.h
@@ -106,7 +106,6 @@ public slots:
 private slots:
     void openCurrentFile();
     void addCurrentFile();
-    void deleteCurrentFile();
     void revertCurrentFile();
     void printOpenedFileList();
     void diffCurrentFile();
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 292c6b2f28f..cd84597b172 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1946,7 +1946,7 @@ void ProjectExplorerPlugin::removeFile()
         }
 
         // remove from version control
-        core->vcsManager()->showDeleteDialog(filePath);
+        core->vcsManager()->promptToDelete(filePath);
 
         // remove from file system
         if (deleteFile) {
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index e83d3262c08..aef5560eff1 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -292,14 +292,14 @@ bool SubversionPlugin::initialize(const QStringList & /*arguments */, QString *e
     connect(m_addAction, SIGNAL(triggered()), this, SLOT(addCurrentFile()));
     subversionMenu->addAction(command);
 
-    m_deleteAction = new Utils::ParameterAction(tr("Delete"), tr("Delete \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
+    m_deleteAction = new Utils::ParameterAction(tr("Delete..."), tr("Delete \"%1\"..."), Utils::ParameterAction::EnabledWithParameter, this);
     command = ami->registerAction(m_deleteAction, CMD_ID_DELETE_FILE,
         globalcontext);
     command->setAttribute(Core::Command::CA_UpdateText);
-    connect(m_deleteAction, SIGNAL(triggered()), this, SLOT(deleteCurrentFile()));
+    connect(m_deleteAction, SIGNAL(triggered()), this, SLOT(promptToDeleteCurrentFile()));
     subversionMenu->addAction(command);
 
-    m_revertAction = new Utils::ParameterAction(tr("Revert"), tr("Revert \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
+    m_revertAction = new Utils::ParameterAction(tr("Revert..."), tr("Revert \"%1\"..."), Utils::ParameterAction::EnabledWithParameter, this);
     command = ami->registerAction(m_revertAction, CMD_ID_REVERT,
         globalcontext);
     command->setAttribute(Core::Command::CA_UpdateText);
@@ -556,13 +556,6 @@ void SubversionPlugin::addCurrentFile()
     vcsAdd(state.currentFileTopLevel(), state.relativeCurrentFile());
 }
 
-void SubversionPlugin::deleteCurrentFile()
-{
-    const VCSBase::VCSBasePluginState state = currentState();
-    QTC_ASSERT(state.hasFile(), return)
-    vcsDelete(state.currentFileTopLevel(), state.relativeCurrentFile());
-}
-
 void SubversionPlugin::revertCurrentFile()
 {
     const VCSBase::VCSBasePluginState state = currentState();
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index d8ca80810ba..97fda4b06dd 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -98,7 +98,6 @@ public:
 
 private slots:
     void addCurrentFile();
-    void deleteCurrentFile();
     void revertCurrentFile();
     void diffProject();
     void diffCurrentFile();
diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp
index 07b719414d3..b672fba110a 100644
--- a/src/plugins/vcsbase/vcsbaseplugin.cpp
+++ b/src/plugins/vcsbase/vcsbaseplugin.cpp
@@ -46,6 +46,7 @@
 #include <QtCore/QSharedData>
 
 #include <QtGui/QAction>
+#include <QtGui/QMessageBox>
 
 enum { debug = 0 };
 
@@ -446,6 +447,15 @@ bool VCSBasePlugin::enableMenuAction(ActionState as, QAction *menuAction)
     return true;
 }
 
+void VCSBasePlugin::promptToDeleteCurrentFile()
+{
+    const VCSBasePluginState state = currentState();
+    QTC_ASSERT(state.hasFile(), return)
+    const bool rc = Core::ICore::instance()->vcsManager()->promptToDelete(versionControl(), state.currentFile());
+    if (!rc)
+        QMessageBox::warning(0, tr("Version Control"), tr("The file '%1' could not be deleted.").arg(state.currentFile()), QMessageBox::Ok);
+}
+
 } // namespace VCSBase
 
 #include "vcsbaseplugin.moc"
diff --git a/src/plugins/vcsbase/vcsbaseplugin.h b/src/plugins/vcsbase/vcsbaseplugin.h
index 70f3e8f20aa..c5760032aa1 100644
--- a/src/plugins/vcsbase/vcsbaseplugin.h
+++ b/src/plugins/vcsbase/vcsbaseplugin.h
@@ -149,6 +149,11 @@ public:
     const VCSBasePluginState &currentState() const;
     Core::IVersionControl *versionControl() const;
 
+public slots:
+    // Convenience slot for "Delete current file" action. Prompts to
+    // delete the file via VCSManager.
+    void promptToDeleteCurrentFile();
+
 protected:
     enum ActionState { NoVCSEnabled, OtherVCSEnabled, VCSEnabled };
 
-- 
GitLab