@@ -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