private void RevisionGridSelectionChanged(object sender, EventArgs e) { try { selectedRevisionUpdatedTargets = UpdateTargets.None; var revisions = RevisionGrid.GetSelectedRevisions(); if (revisions.Any() && GitRevision.IsArtificial(revisions[0].Guid)) { CommitInfoTabControl.RemoveIfExists(CommitInfoTabPage); CommitInfoTabControl.RemoveIfExists(TreeTabPage); } else { CommitInfoTabControl.InsertIfNotExists(0, CommitInfoTabPage); CommitInfoTabControl.InsertIfNotExists(1, TreeTabPage); } //RevisionGrid.HighlightSelectedBranch(); FillFileTree(); FillDiff(); FillCommitInfo(); } catch (Exception ex) { Trace.WriteLine(ex.Message); } }
private void FillFileTree() { if (CommitInfoTabControl.SelectedTab != TreeTabPage) return; if (selectedRevisionUpdatedTargets.HasFlag(UpdateTargets.FileTree)) return; selectedRevisionUpdatedTargets |= UpdateTargets.FileTree; try { GitTree.SuspendLayout(); // Save state only when there is selected node if (GitTree.SelectedNode != null) { TreeNode node = GitTree.SelectedNode; FileText.SaveCurrentScrollPos(); lastSelectedNodes.Clear(); while (node != null) { lastSelectedNodes.Push(node.Text); node = node.Parent; } } // Refresh tree GitTree.Nodes.Clear(); //restore selected file and scroll position when new selection is done if (RevisionGrid.GetSelectedRevisions().Count > 0) { LoadInTree(RevisionGrid.GetSelectedRevisions()[0].SubItems, GitTree.Nodes); //GitTree.Sort(); TreeNode lastMatchedNode = null; // Load state var currenNodes = GitTree.Nodes; TreeNode matchedNode = null; while (lastSelectedNodes.Count > 0 && currenNodes != null) { var next = lastSelectedNodes.Pop(); foreach (TreeNode node in currenNodes) { if (node.Text != next && next.Length != 40) continue; node.Expand(); matchedNode = node; break; } if (matchedNode == null) currenNodes = null; else { lastMatchedNode = matchedNode; currenNodes = matchedNode.Nodes; } } //if there is no exact match, don't restore scroll position if (lastMatchedNode != matchedNode) FileText.ResetCurrentScrollPos(); GitTree.SelectedNode = lastMatchedNode; } if (GitTree.SelectedNode == null) { FileText.ViewText("", ""); } } finally { GitTree.ResumeLayout(); } }
private void FillCommitInfo() { if (CommitInfoTabControl.SelectedTab != CommitInfoTabPage) return; if (selectedRevisionUpdatedTargets.HasFlag(UpdateTargets.CommitInfo)) return; selectedRevisionUpdatedTargets |= UpdateTargets.CommitInfo; if (RevisionGrid.GetSelectedRevisions().Count == 0) return; var revision = RevisionGrid.GetSelectedRevisions()[0]; var children = RevisionGrid.GetRevisionChildren(revision.Guid); RevisionInfo.SetRevisionWithChildren(revision, children); }
private void FillDiff() { DiffTabPage.Text = string.Format("{0}", DiffTabPageTitleBase); if (CommitInfoTabControl.SelectedTab != DiffTabPage) { return; } if (selectedRevisionUpdatedTargets.HasFlag(UpdateTargets.DiffList)) return; selectedRevisionUpdatedTargets |= UpdateTargets.DiffList; var revisions = RevisionGrid.GetSelectedRevisions(); DiffText.SaveCurrentScrollPos(); DiffFiles.SetDiffs(revisions); switch (revisions.Count) { case 0: DiffTabPage.Text = string.Format("{0} (no selection)", DiffTabPageTitleBase); break; case 1: // diff "parent" --> "selected revision" var revision = revisions[0]; if (revision != null && revision.ParentGuids != null && revision.ParentGuids.Length != 0) DiffTabPage.Text = string.Format("{0} (A: parent --> B: selection)", DiffTabPageTitleBase); break; case 2: // diff "first clicked revision" --> "second clicked revision" bool artificialRevSelected = revisions[0].IsArtificial() || revisions[1].IsArtificial(); if (!artificialRevSelected) DiffTabPage.Text = string.Format("{0} (A: first --> B: second)", DiffTabPageTitleBase); break; default: // more than 2 revisions selected => no diff DiffTabPage.Text = string.Format("{0} (not supported)", DiffTabPageTitleBase); break; } }
private void FillDiff() { DiffTabPage.Text = _diffTabPageTitleBase; if (CommitInfoTabControl.SelectedTab != DiffTabPage) { return; } if (_selectedRevisionUpdatedTargets.HasFlag(UpdateTargets.DiffList)) return; _selectedRevisionUpdatedTargets |= UpdateTargets.DiffList; var revisions = RevisionGrid.GetSelectedRevisions(); DiffText.SaveCurrentScrollPos(); DiffFiles.SetDiffs(revisions); if (_oldDiffItem != null && revisions.Count > 0 && revisions[0].Guid == _oldRevision) { DiffFiles.SelectedItem = _oldDiffItem; _oldDiffItem = null; _oldRevision = null; } switch (revisions.Count) { case 0: DiffTabPage.Text = _diffNoSelection.Text; break; case 1: // diff "parent" --> "selected revision" var revision = revisions[0]; if (revision != null && revision.ParentGuids != null && revision.ParentGuids.Length != 0) DiffTabPage.Text = _diffParentWithSelection.Text; break; case 2: // diff "first clicked revision" --> "second clicked revision" bool artificialRevSelected = revisions[0].IsArtificial() || revisions[1].IsArtificial(); if (!artificialRevSelected) DiffTabPage.Text = _diffTwoSelected.Text; break; default: // more than 2 revisions selected => no diff DiffTabPage.Text = _diffNotSupported.Text; break; } }