From 6df60b093eb2fcfb634ac023f612b8d2de0ac6d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janusz=20Bia=C5=82obrzewski?= Date: Sun, 8 Apr 2018 16:35:48 +0200 Subject: [PATCH 1/3] Show FormDiff modeless. --- GitUI/UserControls/RevisionGrid.cs | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/GitUI/UserControls/RevisionGrid.cs b/GitUI/UserControls/RevisionGrid.cs index fec176ab2e4..b1208df333b 100644 --- a/GitUI/UserControls/RevisionGrid.cs +++ b/GitUI/UserControls/RevisionGrid.cs @@ -3732,11 +3732,10 @@ private void CompareToBranchToolStripMenuItem_Click(object sender, EventArgs e) if (form.ShowDialog(this) == DialogResult.OK) { var baseCommit = Module.RevParse(form.BranchName); - using (var diffForm = new FormDiff(UICommands, this, baseCommit, headCommit.Guid, - form.BranchName, headCommit.Subject)) - { - diffForm.ShowDialog(this); - } + var diffForm = new FormDiff(UICommands, this, baseCommit, headCommit.Guid, + form.BranchName, headCommit.Subject); + diffForm.Show(); + diffForm.ShowInTaskbar = true; } } } @@ -3746,11 +3745,10 @@ private void CompareWithCurrentBranchToolStripMenuItem_Click(object sender, Even var baseCommit = GetSelectedRevisions().First(); var headBranch = Module.GetSelectedBranch(); var headBranchName = Module.RevParse(headBranch); - using (var diffForm = new FormDiff(UICommands, this, baseCommit.Guid, headBranchName, - baseCommit.Subject, headBranch)) - { - diffForm.ShowDialog(this); - } + var diffForm = new FormDiff(UICommands, this, baseCommit.Guid, headBranchName, + baseCommit.Subject, headBranch); + diffForm.Show(); + diffForm.ShowInTaskbar = true; } private void selectAsBaseToolStripMenuItem_Click(object sender, EventArgs e) @@ -3768,11 +3766,10 @@ private void compareToBaseToolStripMenuItem_Click(object sender, EventArgs e) } var headCommit = GetSelectedRevisions().First(); - using (var diffForm = new FormDiff(UICommands, this, _baseCommitToCompare.Guid, headCommit.Guid, - _baseCommitToCompare.Subject, headCommit.Subject)) - { - diffForm.ShowDialog(this); - } + var diffForm = new FormDiff(UICommands, this, _baseCommitToCompare.Guid, headCommit.Guid, + _baseCommitToCompare.Subject, headCommit.Subject); + diffForm.Show(); + diffForm.ShowInTaskbar = true; } private void getHelpOnHowToUseTheseFeaturesToolStripMenuItem_Click(object sender, EventArgs e) From d3479cc45f5b57bbad44c29b0606d095c3d3d6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janusz=20Bia=C5=82obrzewski?= Date: Mon, 9 Apr 2018 20:47:20 +0200 Subject: [PATCH 2/3] Move OpenWithDifftool to UICommands. OpenWithDifftool does not need RevisionGrid. It needs IWin32Window and GitModule. It fits better as a member of UICommands. --- GitUI/CommandsDialogs/FormDiff.cs | 2 +- GitUI/CommandsDialogs/FormFileHistory.cs | 4 ++-- GitUI/CommandsDialogs/RevisionDiff.cs | 2 +- GitUI/GitUICommands.cs | 21 +++++++++++++++++++++ GitUI/GitUIExtensions.cs | 21 --------------------- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/GitUI/CommandsDialogs/FormDiff.cs b/GitUI/CommandsDialogs/FormDiff.cs index b82d88a24f6..28c9e705312 100644 --- a/GitUI/CommandsDialogs/FormDiff.cs +++ b/GitUI/CommandsDialogs/FormDiff.cs @@ -161,7 +161,7 @@ private void openWithDifftoolToolStripMenuItem_Click(object sender, EventArgs e) foreach (var itemWithParent in DiffFiles.SelectedItemsWithParent) { var revs = new[] { DiffFiles.Revision, itemWithParent.ParentRevision }; - _revisionGrid.OpenWithDifftool(revs, itemWithParent.Item.Name, itemWithParent.Item.OldName, diffKind, itemWithParent.Item.IsTracked); + UICommands.OpenWithDifftool(this, revs, itemWithParent.Item.Name, itemWithParent.Item.OldName, diffKind, itemWithParent.Item.IsTracked); } } diff --git a/GitUI/CommandsDialogs/FormFileHistory.cs b/GitUI/CommandsDialogs/FormFileHistory.cs index 2f6040b2966..8b759c0213b 100644 --- a/GitUI/CommandsDialogs/FormFileHistory.cs +++ b/GitUI/CommandsDialogs/FormFileHistory.cs @@ -360,7 +360,7 @@ private void OpenWithDifftoolToolStripMenuItemClick(object sender, EventArgs e) ? selectedRevisions[0].Name : null; - FileChanges.OpenWithDifftool(selectedRevisions, FileName, orgFileName, RevisionDiffKind.DiffAB, true); + UICommands.OpenWithDifftool(this, selectedRevisions, FileName, orgFileName, RevisionDiffKind.DiffAB, true); } private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) @@ -482,7 +482,7 @@ public override void TranslateItems(ITranslation translation) private void diffToolremotelocalStripMenuItem_Click(object sender, EventArgs e) { - FileChanges.OpenWithDifftool(FileChanges.GetSelectedRevisions(), FileName, string.Empty, RevisionDiffKind.DiffBLocal, true); + UICommands.OpenWithDifftool(this, FileChanges.GetSelectedRevisions(), FileName, string.Empty, RevisionDiffKind.DiffBLocal, true); } private void toolStripSplitLoad_ButtonClick(object sender, EventArgs e) diff --git a/GitUI/CommandsDialogs/RevisionDiff.cs b/GitUI/CommandsDialogs/RevisionDiff.cs index e15e533f531..6a8ea5d5370 100644 --- a/GitUI/CommandsDialogs/RevisionDiff.cs +++ b/GitUI/CommandsDialogs/RevisionDiff.cs @@ -572,7 +572,7 @@ private void openWithDifftoolToolStripMenuItem_Click(object sender, EventArgs e) foreach (var itemWithParent in DiffFiles.SelectedItemsWithParent) { var revs = new[] { DiffFiles.Revision, itemWithParent.ParentRevision }; - _revisionGrid.OpenWithDifftool(revs, itemWithParent.Item.Name, itemWithParent.Item.OldName, diffKind, itemWithParent.Item.IsTracked); + UICommands.OpenWithDifftool(this, revs, itemWithParent.Item.Name, itemWithParent.Item.OldName, diffKind, itemWithParent.Item.IsTracked); } } diff --git a/GitUI/GitUICommands.cs b/GitUI/GitUICommands.cs index 13178b53281..a77c6a6b2e8 100644 --- a/GitUI/GitUICommands.cs +++ b/GitUI/GitUICommands.cs @@ -1472,6 +1472,27 @@ public void StartFileHistoryDialog(string fileName) StartFileHistoryDialog(fileName, null); } + public void OpenWithDifftool(IWin32Window owner, IReadOnlyList revisions, string fileName, string oldFileName, GitUI.RevisionDiffKind diffKind, bool isTracked) + { + // Note: Order in revisions is that first clicked is last in array + + string error = RevisionDiffInfoProvider.Get(revisions, diffKind, + out var extraDiffArgs, out var firstRevision, out var secondRevision); + + if (!string.IsNullOrEmpty(error)) + { + MessageBox.Show(owner, error); + } + else + { + string output = Module.OpenWithDifftool(fileName, oldFileName, firstRevision, secondRevision, extraDiffArgs, isTracked); + if (!string.IsNullOrEmpty(output)) + { + MessageBox.Show(owner, output); + } + } + } + public bool StartPushDialog() { return StartPushDialog(false); diff --git a/GitUI/GitUIExtensions.cs b/GitUI/GitUIExtensions.cs index d26cf57a7e2..c14642113f2 100644 --- a/GitUI/GitUIExtensions.cs +++ b/GitUI/GitUIExtensions.cs @@ -16,27 +16,6 @@ namespace GitUI { public static class GitUIExtensions { - public static void OpenWithDifftool(this RevisionGrid grid, IReadOnlyList revisions, string fileName, string oldFileName, GitUI.RevisionDiffKind diffKind, bool isTracked) - { - // Note: Order in revisions is that first clicked is last in array - - string error = RevisionDiffInfoProvider.Get(revisions, diffKind, - out var extraDiffArgs, out var firstRevision, out var secondRevision); - - if (!string.IsNullOrEmpty(error)) - { - MessageBox.Show(grid, error); - } - else - { - string output = grid.Module.OpenWithDifftool(fileName, oldFileName, firstRevision, secondRevision, extraDiffArgs, isTracked); - if (!string.IsNullOrEmpty(output)) - { - MessageBox.Show(grid, output); - } - } - } - [CanBeNull] private static Patch GetItemPatch( [NotNull] GitModule module, From c850d020ed56578c6aeee78f0d8701fc8d50783d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janusz=20Bia=C5=82obrzewski?= Date: Mon, 9 Apr 2018 20:56:53 +0200 Subject: [PATCH 3/3] Remove from FormDiff dependency on RevisionGrid. FormDiff receives only immutable dependencies and can be shown modeless (is invariant to repo change). --- GitUI/CommandsDialogs/FormDiff.cs | 10 ++++------ GitUI/CommandsDialogs/RevisionDiff.cs | 6 +----- GitUI/GitUICommands.cs | 11 +++++++++++ GitUI/UserControls/RevisionGrid.cs | 20 +++++++++++--------- 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/GitUI/CommandsDialogs/FormDiff.cs b/GitUI/CommandsDialogs/FormDiff.cs index 28c9e705312..b0dd8b1624d 100644 --- a/GitUI/CommandsDialogs/FormDiff.cs +++ b/GitUI/CommandsDialogs/FormDiff.cs @@ -12,7 +12,6 @@ namespace GitUI.CommandsDialogs { public partial class FormDiff : GitModuleForm { - private readonly RevisionGrid _revisionGrid; private string _baseCommitDisplayStr; private string _headCommitDisplayStr; private GitRevision _baseRevision; @@ -22,6 +21,7 @@ public partial class FormDiff : GitModuleForm private IFileStatusListContextMenuController _revisionDiffContextMenuController; private readonly IFullPathResolver _fullPathResolver; private readonly IFindFilePredicateProvider _findFilePredicateProvider; + private readonly bool _firstParentIsValid; private readonly ToolTip _toolTipControl = new ToolTip(); @@ -32,12 +32,12 @@ public partial class FormDiff : GitModuleForm private readonly TranslationString _btnSwapTooltip = new TranslationString("Swap BASE and Compare commits"); - public FormDiff(GitUICommands commands, RevisionGrid revisionGrid, string baseCommitSha, + public FormDiff(GitUICommands commands, bool firstParentIsValid, string baseCommitSha, string headCommitSha, string baseCommitDisplayStr, string headCommitDisplayStr) : base(commands) { - _revisionGrid = revisionGrid; _baseCommitDisplayStr = baseCommitDisplayStr; _headCommitDisplayStr = headCommitDisplayStr; + _firstParentIsValid = firstParentIsValid; InitializeComponent(); Translate(); @@ -264,14 +264,12 @@ private ContextMenuDiffToolInfo GetContextMenuDiffToolInfo() IEnumerable selectedItemParentRevs = DiffFiles.Revision.ParentGuids; bool allAreNew = DiffFiles.SelectedItemsWithParent.All(i => i.Item.IsNew); bool allAreDeleted = DiffFiles.SelectedItemsWithParent.All(i => i.Item.IsDeleted); - var revisions = _revisionGrid.GetSelectedRevisions(); - bool firstParentsValid = revisions != null && revisions.Count > 1; var selectionInfo = new ContextMenuDiffToolInfo(_headRevision, selectedItemParentRevs, allAreNew: allAreNew, allAreDeleted: allAreDeleted, firstIsParent: firstIsParent, - firstParentsValid: firstParentsValid, + firstParentsValid: _firstParentIsValid, localExists: localExists); return selectionInfo; } diff --git a/GitUI/CommandsDialogs/RevisionDiff.cs b/GitUI/CommandsDialogs/RevisionDiff.cs index 6a8ea5d5370..4e50df80232 100644 --- a/GitUI/CommandsDialogs/RevisionDiff.cs +++ b/GitUI/CommandsDialogs/RevisionDiff.cs @@ -584,16 +584,12 @@ private ContextMenuDiffToolInfo GetContextMenuDiffToolInfo() IEnumerable selectedItemParentRevs = DiffFiles.SelectedItemParents.Select(i => i.Guid); bool allAreNew = DiffFiles.SelectedItemsWithParent.All(i => i.Item.IsNew); bool allAreDeleted = DiffFiles.SelectedItemsWithParent.All(i => i.Item.IsDeleted); - var revisions = _revisionGrid.GetSelectedRevisions(); - - // Parents to First (A) are only known if A is explicitly selected (there is no explicit search for parents to parents of a single selected revision) - bool firstParentsValid = revisions != null && revisions.Count > 1; var selectionInfo = new ContextMenuDiffToolInfo(DiffFiles.Revision, selectedItemParentRevs, allAreNew: allAreNew, allAreDeleted: allAreDeleted, firstIsParent: firstIsParent, - firstParentsValid: firstParentsValid, + firstParentsValid: _revisionGrid.IsFirstParentValid(), localExists: localExists); return selectionInfo; } diff --git a/GitUI/GitUICommands.cs b/GitUI/GitUICommands.cs index a77c6a6b2e8..8016aa243f0 100644 --- a/GitUI/GitUICommands.cs +++ b/GitUI/GitUICommands.cs @@ -1493,6 +1493,17 @@ public void OpenWithDifftool(IWin32Window owner, IReadOnlyList revi } } + public FormDiff ShowFormDiff(bool firstParentIsValid, string baseCommitSha, + string headCommitSha, string baseCommitDisplayStr, string headCommitDisplayStr) + { + var diffForm = new FormDiff(this, firstParentIsValid, baseCommitSha, + headCommitSha, baseCommitDisplayStr, headCommitDisplayStr); + diffForm.Show(); + diffForm.ShowInTaskbar = true; + + return diffForm; + } + public bool StartPushDialog() { return StartPushDialog(false); diff --git a/GitUI/UserControls/RevisionGrid.cs b/GitUI/UserControls/RevisionGrid.cs index b1208df333b..4cf9b144864 100644 --- a/GitUI/UserControls/RevisionGrid.cs +++ b/GitUI/UserControls/RevisionGrid.cs @@ -968,6 +968,14 @@ public IReadOnlyList GetSelectedRevisions(SortDirection? direction .ToList(); } + public bool IsFirstParentValid() + { + var revisions = GetSelectedRevisions(); + + // Parents to First (A) are only known if A is explicitly selected (there is no explicit search for parents to parents of a single selected revision) + return revisions != null && revisions.Count > 1; + } + public IReadOnlyList GetRevisionChildren(string revision) { return Revisions.GetRevisionChildren(revision); @@ -3732,10 +3740,8 @@ private void CompareToBranchToolStripMenuItem_Click(object sender, EventArgs e) if (form.ShowDialog(this) == DialogResult.OK) { var baseCommit = Module.RevParse(form.BranchName); - var diffForm = new FormDiff(UICommands, this, baseCommit, headCommit.Guid, + UICommands.ShowFormDiff(IsFirstParentValid(), baseCommit, headCommit.Guid, form.BranchName, headCommit.Subject); - diffForm.Show(); - diffForm.ShowInTaskbar = true; } } } @@ -3745,10 +3751,8 @@ private void CompareWithCurrentBranchToolStripMenuItem_Click(object sender, Even var baseCommit = GetSelectedRevisions().First(); var headBranch = Module.GetSelectedBranch(); var headBranchName = Module.RevParse(headBranch); - var diffForm = new FormDiff(UICommands, this, baseCommit.Guid, headBranchName, + UICommands.ShowFormDiff(IsFirstParentValid(), baseCommit.Guid, headBranchName, baseCommit.Subject, headBranch); - diffForm.Show(); - diffForm.ShowInTaskbar = true; } private void selectAsBaseToolStripMenuItem_Click(object sender, EventArgs e) @@ -3766,10 +3770,8 @@ private void compareToBaseToolStripMenuItem_Click(object sender, EventArgs e) } var headCommit = GetSelectedRevisions().First(); - var diffForm = new FormDiff(UICommands, this, _baseCommitToCompare.Guid, headCommit.Guid, + UICommands.ShowFormDiff(IsFirstParentValid(), _baseCommitToCompare.Guid, headCommit.Guid, _baseCommitToCompare.Subject, headCommit.Subject); - diffForm.Show(); - diffForm.ShowInTaskbar = true; } private void getHelpOnHowToUseTheseFeaturesToolStripMenuItem_Click(object sender, EventArgs e)