diff -r 3145aadca3d2 -r 0c551e8818e0 External/Aga.Controls/Tree/Node.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/External/Aga.Controls/Tree/Node.cs Sun May 27 15:16:19 2012 +0000 @@ -0,0 +1,257 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Collections.ObjectModel; +using System.Windows.Forms; +using System.Drawing; + +namespace Aga.Controls.Tree +{ + public class Node + { + #region NodeCollection + + private class NodeCollection : Collection + { + private Node _owner; + + public NodeCollection(Node owner) + { + _owner = owner; + } + + protected override void ClearItems() + { + while (this.Count != 0) + this.RemoveAt(this.Count - 1); + } + + protected override void InsertItem(int index, Node item) + { + if (item == null) + throw new ArgumentNullException("item"); + + if (item.Parent != _owner) + { + if (item.Parent != null) + item.Parent.Nodes.Remove(item); + item._parent = _owner; + item._index = index; + for (int i = index; i < Count; i++) + this[i]._index++; + base.InsertItem(index, item); + + TreeModel model = _owner.FindModel(); + if (model != null) + model.OnNodeInserted(_owner, index, item); + } + } + + protected override void RemoveItem(int index) + { + Node item = this[index]; + item._parent = null; + item._index = -1; + for (int i = index + 1; i < Count; i++) + this[i]._index--; + base.RemoveItem(index); + + TreeModel model = _owner.FindModel(); + if (model != null) + model.OnNodeRemoved(_owner, index, item); + } + + protected override void SetItem(int index, Node item) + { + if (item == null) + throw new ArgumentNullException("item"); + + RemoveAt(index); + InsertItem(index, item); + } + } + + #endregion + + #region Properties + + private TreeModel _model; + internal TreeModel Model + { + get { return _model; } + set { _model = value; } + } + + private NodeCollection _nodes; + public Collection Nodes + { + get { return _nodes; } + } + + private Node _parent; + public Node Parent + { + get { return _parent; } + set + { + if (value != _parent) + { + if (_parent != null) + _parent.Nodes.Remove(this); + + if (value != null) + value.Nodes.Add(this); + } + } + } + + private int _index = -1; + public int Index + { + get + { + return _index; + } + } + + public Node PreviousNode + { + get + { + int index = Index; + if (index > 0) + return _parent.Nodes[index - 1]; + else + return null; + } + } + + public Node NextNode + { + get + { + int index = Index; + if (index >= 0 && index < _parent.Nodes.Count - 1) + return _parent.Nodes[index + 1]; + else + return null; + } + } + + private string _text; + public virtual string Text + { + get { return _text; } + set + { + if (_text != value) + { + _text = value; + NotifyModel(); + } + } + } + + private CheckState _checkState; + public virtual CheckState CheckState + { + get { return _checkState; } + set + { + if (_checkState != value) + { + _checkState = value; + NotifyModel(); + } + } + } + + private Image _image; + public Image Image + { + get { return _image; } + set + { + if (_image != value) + { + _image = value; + NotifyModel(); + } + } + } + + private object _tag; + public object Tag + { + get { return _tag; } + set { _tag = value; } + } + + public bool IsChecked + { + get + { + return CheckState != CheckState.Unchecked; + } + set + { + if (value) + CheckState = CheckState.Checked; + else + CheckState = CheckState.Unchecked; + } + } + + public virtual bool IsLeaf + { + get + { + return false; + } + } + + #endregion + + public Node() + : this(string.Empty) + { + } + + public Node(string text) + { + _text = text; + _nodes = new NodeCollection(this); + } + + public override string ToString() + { + return Text; + } + + private TreeModel FindModel() + { + Node node = this; + while (node != null) + { + if (node.Model != null) + return node.Model; + node = node.Parent; + } + return null; + } + + protected void NotifyModel() + { + TreeModel model = FindModel(); + if (model != null && Parent != null) + { + TreePath path = model.GetPath(Parent); + if (path != null) + { + TreeModelEventArgs args = new TreeModelEventArgs(path, new int[] { Index }, new object[] { this }); + model.OnNodesChanged(args); + } + } + } + } +}