using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Drawing; using System.ComponentModel; namespace Aga.Controls.Tree.NodeControls { [DesignTimeVisible(false), ToolboxItem(false)] public abstract class NodeControl : Component { #region Properties private TreeViewAdv _parent; [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public TreeViewAdv Parent { get { return _parent; } set { if (value != _parent) { if (_parent != null) _parent.NodeControls.Remove(this); if (value != null) value.NodeControls.Add(this); } } } private IToolTipProvider _toolTipProvider; [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public IToolTipProvider ToolTipProvider { get { return _toolTipProvider; } set { _toolTipProvider = value; } } private TreeColumn _parentColumn; public TreeColumn ParentColumn { get { return _parentColumn; } set { _parentColumn = value; if (_parent != null) _parent.FullUpdate(); } } private VerticalAlignment _verticalAlign = VerticalAlignment.Center; [DefaultValue(VerticalAlignment.Center)] public VerticalAlignment VerticalAlign { get { return _verticalAlign; } set { _verticalAlign = value; if (_parent != null) _parent.FullUpdate(); } } private int _leftMargin = 0; public int LeftMargin { get { return _leftMargin; } set { if (value < 0) throw new ArgumentOutOfRangeException(); _leftMargin = value; if (_parent != null) _parent.FullUpdate(); } } #endregion internal virtual void AssignParent(TreeViewAdv parent) { _parent = parent; } protected virtual Rectangle GetBounds(TreeNodeAdv node, DrawContext context) { Rectangle r = context.Bounds; Size s = GetActualSize(node, context); Size bs = new Size(r.Width - LeftMargin, Math.Min(r.Height, s.Height)); switch (VerticalAlign) { case VerticalAlignment.Top: return new Rectangle(new Point(r.X + LeftMargin, r.Y), bs); case VerticalAlignment.Bottom: return new Rectangle(new Point(r.X + LeftMargin, r.Bottom - s.Height), bs); default: return new Rectangle(new Point(r.X + LeftMargin, r.Y + (r.Height - s.Height) / 2), bs); } } protected void CheckThread() { if (Parent != null && Control.CheckForIllegalCrossThreadCalls) if (Parent.InvokeRequired) throw new InvalidOperationException("Cross-thread calls are not allowed"); } public bool IsVisible(TreeNodeAdv node) { NodeControlValueEventArgs args = new NodeControlValueEventArgs(node); args.Value = true; OnIsVisibleValueNeeded(args); return Convert.ToBoolean(args.Value); } internal Size GetActualSize(TreeNodeAdv node, DrawContext context) { if (IsVisible(node)) { Size s = MeasureSize(node, context); return new Size(s.Width + LeftMargin, s.Height); } else return Size.Empty; } public abstract Size MeasureSize(TreeNodeAdv node, DrawContext context); public abstract void Draw(TreeNodeAdv node, DrawContext context); public virtual string GetToolTip(TreeNodeAdv node) { if (ToolTipProvider != null) return ToolTipProvider.GetToolTip(node, this); else return string.Empty; } public virtual void MouseDown(TreeNodeAdvMouseEventArgs args) { } public virtual void MouseUp(TreeNodeAdvMouseEventArgs args) { } public virtual void MouseDoubleClick(TreeNodeAdvMouseEventArgs args) { } public virtual void KeyDown(KeyEventArgs args) { } public virtual void KeyUp(KeyEventArgs args) { } public event EventHandler IsVisibleValueNeeded; protected virtual void OnIsVisibleValueNeeded(NodeControlValueEventArgs args) { if (IsVisibleValueNeeded != null) IsVisibleValueNeeded(this, args); } } }