From dd235e2b4827ce76c7dff86a1c3e35400161a33b Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Tue, 13 Jan 2009 14:06:42 +0100
Subject: [PATCH] Fixes: Random enabling of submit/diff buttons when switching
 contexts (viewing diffs) from the submit editor

Details: Register actions directly
---
 src/plugins/git/gitplugin.cpp               | 11 ++-----
 src/plugins/perforce/perforceplugin.cpp     | 12 ++-----
 src/plugins/subversion/subversionplugin.cpp | 12 ++-----
 src/plugins/vcsbase/vcsbasesubmiteditor.cpp | 36 +++++++++------------
 src/plugins/vcsbase/vcsbasesubmiteditor.h   | 14 +++++---
 5 files changed, 31 insertions(+), 54 deletions(-)

diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 50214c7c354..63e1f19d18d 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -210,11 +210,7 @@ GitPlugin *GitPlugin::instance()
 static const VCSBase::VCSBaseSubmitEditorParameters submitParameters = {
     Git::Constants::SUBMIT_MIMETYPE,
     Git::Constants::GITSUBMITEDITOR_KIND,
-    Git::Constants::C_GITSUBMITEDITOR,
-    Core::Constants::UNDO,
-    Core::Constants::REDO,
-    Git::Constants::SUBMIT_CURRENT,
-    Git::Constants::DIFF_SELECTED
+    Git::Constants::C_GITSUBMITEDITOR
 };
 
 static Core::ICommand *createSeparator(Core::ActionManagerInterface *am,
@@ -640,10 +636,7 @@ Core::IEditor *GitPlugin::openSubmitEditor(const QString &fileName, const Commit
     QTC_ASSERT(submitEditor, return 0);
     // The actions are for some reason enabled by the context switching
     // mechanism. Disable them correctly.
-    m_submitCurrentAction->setEnabled(!cd.stagedFiles.empty());
-    m_diffSelectedFilesAction->setEnabled(false);
-    m_undoAction->setEnabled(false);
-    m_redoAction->setEnabled(false);
+    submitEditor->registerActions(m_undoAction, m_redoAction, m_submitCurrentAction, m_diffSelectedFilesAction);
     submitEditor->setCommitData(cd);
     connect(submitEditor, SIGNAL(diffStaged(QStringList)), this, SLOT(submitEditorDiffStaged(QStringList)));
     connect(submitEditor, SIGNAL(diffUnstaged(QStringList)), this, SLOT(submitEditorDiffUnstaged(QStringList)));
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index aa4b0a4fa48..c616a019aa6 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -179,11 +179,7 @@ PerforcePlugin::PerforcePlugin() :
 static const VCSBase::VCSBaseSubmitEditorParameters submitParameters = {
     Perforce::Constants::SUBMIT_MIMETYPE,
     Perforce::Constants::PERFORCESUBMITEDITOR_KIND,
-    Perforce::Constants::C_PERFORCESUBMITEDITOR,
-    Core::Constants::UNDO,
-    Core::Constants::REDO,
-    Perforce::Constants::SUBMIT_CURRENT,
-    Perforce::Constants::DIFF_SELECTED
+    Perforce::Constants::C_PERFORCESUBMITEDITOR
 };
 
 bool PerforcePlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage)
@@ -558,12 +554,8 @@ Core::IEditor *PerforcePlugin::openPerforceSubmitEditor(const QString &fileName,
     PerforceSubmitEditor *submitEditor = dynamic_cast<PerforceSubmitEditor*>(editor);
     QTC_ASSERT(submitEditor, return 0);
     submitEditor->restrictToProjectFiles(depotFileNames);
+    submitEditor->registerActions(m_undoAction, m_redoAction, m_submitCurrentLogAction, m_diffSelectedFiles);
     connect(submitEditor, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(slotDiff(QStringList)));
-    // The actions are for some reason enabled by the context switching
-    // mechanism. Disable them correctly.
-    m_diffSelectedFiles->setEnabled(false);
-    m_undoAction->setEnabled(false);
-    m_redoAction->setEnabled(false);
     return editor;
 }
 
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 36182eb94a0..9a5067f4dc2 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -245,11 +245,7 @@ void SubversionPlugin::cleanChangeTmpFile()
 static const VCSBase::VCSBaseSubmitEditorParameters submitParameters = {
     Subversion::Constants::SUBVERSION_SUBMIT_MIMETYPE,
     Subversion::Constants::SUBVERSIONCOMMITEDITOR_KIND,
-    Subversion::Constants::SUBVERSIONCOMMITEDITOR,
-    Core::Constants::UNDO,
-    Core::Constants::REDO,
-    Subversion::Constants::SUBMIT_CURRENT,
-    Subversion::Constants::DIFF_SELECTED
+    Subversion::Constants::SUBVERSIONCOMMITEDITOR
 };
 
 bool SubversionPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage)
@@ -529,11 +525,7 @@ SubversionSubmitEditor *SubversionPlugin::openSubversionSubmitEditor(const QStri
     Core::IEditor *editor = m_coreInstance->editorManager()->openEditor(fileName, QLatin1String(Constants::SUBVERSIONCOMMITEDITOR_KIND));
     SubversionSubmitEditor *submitEditor = qobject_cast<SubversionSubmitEditor*>(editor);
     QTC_ASSERT(submitEditor, /**/);
-    // The actions are for some reason enabled by the context switching
-    // mechanism. Disable them correctly.
-    m_submitDiffAction->setEnabled(false);
-    m_submitUndoAction->setEnabled(false);
-    m_submitRedoAction->setEnabled(false);
+    submitEditor->registerActions(m_submitUndoAction, m_submitRedoAction, m_submitCurrentLogAction, m_submitDiffAction);
     connect(submitEditor, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(diffFiles(QStringList)));
 
     return submitEditor;
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index 25fbce7634c..a26f811e8dd 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -57,17 +57,6 @@
 enum { debug = 0 };
 enum { wantToolBar = 0 };
 
-static inline QAction *actionFromId(const Core::ICore *core, const char *id)
-{
-    QAction *rc = 0;
-    if (id)
-       if (const Core::ICommand *cmd = core->actionManager()->command(id))
-            rc = cmd->action();
-    if (debug)
-        qDebug() << Q_FUNC_INFO << id << rc;
-    return rc;
-}
-
 namespace VCSBase {
 
 struct VCSBaseSubmitEditorPrivate {
@@ -83,10 +72,8 @@ struct VCSBaseSubmitEditorPrivate {
     VCSBase::Internal::SubmitEditorFile *m_file;
     QList<int> m_contexts;
 
-    QPointer<QAction> m_undoAction;
-    QPointer<QAction> m_redoAction;
-    QPointer<QAction> m_submitAction;
     QPointer<QAction> m_diffAction;
+    QPointer<QAction> m_submitAction;
 };
 
 VCSBaseSubmitEditorPrivate::VCSBaseSubmitEditorPrivate(const VCSBaseSubmitEditorParameters *parameters,
@@ -96,11 +83,7 @@ VCSBaseSubmitEditorPrivate::VCSBaseSubmitEditorPrivate(const VCSBaseSubmitEditor
     m_widget(editorWidget),
     m_toolWidget(0),
     m_parameters(parameters),
-    m_file(new VCSBase::Internal::SubmitEditorFile(QLatin1String(m_parameters->mimeType), q)),
-    m_undoAction(actionFromId(m_core, m_parameters->undoActionId)),
-    m_redoAction(actionFromId(m_core, m_parameters->redoActionId)),
-    m_submitAction(actionFromId(m_core, m_parameters->submitActionId)),
-    m_diffAction(actionFromId(m_core, m_parameters->diffActionId))
+    m_file(new VCSBase::Internal::SubmitEditorFile(QLatin1String(m_parameters->mimeType), q))
 {
     m_contexts << m_core->uniqueIDManager()->uniqueIdentifier(m_parameters->context);
 }
@@ -113,7 +96,6 @@ VCSBaseSubmitEditor::VCSBaseSubmitEditor(const VCSBaseSubmitEditorParameters *pa
     // We are always clean to prevent the editor manager from asking to save.
     connect(m_d->m_file, SIGNAL(saveMe(QString)), this, SLOT(save(QString)));
 
-    m_d->m_widget->registerActions(m_d->m_undoAction, m_d->m_redoAction,  m_d->m_submitAction, m_d->m_diffAction);
     connect(m_d->m_widget, SIGNAL(diffSelected(QStringList)), this, SLOT(slotDiffSelectedVCSFiles(QStringList)));
     connect(m_d->m_widget->descriptionEdit(), SIGNAL(textChanged()), this, SLOT(slotDescriptionChanged()));
 
@@ -129,6 +111,20 @@ VCSBaseSubmitEditor::~VCSBaseSubmitEditor()
     delete m_d;
 }
 
+void VCSBaseSubmitEditor::registerActions(QAction *editorUndoAction,  QAction *editorRedoAction,
+                                          QAction *submitAction, QAction *diffAction)\
+{
+    m_d->m_widget->registerActions(editorUndoAction, editorRedoAction, submitAction, diffAction);
+    m_d->m_diffAction = diffAction;
+    m_d->m_submitAction = submitAction;
+}
+
+void VCSBaseSubmitEditor::unregisterActions(QAction *editorUndoAction,  QAction *editorRedoAction,
+                           QAction *submitAction, QAction *diffAction)
+{
+    m_d->m_widget->unregisterActions(editorUndoAction, editorRedoAction, submitAction, diffAction);
+    m_d->m_diffAction = m_d->m_submitAction = 0;
+}
 int VCSBaseSubmitEditor::fileNameColumn() const
 {
     return m_d->m_widget->fileNameColumn();
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h
index d3e9166b35f..a11d117f00b 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.h
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h
@@ -44,6 +44,7 @@
 QT_BEGIN_NAMESPACE
 class QIcon;
 class QAbstractItemModel;
+class QAction;
 QT_END_NAMESPACE
 
 namespace Core {
@@ -61,10 +62,6 @@ struct VCSBASE_EXPORT VCSBaseSubmitEditorParameters {
     const char *mimeType;
     const char *kind;
     const char *context;
-    const char *undoActionId;
-    const char *redoActionId;
-    const char *submitActionId;
-    const char *diffActionId;
 };
 
 /* Base class for a submit editor based on the Core::Utils::SubmitEditorWidget
@@ -86,7 +83,8 @@ struct VCSBASE_EXPORT VCSBaseSubmitEditorParameters {
  * signal and then asking the IFile interface of the editor to save the file
  * within a IFileManager::blockFileChange() section
  * and to launch the submit process. In addition, the action registered
- * for submit should be connected to a slot triggering the close of the
+ * for submit sho src/libs/utils/submiteditorwidget.h
+uld be connected to a slot triggering the close of the
  * current editor in the editor manager. */
 
 class VCSBASE_EXPORT VCSBaseSubmitEditor : public Core::IEditor
@@ -102,6 +100,12 @@ protected:
                                  Core::Utils::SubmitEditorWidget *editorWidget);
 
 public:
+    // Register the actions with the submit editor widget.
+    void registerActions(QAction *editorUndoAction,  QAction *editorRedoAction,
+                         QAction *submitAction = 0, QAction *diffAction = 0);
+    void unregisterActions(QAction *editorUndoAction,  QAction *editorRedoAction,
+                           QAction *submitAction = 0, QAction *diffAction = 0);
+
     virtual ~VCSBaseSubmitEditor();
 
     int fileNameColumn() const;
-- 
GitLab