#region Using Statements using System; using System.Linq; using System.Windows.Forms; using ANX.Framework.NonXNA.Development; using System.Collections.Generic; #endregion // This file is part of the EES Content Compiler 4, // © 2008 - 2012 by Eagle Eye Studios. // The EES Content Compiler 4 is released under the Ms-PL license. // For details see: http://anxframework.codeplex.com/license namespace ANX.ContentCompiler.GUI { [Developer("SilentWarrior/Eagle Eye Studios")] [PercentageComplete(100)] [TestState(TestStateAttribute.TestState.Tested)] public static class TreeViewExtensions { /// /// Performs a recursive search on this TreeView's nodes and its child nodes. Returns the first item found. /// /// The TreeView /// Name to search for /// The first node matching the given criteria or null public static TreeNode RecursiveSearch(this TreeView treeView, String name) { foreach (TreeNode treeNode in treeView.Nodes) { if (treeNode.Name.Equals(name)) return treeNode; TreeNode retNode = treeNode.RecursiveSearch(name); if (retNode != null) { return retNode; } } return null; } /// /// Performs a recursive search on this TreeNode's nodes and their child nodes. Returns the first item found. /// /// The TreeNode /// Name to search for /// The first node matching the given criteria or null public static TreeNode RecursiveSearch(this TreeNode treeNode, String name) { foreach (TreeNode node in treeNode.Nodes) { if (node.Name.Equals(name)) return node; TreeNode ret = node.RecursiveSearch(name); if (ret != null) return ret; } return null; } /// /// Recursively replaces all parts of the names/texts with new values. /// /// /// /// public static void RecursivelyReplacePartOfName(this TreeNode tree, string old, string newString) { tree.Name = tree.Name.Replace(old, newString); tree.Text = tree.Text.Replace(old, newString); foreach (TreeNode node in tree.Nodes) { node.RecursivelyReplacePartOfName(old, newString); } } /// /// Returns all TreeNodes contained in the given collection and all sub collections depth first. /// /// /// public static IEnumerable GetAllNodes(this TreeNodeCollection collection) { foreach (TreeNode node in collection) { foreach (TreeNode subNode in node.Nodes.GetAllNodes()) yield return subNode; yield return node; } } /// /// Gets the path for a TreeNode, consisting of the text of the nodes originating from the root. /// /// /// public static string GetPath(this TreeNode node) { if (node.Parent != null) return node.Parent.GetPath() + '/' + node.Text; else return node.Text; } public static TreeNode FindNode(this TreeNodeCollection collection, string path) { if (path == null) throw new ArgumentNullException("path"); if (path == "") return null; TreeNodeCollection currentCollection = collection; TreeNode targetNode = null; var pathParts = path.Split('/'); foreach (var part in pathParts) { int index = currentCollection.IndexOf((x) => x.Text == part); if (index == -1) return null; targetNode = currentCollection[index]; currentCollection = targetNode.Nodes; } return targetNode; } public static int IndexOf(this TreeNodeCollection collection, Predicate predicate) { if (predicate == null) throw new ArgumentNullException("predicate"); for (int i = 0; i < collection.Count; i++) if (predicate(collection[i])) return i; return -1; } } }