private void loadIssue()
{
Comments.Nodes.Clear();
if (uuid != Guid.Empty)
{
var issues_nav = plugin.issues.CreateNavigator();
var iter=(XPathNodeIterator)issues_nav.Select("//bug[uuid='"+uuid.ToString()+"']");
iter.MoveNext();
XPathNavigator issue = iter.Current;
BoxUUID.Text = issue.Evaluate("string(uuid)").ToString();
BoxShortName.Text = issue.Evaluate("string(short-name)").ToString();
BoxCreated.Text = issue.Evaluate("string(created)").ToString();
BoxCreator.Text = issue.Evaluate("string(creator)").ToString();
BoxReporter.Text = issue.Evaluate("string(reporter)").ToString();
BoxAssigned.Text = issue.Evaluate("string(assigned)").ToString();
BoxSeverity.SelectedItem = issue.Evaluate("string(severity)").ToString();
BoxStatus.SelectedItem = issue.Evaluate("string(status)").ToString();
BoxSummary.Text = issue.Evaluate("string(summary)").ToString();
// Iterate all root comments and append
commentToUUID.Clear();
var UUIDtoComment = new Dictionary<Guid, TreeNode>();
XPathNodeIterator comments = (XPathNodeIterator)issue.Select("comment[not(in-reply-to)]");
foreach (XPathNavigator comment in comments)
{
var node = NewCommentTreeNode(comment);
var uuidpath=new uuid_xpath(new Guid(comment.Evaluate("string(uuid)").ToString()), comment);
UUIDtoComment.Add(uuidpath.Item1, node);
commentToUUID.Add(node, uuidpath);
Comments.Nodes.Add(node);
}
// Recursively apply replies to comments
XPathNodeIterator replies_ = (XPathNodeIterator)issue.Select("comment[in-reply-to]");
var replies = new List<uuid_xpath>();
foreach (XPathNavigator reply in replies_)
replies.Add(new uuid_xpath(new Guid(reply.Evaluate("string(in-reply-to)").ToString()), reply));
while (replies.Count > 0)
{
var oldcount = replies.Count;
for(var i=0; i<replies.Count; )
{
uuid_xpath reply = replies[i];
TreeNode commentnode = UUIDtoComment[reply.Item1];
if (commentnode !=null)
{
var node = NewCommentTreeNode(reply.Item2);
var uuidpath=new uuid_xpath(new Guid(reply.Item2.Evaluate("string(uuid)").ToString()), reply.Item2);
UUIDtoComment.Add(uuidpath.Item1, node);
commentToUUID.Add(node, uuidpath);
commentnode.Nodes.Add(node);
replies.Remove(reply);
}
else i++;
}
if (oldcount == replies.Count)
{
// BE repo is corrupt, so just add as root items and exit
foreach (uuid_xpath reply in replies)
{
var node = NewCommentTreeNode(reply.Item2, "Corrupted BE repo in-reply-to-unknown(" + reply.Item1 + ") ");
var uuidpath = new uuid_xpath(new Guid(reply.Item2.Evaluate("string(uuid)").ToString()), reply.Item2);
commentToUUID.Add(node, uuidpath);
Comments.Nodes.Add(node);
}
break;
}
}
}
setEditable(uuid == Guid.Empty);
CommentAdd.Enabled = true;
Application.DoEvents(); // Let MSHTML get around to binding
if (Comments.Nodes.Count > 0)
{
Comments.ExpandAll();
Commentary.Panel2.Enabled = true;
Comments.SelectedNode = Comments.Nodes[0];
CommentReply.Enabled = CommentDelete.Enabled = CommentEdit.Enabled = true;
CommentDelete.Enabled = CommentEdit.Enabled = false;
}
}