diff -r 3145aadca3d2 -r 0c551e8818e0 External/Aga.Controls/Tree/TreeModel.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/External/Aga.Controls/Tree/TreeModel.cs Sun May 27 15:16:19 2012 +0000 @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Collections.ObjectModel; + +namespace Aga.Controls.Tree +{ + /// + /// Provides a simple ready to use implementation of . Warning: this class is not optimized + /// to work with big amount of data. In this case create you own implementation of ITreeModel, and pay attention + /// on GetChildren and IsLeaf methods. + /// + public class TreeModel : ITreeModel + { + private Node _root; + public Node Root + { + get { return _root; } + } + + public Collection Nodes + { + get { return _root.Nodes; } + } + + public TreeModel() + { + _root = new Node(); + _root.Model = this; + } + + public TreePath GetPath(Node node) + { + if (node == _root) + return TreePath.Empty; + else + { + Stack stack = new Stack(); + while (node != _root) + { + stack.Push(node); + node = node.Parent; + } + return new TreePath(stack.ToArray()); + } + } + + public Node FindNode(TreePath path) + { + if (path.IsEmpty()) + return _root; + else + return FindNode(_root, path, 0); + } + + private Node FindNode(Node root, TreePath path, int level) + { + foreach (Node node in root.Nodes) + if (node == path.FullPath[level]) + { + if (level == path.FullPath.Length - 1) + return node; + else + return FindNode(node, path, level + 1); + } + return null; + } + + #region ITreeModel Members + + public System.Collections.IEnumerable GetChildren(TreePath treePath) + { + Node node = FindNode(treePath); + if (node != null) + foreach (Node n in node.Nodes) + yield return n; + else + yield break; + } + + public bool IsLeaf(TreePath treePath) + { + Node node = FindNode(treePath); + if (node != null) + return node.IsLeaf; + else + throw new ArgumentException("treePath"); + } + + public event EventHandler NodesChanged; + internal void OnNodesChanged(TreeModelEventArgs args) + { + if (NodesChanged != null) + NodesChanged(this, args); + } + + public event EventHandler StructureChanged; + public void OnStructureChanged(TreePathEventArgs args) + { + if (StructureChanged != null) + StructureChanged(this, args); + } + + public event EventHandler NodesInserted; + internal void OnNodeInserted(Node parent, int index, Node node) + { + if (NodesInserted != null) + { + TreeModelEventArgs args = new TreeModelEventArgs(GetPath(parent), new int[] { index }, new object[] { node }); + NodesInserted(this, args); + } + + } + + public event EventHandler NodesRemoved; + internal void OnNodeRemoved(Node parent, int index, Node node) + { + if (NodesRemoved != null) + { + TreeModelEventArgs args = new TreeModelEventArgs(GetPath(parent), new int[] { index }, new object[] { node }); + NodesRemoved(this, args); + } + } + + #endregion + } +}