@@ -9,7 +9,7 @@ public class TreeView : Control
9
9
internal readonly ScrollBar vScrollBar ;
10
10
internal int arrowSize = 16 ;
11
11
internal TreeNode root ;
12
-
12
+
13
13
private readonly DrawTreeNodeEventArgs nodeArgs = new DrawTreeNodeEventArgs ( null , null , Rectangle . Empty , TreeNodeStates . Default ) ;
14
14
private readonly List < TreeNode > nodeList = new List < TreeNode > ( ) ;
15
15
private readonly DrawTreeNodeEventHandler onDrawNode ;
@@ -20,6 +20,8 @@ public class TreeView : Control
20
20
private Point dragPosition ;
21
21
private string filter ;
22
22
private TreeNode hoveredNode ;
23
+ private ToolTip nodeToolTip ;
24
+ private TreeNode nodeToolTipLast ;
23
25
private float resetFilterTime ;
24
26
25
27
public TreeView ( )
@@ -36,7 +38,7 @@ public TreeView()
36
38
ImageList = new ImageList ( ) ;
37
39
ItemHeight = 22 ;
38
40
Padding = new Padding ( 4 ) ;
39
-
41
+
40
42
ScrollBarColor = Color . FromArgb ( 222 , 222 , 230 ) ;
41
43
ScrollBarHoverColor = Color . FromArgb ( 136 , 136 , 136 ) ;
42
44
ScrollSpeed = 2 ;
@@ -58,13 +60,15 @@ public TreeView()
58
60
public event ItemDragEventHandler ItemDrag ;
59
61
public event TreeNodeMouseClickEventHandler NodeMouseClick ;
60
62
public event TreeNodeMouseClickEventHandler NodeMouseDoubleClick ;
63
+ public event TreeNodeMouseHoverEventHandler NodeMouseHover ;
61
64
62
65
public BorderStyle BorderStyle { get ; set ; }
63
66
public ImageList ImageList { get ; set ; }
64
67
public int ItemHeight { get ; set ; }
65
68
public TreeNodeCollection Nodes { get ; private set ; }
66
69
public TreeNode SelectedNode { get ; set ; }
67
-
70
+ public bool ShowNodeToolTips { get ; set ; }
71
+
68
72
internal Color ScrollBarColor { get ; set ; }
69
73
internal Color ScrollBarHoverColor { get ; set ; }
70
74
internal float ScrollIndex { get { return vScrollBar . Value ; } set { vScrollBar . Value = ( int ) value ; } }
@@ -87,6 +91,25 @@ public void CollapseAll()
87
91
Nodes [ i ] . CollapseInternal ( ) ;
88
92
Refresh ( ) ;
89
93
}
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
+ }
90
113
public void ExpandAll ( )
91
114
{
92
115
var nodesCount = Nodes . Count ;
@@ -213,7 +236,31 @@ protected override void OnMouseHover(EventArgs e)
213
236
{
214
237
var mclient = PointToClient ( MousePosition ) ;
215
238
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
+ }
217
264
}
218
265
protected override void OnMouseMove ( MouseEventArgs e )
219
266
{
@@ -246,6 +293,12 @@ protected virtual void OnNodeMouseDoubleClick(TreeNodeMouseClickEventArgs e)
246
293
if ( nodeMouseDoubleClick != null )
247
294
nodeMouseDoubleClick ( this , e ) ;
248
295
}
296
+ protected virtual void OnNodeMouseHover ( TreeNodeMouseHoverEventArgs e )
297
+ {
298
+ var handler = NodeMouseHover ;
299
+ if ( handler != null )
300
+ handler ( this , e ) ;
301
+ }
249
302
protected override void OnPaint ( PaintEventArgs e )
250
303
{
251
304
// Reset filter.
@@ -332,21 +385,6 @@ private void _Application_UpClick(object sender, MouseEventArgs e)
332
385
dragNode = null ;
333
386
dragPosition = Point . Empty ;
334
387
}
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
- }
350
388
private Rectangle _GetNodeBounds ( TreeNode node )
351
389
{
352
390
nodeList . Add ( node ) ;
@@ -439,7 +477,7 @@ private void _OnDrawNode(object sender, DrawTreeNodeEventArgs e)
439
477
}
440
478
private TreeNode _SelectAtPosition ( MouseEventArgs e )
441
479
{
442
- var node = _GetNodeAtPosition ( root , e . Location ) ;
480
+ var node = GetNodeAt ( e . Location ) ;
443
481
if ( node == null || node . Enabled == false ) return null ;
444
482
445
483
SelectedNode = node ;
0 commit comments