|  |  | using System;
 | 
						
						
						
							|  |  | using System.Collections.Generic;
 | 
						
						
						
							|  |  | using FairyGUI.Utils;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | namespace FairyGUI
 | 
						
						
						
							|  |  | {
 | 
						
						
						
							|  |  |     /// <summary>
 | 
						
						
						
							|  |  |     /// 
 | 
						
						
						
							|  |  |     /// </summary>
 | 
						
						
						
							|  |  |     public class GTree : GList
 | 
						
						
						
							|  |  |     {
 | 
						
						
						
							|  |  |         public delegate void TreeNodeRenderDelegate(GTreeNode node, GComponent obj);
 | 
						
						
						
							|  |  |         public delegate void TreeNodeWillExpandDelegate(GTreeNode node, bool expand);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 当TreeNode需要更新时回调
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public TreeNodeRenderDelegate treeNodeRender;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 当TreeNode即将展开或者收缩时回调。可以在回调中动态增加子节点。
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public TreeNodeWillExpandDelegate treeNodeWillExpand;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         int _indent;
 | 
						
						
						
							|  |  |         GTreeNode _rootNode;
 | 
						
						
						
							|  |  |         int _clickToExpand;
 | 
						
						
						
							|  |  |         bool _expandedStatusInEvt;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         private static List<int> helperIntList = new List<int>();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public GTree()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             _indent = 30;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             _rootNode = new GTreeNode(true);
 | 
						
						
						
							|  |  |             _rootNode._SetTree(this);
 | 
						
						
						
							|  |  |             _rootNode.expanded = true;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// TreeView的顶层节点,这是个虚拟节点,也就是他不会显示出来。
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public GTreeNode rootNode
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _rootNode; }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// TreeView每级的缩进,单位像素。
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public int indent
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _indent; }
 | 
						
						
						
							|  |  |             set { _indent = value; }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public int clickToExpand
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _clickToExpand; }
 | 
						
						
						
							|  |  |             set { _clickToExpand = value; }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         public GTreeNode GetSelectedNode()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             int i = this.selectedIndex;
 | 
						
						
						
							|  |  |             if (i != -1)
 | 
						
						
						
							|  |  |                 return (GTreeNode)this.GetChildAt(i)._treeNode;
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 return null;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  | 		/// 
 | 
						
						
						
							|  |  | 		/// </summary>
 | 
						
						
						
							|  |  | 		/// <returns></returns>
 | 
						
						
						
							|  |  | 		public List<GTreeNode> GetSelectedNodes()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             return GetSelectedNodes(null);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="result"></param>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         public List<GTreeNode> GetSelectedNodes(List<GTreeNode> result)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (result == null)
 | 
						
						
						
							|  |  |                 result = new List<GTreeNode>();
 | 
						
						
						
							|  |  |             helperIntList.Clear();
 | 
						
						
						
							|  |  |             List<int> sels = GetSelection(helperIntList);
 | 
						
						
						
							|  |  |             int cnt = sels.Count;
 | 
						
						
						
							|  |  |             for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GTreeNode node = GetChildAt(sels[i])._treeNode;
 | 
						
						
						
							|  |  |                 result.Add(node);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             return result;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  | 		/// 
 | 
						
						
						
							|  |  | 		/// </summary>
 | 
						
						
						
							|  |  | 		/// <param name="node"></param>
 | 
						
						
						
							|  |  |         public void SelectNode(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             SelectNode(node, false);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         /// <param name="scrollItToView"></param>
 | 
						
						
						
							|  |  |         public void SelectNode(GTreeNode node, bool scrollItToView)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             GTreeNode parentNode = node.parent;
 | 
						
						
						
							|  |  |             while (parentNode != null && parentNode != _rootNode)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 parentNode.expanded = true;
 | 
						
						
						
							|  |  |                 parentNode = parentNode.parent;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             AddSelection(GetChildIndex(node.cell), scrollItToView);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         public void UnselectNode(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             RemoveSelection(GetChildIndex(node.cell));
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  | 		/// 
 | 
						
						
						
							|  |  | 		/// </summary>
 | 
						
						
						
							|  |  |         public void ExpandAll()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ExpandAll(_rootNode);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="folderNode"></param>
 | 
						
						
						
							|  |  |         public void ExpandAll(GTreeNode folderNode)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             folderNode.expanded = true;
 | 
						
						
						
							|  |  |             int cnt = folderNode.numChildren;
 | 
						
						
						
							|  |  |             for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GTreeNode node = folderNode.GetChildAt(i);
 | 
						
						
						
							|  |  |                 if (node.isFolder)
 | 
						
						
						
							|  |  |                     ExpandAll(node);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="folderNode"></param>
 | 
						
						
						
							|  |  |         public void CollapseAll()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             CollapseAll(_rootNode);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="folderNode"></param>
 | 
						
						
						
							|  |  |         public void CollapseAll(GTreeNode folderNode)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (folderNode != _rootNode)
 | 
						
						
						
							|  |  |                 folderNode.expanded = false;
 | 
						
						
						
							|  |  |             int cnt = folderNode.numChildren;
 | 
						
						
						
							|  |  |             for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GTreeNode node = folderNode.GetChildAt(i);
 | 
						
						
						
							|  |  |                 if (node.isFolder)
 | 
						
						
						
							|  |  |                     CollapseAll(node);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         void CreateCell(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             GComponent child = itemPool.GetObject(string.IsNullOrEmpty(node._resURL) ? this.defaultItem : node._resURL) as GComponent;
 | 
						
						
						
							|  |  |             if (child == null)
 | 
						
						
						
							|  |  |                 throw new Exception("FairyGUI: cannot create tree node object.");
 | 
						
						
						
							|  |  |             child.displayObject.home = this.displayObject.cachedTransform;
 | 
						
						
						
							|  |  |             child._treeNode = node;
 | 
						
						
						
							|  |  |             node._cell = child;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             GObject indentObj = node.cell.GetChild("indent");
 | 
						
						
						
							|  |  |             if (indentObj != null)
 | 
						
						
						
							|  |  |                 indentObj.width = (node.level - 1) * indent;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             Controller cc;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             cc = child.GetController("expanded");
 | 
						
						
						
							|  |  |             if (cc != null)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 cc.onChanged.Add(__expandedStateChanged);
 | 
						
						
						
							|  |  |                 cc.selectedIndex = node.expanded ? 1 : 0;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             cc = child.GetController("leaf");
 | 
						
						
						
							|  |  |             if (cc != null)
 | 
						
						
						
							|  |  |                 cc.selectedIndex = node.isFolder ? 0 : 1;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (node.isFolder)
 | 
						
						
						
							|  |  |                 child.onTouchBegin.Add(__cellTouchBegin);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (treeNodeRender != null)
 | 
						
						
						
							|  |  |                 treeNodeRender(node, node._cell);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         internal void _AfterInserted(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (node._cell == null)
 | 
						
						
						
							|  |  |                 CreateCell(node);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int index = GetInsertIndexForNode(node);
 | 
						
						
						
							|  |  |             AddChildAt(node.cell, index);
 | 
						
						
						
							|  |  |             if (treeNodeRender != null)
 | 
						
						
						
							|  |  |                 treeNodeRender(node, node._cell);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (node.isFolder && node.expanded)
 | 
						
						
						
							|  |  |                 CheckChildren(node, index);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         int GetInsertIndexForNode(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             GTreeNode prevNode = node.GetPrevSibling();
 | 
						
						
						
							|  |  |             if (prevNode == null)
 | 
						
						
						
							|  |  |                 prevNode = node.parent;
 | 
						
						
						
							|  |  |             int insertIndex = GetChildIndex(prevNode.cell) + 1;
 | 
						
						
						
							|  |  |             int myLevel = node.level;
 | 
						
						
						
							|  |  |             int cnt = this.numChildren;
 | 
						
						
						
							|  |  |             for (int i = insertIndex; i < cnt; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GTreeNode testNode = GetChildAt(i)._treeNode;
 | 
						
						
						
							|  |  |                 if (testNode.level <= myLevel)
 | 
						
						
						
							|  |  |                     break;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 insertIndex++;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             return insertIndex;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         internal void _AfterRemoved(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             RemoveNode(node);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         internal void _AfterExpanded(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (node == _rootNode)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 CheckChildren(_rootNode, 0);
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (this.treeNodeWillExpand != null)
 | 
						
						
						
							|  |  |                 this.treeNodeWillExpand(node, true);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (node._cell == null)
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (this.treeNodeRender != null)
 | 
						
						
						
							|  |  |                 this.treeNodeRender(node, node._cell);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             Controller cc = node._cell.GetController("expanded");
 | 
						
						
						
							|  |  |             if (cc != null)
 | 
						
						
						
							|  |  |                 cc.selectedIndex = 1;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (node._cell.parent != null)
 | 
						
						
						
							|  |  |                 CheckChildren(node, GetChildIndex(node._cell));
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         internal void _AfterCollapsed(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (node == _rootNode)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 CheckChildren(_rootNode, 0);
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (this.treeNodeWillExpand != null)
 | 
						
						
						
							|  |  |                 this.treeNodeWillExpand(node, false);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (node._cell == null)
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (this.treeNodeRender != null)
 | 
						
						
						
							|  |  |                 this.treeNodeRender(node, node._cell);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             Controller cc = node._cell.GetController("expanded");
 | 
						
						
						
							|  |  |             if (cc != null)
 | 
						
						
						
							|  |  |                 cc.selectedIndex = 0;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (node._cell.parent != null)
 | 
						
						
						
							|  |  |                 HideFolderNode(node);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         internal void _AfterMoved(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             int startIndex = GetChildIndex(node._cell);
 | 
						
						
						
							|  |  |             int endIndex;
 | 
						
						
						
							|  |  |             if (node.isFolder)
 | 
						
						
						
							|  |  |                 endIndex = GetFolderEndIndex(startIndex, node.level);
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 endIndex = startIndex + 1;
 | 
						
						
						
							|  |  |             int insertIndex = GetInsertIndexForNode(node);
 | 
						
						
						
							|  |  |             int cnt = endIndex - startIndex;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (insertIndex < startIndex)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GObject obj = GetChildAt(startIndex + i);
 | 
						
						
						
							|  |  |                     SetChildIndex(obj, insertIndex + i);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GObject obj = GetChildAt(startIndex);
 | 
						
						
						
							|  |  |                     SetChildIndex(obj, insertIndex);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         private int GetFolderEndIndex(int startIndex, int level)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             int cnt = this.numChildren;
 | 
						
						
						
							|  |  |             for (int i = startIndex + 1; i < cnt; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GTreeNode node = GetChildAt(i)._treeNode;
 | 
						
						
						
							|  |  |                 if (node.level <= level)
 | 
						
						
						
							|  |  |                     return i;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             return cnt;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="folderNode"></param>
 | 
						
						
						
							|  |  |         /// <param name="index"></param>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         int CheckChildren(GTreeNode folderNode, int index)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             int cnt = folderNode.numChildren;
 | 
						
						
						
							|  |  |             for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 index++;
 | 
						
						
						
							|  |  |                 GTreeNode node = folderNode.GetChildAt(i);
 | 
						
						
						
							|  |  |                 if (node.cell == null)
 | 
						
						
						
							|  |  |                     CreateCell(node);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (node.cell.parent == null)
 | 
						
						
						
							|  |  |                     AddChildAt(node.cell, index);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (node.isFolder && node.expanded)
 | 
						
						
						
							|  |  |                     index = CheckChildren(node, index);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             return index;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="folderNode"></param>
 | 
						
						
						
							|  |  |         void HideFolderNode(GTreeNode folderNode)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             int cnt = folderNode.numChildren;
 | 
						
						
						
							|  |  |             for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GTreeNode node = folderNode.GetChildAt(i);
 | 
						
						
						
							|  |  |                 if (node.cell != null && node.cell.parent != null)
 | 
						
						
						
							|  |  |                     RemoveChild(node.cell);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (node.isFolder && node.expanded)
 | 
						
						
						
							|  |  |                     HideFolderNode(node);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="node"></param>
 | 
						
						
						
							|  |  |         void RemoveNode(GTreeNode node)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (node.cell != null)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (node.cell.parent != null)
 | 
						
						
						
							|  |  |                     RemoveChild(node.cell);
 | 
						
						
						
							|  |  |                 itemPool.ReturnObject(node.cell);
 | 
						
						
						
							|  |  |                 node._cell._treeNode = null;
 | 
						
						
						
							|  |  |                 node._cell = null;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (node.isFolder)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = node.numChildren;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GTreeNode node2 = node.GetChildAt(i);
 | 
						
						
						
							|  |  |                     RemoveNode(node2);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void __cellTouchBegin(EventContext context)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             GTreeNode node = ((GObject)context.sender)._treeNode;
 | 
						
						
						
							|  |  |             _expandedStatusInEvt = node.expanded;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void __expandedStateChanged(EventContext context)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             Controller cc = (Controller)context.sender;
 | 
						
						
						
							|  |  |             GTreeNode node = cc.parent._treeNode;
 | 
						
						
						
							|  |  |             node.expanded = cc.selectedIndex == 1;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         override protected void DispatchItemEvent(GObject item, EventContext context)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_clickToExpand != 0)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GTreeNode node = item._treeNode;
 | 
						
						
						
							|  |  |                 if (node != null && _expandedStatusInEvt == node.expanded)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_clickToExpand == 2)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (context.inputEvent.isDoubleClick)
 | 
						
						
						
							|  |  |                             node.expanded = !node.expanded;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                         node.expanded = !node.expanded;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             base.DispatchItemEvent(item, context);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         override public void Setup_BeforeAdd(ByteBuffer buffer, int beginPos)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             base.Setup_BeforeAdd(buffer, beginPos);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             buffer.Seek(beginPos, 9);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             _indent = buffer.ReadInt();
 | 
						
						
						
							|  |  |             _clickToExpand = buffer.ReadByte();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         override protected void ReadItems(ByteBuffer buffer)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             int nextPos;
 | 
						
						
						
							|  |  |             string str;
 | 
						
						
						
							|  |  |             bool isFolder;
 | 
						
						
						
							|  |  |             GTreeNode lastNode = null;
 | 
						
						
						
							|  |  |             int level;
 | 
						
						
						
							|  |  |             int prevLevel = 0;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int cnt = buffer.ReadShort();
 | 
						
						
						
							|  |  |             for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 nextPos = buffer.ReadUshort();
 | 
						
						
						
							|  |  |                 nextPos += buffer.position;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 str = buffer.ReadS();
 | 
						
						
						
							|  |  |                 if (str == null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     str = this.defaultItem;
 | 
						
						
						
							|  |  |                     if (str == null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         buffer.position = nextPos;
 | 
						
						
						
							|  |  |                         continue;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 isFolder = buffer.ReadBool();
 | 
						
						
						
							|  |  |                 level = buffer.ReadByte();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 GTreeNode node = new GTreeNode(isFolder, str);
 | 
						
						
						
							|  |  |                 node.expanded = true;
 | 
						
						
						
							|  |  |                 if (i == 0)
 | 
						
						
						
							|  |  |                     _rootNode.AddChild(node);
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (level > prevLevel)
 | 
						
						
						
							|  |  |                         lastNode.AddChild(node);
 | 
						
						
						
							|  |  |                     else if (level < prevLevel)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int j = level; j <= prevLevel; j++)
 | 
						
						
						
							|  |  |                             lastNode = lastNode.parent;
 | 
						
						
						
							|  |  |                         lastNode.AddChild(node);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                         lastNode.parent.AddChild(node);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 lastNode = node;
 | 
						
						
						
							|  |  |                 prevLevel = level;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 SetupItem(buffer, node.cell);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 buffer.position = nextPos;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | }
 |