public void RefreshTree()
{
ObjectTree.BeginUpdate();
VisibleNodes = new List<TreeNode>();
string[] searchTerms = (ObjectSearch.Text == "") ? null : ObjectSearch.Text.ToLowerInvariant().Split(' ');
SourceNodeToEnt = new Dictionary<TreeNode, ObjectRegistryEntry>();
ObjectTree.Nodes.Clear();
var objects = ObjectRegistry.MastersByFilename;
foreach (var obj in objects)
{
var filename = obj.Key;
var masters = obj.Value;
var fileNode = new TreeNode(filename);
bool fileAdded = false;
var nodes = new List<TreeNode>();
foreach (var master in masters)
{
//if the master matches the search, OR at least one child does, it appears.
int matches = 0;
var node = new TreeNode(master.Name);
SourceNodeToEnt.Add(node, master);
if (master.SearchMatch(searchTerms)) matches++;
foreach (var child in master.Children)
{
if (child.SearchMatch(searchTerms))
{
var cnode = new TreeNode(child.Name);
SourceNodeToEnt.Add(cnode, child);
node.Nodes.Add(cnode);
matches++;
}
}
if (matches > 0)
{
if (!fileAdded)
{
fileAdded = true;
ObjectTree.Nodes.Add(fileNode);
VisibleNodes.Add(fileNode);
}
fileNode.Nodes.Add(node);
VisibleNodes.Add(node);
foreach (var cnode in node.Nodes) VisibleNodes.Add((TreeNode)cnode);
}
}
fileNode.Expand();
}
ObjectTree.EndUpdate();
SearchDescribe.Text = (ObjectSearch.Text == "") ?
"Showing all objects. ("+VisibleNodes.Count+" results)" :
VisibleNodes.Count+" search results for '" + ObjectSearch.Text + "'.";
}