using System; using System.Collections.Generic; using System.Text; using System.Drawing; using Aga.Controls.Properties; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; namespace Aga.Controls.Tree.NodeControls { internal class NodePlusMinus : NodeControl { public const int ImageSize = 9; public const int Width = 16; private Bitmap _plus; private Bitmap _minus; private VisualStyleRenderer _openedRenderer; private VisualStyleRenderer OpenedRenderer { get { if (_openedRenderer == null) _openedRenderer = new VisualStyleRenderer(VisualStyleElement.TreeView.Glyph.Opened); return _openedRenderer; } } private VisualStyleRenderer _closedRenderer; private VisualStyleRenderer ClosedRenderer { get { if (_closedRenderer == null) _closedRenderer = new VisualStyleRenderer(VisualStyleElement.TreeView.Glyph.Closed); return _closedRenderer; } } public NodePlusMinus() { _plus = Resources.plus; _minus = Resources.minus; } public override Size MeasureSize(TreeNodeAdv node, DrawContext context) { int scaledX = node.Tree.GetScaledSize(Width, false); int scaledY = node.Tree.GetScaledSize(Width); return new Size(scaledX, scaledY); } public override void Draw(TreeNodeAdv node, DrawContext context) { if (node.CanExpand) { Rectangle r = context.Bounds; int scaledX = node.Tree.GetScaledSize(ImageSize, false); int scaledY = node.Tree.GetScaledSize(ImageSize); int dy = (int)Math.Round((float)(r.Height - scaledY) / 2); if (TreeViewAdv.CustomPlusMinusRenderFunc != null) { TreeViewAdv.CustomPlusMinusRenderFunc(context.Graphics, r, node.IsExpanded); return; } else if (Application.RenderWithVisualStyles) { VisualStyleRenderer renderer; if (node.IsExpanded) renderer = OpenedRenderer; else renderer = ClosedRenderer; renderer.DrawBackground(context.Graphics, new Rectangle(r.X, r.Y + dy, scaledX, scaledY)); } else { Image img; if (node.IsExpanded) img = _minus; else img = _plus; context.Graphics.DrawImageUnscaled(img, new Point(r.X, r.Y + dy)); } } } public override void MouseDown(TreeNodeAdvMouseEventArgs args) { if (args.Button == MouseButtons.Left) { args.Handled = true; if (args.Node.CanExpand) args.Node.IsExpanded = !args.Node.IsExpanded; } } public override void MouseDoubleClick(TreeNodeAdvMouseEventArgs args) { args.Handled = true; // Supress expand/collapse when double click on plus/minus } } }