#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;
}
}
}