1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
4 using System
.Collections
.Generic
;
6 using System
.Collections
.ObjectModel
;
8 namespace Aga
.Controls
.Tree
11 /// Provides a simple ready to use implementation of <see cref="ITreeModel"/>. Warning: this class is not optimized
12 /// to work with big amount of data. In this case create you own implementation of <c>ITreeModel</c>, and pay attention
13 /// on GetChildren and IsLeaf methods.
15 public class TreeModel
: ITreeModel
23 public Collection
<Node
> Nodes
25 get { return _root.Nodes; }
34 public TreePath
GetPath(Node node
)
37 return TreePath
.Empty
;
40 Stack
<object> stack
= new Stack
<object>();
46 return new TreePath(stack
.ToArray());
50 public Node
FindNode(TreePath path
)
55 return FindNode(_root
, path
, 0);
58 private Node
FindNode(Node root
, TreePath path
, int level
)
60 foreach (Node node
in root
.Nodes
)
61 if (node
== path
.FullPath
[level
])
63 if (level
== path
.FullPath
.Length
- 1)
66 return FindNode(node
, path
, level
+ 1);
71 #region ITreeModel Members
73 public System
.Collections
.IEnumerable
GetChildren(TreePath treePath
)
75 Node node
= FindNode(treePath
);
77 foreach (Node n
in node
.Nodes
)
83 public bool IsLeaf(TreePath treePath
)
85 Node node
= FindNode(treePath
);
89 throw new ArgumentException("treePath");
92 public event EventHandler
<TreeModelEventArgs
> NodesChanged
;
93 internal void OnNodesChanged(TreeModelEventArgs args
)
95 if (NodesChanged
!= null)
96 NodesChanged(this, args
);
99 public event EventHandler
<TreePathEventArgs
> StructureChanged
;
100 public void OnStructureChanged(TreePathEventArgs args
)
102 if (StructureChanged
!= null)
103 StructureChanged(this, args
);
106 public event EventHandler
<TreeModelEventArgs
> NodesInserted
;
107 internal void OnNodeInserted(Node parent
, int index
, Node node
)
109 if (NodesInserted
!= null)
111 TreeModelEventArgs args
= new TreeModelEventArgs(GetPath(parent
), new int[] { index }
, new object[] { node }
);
112 NodesInserted(this, args
);
117 public event EventHandler
<TreeModelEventArgs
> NodesRemoved
;
118 internal void OnNodeRemoved(Node parent
, int index
, Node node
)
120 if (NodesRemoved
!= null)
122 TreeModelEventArgs args
= new TreeModelEventArgs(GetPath(parent
), new int[] { index }
, new object[] { node }
);
123 NodesRemoved(this, args
);