#region Imports using DPumpHydr.WinFrmUI.RLT.Util; using System; using System.Drawing; #endregion namespace DPumpHydr.WinFrmUI.RLT.Controls { #region CrownTreeNode public class CrownTreeNode { #region Event Region public event EventHandler> ItemsAdded; public event EventHandler> ItemsRemoved; public event EventHandler TextChanged; public event EventHandler NodeExpanded; public event EventHandler NodeCollapsed; #endregion #region Field Region private string _text; private CrownTreeView _parentTree; private ObservableList _nodes; private bool _expanded; #endregion #region Property Region public string Text { get => _text; set { if (_text == value) { return; } _text = value; OnTextChanged(); } } public Rectangle ExpandArea { get; set; } public Rectangle IconArea { get; set; } public Rectangle TextArea { get; set; } public Rectangle FullArea { get; set; } public bool ExpandAreaHot { get; set; } public Image Icon { get; set; } public Image ExpandedIcon { get; set; } public bool Expanded { get => _expanded; set { if (_expanded == value) { return; } if (value == true && Nodes.Count == 0) { return; } _expanded = value; if (_expanded) { NodeExpanded?.Invoke(this, null); } else { NodeCollapsed?.Invoke(this, null); } } } public ObservableList Nodes { get => _nodes; set { if (_nodes != null) { _nodes.ItemsAdded -= Nodes_ItemsAdded; _nodes.ItemsRemoved -= Nodes_ItemsRemoved; } _nodes = value; _nodes.ItemsAdded += Nodes_ItemsAdded; _nodes.ItemsRemoved += Nodes_ItemsRemoved; } } public bool IsRoot { get; set; } public CrownTreeView ParentTree { get => _parentTree; set { if (_parentTree == value) { return; } _parentTree = value; foreach (CrownTreeNode node in Nodes) { node.ParentTree = _parentTree; } } } public CrownTreeNode ParentNode { get; set; } public bool Odd { get; set; } public object NodeType { get; set; } public object Tag { get; set; } public string FullPath { get { CrownTreeNode parent = ParentNode; string path = Text; while (parent != null) { path = string.Format("{0}{1}{2}", parent.Text, "\\", path); parent = parent.ParentNode; } return path; } } public CrownTreeNode PrevVisibleNode { get; set; } public CrownTreeNode NextVisibleNode { get; set; } public int VisibleIndex { get; set; } public bool IsNodeAncestor(CrownTreeNode node) { CrownTreeNode parent = ParentNode; while (parent != null) { if (parent == node) { return true; } parent = parent.ParentNode; } return false; } #endregion #region Constructor Region public CrownTreeNode() { Nodes = new ObservableList(); } public CrownTreeNode(string text) : this() { Text = text; } #endregion #region Method Region public void Remove() { if (ParentNode != null) { ParentNode.Nodes.Remove(this); } else { ParentTree.Nodes.Remove(this); } } public void EnsureVisible() { CrownTreeNode parent = ParentNode; while (parent != null) { parent.Expanded = true; parent = parent.ParentNode; } } #endregion #region Event Handler Region private void OnTextChanged() { if (ParentTree != null && ParentTree.TreeViewNodeSorter != null) { if (ParentNode != null) { ParentNode.Nodes.Sort(ParentTree.TreeViewNodeSorter); } else { ParentTree.Nodes.Sort(ParentTree.TreeViewNodeSorter); } } TextChanged?.Invoke(this, null); } private void Nodes_ItemsAdded(object sender, ObservableListModified e) { foreach (CrownTreeNode node in e.Items) { node.ParentNode = this; node.ParentTree = ParentTree; } if (ParentTree != null && ParentTree.TreeViewNodeSorter != null) { Nodes.Sort(ParentTree.TreeViewNodeSorter); } ItemsAdded?.Invoke(this, e); } private void Nodes_ItemsRemoved(object sender, ObservableListModified e) { if (Nodes.Count == 0) { Expanded = false; } ItemsRemoved?.Invoke(this, e); } #endregion } #endregion }