From 48fe7804ea9238c6bdbbb870bda7c44958dd1d22 Mon Sep 17 00:00:00 2001
From: Siegfried Pammer <siegfriedpammer@gmail.com>
Date: Sun, 22 Jul 2012 23:37:44 +0200
Subject: [PATCH] fix bug MouseHoverLogic to make it easier to show
 Diff-Tooltip in editor: start MouseHover already on MouseEnter

---
 .../Rendering/MouseHoverLogic.cs              | 31 +++++++++++++------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/MouseHoverLogic.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/MouseHoverLogic.cs
index 1f6f79d745..25d025b249 100644
--- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/MouseHoverLogic.cs
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/MouseHoverLogic.cs
@@ -30,25 +30,35 @@ namespace ICSharpCode.AvalonEdit.Rendering
 			this.target = target;
 			this.target.MouseLeave += MouseHoverLogicMouseLeave;
 			this.target.MouseMove += MouseHoverLogicMouseMove;
+			this.target.MouseEnter += MouseHoverLogicMouseEnter;
 		}
-	
+		
 		void MouseHoverLogicMouseMove(object sender, MouseEventArgs e)
 		{
-			Point newPosition = e.GetPosition(this.target);
-			Vector mouseMovement = mouseHoverStartPoint - newPosition;
+			Vector mouseMovement = mouseHoverStartPoint - e.GetPosition(this.target);
 			if (Math.Abs(mouseMovement.X) > SystemParameters.MouseHoverWidth
 			    || Math.Abs(mouseMovement.Y) > SystemParameters.MouseHoverHeight)
 			{
-				StopHovering();
-				mouseHoverStartPoint = newPosition;
-				mouseHoverLastEventArgs = e;
-				mouseHoverTimer = new DispatcherTimer(SystemParameters.MouseHoverTime, DispatcherPriority.Background,
-				                                      OnMouseHoverTimerElapsed, this.target.Dispatcher);
-				mouseHoverTimer.Start();
+				StartHovering(e);
 			}
 			// do not set e.Handled - allow others to also handle MouseMove
 		}
-	
+		
+		void MouseHoverLogicMouseEnter(object sender, MouseEventArgs e)
+		{
+			StartHovering(e);
+			// do not set e.Handled - allow others to also handle MouseEnter
+		}
+		
+		void StartHovering(MouseEventArgs e)
+		{
+			StopHovering();
+			mouseHoverStartPoint = e.GetPosition(this.target);
+			mouseHoverLastEventArgs = e;
+			mouseHoverTimer = new DispatcherTimer(SystemParameters.MouseHoverTime, DispatcherPriority.Background, OnMouseHoverTimerElapsed, this.target.Dispatcher);
+			mouseHoverTimer.Start();
+		}
+		
 		void MouseHoverLogicMouseLeave(object sender, MouseEventArgs e)
 		{
 			StopHovering();
@@ -116,6 +126,7 @@ namespace ICSharpCode.AvalonEdit.Rendering
 			if (!disposed) {
 				this.target.MouseLeave -= MouseHoverLogicMouseLeave;
 				this.target.MouseMove -= MouseHoverLogicMouseMove;
+				this.target.MouseEnter -= MouseHoverLogicMouseEnter;
 			}
 			disposed = true;
 		}