using System;
using System.Collections.Generic;
namespace FairyGUI
{
///
///
///
[Obsolete("Use GTree and GTreeNode instead")]
public class TreeView : EventDispatcher
{
///
/// TreeView使用的List对象
///
public GList list { get; private set; }
///
/// TreeView的顶层节点,这是个虚拟节点,也就是他不会显示出来。
///
public TreeNode root { get; private set; }
///
/// TreeView每级的缩进,单位像素。
///
public int indent;
public delegate GComponent TreeNodeCreateCellDelegate(TreeNode node);
public delegate void TreeNodeRenderDelegate(TreeNode node);
public delegate void TreeNodeWillExpandDelegate(TreeNode node, bool expand);
///
/// 当TreeNode需要创建对象的显示对象时回调
///
public TreeNodeCreateCellDelegate treeNodeCreateCell;
///
/// 当TreeNode需要更新时回调
///
public TreeNodeRenderDelegate treeNodeRender;
///
/// 当TreeNode即将展开或者收缩时回调。可以在回调中动态增加子节点。
///
public TreeNodeWillExpandDelegate treeNodeWillExpand;
///
/// 点击任意TreeNode时触发
///
public EventListener onClickNode { get; private set; }
///
/// 右键点击任意TreeNode时触发
///
public EventListener onRightClickNode { get; private set; }
///
///
///
///
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");
}
///
///
///
///
public TreeNode GetSelectedNode()
{
if (list.selectedIndex != -1)
return (TreeNode)list.GetChildAt(list.selectedIndex).data;
else
return null;
}
///
///
///
///
public List GetSelection()
{
List sels = list.GetSelection();
int cnt = sels.Count;
List ret = new List();
for (int i = 0; i < cnt; i++)
{
TreeNode node = (TreeNode)list.GetChildAt(sels[i]).data;
ret.Add(node);
}
return ret;
}
///
///
///
///
///
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);
}
///
///
///
///
public void RemoveSelection(TreeNode node)
{
list.RemoveSelection(list.GetChildIndex(node.cell));
}
///
///
///
public void ClearSelection()
{
list.ClearSelection();
}
///
///
///
///
///
public int GetNodeIndex(TreeNode node)
{
return list.GetChildIndex(node.cell);
}
///
///
///
///
public void UpdateNode(TreeNode node)
{
if (node.cell == null)
return;
if (treeNodeRender != null)
treeNodeRender(node);
}
///
///
///
///
public void UpdateNodes(List 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);
}
}
///
///
///
///
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);
}
}
///
///
///
///
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);
}
}
///
///
///
///
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);
}
///
///
///
///
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);
}
///
///
///
///
///
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;
}
///
///
///
///
internal void AfterRemoved(TreeNode node)
{
RemoveNode(node);
}
///
///
///
///
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));
}
///
///
///
///
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);
}
///
///
///
///
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);
}
///
///
///
///
///
///
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;
}
///
///
///
///
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);
}
}
///
///
///
///
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);
}
}
}
}