public void RefreshTree() { ObjectTree.BeginUpdate(); VisibleNodes = new List <TreeNode>(); string[] searchTerms = (ObjectSearch.Text == "") ? null : ObjectSearch.Text.ToLower().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 + "'."; }