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();
}
}