private SelectStreamWindow(List <PerforceStreamRecord> Streams, string StreamName) { InitializeComponent(); this.SelectedStream = StreamName; // Set up the image list ImageList PerforceImageList = new ImageList(); PerforceImageList.ImageSize = new Size(16, 16); PerforceImageList.ColorDepth = ColorDepth.Depth32Bit; PerforceImageList.Images.AddStrip(Properties.Resources.Perforce); StreamsTreeView.ImageList = PerforceImageList; // Build a map of stream names to their nodes Dictionary <string, StreamNode> IdentifierToNode = new Dictionary <string, StreamNode>(StringComparer.InvariantCultureIgnoreCase); foreach (PerforceStreamRecord Stream in Streams) { if (Stream.Identifier != null && Stream.Name != null) { IdentifierToNode[Stream.Identifier] = new StreamNode(Stream); } } // Create all the depots Dictionary <string, StreamDepot> NameToDepot = new Dictionary <string, StreamDepot>(StringComparer.InvariantCultureIgnoreCase); foreach (StreamNode Node in IdentifierToNode.Values) { if (Node.Record.Parent == null) { string DepotName; if (PerforceUtils.TryGetDepotName(Node.Record.Identifier, out DepotName)) { StreamDepot Depot; if (!NameToDepot.TryGetValue(DepotName, out Depot)) { Depot = new StreamDepot(DepotName); NameToDepot.Add(DepotName, Depot); } Depot.RootNodes.Add(Node); } } else { StreamNode ParentNode; if (IdentifierToNode.TryGetValue(Node.Record.Parent, out ParentNode)) { ParentNode.ChildNodes.Add(Node); } } } // Sort the tree Depots = NameToDepot.Values.OrderBy(x => x.Name).ToList(); foreach (StreamDepot Depot in Depots) { Depot.Sort(); } // Update the contents of the tree PopulateTree(); UpdateOkButton(); }
private void PopulateTree() { StreamsTreeView.BeginUpdate(); StreamsTreeView.Nodes.Clear(); string[] Filter = FilterTextBox.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); List <StreamDepot> FilteredDepots = Depots; if (Filter.Length > 0) { FilteredDepots = new List <StreamDepot>(); foreach (StreamDepot Depot in Depots) { StreamDepot FilteredDepot = new StreamDepot(Depot.Name); foreach (StreamNode RootNode in Depot.RootNodes) { StreamNode FilteredRootNode; if (TryFilterTree(RootNode, Filter, out FilteredRootNode)) { FilteredDepot.RootNodes.Add(FilteredRootNode); } } if (FilteredDepot.RootNodes.Count > 0) { FilteredDepots.Add(FilteredDepot); } } } bool bExpandAll = Filter.Length > 0; foreach (StreamDepot Depot in FilteredDepots) { TreeNode DepotTreeNode = new TreeNode(Depot.Name); DepotTreeNode.ImageIndex = 1; DepotTreeNode.SelectedImageIndex = 1; StreamsTreeView.Nodes.Add(DepotTreeNode); bool bExpand = bExpandAll; foreach (StreamNode RootNode in Depot.RootNodes) { bExpand |= AddStreamNodeToTree(RootNode, Filter, DepotTreeNode, bExpandAll); } if (bExpand) { DepotTreeNode.Expand(); } } if (StreamsTreeView.SelectedNode == null && Filter.Length > 0 && StreamsTreeView.Nodes.Count > 0) { for (TreeNode Node = StreamsTreeView.Nodes[0];; Node = Node.Nodes[0]) { StreamNode Stream = Node.Tag as StreamNode; if (Stream != null && IncludeNodeInFilter(Stream, Filter)) { StreamsTreeView.SelectedNode = Node; break; } if (Node.Nodes.Count == 0) { break; } } } if (StreamsTreeView.SelectedNode != null) { StreamsTreeView.SelectedNode.EnsureVisible(); } else if (StreamsTreeView.Nodes.Count > 0) { StreamsTreeView.Nodes[0].EnsureVisible(); } StreamsTreeView.EndUpdate(); UpdateOkButton(); }