Skip to content

Commit f6939bd

Browse files
committed
added treeNode.ToolTipText;
added treeView.NodeMouseHover
1 parent b27946c commit f6939bd

File tree

3 files changed

+73
-20
lines changed

3 files changed

+73
-20
lines changed

System/Windows/Forms/TreeNode.cs

+1
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ public TreeNode PrevNode
111111
}
112112
public object Tag { get; set; }
113113
public string Text { get; set; }
114+
public string ToolTipText { get; set; }
114115
public TreeView TreeView
115116
{
116117
get
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace System.Windows.Forms
2+
{
3+
public delegate void TreeNodeMouseHoverEventHandler(object sender, TreeNodeMouseHoverEventArgs e);
4+
5+
public class TreeNodeMouseHoverEventArgs : EventArgs
6+
{
7+
public TreeNodeMouseHoverEventArgs(TreeNode node)
8+
{
9+
Node = node;
10+
}
11+
12+
public TreeNode Node { get; private set; }
13+
}
14+
}

System/Windows/Forms/TreeView.cs

+58-20
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class TreeView : Control
99
internal readonly ScrollBar vScrollBar;
1010
internal int arrowSize = 16;
1111
internal TreeNode root;
12-
12+
1313
private readonly DrawTreeNodeEventArgs nodeArgs = new DrawTreeNodeEventArgs(null, null, Rectangle.Empty, TreeNodeStates.Default);
1414
private readonly List<TreeNode> nodeList = new List<TreeNode>();
1515
private readonly DrawTreeNodeEventHandler onDrawNode;
@@ -20,6 +20,8 @@ public class TreeView : Control
2020
private Point dragPosition;
2121
private string filter;
2222
private TreeNode hoveredNode;
23+
private ToolTip nodeToolTip;
24+
private TreeNode nodeToolTipLast;
2325
private float resetFilterTime;
2426

2527
public TreeView()
@@ -36,7 +38,7 @@ public TreeView()
3638
ImageList = new ImageList();
3739
ItemHeight = 22;
3840
Padding = new Padding(4);
39-
41+
4042
ScrollBarColor = Color.FromArgb(222, 222, 230);
4143
ScrollBarHoverColor = Color.FromArgb(136, 136, 136);
4244
ScrollSpeed = 2;
@@ -58,13 +60,15 @@ public TreeView()
5860
public event ItemDragEventHandler ItemDrag;
5961
public event TreeNodeMouseClickEventHandler NodeMouseClick;
6062
public event TreeNodeMouseClickEventHandler NodeMouseDoubleClick;
63+
public event TreeNodeMouseHoverEventHandler NodeMouseHover;
6164

6265
public BorderStyle BorderStyle { get; set; }
6366
public ImageList ImageList { get; set; }
6467
public int ItemHeight { get; set; }
6568
public TreeNodeCollection Nodes { get; private set; }
6669
public TreeNode SelectedNode { get; set; }
67-
70+
public bool ShowNodeToolTips { get; set; }
71+
6872
internal Color ScrollBarColor { get; set; }
6973
internal Color ScrollBarHoverColor { get; set; }
7074
internal float ScrollIndex { get { return vScrollBar.Value; } set { vScrollBar.Value = (int)value; } }
@@ -87,6 +91,25 @@ public void CollapseAll()
8791
Nodes[i].CollapseInternal();
8892
Refresh();
8993
}
94+
public TreeNode GetNodeAt(int x, int y)
95+
{
96+
var scrollNodeListCount = scrollNodeList.Count;
97+
for (int i = 0; i < scrollNodeListCount; i++)
98+
{
99+
var node = scrollNodeList[i];
100+
var nodeY = node.Bounds.Y - ScrollIndex;
101+
var nodeH = node.Bounds.Height;
102+
103+
if (y >= nodeY && y < nodeY + nodeH)
104+
return node;
105+
}
106+
107+
return null;
108+
}
109+
public TreeNode GetNodeAt(Point pt)
110+
{
111+
return GetNodeAt(pt.X, pt.Y);
112+
}
90113
public void ExpandAll()
91114
{
92115
var nodesCount = Nodes.Count;
@@ -213,7 +236,31 @@ protected override void OnMouseHover(EventArgs e)
213236
{
214237
var mclient = PointToClient(MousePosition);
215238

216-
hoveredNode = _GetNodeAtPosition(root, mclient);
239+
hoveredNode = GetNodeAt(mclient);
240+
if (hoveredNode != null)
241+
{
242+
if (ShowNodeToolTips)
243+
{
244+
if (string.IsNullOrEmpty(hoveredNode.ToolTipText) == false)
245+
{
246+
if (nodeToolTip == null)
247+
{
248+
nodeToolTip = new ToolTip();
249+
nodeToolTip.InitialDelay = 0;
250+
}
251+
252+
if (hoveredNode != nodeToolTipLast)
253+
nodeToolTip.Show(hoveredNode.ToolTipText, mclient);
254+
255+
nodeToolTipLast = hoveredNode;
256+
}
257+
else
258+
nodeToolTipLast = null;
259+
}
260+
261+
// Tooltip will show previous ToolTipText. Override OnMouseHover if neccesary.
262+
OnNodeMouseHover(new TreeNodeMouseHoverEventArgs(hoveredNode));
263+
}
217264
}
218265
protected override void OnMouseMove(MouseEventArgs e)
219266
{
@@ -246,6 +293,12 @@ protected virtual void OnNodeMouseDoubleClick(TreeNodeMouseClickEventArgs e)
246293
if (nodeMouseDoubleClick != null)
247294
nodeMouseDoubleClick(this, e);
248295
}
296+
protected virtual void OnNodeMouseHover(TreeNodeMouseHoverEventArgs e)
297+
{
298+
var handler = NodeMouseHover;
299+
if (handler != null)
300+
handler(this, e);
301+
}
249302
protected override void OnPaint(PaintEventArgs e)
250303
{
251304
// Reset filter.
@@ -332,21 +385,6 @@ private void _Application_UpClick(object sender, MouseEventArgs e)
332385
dragNode = null;
333386
dragPosition = Point.Empty;
334387
}
335-
private TreeNode _GetNodeAtPosition(TreeNode rootNode, Point position)
336-
{
337-
var scrollNodeListCount = scrollNodeList.Count;
338-
for (int i = 0; i < scrollNodeListCount; i++)
339-
{
340-
var node = scrollNodeList[i];
341-
var nodeY = node.Bounds.Y - ScrollIndex;
342-
var nodeH = node.Bounds.Height;
343-
344-
if (position.Y >= nodeY && position.Y < nodeY + nodeH)
345-
return node;
346-
}
347-
348-
return null;
349-
}
350388
private Rectangle _GetNodeBounds(TreeNode node)
351389
{
352390
nodeList.Add(node);
@@ -439,7 +477,7 @@ private void _OnDrawNode(object sender, DrawTreeNodeEventArgs e)
439477
}
440478
private TreeNode _SelectAtPosition(MouseEventArgs e)
441479
{
442-
var node = _GetNodeAtPosition(root, e.Location);
480+
var node = GetNodeAt(e.Location);
443481
if (node == null || node.Enabled == false) return null;
444482

445483
SelectedNode = node;

0 commit comments

Comments
 (0)