From 8510c2ab2b42c940bf5ffb424fcdf7fc38913fc0 Mon Sep 17 00:00:00 2001
From: hjk <hjk121@nokiamail.com>
Date: Mon, 3 Jun 2013 18:12:41 +0200
Subject: [PATCH] Git: Try do consolidate code duplication

Change-Id: I5ac34d96152d6e4f9abc8f6dd18d1e1eab0bde7f
Reviewed-by: Jarek Kobus <jaroslaw.kobus@digia.com>
---
 src/plugins/git/gitclient.cpp | 94 ++++++++++++-----------------------
 src/plugins/git/gitclient.h   |  5 +-
 2 files changed, 36 insertions(+), 63 deletions(-)

diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 1fce5d4c25d..13ac15ba6a5 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -823,20 +823,29 @@ VcsBase::VcsBaseEditorWidget *GitClient::findExistingVCSEditor(const char *regis
     return rc;
 }
 
-DiffEditor::DiffEditor *GitClient::findExistingDiffEditor(const char *registerDynamicProperty,
-                                                      const QString &dynamicPropertyValue) const
+DiffEditor::DiffEditor *GitClient::findExistingOrOpenNewDiffEditor(const char *registerDynamicProperty,
+    const QString &dynamicPropertyValue, const QString &titlePattern) const
 {
     Core::IEditor *outputEditor = locateEditor(registerDynamicProperty, dynamicPropertyValue);
-    if (!outputEditor)
-        return 0;
-
-    // Exists already
-    Core::EditorManager::activateEditor(outputEditor, Core::EditorManager::ModeSwitch);
-    outputEditor->createNew(m_msgWait);
+    if (outputEditor) {
+        // Exists already
+        Core::EditorManager::activateEditor(outputEditor, Core::EditorManager::ModeSwitch);
+        outputEditor->createNew(m_msgWait);
+    }
 
-    return qobject_cast<DiffEditor::DiffEditor *>(outputEditor);
+    DiffEditor::DiffEditor *editor = qobject_cast<DiffEditor::DiffEditor *>(outputEditor);
+    if (!editor) {
+        const Core::Id editorId = DiffEditor::Constants::DIFF_EDITOR_ID;
+        QString title = titlePattern;
+        editor = qobject_cast<DiffEditor::DiffEditor *>(
+                    Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait));
+        editor->document()->setProperty(registerDynamicProperty, dynamicPropertyValue);
+        Core::EditorManager::activateEditor(editor, Core::EditorManager::ModeSwitch); // should probably go outside this block
+    }
+    return editor;
 }
 
+
 /* Create an editor associated to VCS output of a source file/directory
  * (using the file's codec). Makes use of a dynamic property to find an
  * existing instance and to reuse it (in case, say, 'git diff foo' is
@@ -885,21 +894,13 @@ void GitClient::diff(const QString &workingDirectory,
                      const QStringList &unstagedFileNames,
                      const QStringList &stagedFileNames)
 {
-    if (settings()->boolValue(GitSettings::useDiffEditorKey)) {
-        const Core::Id editorId = DiffEditor::Constants::DIFF_EDITOR_ID;
-        QString title = tr("Git Diff");
-
-        DiffEditor::DiffEditor *editorEditable = findExistingDiffEditor("originalFileName", workingDirectory);
+    const QString title = tr("Git Diff");
+    const int timeout = settings()->intValue(GitSettings::timeoutKey);
 
-        if (!editorEditable) {
-            editorEditable = qobject_cast<DiffEditor::DiffEditor *>(
-                        Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait));
-            editorEditable->document()->setProperty("originalFileName", workingDirectory);
-            Core::EditorManager::activateEditor(editorEditable, Core::EditorManager::ModeSwitch); // should probably go outside this block
-        }
+    if (settings()->boolValue(GitSettings::useDiffEditorKey)) {
+        DiffEditor::DiffEditor *editor = findExistingOrOpenNewDiffEditor("originalFileName", workingDirectory, title);
 
-        int timeout = settings()->intValue(GitSettings::timeoutKey);
-        GitDiffHandler *handler = new GitDiffHandler(editorEditable, gitBinaryPath(), workingDirectory, processEnvironment(), timeout);
+        GitDiffHandler *handler = new GitDiffHandler(editor, gitBinaryPath(), workingDirectory, processEnvironment(), timeout);
 
         if (unstagedFileNames.empty() && stagedFileNames.empty()) {
             // local repository diff
@@ -914,7 +915,6 @@ void GitClient::diff(const QString &workingDirectory,
     } else {
         const QString binary = settings()->stringValue(GitSettings::binaryPathKey);
         const Core::Id editorId = Git::Constants::GIT_DIFF_EDITOR_ID;
-        const QString title = tr("Git Diff");
 
         VcsBase::VcsBaseEditorWidget *editor = findExistingVCSEditor("originalFileName", workingDirectory);
         if (!editor) {
@@ -940,8 +940,6 @@ void GitClient::diff(const QString &workingDirectory,
         QStringList cmdArgs;
         cmdArgs << QLatin1String("diff") << QLatin1String(noColorOption);
 
-        int timeout = settings()->intValue(GitSettings::timeoutKey);
-
         if (unstagedFileNames.empty() && stagedFileNames.empty()) {
             QStringList arguments(cmdArgs);
             arguments << userDiffArgs;
@@ -972,27 +970,18 @@ void GitClient::diff(const QString &workingDirectory,
                      const QStringList &diffArgs,
                      const QString &fileName)
 {
+    const QString title = tr("Git Diff \"%1\"").arg(fileName);
     if (settings()->boolValue(GitSettings::useDiffEditorKey)) {
-        const Core::Id editorId = DiffEditor::Constants::DIFF_EDITOR_ID;
-        QString title = tr("Git Diff \"%1\"").arg(fileName);
         const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource(workingDirectory, fileName);
-
-        DiffEditor::DiffEditor *editorEditable = findExistingDiffEditor("originalFileName", sourceFile);
-        if (!editorEditable) {
-            editorEditable = qobject_cast<DiffEditor::DiffEditor *>(
-                        Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait));
-            editorEditable->document()->setProperty("originalFileName", sourceFile);
-            Core::EditorManager::activateEditor(editorEditable, Core::EditorManager::ModeSwitch);
-        }
+        DiffEditor::DiffEditor *editor = findExistingOrOpenNewDiffEditor("originalFileName", sourceFile, title);
 
         if (!fileName.isEmpty()) {
             int timeout = settings()->intValue(GitSettings::timeoutKey);
-            GitDiffHandler *handler = new GitDiffHandler(editorEditable, gitBinaryPath(), workingDirectory, processEnvironment(), timeout);
+            GitDiffHandler *handler = new GitDiffHandler(editor, gitBinaryPath(), workingDirectory, processEnvironment(), timeout);
             handler->diffFile(fileName);
         }
     } else {
         const Core::Id editorId = Git::Constants::GIT_DIFF_EDITOR_ID;
-        const QString title = tr("Git Diff \"%1\"").arg(fileName);
         const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource(workingDirectory, fileName);
 
         VcsBase::VcsBaseEditorWidget *editor = findExistingVCSEditor("originalFileName", sourceFile);
@@ -1022,24 +1011,16 @@ void GitClient::diffBranch(const QString &workingDirectory,
                            const QStringList &diffArgs,
                            const QString &branchName)
 {
+    const QString title = tr("Git Diff Branch \"%1\"").arg(branchName);
     if (settings()->boolValue(GitSettings::useDiffEditorKey)) {
-        const Core::Id editorId = DiffEditor::Constants::DIFF_EDITOR_ID;
-        QString title = tr("Git Diff Branch \"%1\"").arg(branchName);
-
-        DiffEditor::DiffEditor *editorEditable = findExistingDiffEditor("BranchName", branchName);
-        if (!editorEditable) {
-            editorEditable = qobject_cast<DiffEditor::DiffEditor *>(
-                        Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait));
-            editorEditable->document()->setProperty("BranchName", branchName);
-            Core::EditorManager::activateEditor(editorEditable, Core::EditorManager::ModeSwitch);
-        }
+        DiffEditor::DiffEditor *editor =
+                findExistingOrOpenNewDiffEditor("BranchName", branchName, title);
 
         int timeout = settings()->intValue(GitSettings::timeoutKey);
-        GitDiffHandler *handler = new GitDiffHandler(editorEditable, gitBinaryPath(), workingDirectory, processEnvironment(), timeout);
+        GitDiffHandler *handler = new GitDiffHandler(editor, gitBinaryPath(), workingDirectory, processEnvironment(), timeout);
         handler->diffBranch(branchName);
     } else {
         const Core::Id editorId = Git::Constants::GIT_DIFF_EDITOR_ID;
-        const QString title = tr("Git Diff Branch \"%1\"").arg(branchName);
         const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource(workingDirectory, QStringList());
 
         VcsBase::VcsBaseEditorWidget *editor = findExistingVCSEditor("BranchName", branchName);
@@ -1137,23 +1118,14 @@ void GitClient::show(const QString &source, const QString &id,
         return;
     }
 
-    QString title = tr("Git Show \"%1\"").arg(name.isEmpty() ? id : name);
+    const QString title = tr("Git Show \"%1\"").arg(name.isEmpty() ? id : name);
     const QFileInfo sourceFi(source);
     const QString workDir = sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath();
     if (settings()->boolValue(GitSettings::useDiffEditorKey)) {
-        const Core::Id editorId = DiffEditor::Constants::DIFF_EDITOR_ID;
-
-        DiffEditor::DiffEditor *editorEditable = findExistingDiffEditor("show", id);
-
-        if (!editorEditable) {
-            editorEditable = qobject_cast<DiffEditor::DiffEditor *>(
-                        Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait));
-            editorEditable->document()->setProperty("show", id);
-            Core::EditorManager::activateEditor(editorEditable, Core::EditorManager::ModeSwitch); // should probably go outside this block
-        }
+        DiffEditor::DiffEditor *editor = findExistingOrOpenNewDiffEditor("show", id, title);
 
         int timeout = settings()->intValue(GitSettings::timeoutKey);
-        GitDiffHandler *handler = new GitDiffHandler(editorEditable, gitBinaryPath(),
+        GitDiffHandler *handler = new GitDiffHandler(editor, gitBinaryPath(),
                                                      findRepositoryForDirectory(workDir),
                                                      processEnvironment(), timeout);
         handler->show(id);
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 85e422a33f4..a280ccc34d4 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -334,8 +334,9 @@ private:
     QTextCodec *getSourceCodec(const QString &file) const;
     VcsBase::VcsBaseEditorWidget *findExistingVCSEditor(const char *registerDynamicProperty,
                                                   const QString &dynamicPropertyValue) const;
-    DiffEditor::DiffEditor *findExistingDiffEditor(const char *registerDynamicProperty,
-                                               const QString &dynamicPropertyValue) const;
+    DiffEditor::DiffEditor *findExistingOrOpenNewDiffEditor(const char *registerDynamicProperty,
+                                               const QString &dynamicPropertyValue,
+                                               const QString &titlePattern) const;
 
     enum CodecType { CodecSource, CodecLogOutput, CodecNone };
     VcsBase::VcsBaseEditorWidget *createVcsEditor(const Core::Id &kind,
-- 
GitLab