using System;
using System.Collections.Generic;
namespace FairyGUI
{
///
///
///
public class GTreeNode
{
///
///
///
public object data;
///
///
///
public GTreeNode parent { get; private set; }
///
///
///
public GTree tree { get; private set; }
List _children;
bool _expanded;
int _level;
internal GComponent _cell;
internal string _resURL;
///
///
///
///
public GTreeNode(bool hasChild) : this(hasChild, null)
{
}
///
///
///
///
///
public GTreeNode(bool hasChild, string resURL)
{
if (hasChild)
_children = new List();
_resURL = resURL;
}
///
///
///
public GComponent cell
{
get { return _cell; }
}
///
///
///
public int level
{
get { return _level; }
}
///
///
///
public bool expanded
{
get
{
return _expanded;
}
set
{
if (_children == null)
return;
if (_expanded != value)
{
_expanded = value;
if (tree != null)
{
if (_expanded)
tree._AfterExpanded(this);
else
tree._AfterCollapsed(this);
}
}
}
}
///
///
///
public void ExpandToRoot()
{
GTreeNode p = this;
while (p != null)
{
p.expanded = true;
p = p.parent;
}
}
///
///
///
public bool isFolder
{
get { return _children != null; }
}
///
///
///
public string text
{
get
{
if (_cell != null)
return _cell.text;
else
return null;
}
set
{
if (_cell != null)
_cell.text = value;
}
}
///
///
///
public string icon
{
get
{
if (_cell != null)
return _cell.icon;
else
return null;
}
set
{
if (_cell != null)
_cell.icon = value;
}
}
///
///
///
///
///
public GTreeNode AddChild(GTreeNode child)
{
AddChildAt(child, _children.Count);
return child;
}
///
///
///
///
///
///
public GTreeNode AddChildAt(GTreeNode child, int index)
{
if (child == null)
throw new Exception("child is null");
int numChildren = _children.Count;
if (index >= 0 && index <= numChildren)
{
if (child.parent == this)
{
SetChildIndex(child, index);
}
else
{
if (child.parent != null)
child.parent.RemoveChild(child);
int cnt = _children.Count;
if (index == cnt)
_children.Add(child);
else
_children.Insert(index, child);
child.parent = this;
child._level = _level + 1;
child._SetTree(this.tree);
if (tree != null && this == tree.rootNode || _cell != null && _cell.parent != null && _expanded)
tree._AfterInserted(child);
}
return child;
}
else
{
throw new Exception("Invalid child index");
}
}
///
///
///
///
///
public GTreeNode RemoveChild(GTreeNode child)
{
int childIndex = _children.IndexOf(child);
if (childIndex != -1)
{
RemoveChildAt(childIndex);
}
return child;
}
///
///
///
///
///
public GTreeNode RemoveChildAt(int index)
{
if (index >= 0 && index < numChildren)
{
GTreeNode child = _children[index];
_children.RemoveAt(index);
child.parent = null;
if (tree != null)
{
child._SetTree(null);
tree._AfterRemoved(child);
}
return child;
}
else
{
throw new Exception("Invalid child index");
}
}
///
///
///
///
///
public void RemoveChildren(int beginIndex = 0, int endIndex = -1)
{
if (endIndex < 0 || endIndex >= numChildren)
endIndex = numChildren - 1;
for (int i = beginIndex; i <= endIndex; ++i)
RemoveChildAt(beginIndex);
}
///
///
///
///
///
public GTreeNode GetChildAt(int index)
{
if (index >= 0 && index < numChildren)
return _children[index];
else
throw new Exception("Invalid child index");
}
///
///
///
///
///
public int GetChildIndex(GTreeNode child)
{
return _children.IndexOf(child);
}
///
///
///
///
public GTreeNode GetPrevSibling()
{
if (parent == null)
return null;
int i = parent._children.IndexOf(this);
if (i <= 0)
return null;
return parent._children[i - 1];
}
///
///
///
///
public GTreeNode GetNextSibling()
{
if (parent == null)
return null;
int i = parent._children.IndexOf(this);
if (i < 0 || i >= parent._children.Count - 1)
return null;
return parent._children[i + 1];
}
///
///
///
///
///
public void SetChildIndex(GTreeNode child, int index)
{
int oldIndex = _children.IndexOf(child);
if (oldIndex == -1)
throw new Exception("Not a child of this container");
int cnt = _children.Count;
if (index < 0)
index = 0;
else if (index > cnt)
index = cnt;
if (oldIndex == index)
return;
_children.RemoveAt(oldIndex);
_children.Insert(index, child);
if (tree != null && this == tree.rootNode || _cell != null && _cell.parent != null && _expanded)
tree._AfterMoved(child);
}
///
///
///
///
///
public void SwapChildren(GTreeNode child1, GTreeNode child2)
{
int index1 = _children.IndexOf(child1);
int index2 = _children.IndexOf(child2);
if (index1 == -1 || index2 == -1)
throw new Exception("Not a child of this container");
SwapChildrenAt(index1, index2);
}
///
///
///
///
///
public void SwapChildrenAt(int index1, int index2)
{
GTreeNode child1 = _children[index1];
GTreeNode child2 = _children[index2];
SetChildIndex(child1, index2);
SetChildIndex(child2, index1);
}
///
///
///
public int numChildren
{
get { return (null == _children) ? 0 : _children.Count; }
}
internal void _SetTree(GTree value)
{
tree = value;
if (tree != null && tree.treeNodeWillExpand != null && _expanded)
tree.treeNodeWillExpand(this, true);
if (_children != null)
{
int cnt = _children.Count;
for (int i = 0; i < cnt; i++)
{
GTreeNode node = _children[i];
node._level = _level + 1;
node._SetTree(value);
}
}
}
}
}