summaryrefslogtreecommitdiff
path: root/src/plugins/git/gitclient.cpp
diff options
context:
space:
mode:
authorjkobus <jaroslaw.kobus@digia.com>2013-08-29 13:08:34 +0200
committerJarek Kobus <jaroslaw.kobus@digia.com>2013-08-30 11:21:31 +0200
commit24ccd50015bf61cdd8a5abaf0ca98fa4e7337460 (patch)
tree6a255f55e74a25df4b4cf2b4190514f51dbe5554 /src/plugins/git/gitclient.cpp
parent8749eee57858c2bcd4f898bcec4dd61242b071d3 (diff)
downloadqt-creator-24ccd50015bf61cdd8a5abaf0ca98fa4e7337460.tar.gz
Add a toolbutton for switching diff view mode
Task-number: QTCREATORBUG-10035 Change-Id: I83cb7cec3f4ba484ab068f398a12096501017668 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
Diffstat (limited to 'src/plugins/git/gitclient.cpp')
-rw-r--r--src/plugins/git/gitclient.cpp446
1 files changed, 332 insertions, 114 deletions
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 5f416155d4..eb9d562005 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -44,6 +44,7 @@
#include <coreplugin/vcsmanager.h>
#include <coreplugin/id.h>
#include <coreplugin/iversioncontrol.h>
+#include <coreplugin/coreconstants.h>
#include <utils/hostosinfo.h>
#include <utils/qtcassert.h>
@@ -84,6 +85,96 @@ namespace Internal {
using VcsBase::VcsBasePlugin;
+class GitDiffSwitcher : public QObject
+{
+ Q_OBJECT
+
+public:
+ enum DiffType {
+ DiffRepository,
+ DiffFile,
+ DiffFileList,
+ DiffProjectList,
+ DiffBranch,
+ DiffShow
+ };
+
+ GitDiffSwitcher(Core::IEditor *parentEditor, GitClient *gitClient, GitClient::DiffEditorType switchToType)
+ : QObject(parentEditor),
+ m_gitClient(gitClient),
+ m_editorType(switchToType)
+ {
+ QIcon actionIcon = switchToType == GitClient::SideBySideDiffEditor
+ ? QIcon(QLatin1String(Core::Constants::ICON_SIDE_BY_SIDE_DIFF))
+ : QIcon(QLatin1String(Core::Constants::ICON_TEXT_DIFF));
+
+ const QString actionToolTip = switchToType == GitClient::SideBySideDiffEditor
+ ? tr("Switch to Side By Side Diff Editor")
+ : tr("Switch to Text Diff Editor");
+
+ QAction *switchAction = new QAction(actionIcon, actionToolTip, parentEditor);
+ parentEditor->toolBar()->addAction(switchAction);
+ connect(switchAction, SIGNAL(triggered()), this, SLOT(execute()));
+ }
+
+ void setWorkingDirectory(const QString &workingDir) { m_workingDirectory = workingDir; }
+ void setDiffType(DiffType type) { m_diffType = type; }
+ void setFileName(const QString &fileName) { m_fileName = fileName; }
+ void setFileList(const QStringList &stagedFiles, const QStringList &unstagedFiles)
+ {
+ m_stagedFiles = stagedFiles;
+ m_unstagedFiles = unstagedFiles;
+ }
+ void setProjectList(const QStringList &projectFiles) { m_projectFiles = projectFiles; }
+ void setBranchName(const QString &branchName) { m_branchName = branchName; }
+ void setId(const QString &id) { m_id = id; }
+ void setDisplayName(const QString &displayName) { m_displayName = displayName; }
+ void setBaseArguments(const QStringList &args) { m_baseArguments = args; }
+
+public slots:
+ void execute();
+
+private:
+ GitClient *m_gitClient;
+ QString m_workingDirectory;
+ DiffType m_diffType;
+ GitClient::DiffEditorType m_editorType;
+ QString m_fileName;
+ QStringList m_stagedFiles;
+ QStringList m_unstagedFiles;
+ QStringList m_projectFiles;
+ QString m_branchName;
+ QString m_id;
+ QString m_displayName;
+ QStringList m_baseArguments;
+};
+
+void GitDiffSwitcher::execute()
+{
+ switch (m_diffType) {
+ case DiffRepository:
+ m_gitClient->diff(m_workingDirectory, QStringList(), QStringList(), m_editorType);
+ break;
+ case DiffFile:
+ m_gitClient->diff(m_workingDirectory, m_fileName, m_editorType);
+ break;
+ case DiffFileList:
+ m_gitClient->diff(m_workingDirectory, m_unstagedFiles, m_stagedFiles, m_editorType);
+ break;
+ case DiffProjectList:
+ m_gitClient->diff(m_workingDirectory, m_projectFiles, QStringList(), m_editorType);
+ break;
+ case DiffBranch:
+ m_gitClient->diffBranch(m_workingDirectory, m_baseArguments, m_branchName, m_editorType);
+ break;
+ case DiffShow:
+ m_gitClient->show(m_fileName, m_id, m_baseArguments, m_displayName, m_editorType);
+ break;
+ default:
+ break;
+ }
+}
+
class GitDiffHandler : public QObject
{
Q_OBJECT
@@ -873,28 +964,30 @@ VcsBase::VcsBaseEditorWidget *GitClient::findExistingVCSEditor(const char *regis
return rc;
}
-DiffEditor::DiffEditor *GitClient::findExistingOrOpenNewDiffEditor(const char *registerDynamicProperty,
- const QString &dynamicPropertyValue, const QString &titlePattern, const Core::Id editorId) const
+DiffEditor::DiffEditor *GitClient::findExistingDiffEditor(const char *registerDynamicProperty,
+ const QString &dynamicPropertyValue) const
{
- Core::IEditor *outputEditor = locateEditor(registerDynamicProperty, dynamicPropertyValue);
- if (outputEditor) {
- // Exists already
- Core::EditorManager::activateEditor(outputEditor);
- outputEditor->document()->setContents(m_msgWait.toUtf8());
+ DiffEditor::DiffEditor *diffEditor = qobject_cast<DiffEditor::DiffEditor *>(
+ locateEditor(registerDynamicProperty, dynamicPropertyValue));
+ if (diffEditor) {
+ diffEditor->document()->setContents(m_msgWait.toUtf8());
+ Core::EditorManager::activateEditor(diffEditor);
}
-
- DiffEditor::DiffEditor *editor = qobject_cast<DiffEditor::DiffEditor *>(outputEditor);
- if (!editor) {
- QString title = titlePattern;
- editor = qobject_cast<DiffEditor::DiffEditor *>(
- Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait.toUtf8()));
- QTC_ASSERT(editor, return 0);
- editor->document()->setProperty(registerDynamicProperty, dynamicPropertyValue);
- Core::EditorManager::activateEditor(editor);
- }
- return editor;
+ return diffEditor;
}
+DiffEditor::DiffEditor *GitClient::createDiffEditor(const char *registerDynamicProperty,
+ const QString &dynamicPropertyValue, const QString &titlePattern, const Core::Id editorId) const
+{
+ QString title = titlePattern;
+ DiffEditor::DiffEditor *diffEditor = qobject_cast<DiffEditor::DiffEditor *>(
+ Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait.toUtf8()));
+ QTC_ASSERT(diffEditor, return 0);
+ diffEditor->document()->setProperty(registerDynamicProperty, dynamicPropertyValue);
+
+ Core::EditorManager::activateEditor(diffEditor);
+ return diffEditor;
+}
/* 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
@@ -942,19 +1035,30 @@ VcsBase::VcsBaseEditorWidget *GitClient::createVcsEditor(const Core::Id &id,
void GitClient::diff(const QString &workingDirectory,
const QStringList &unstagedFileNames,
- const QStringList &stagedFileNames)
+ const QStringList &stagedFileNames,
+ DiffEditorType editorType)
{
const QString title = tr("Git Diff");
const int timeout = settings()->intValue(GitSettings::timeoutKey);
+ const bool showSideBySideEditor = (editorType == DefaultDiffEditor
+ && settings()->boolValue(GitSettings::useDiffEditorKey))
+ || editorType == SideBySideDiffEditor;
+ Core::IEditor *newEditor = 0;
+ if (showSideBySideEditor) {
+ const char *propertyName = "sideBySideOriginalFileName";
+ DiffEditor::DiffEditor *diffEditor = findExistingDiffEditor(propertyName, workingDirectory);
+ if (!diffEditor) {
+ newEditor = diffEditor = createDiffEditor(propertyName,
+ workingDirectory,
+ title,
+ DiffEditor::Constants::DIFF_EDITOR_ID);
+ }
- if (settings()->boolValue(GitSettings::useDiffEditorKey)) {
- DiffEditor::DiffEditor *editor = findExistingOrOpenNewDiffEditor(
- "originalFileName",
- workingDirectory,
- title,
- DiffEditor::Constants::DIFF_EDITOR_ID);
-
- GitDiffHandler *handler = new GitDiffHandler(editor, gitBinaryPath(), workingDirectory, processEnvironment(), timeout);
+ GitDiffHandler *handler = new GitDiffHandler(diffEditor,
+ gitBinaryPath(),
+ workingDirectory,
+ processEnvironment(),
+ timeout);
if (unstagedFileNames.empty() && stagedFileNames.empty()) {
// local repository diff
@@ -968,32 +1072,41 @@ void GitClient::diff(const QString &workingDirectory,
}
} else {
const QString binary = settings()->stringValue(GitSettings::binaryPathKey);
- const Core::Id editorId = Git::Constants::GIT_DIFF_EDITOR_ID;
-
- VcsBase::VcsBaseEditorWidget *editor = findExistingVCSEditor("originalFileName", workingDirectory);
- if (!editor) {
+ const char *propertyName = "originalFileName";
+ VcsBase::VcsBaseEditorWidget *vcsEditor = findExistingVCSEditor(propertyName, workingDirectory);
+ if (!vcsEditor) {
GitCommitDiffArgumentsWidget *argWidget =
- new GitCommitDiffArgumentsWidget(this, workingDirectory,
- unstagedFileNames, stagedFileNames);
-
- editor = createVcsEditor(editorId, title,
- workingDirectory, CodecSource, "originalFileName", workingDirectory, argWidget);
- connect(editor, SIGNAL(diffChunkReverted(VcsBase::DiffChunk)), argWidget, SLOT(executeCommand()));
+ new GitCommitDiffArgumentsWidget(this,
+ workingDirectory,
+ unstagedFileNames,
+ stagedFileNames);
+ vcsEditor = createVcsEditor(Git::Constants::GIT_DIFF_EDITOR_ID,
+ title,
+ workingDirectory,
+ CodecSource,
+ propertyName,
+ workingDirectory,
+ argWidget);
+ newEditor = vcsEditor->editor();
+ connect(vcsEditor, SIGNAL(diffChunkReverted(VcsBase::DiffChunk)),
+ argWidget, SLOT(executeCommand()));
}
- GitCommitDiffArgumentsWidget *argWidget = qobject_cast<GitCommitDiffArgumentsWidget *>(editor->configurationWidget());
+ GitCommitDiffArgumentsWidget *argWidget = qobject_cast<GitCommitDiffArgumentsWidget *>(
+ vcsEditor->configurationWidget());
argWidget->setFileNames(unstagedFileNames, stagedFileNames);
QStringList userDiffArgs = argWidget->arguments();
- editor->setDiffBaseDirectory(workingDirectory);
+ vcsEditor->setDiffBaseDirectory(workingDirectory);
// Create a batch of 2 commands to be run after each other in case
// we have a mixture of staged/unstaged files as is the case
// when using the submit dialog.
- VcsBase::Command *command = createCommand(workingDirectory, editor);
+ VcsBase::Command *command = createCommand(workingDirectory, vcsEditor);
// Directory diff?
QStringList cmdArgs;
- cmdArgs << QLatin1String("diff") << QLatin1String(noColorOption);
+ cmdArgs << QLatin1String("diff")
+ << QLatin1String(noColorOption);
if (unstagedFileNames.empty() && stagedFileNames.empty()) {
QStringList arguments(cmdArgs);
@@ -1004,101 +1117,175 @@ void GitClient::diff(const QString &workingDirectory,
// Files diff.
if (!unstagedFileNames.empty()) {
QStringList arguments(cmdArgs);
- arguments << userDiffArgs;
- arguments << QLatin1String("--") << unstagedFileNames;
+ arguments << userDiffArgs
+ << QLatin1String("--")
+ << unstagedFileNames;
outputWindow()->appendCommand(workingDirectory, binary, arguments);
command->addJob(arguments, timeout);
}
if (!stagedFileNames.empty()) {
QStringList arguments(cmdArgs);
- arguments << userDiffArgs;
- arguments << QLatin1String("--cached") << QLatin1String("--") << stagedFileNames;
+ arguments << userDiffArgs
+ << QLatin1String("--cached")
+ << QLatin1String("--")
+ << stagedFileNames;
outputWindow()->appendCommand(workingDirectory, binary, arguments);
command->addJob(arguments, timeout);
}
}
command->execute();
}
+ if (newEditor) {
+ GitDiffSwitcher *switcher = new GitDiffSwitcher(newEditor, this,
+ showSideBySideEditor ? SimpleTextDiffEditor : SideBySideDiffEditor);
+ switcher->setWorkingDirectory(workingDirectory);
+ if (unstagedFileNames.empty() && stagedFileNames.empty()) {
+ // local repository diff
+ switcher->setDiffType(GitDiffSwitcher::DiffRepository);
+ } else if (!stagedFileNames.empty()) {
+ // diff of selected files only with --cached option, used in commit editor
+ switcher->setDiffType(GitDiffSwitcher::DiffFileList);
+ switcher->setFileList(stagedFileNames, unstagedFileNames);
+ } else {
+ // current project diff
+ switcher->setDiffType(GitDiffSwitcher::DiffProjectList);
+ switcher->setProjectList(unstagedFileNames);
+ }
+ }
}
void GitClient::diff(const QString &workingDirectory,
- const QString &fileName)
+ const QString &fileName,
+ DiffEditorType editorType)
{
const QString title = tr("Git Diff \"%1\"").arg(fileName);
- if (settings()->boolValue(GitSettings::useDiffEditorKey)) {
- const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource(workingDirectory, fileName);
- DiffEditor::DiffEditor *editor = findExistingOrOpenNewDiffEditor(
- "originalFileName",
- sourceFile,
- title,
- DiffEditor::Constants::DIFF_EDITOR_ID);
-
- if (!fileName.isEmpty()) {
- int timeout = settings()->intValue(GitSettings::timeoutKey);
- GitDiffHandler *handler = new GitDiffHandler(editor, gitBinaryPath(), workingDirectory, processEnvironment(), timeout);
- handler->diffFile(fileName);
+ const bool showSideBySideEditor = (editorType == DefaultDiffEditor
+ && settings()->boolValue(GitSettings::useDiffEditorKey))
+ || editorType == SideBySideDiffEditor;
+ const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource(workingDirectory, fileName);
+ Core::IEditor *newEditor = 0;
+ if (showSideBySideEditor) {
+ const char *propertyName = "sideBySideOriginalFileName";
+ DiffEditor::DiffEditor *diffEditor = findExistingDiffEditor(propertyName, sourceFile);
+ if (!diffEditor) {
+ newEditor = diffEditor = createDiffEditor(propertyName,
+ sourceFile,
+ title,
+ DiffEditor::Constants::DIFF_EDITOR_ID);
}
+ GitDiffHandler *handler = new GitDiffHandler(diffEditor,
+ gitBinaryPath(),
+ workingDirectory,
+ processEnvironment(),
+ settings()->intValue(GitSettings::timeoutKey));
+ handler->diffFile(fileName);
} else {
- const Core::Id editorId = Git::Constants::GIT_DIFF_EDITOR_ID;
- const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource(workingDirectory, fileName);
-
- VcsBase::VcsBaseEditorWidget *editor = findExistingVCSEditor("originalFileName", sourceFile);
- if (!editor) {
+ const char *propertyName = "originalFileName";
+ VcsBase::VcsBaseEditorWidget *vcsEditor = findExistingVCSEditor(propertyName, sourceFile);
+ if (!vcsEditor) {
GitFileDiffArgumentsWidget *argWidget =
new GitFileDiffArgumentsWidget(this, workingDirectory, fileName);
- editor = createVcsEditor(editorId, title, sourceFile, CodecSource, "originalFileName", sourceFile, argWidget);
- connect(editor, SIGNAL(diffChunkReverted(VcsBase::DiffChunk)), argWidget, SLOT(executeCommand()));
+ vcsEditor = createVcsEditor(Git::Constants::GIT_DIFF_EDITOR_ID,
+ title,
+ sourceFile,
+ CodecSource,
+ propertyName,
+ sourceFile,
+ argWidget);
+ newEditor = vcsEditor->editor();
+ connect(vcsEditor, SIGNAL(diffChunkReverted(VcsBase::DiffChunk)),
+ argWidget, SLOT(executeCommand()));
}
- editor->setDiffBaseDirectory(workingDirectory);
+ vcsEditor->setDiffBaseDirectory(workingDirectory);
- GitFileDiffArgumentsWidget *argWidget = qobject_cast<GitFileDiffArgumentsWidget *>(editor->configurationWidget());
+ GitFileDiffArgumentsWidget *argWidget = qobject_cast<GitFileDiffArgumentsWidget *>(
+ vcsEditor->configurationWidget());
QStringList userDiffArgs = argWidget->arguments();
QStringList cmdArgs;
- cmdArgs << QLatin1String("diff") << QLatin1String(noColorOption)
+ cmdArgs << QLatin1String("diff")
+ << QLatin1String(noColorOption)
<< userDiffArgs;
if (!fileName.isEmpty())
cmdArgs << QLatin1String("--") << fileName;
- executeGit(workingDirectory, cmdArgs, editor);
+ executeGit(workingDirectory, cmdArgs, vcsEditor);
+ }
+ if (newEditor) {
+ GitDiffSwitcher *switcher = new GitDiffSwitcher(newEditor, this,
+ showSideBySideEditor ? SimpleTextDiffEditor : SideBySideDiffEditor);
+ switcher->setWorkingDirectory(workingDirectory);
+ switcher->setDiffType(GitDiffSwitcher::DiffFile);
+ switcher->setFileName(fileName);
}
}
void GitClient::diffBranch(const QString &workingDirectory,
const QStringList &diffArgs,
- const QString &branchName)
+ const QString &branchName,
+ DiffEditorType editorType)
{
const QString title = tr("Git Diff Branch \"%1\"").arg(branchName);
- if (settings()->boolValue(GitSettings::useDiffEditorKey)) {
- DiffEditor::DiffEditor *editor = findExistingOrOpenNewDiffEditor(
- "BranchName",
- branchName,
- title,
- DiffEditor::Constants::DIFF_EDITOR_ID);
-
- int timeout = settings()->intValue(GitSettings::timeoutKey);
- GitDiffHandler *handler = new GitDiffHandler(editor, gitBinaryPath(), workingDirectory, processEnvironment(), timeout);
+ const bool showSideBySideEditor = (editorType == DefaultDiffEditor
+ && settings()->boolValue(GitSettings::useDiffEditorKey))
+ || editorType == SideBySideDiffEditor;
+ Core::IEditor *newEditor = 0;
+ if (showSideBySideEditor) {
+ const char *propertyName = "sideBySideBranchName";
+ DiffEditor::DiffEditor *diffEditor = findExistingDiffEditor(propertyName, branchName);
+ if (!diffEditor) {
+ newEditor = diffEditor = createDiffEditor(propertyName,
+ branchName,
+ title,
+ DiffEditor::Constants::DIFF_EDITOR_ID);
+ }
+
+ GitDiffHandler *handler = new GitDiffHandler(diffEditor,
+ gitBinaryPath(),
+ workingDirectory,
+ processEnvironment(),
+ settings()->intValue(GitSettings::timeoutKey));
handler->diffBranch(branchName);
} else {
- const Core::Id editorId = Git::Constants::GIT_DIFF_EDITOR_ID;
+ const char *propertyName = "BranchName";
const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource(workingDirectory, QStringList());
- VcsBase::VcsBaseEditorWidget *editor = findExistingVCSEditor("BranchName", branchName);
- if (!editor)
- editor = createVcsEditor(editorId, title, sourceFile, CodecSource, "BranchName", branchName,
- new GitBranchDiffArgumentsWidget(this, workingDirectory,
- diffArgs, branchName));
- editor->setDiffBaseDirectory(workingDirectory);
+ VcsBase::VcsBaseEditorWidget *vcsEditor = findExistingVCSEditor(propertyName, branchName);
+ if (!vcsEditor) {
+ vcsEditor = createVcsEditor(Git::Constants::GIT_DIFF_EDITOR_ID,
+ title,
+ sourceFile,
+ CodecSource,
+ propertyName,
+ branchName,
+ new GitBranchDiffArgumentsWidget(this,
+ workingDirectory,
+ diffArgs,
+ branchName));
+ newEditor = vcsEditor->editor();
+ }
+ vcsEditor->setDiffBaseDirectory(workingDirectory);
- GitBranchDiffArgumentsWidget *argWidget = qobject_cast<GitBranchDiffArgumentsWidget *>(editor->configurationWidget());
+ GitBranchDiffArgumentsWidget *argWidget = qobject_cast<GitBranchDiffArgumentsWidget *>(
+ vcsEditor->configurationWidget());
QStringList userDiffArgs = argWidget->arguments();
QStringList cmdArgs;
- cmdArgs << QLatin1String("diff") << QLatin1String(noColorOption)
- << userDiffArgs << branchName;
+ cmdArgs << QLatin1String("diff")
+ << QLatin1String(noColorOption)
+ << userDiffArgs
+ << branchName;
- executeGit(workingDirectory, cmdArgs, editor);
+ executeGit(workingDirectory, cmdArgs, vcsEditor);
+ }
+ if (newEditor) {
+ GitDiffSwitcher *switcher = new GitDiffSwitcher(newEditor, this,
+ showSideBySideEditor ? SimpleTextDiffEditor : SideBySideDiffEditor);
+ switcher->setWorkingDirectory(workingDirectory);
+ switcher->setDiffType(GitDiffSwitcher::DiffBranch);
+ switcher->setBaseArguments(diffArgs);
+ switcher->setBranchName(branchName);
}
}
@@ -1194,7 +1381,8 @@ static inline QString msgCannotShow(const QString &sha)
}
void GitClient::show(const QString &source, const QString &id,
- const QStringList &args, const QString &name)
+ const QStringList &args, const QString &name,
+ DiffEditorType editorType)
{
if (!canShow(id)) {
outputWindow()->appendError(msgCannotShow(id));
@@ -1203,36 +1391,66 @@ void GitClient::show(const QString &source, const QString &id,
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)) {
- DiffEditor::DiffEditor *editor = findExistingOrOpenNewDiffEditor(
- "show",
- id,
- title,
- DiffEditor::Constants::DIFF_SHOW_EDITOR_ID);
-
- int timeout = settings()->intValue(GitSettings::timeoutKey);
- GitDiffHandler *handler = new GitDiffHandler(editor, gitBinaryPath(), workDir,
- processEnvironment(), timeout);
+ const QString workingDirectory = sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath();
+ const bool showSideBySideEditor = (editorType == DefaultDiffEditor
+ && settings()->boolValue(GitSettings::useDiffEditorKey))
+ || editorType == SideBySideDiffEditor;
+ Core::IEditor *newEditor = 0;
+ if (showSideBySideEditor) {
+ const char *propertyName = "sideBySideShow";
+ DiffEditor::DiffEditor *diffEditor = findExistingDiffEditor(propertyName, id);
+ if (!diffEditor) {
+ newEditor = diffEditor = createDiffEditor(propertyName,
+ id,
+ title,
+ DiffEditor::Constants::DIFF_SHOW_EDITOR_ID);
+ }
+
+ GitDiffHandler *handler = new GitDiffHandler(diffEditor,
+ gitBinaryPath(),
+ workingDirectory,
+ processEnvironment(),
+ settings()->intValue(GitSettings::timeoutKey));
handler->show(id);
} else {
+ const char *propertyName = "show";
const Core::Id editorId = Git::Constants::GIT_DIFF_EDITOR_ID;
- VcsBase::VcsBaseEditorWidget *editor = findExistingVCSEditor("show", id);
- if (!editor)
- editor = createVcsEditor(editorId, title, source, CodecSource, "show", id,
- new GitShowArgumentsWidget(this, source, args, id));
+ VcsBase::VcsBaseEditorWidget *vcsEditor = findExistingVCSEditor(propertyName, id);
+ if (!vcsEditor) {
+ vcsEditor = createVcsEditor(editorId,
+ title,
+ source,
+ CodecSource,
+ propertyName,
+ id,
+ new GitShowArgumentsWidget(this,
+ source,
+ args,
+ id));
+ newEditor = vcsEditor->editor();
+ }
- GitShowArgumentsWidget *argWidget = qobject_cast<GitShowArgumentsWidget *>(editor->configurationWidget());
+ GitShowArgumentsWidget *argWidget = qobject_cast<GitShowArgumentsWidget *>(
+ vcsEditor->configurationWidget());
QStringList userArgs = argWidget->arguments();
QStringList arguments;
- arguments << QLatin1String("show") << QLatin1String(noColorOption);
- arguments << QLatin1String(decorateOption);
- arguments.append(userArgs);
- arguments << id;
-
- editor->setDiffBaseDirectory(workDir);
- executeGit(workDir, arguments, editor);
+ arguments << QLatin1String("show")
+ << QLatin1String(noColorOption)
+ << QLatin1String(decorateOption)
+ << userArgs
+ << id;
+
+ vcsEditor->setDiffBaseDirectory(workingDirectory);
+ executeGit(workingDirectory, arguments, vcsEditor);
+ }
+ if (newEditor) {
+ GitDiffSwitcher *switcher = new GitDiffSwitcher(newEditor, this,
+ showSideBySideEditor ? SimpleTextDiffEditor : SideBySideDiffEditor);
+ switcher->setDiffType(GitDiffSwitcher::DiffShow);
+ switcher->setFileName(source);
+ switcher->setBaseArguments(args);
+ switcher->setId(id);
}
}