コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }