using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PckStudio.Core.Extensions { public static class TreeNodeCollectionExtensions { /// /// wrapper that allows the use of in TreeNode.Nodes.Find(, ...) and TreeNode.Nodes.ContainsKey() /// /// /// /// new Created TreeNode public static TreeNode CreateNode(this TreeNodeCollection root, string name, object tag = null) { TreeNode node = new TreeNode(name); node.Name = name; node.Tag = tag; root.Add(node); return node; } private static (string, string) Slice(this string s, int i) => (s.Substring(0, i), s.Substring(i + 1)); public static TreeNode BuildNodeTreeBySeperator(this TreeNodeCollection root, string path, char seperator, int maxDepth = -1) => root.BuildNodeTreeBySeperator(path, seperator.ToString(), maxDepth); public static TreeNode BuildNodeTreeBySeperator(this TreeNodeCollection root, string path, string seperator, int maxDepth = -1) { _ = root ?? throw new ArgumentNullException(nameof(root)); if (maxDepth == 0 || !path.Contains(seperator)) return root.CreateNode(path); (string nodeText, string subPath) = path.Slice(path.IndexOf(seperator)); if (string.IsNullOrWhiteSpace(nodeText)) return BuildNodeTreeBySeperator(root, subPath, seperator, maxDepth - 1); TreeNode subNode = root.ContainsKey(nodeText) ? root[nodeText] : root.CreateNode(nodeText); return BuildNodeTreeBySeperator(subNode.Nodes, subPath, seperator, maxDepth - 1); } public static IEnumerable GetLeafNodes(this TreeNodeCollection root) { foreach (TreeNode node in root) { if (node.Nodes.Count == 0) yield return node; foreach (TreeNode ln in node.Nodes.GetLeafNodes()) yield return ln; } } } }