!B (Sandbox) (CE-21795) Importing models with multisubmaterials via fbx switches...
[CRYENGINE.git] / Code / Tools / LuaRemoteDebugger / Aga.Controls / Tree / TreeModel.cs
blobae08308b1a2994e027603d9e406315b4898bdac8
1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
3 using System;
4 using System.Collections.Generic;
5 using System.Text;
6 using System.Collections.ObjectModel;
8 namespace Aga.Controls.Tree
10 /// <summary>
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.
14 /// </summary>
15 public class TreeModel : ITreeModel
17 private Node _root;
18 public Node Root
20 get { return _root; }
23 public Collection<Node> Nodes
25 get { return _root.Nodes; }
28 public TreeModel()
30 _root = new Node();
31 _root.Model = this;
34 public TreePath GetPath(Node node)
36 if (node == _root)
37 return TreePath.Empty;
38 else
40 Stack<object> stack = new Stack<object>();
41 while (node != _root)
43 stack.Push(node);
44 node = node.Parent;
46 return new TreePath(stack.ToArray());
50 public Node FindNode(TreePath path)
52 if (path.IsEmpty())
53 return _root;
54 else
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)
64 return node;
65 else
66 return FindNode(node, path, level + 1);
68 return null;
71 #region ITreeModel Members
73 public System.Collections.IEnumerable GetChildren(TreePath treePath)
75 Node node = FindNode(treePath);
76 if (node != null)
77 foreach (Node n in node.Nodes)
78 yield return n;
79 else
80 yield break;
83 public bool IsLeaf(TreePath treePath)
85 Node node = FindNode(treePath);
86 if (node != null)
87 return node.IsLeaf;
88 else
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);
127 #endregion