|  |  |  |  | using System; | 
					
						
							|  |  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace FairyGUI | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     /// <summary> | 
					
						
							|  |  |  |  |     ///  | 
					
						
							|  |  |  |  |     /// </summary> | 
					
						
							|  |  |  |  |     [Obsolete("Use GTree and GTreeNode instead")] | 
					
						
							|  |  |  |  |     public class TreeView : EventDispatcher | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// TreeView使用的List对象 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public GList list { get; private set; } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// TreeView的顶层节点,这是个虚拟节点,也就是他不会显示出来。 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public TreeNode root { get; private set; } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// TreeView每级的缩进,单位像素。 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public int indent; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public delegate GComponent TreeNodeCreateCellDelegate(TreeNode node); | 
					
						
							|  |  |  |  |         public delegate void TreeNodeRenderDelegate(TreeNode node); | 
					
						
							|  |  |  |  |         public delegate void TreeNodeWillExpandDelegate(TreeNode node, bool expand); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 当TreeNode需要创建对象的显示对象时回调 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public TreeNodeCreateCellDelegate treeNodeCreateCell; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 当TreeNode需要更新时回调 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public TreeNodeRenderDelegate treeNodeRender; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 当TreeNode即将展开或者收缩时回调。可以在回调中动态增加子节点。 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public TreeNodeWillExpandDelegate treeNodeWillExpand; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 点击任意TreeNode时触发 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public EventListener onClickNode { get; private set; } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 右键点击任意TreeNode时触发 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public EventListener onRightClickNode { get; private set; } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="list"></param> | 
					
						
							|  |  |  |  |         public TreeView(GList list) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             this.list = list; | 
					
						
							|  |  |  |  |             list.onClickItem.Add(__clickItem); | 
					
						
							|  |  |  |  |             list.onRightClickItem.Add(__clickItem); | 
					
						
							|  |  |  |  |             list.RemoveChildrenToPool(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             root = new TreeNode(true); | 
					
						
							|  |  |  |  |             root.SetTree(this); | 
					
						
							|  |  |  |  |             root.cell = list; | 
					
						
							|  |  |  |  |             root.expanded = true; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             indent = 30; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             onClickNode = new EventListener(this, "onClickNode"); | 
					
						
							|  |  |  |  |             onRightClickNode = new EventListener(this, "onRightClickNode"); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <returns></returns> | 
					
						
							|  |  |  |  |         public TreeNode GetSelectedNode() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (list.selectedIndex != -1) | 
					
						
							|  |  |  |  |                 return (TreeNode)list.GetChildAt(list.selectedIndex).data; | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |                 return null; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <returns></returns> | 
					
						
							|  |  |  |  |         public List<TreeNode> GetSelection() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             List<int> sels = list.GetSelection(); | 
					
						
							|  |  |  |  |             int cnt = sels.Count; | 
					
						
							|  |  |  |  |             List<TreeNode> ret = new List<TreeNode>(); | 
					
						
							|  |  |  |  |             for (int i = 0; i < cnt; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 TreeNode node = (TreeNode)list.GetChildAt(sels[i]).data; | 
					
						
							|  |  |  |  |                 ret.Add(node); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             return ret; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         /// <param name="scrollItToView"></param> | 
					
						
							|  |  |  |  |         public void AddSelection(TreeNode node, bool scrollItToView = false) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             TreeNode parentNode = node.parent; | 
					
						
							|  |  |  |  |             while (parentNode != null && parentNode != root) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 parentNode.expanded = true; | 
					
						
							|  |  |  |  |                 parentNode = parentNode.parent; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             list.AddSelection(list.GetChildIndex(node.cell), scrollItToView); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         public void RemoveSelection(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             list.RemoveSelection(list.GetChildIndex(node.cell)); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public void ClearSelection() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             list.ClearSelection(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         /// <returns></returns> | 
					
						
							|  |  |  |  |         public int GetNodeIndex(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             return list.GetChildIndex(node.cell); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         public void UpdateNode(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (node.cell == null) | 
					
						
							|  |  |  |  |                 return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (treeNodeRender != null) | 
					
						
							|  |  |  |  |                 treeNodeRender(node); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="nodes"></param> | 
					
						
							|  |  |  |  |         public void UpdateNodes(List<TreeNode> nodes) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             int cnt = nodes.Count; | 
					
						
							|  |  |  |  |             for (int i = 0; i < cnt; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 TreeNode node = nodes[i]; | 
					
						
							|  |  |  |  |                 if (node.cell == null) | 
					
						
							|  |  |  |  |                     return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 if (treeNodeRender != null) | 
					
						
							|  |  |  |  |                     treeNodeRender(node); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="folderNode"></param> | 
					
						
							|  |  |  |  |         public void ExpandAll(TreeNode folderNode) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             folderNode.expanded = true; | 
					
						
							|  |  |  |  |             int cnt = folderNode.numChildren; | 
					
						
							|  |  |  |  |             for (int i = 0; i < cnt; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 TreeNode node = folderNode.GetChildAt(i); | 
					
						
							|  |  |  |  |                 if (node.isFolder) | 
					
						
							|  |  |  |  |                     ExpandAll(node); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="folderNode"></param> | 
					
						
							|  |  |  |  |         public void CollapseAll(TreeNode folderNode) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (folderNode != root) | 
					
						
							|  |  |  |  |                 folderNode.expanded = false; | 
					
						
							|  |  |  |  |             int cnt = folderNode.numChildren; | 
					
						
							|  |  |  |  |             for (int i = 0; i < cnt; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 TreeNode node = folderNode.GetChildAt(i); | 
					
						
							|  |  |  |  |                 if (node.isFolder) | 
					
						
							|  |  |  |  |                     CollapseAll(node); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         void CreateCell(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (treeNodeCreateCell != null) | 
					
						
							|  |  |  |  |                 node.cell = treeNodeCreateCell(node); | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |                 node.cell = list.itemPool.GetObject(list.defaultItem) as GComponent; | 
					
						
							|  |  |  |  |             if (node.cell == null) | 
					
						
							|  |  |  |  |                 throw new Exception("Unable to create tree cell"); | 
					
						
							|  |  |  |  |             node.cell.data = node; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             GObject indentObj = node.cell.GetChild("indent"); | 
					
						
							|  |  |  |  |             if (indentObj != null) | 
					
						
							|  |  |  |  |                 indentObj.width = (node.level - 1) * indent; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             GButton expandButton = (GButton)node.cell.GetChild("expandButton"); | 
					
						
							|  |  |  |  |             if (expandButton != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (node.isFolder) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     expandButton.visible = true; | 
					
						
							|  |  |  |  |                     expandButton.onClick.Add(__clickExpandButton); | 
					
						
							|  |  |  |  |                     expandButton.data = node; | 
					
						
							|  |  |  |  |                     expandButton.selected = node.expanded; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 else | 
					
						
							|  |  |  |  |                     expandButton.visible = false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (treeNodeRender != null) | 
					
						
							|  |  |  |  |                 treeNodeRender(node); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         internal void AfterInserted(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             CreateCell(node); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             int index = GetInsertIndexForNode(node); | 
					
						
							|  |  |  |  |             list.AddChildAt(node.cell, index); | 
					
						
							|  |  |  |  |             if (treeNodeRender != null) | 
					
						
							|  |  |  |  |                 treeNodeRender(node); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (node.isFolder && node.expanded) | 
					
						
							|  |  |  |  |                 CheckChildren(node, index); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         /// <returns></returns> | 
					
						
							|  |  |  |  |         int GetInsertIndexForNode(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             TreeNode prevNode = node.GetPrevSibling(); | 
					
						
							|  |  |  |  |             if (prevNode == null) | 
					
						
							|  |  |  |  |                 prevNode = node.parent; | 
					
						
							|  |  |  |  |             int insertIndex = list.GetChildIndex(prevNode.cell) + 1; | 
					
						
							|  |  |  |  |             int myLevel = node.level; | 
					
						
							|  |  |  |  |             int cnt = list.numChildren; | 
					
						
							|  |  |  |  |             for (int i = insertIndex; i < cnt; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 TreeNode testNode = (TreeNode)list.GetChildAt(i).data; | 
					
						
							|  |  |  |  |                 if (testNode.level <= myLevel) | 
					
						
							|  |  |  |  |                     break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 insertIndex++; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             return insertIndex; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         internal void AfterRemoved(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             RemoveNode(node); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         internal void AfterExpanded(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (node != root && treeNodeWillExpand != null) | 
					
						
							|  |  |  |  |                 treeNodeWillExpand(node, true); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (node.cell == null) | 
					
						
							|  |  |  |  |                 return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (node != root) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (treeNodeRender != null) | 
					
						
							|  |  |  |  |                     treeNodeRender(node); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 GButton expandButton = (GButton)node.cell.GetChild("expandButton"); | 
					
						
							|  |  |  |  |                 if (expandButton != null) | 
					
						
							|  |  |  |  |                     expandButton.selected = true; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (node.cell.parent != null) | 
					
						
							|  |  |  |  |                 CheckChildren(node, list.GetChildIndex(node.cell)); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         internal void AfterCollapsed(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (node != root && treeNodeWillExpand != null) | 
					
						
							|  |  |  |  |                 treeNodeWillExpand(node, false); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (node.cell == null) | 
					
						
							|  |  |  |  |                 return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (node != root) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (treeNodeRender != null) | 
					
						
							|  |  |  |  |                     treeNodeRender(node); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 GButton expandButton = (GButton)node.cell.GetChild("expandButton"); | 
					
						
							|  |  |  |  |                 if (expandButton != null) | 
					
						
							|  |  |  |  |                     expandButton.selected = false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (node.cell.parent != null) | 
					
						
							|  |  |  |  |                 HideFolderNode(node); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         internal void AfterMoved(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (!node.isFolder) | 
					
						
							|  |  |  |  |                 list.RemoveChild(node.cell); | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |                 HideFolderNode(node); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             int index = GetInsertIndexForNode(node); | 
					
						
							|  |  |  |  |             list.AddChildAt(node.cell, index); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (node.isFolder && node.expanded) | 
					
						
							|  |  |  |  |                 CheckChildren(node, index); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="folderNode"></param> | 
					
						
							|  |  |  |  |         /// <param name="index"></param> | 
					
						
							|  |  |  |  |         /// <returns></returns> | 
					
						
							|  |  |  |  |         int CheckChildren(TreeNode folderNode, int index) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             int cnt = folderNode.numChildren; | 
					
						
							|  |  |  |  |             for (int i = 0; i < cnt; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 index++; | 
					
						
							|  |  |  |  |                 TreeNode node = folderNode.GetChildAt(i); | 
					
						
							|  |  |  |  |                 if (node.cell == null) | 
					
						
							|  |  |  |  |                     CreateCell(node); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 if (node.cell.parent == null) | 
					
						
							|  |  |  |  |                     list.AddChildAt(node.cell, index); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 if (node.isFolder && node.expanded) | 
					
						
							|  |  |  |  |                     index = CheckChildren(node, index); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             return index; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="folderNode"></param> | 
					
						
							|  |  |  |  |         void HideFolderNode(TreeNode folderNode) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             int cnt = folderNode.numChildren; | 
					
						
							|  |  |  |  |             for (int i = 0; i < cnt; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 TreeNode node = folderNode.GetChildAt(i); | 
					
						
							|  |  |  |  |                 if (node.cell != null) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     if (node.cell.parent != null) | 
					
						
							|  |  |  |  |                         list.RemoveChild(node.cell); | 
					
						
							|  |  |  |  |                     list.itemPool.ReturnObject(node.cell); | 
					
						
							|  |  |  |  |                     node.cell.data = null; | 
					
						
							|  |  |  |  |                     node.cell = null; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 if (node.isFolder && node.expanded) | 
					
						
							|  |  |  |  |                     HideFolderNode(node); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="node"></param> | 
					
						
							|  |  |  |  |         void RemoveNode(TreeNode node) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (node.cell != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (node.cell.parent != null) | 
					
						
							|  |  |  |  |                     list.RemoveChild(node.cell); | 
					
						
							|  |  |  |  |                 list.itemPool.ReturnObject(node.cell); | 
					
						
							|  |  |  |  |                 node.cell.data = null; | 
					
						
							|  |  |  |  |                 node.cell = null; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (node.isFolder) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 int cnt = node.numChildren; | 
					
						
							|  |  |  |  |                 for (int i = 0; i < cnt; i++) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     TreeNode node2 = node.GetChildAt(i); | 
					
						
							|  |  |  |  |                     RemoveNode(node2); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         void __clickExpandButton(EventContext context) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             context.StopPropagation(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             GButton expandButton = (GButton)context.sender; | 
					
						
							|  |  |  |  |             TreeNode node = (TreeNode)expandButton.parent.data; | 
					
						
							|  |  |  |  |             if (list.scrollPane != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 float posY = list.scrollPane.posY; | 
					
						
							|  |  |  |  |                 if (expandButton.selected) | 
					
						
							|  |  |  |  |                     node.expanded = true; | 
					
						
							|  |  |  |  |                 else | 
					
						
							|  |  |  |  |                     node.expanded = false; | 
					
						
							|  |  |  |  |                 list.scrollPane.posY = posY; | 
					
						
							|  |  |  |  |                 list.scrollPane.ScrollToView(node.cell); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (expandButton.selected) | 
					
						
							|  |  |  |  |                     node.expanded = true; | 
					
						
							|  |  |  |  |                 else | 
					
						
							|  |  |  |  |                     node.expanded = false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         void __clickItem(EventContext context) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             float posY = 0; | 
					
						
							|  |  |  |  |             if (list.scrollPane != null) | 
					
						
							|  |  |  |  |                 posY = list.scrollPane.posY; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             TreeNode node = (TreeNode)((GObject)context.data).data; | 
					
						
							|  |  |  |  |             if (context.type == list.onRightClickItem.type) | 
					
						
							|  |  |  |  |                 onRightClickNode.Call(node); | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |                 onClickNode.Call(node); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (list.scrollPane != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 list.scrollPane.posY = posY; | 
					
						
							|  |  |  |  |                 list.scrollPane.ScrollToView(node.cell); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |