2006-03-21 Peter Dennis Bartok <pbartok@novell.com>
authorPeter Dennis Bartok <pbartok@mono-cvs.ximian.com>
Tue, 21 Mar 2006 22:38:21 +0000 (22:38 -0000)
committerPeter Dennis Bartok <pbartok@mono-cvs.ximian.com>
Tue, 21 Mar 2006 22:38:21 +0000 (22:38 -0000)
* XplatUI.cs, XplatUIDriver.cs, XplatUIX11.cs, XplatUIWin32.cs,
  XplatUIOSX.cs:
  - Added ResetMouseHover method to allow controls to retrigger
    hovering if they need it more than once
  - Implemented MouseHoverTime and MouseHoverSize properties
* Timer.cs: Start() must reset the interval
* SystemInformation.cs: Added 2.0 MouseHoverTime and MouseHoverSize
  properties

svn path=/trunk/mcs/; revision=58265

mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
mcs/class/Managed.Windows.Forms/System.Windows.Forms/SystemInformation.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/Timer.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUI.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIDriver.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIOSX.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIWin32.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs

index f125509207e9951cfeb97db123244dbdc97df015..3d2207a95d21747c1823adf2eae3ee0a14e7e566 100644 (file)
@@ -1,3 +1,14 @@
+2006-03-21  Peter Dennis Bartok  <pbartok@novell.com> 
+
+       * XplatUI.cs, XplatUIDriver.cs, XplatUIX11.cs, XplatUIWin32.cs, 
+         XplatUIOSX.cs: 
+         - Added ResetMouseHover method to allow controls to retrigger
+           hovering if they need it more than once
+         - Implemented MouseHoverTime and MouseHoverSize properties
+       * Timer.cs: Start() must reset the interval
+       * SystemInformation.cs: Added 2.0 MouseHoverTime and MouseHoverSize
+         properties
+
 2006-03-21  Jackson Harper  <jackson@ximian.com>
 
        * X11Keyboard.cs: improved layout detection. Move the nonchar
index a5bef543a3877928bedcc0b00538bafdae36fd15..d289d614bac899b4a228d29320dd9ae4f6994ba5 100644 (file)
@@ -265,6 +265,20 @@ namespace System.Windows.Forms {
                        }
                }
 
+#if NET_2_0
+               public static Size MouseHoverSize {
+                       get {
+                               return XplatUI.MouseHoverSize;
+                       }
+               }
+
+               public static int MouseHoverTime {
+                       get {
+                               return XplatUI.MouseHoverTime;
+                       }
+               }
+#endif
+
                public static bool MousePresent {
                        get {
                                return true;
index d0326df3e8394743308ae64cfafb54ad8303a486..8395e86df7290ac4e074d9ab2ecbea8d85070e35 100644 (file)
@@ -59,6 +59,8 @@ namespace System.Windows.Forms {
                                if (value != enabled) {
                                        enabled = value;
                                        if (value) {
+                                               // Use AddTicks so we get some rounding
+                                               expires = DateTime.Now.AddMilliseconds (interval > Minimum ? interval : Minimum);
                                                XplatUI.SetTimer (this);
                                        } else {
                                                XplatUI.KillTimer (this);
index 3b80380971a90d2738c43133369bf48c0bce9de3..2aa6e623a076100f038dabed82ff75d144c0d2ec 100644 (file)
@@ -77,9 +77,8 @@ namespace System.Windows.Forms {
 
                #region Constructor & Destructor
                static XplatUI() {
-                       Console.WriteLine("Mono System.Windows.Forms Assembly [Revision: 57713; built: 2006/03/09 03:26:24]");
+                       Console.WriteLine("Mono System.Windows.Forms Assembly [$auto_build_revision$]");
 
-                       // Don't forget to throw the mac in here somewhere, too
                        default_class_name="SWFClass";
 
                        // check for Unix platforms - see FAQ for more details
@@ -208,6 +207,18 @@ namespace System.Windows.Forms {
                        }
                }
 
+               static public Size MouseHoverSize {
+                       get {
+                               return driver.MouseHoverSize;
+                       }
+               }
+
+               static public int MouseHoverTime {
+                       get {
+                               return driver.MouseHoverTime;
+                       }
+               }
+
                static public bool MouseWheelPresent {
                        get {
                                return driver.MouseWheelPresent;
@@ -601,6 +612,13 @@ namespace System.Windows.Forms {
                        driver.RequestNCRecalc(handle);
                }
 
+               internal static void ResetMouseHover(IntPtr handle) {
+                       #if DriverDebug
+                               Console.WriteLine("ResetMouseHover({0}): Called", Window(handle));
+                       #endif
+                       driver.ResetMouseHover(handle);
+               }
+
                internal static void ScreenToClient(IntPtr handle, ref int x, ref int y) {
                        #if DriverDebug
                                Console.WriteLine("ScreenToClient({0}, {1}, {2}): Called", Window(handle), x, y);
index 4722a7a27da257719b91aac6caae64d9c7773275..4ae04fab6f90bc337e4f32fcde690a37ccb039a8 100644 (file)
@@ -68,6 +68,18 @@ namespace System.Windows.Forms {
                        }
                }
 
+               internal virtual Size MouseHoverSize {
+                       get {
+                               return new Size (1, 1);
+                       }
+               }
+
+               internal virtual int MouseHoverTime {
+                       get {
+                               return 500;
+                       }
+               }
+
                internal virtual Point MousePosition {
                        get {
                                return Point.Empty;
@@ -234,6 +246,7 @@ namespace System.Windows.Forms {
                internal abstract void EndLoop(Thread thread);
 
                internal abstract void RequestNCRecalc(IntPtr hwnd);
+               internal abstract void ResetMouseHover(IntPtr hwnd);
 
                // System information
                internal abstract int KeyboardSpeed { get; } 
index 1b200f0c656e0c42329e60dcb5b189f662babc7d..e638493cebccbd60841ae668494fa815f0322f5d 100644 (file)
@@ -1391,6 +1391,11 @@ namespace System.Windows.Forms {
                        throw new NotImplementedException();
                }
 
+               [MonoTODO]              
+               internal override void ResetMouseHover(IntPtr handle) {
+                       throw new NotImplementedException();
+               }
+
                internal override void ScreenToClient(IntPtr handle, ref int x, ref int y) {
                        CGPoint pt = new CGPoint ();
                        Rect wBounds = new Rect ();
index c6127996e4a4b25d355404c0d8a652ed4be372d0..f900f46ad6009913636afd5cee37d09db16ab160 100644 (file)
@@ -99,7 +99,10 @@ namespace System.Windows.Forms {
                }
 
                internal enum SPIAction {
-                       SPI_GETWORKAREA         = 0x0030
+                       SPI_GETWORKAREA         = 0x0030,
+                       SPI_GETMOUSEHOVERWIDTH  = 0x0062,
+                       SPI_GETMOUSEHOVERHEIGHT = 0x0064,
+                       SPI_GETMOUSEHOVERTIME   = 0x0066,
                }
 
                internal enum WindowPlacementFlags {
@@ -869,6 +872,27 @@ namespace System.Windows.Forms {
                        }
                }
 
+               internal override Size MouseHoverSize {
+                       get {
+                               int     width = 4;
+                               int     height = 4;
+
+                               Win32SystemParametersInfo(SPIAction.SPI_GETMOUSEHOVERWIDTH, 0, ref width, 0);
+                               Win32SystemParametersInfo(SPIAction.SPI_GETMOUSEHOVERWIDTH, 0, ref height, 0);
+                               return new Size(width, height);
+                       }
+               }
+
+               internal override int MouseHoverTime {
+                       get {
+                               int time = 500;
+
+                               Win32SystemParametersInfo(SPIAction.SPI_GETMOUSEHOVERTIME, 0, ref time, 0);
+                               return time;
+                       }
+               }
+
+
                internal override bool DropTarget {
                        get {
                                return false;
@@ -1322,6 +1346,17 @@ namespace System.Windows.Forms {
                        Win32SetWindowPos(handle, IntPtr.Zero, 0, 0, 0, 0, SetWindowPosFlags.SWP_FRAMECHANGED | SetWindowPosFlags.SWP_NOOWNERZORDER | SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_NOMOVE);
                }
 
+               internal override void ResetMouseHover(IntPtr handle) {
+                       TRACKMOUSEEVENT tme;
+
+                       tme = new TRACKMOUSEEVENT();
+                       tme.size = Marshal.SizeOf(tme);
+                       tme.hWnd = handle;
+                       tme.dwFlags = TMEFlags.TME_LEAVE | TMEFlags.TME_HOVER;
+                       Win32TrackMouseEvent(ref tme);
+               }
+
+
                internal override bool GetMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax) {
                        return GetMessage(ref msg, hWnd, wFilterMin, wFilterMax, true);
                }
@@ -2485,6 +2520,12 @@ namespace System.Windows.Forms {
                [DllImport ("user32.dll", EntryPoint="SystemParametersInfoW", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall)]
                private extern static bool Win32SystemParametersInfo(SPIAction uiAction, uint uiParam, ref RECT rect, uint fWinIni);
 
+               [DllImport ("user32.dll", EntryPoint="SystemParametersInfoW", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall)]
+               private extern static bool Win32SystemParametersInfo(SPIAction uiAction, uint uiParam, ref uint value, uint fWinIni);
+
+               [DllImport ("user32.dll", EntryPoint="SystemParametersInfoW", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall)]
+               private extern static bool Win32SystemParametersInfo(SPIAction uiAction, uint uiParam, ref int value, uint fWinIni);
+
                [DllImport ("user32.dll", EntryPoint="OpenClipboard", CallingConvention=CallingConvention.StdCall)]
                private extern static bool Win32OpenClipboard(IntPtr hwnd);
 
index 1b27d892bd869d2ab20af272259e9520cec814c4..8804dffff6bc45885886864bc7163f6b659086d6 100644 (file)
@@ -394,7 +394,8 @@ namespace System.Windows.Forms {
                                HoverState.Timer = new Timer();
                                HoverState.Timer.Enabled = false;
                                HoverState.Timer.Interval = HoverState.Interval;
-                               HoverState.Timer.Tick +=new EventHandler(MouseHover);
+                               HoverState.Timer.Tick += new EventHandler(MouseHover);
+                               HoverState.Size = new Size(4, 4);
                                HoverState.X = -1;
                                HoverState.Y = -1;
 
@@ -1421,25 +1422,22 @@ namespace System.Windows.Forms {
 
                #region Callbacks
                private void MouseHover(object sender, EventArgs e) {
-                       if ((HoverState.X == MousePosition.X) && (HoverState.Y == MousePosition.Y)) {
-                               XEvent xevent;
+                       XEvent xevent;
+                       HoverState.Timer.Enabled = false;
 
-                               HoverState.Timer.Enabled = false;
-
-                               if (HoverState.Window != IntPtr.Zero) {
-                                       xevent = new XEvent ();
+                       if (HoverState.Window != IntPtr.Zero) {
+                               xevent = new XEvent ();
 
-                                       xevent.type = XEventName.ClientMessage;
-                                       xevent.ClientMessageEvent.display = DisplayHandle;
-                                       xevent.ClientMessageEvent.window = HoverState.Window;
-                                       xevent.ClientMessageEvent.message_type = HoverState.Atom;
-                                       xevent.ClientMessageEvent.format = 32;
-                                       xevent.ClientMessageEvent.ptr1 = (IntPtr) (HoverState.Y << 16 | HoverState.X);
+                               xevent.type = XEventName.ClientMessage;
+                               xevent.ClientMessageEvent.display = DisplayHandle;
+                               xevent.ClientMessageEvent.window = HoverState.Window;
+                               xevent.ClientMessageEvent.message_type = HoverState.Atom;
+                               xevent.ClientMessageEvent.format = 32;
+                               xevent.ClientMessageEvent.ptr1 = (IntPtr) (HoverState.Y << 16 | HoverState.X);
 
-                                       MessageQueue.EnqueueLocked (xevent);
+                               MessageQueue.EnqueueLocked (xevent);
 
-                                       WakeupMain ();
-                               }
+                               WakeupMain ();
                        }
                }
 
@@ -1683,6 +1681,20 @@ namespace System.Windows.Forms {
                        }
                } 
 
+               internal override Size MouseHoverSize {
+                       get {
+                               return new Size (1, 1);
+                       }
+               }
+
+               internal override int MouseHoverTime {
+                       get {
+                               return HoverState.Interval;
+                       }
+               }
+
+
+
                internal override  bool MouseWheelPresent {
                        get {
                                return true;    // FIXME - how to detect?
@@ -2907,8 +2919,19 @@ namespace System.Windows.Forms {
                                                        msg.lParam = (IntPtr)(MousePosition.Y << 16 | MousePosition.X);
                                                }
 
-                                               HoverState.X = MousePosition.X = xevent.MotionEvent.x;
-                                               HoverState.Y = MousePosition.Y = xevent.MotionEvent.y;
+                                               MousePosition.X = xevent.MotionEvent.x;
+                                               MousePosition.Y = xevent.MotionEvent.y;
+
+                                               if ((HoverState.Timer.Enabled) &&
+                                                   (((MousePosition.X + HoverState.Size.Width) < HoverState.X) ||
+                                                   ((MousePosition.X - HoverState.Size.Width) > HoverState.X) ||
+                                                   ((MousePosition.Y + HoverState.Size.Height) < HoverState.Y) ||
+                                                   ((MousePosition.Y - HoverState.Size.Height) > HoverState.Y))) {
+                                                       HoverState.Timer.Stop();
+                                                       HoverState.Timer.Start();
+                                                       HoverState.X = MousePosition.X;
+                                                       HoverState.Y = MousePosition.Y;
+                                               }
 
                                                break;
                                        } else {
@@ -2953,6 +2976,8 @@ namespace System.Windows.Forms {
                                                goto ProcessNextMessage;
                                        }
                                        msg.message = Msg.WM_MOUSE_ENTER;
+                                       HoverState.X = xevent.CrossingEvent.x;
+                                       HoverState.Y = xevent.CrossingEvent.y;
                                        HoverState.Timer.Enabled = true;
                                        HoverState.Window = xevent.CrossingEvent.window;
                                        break;
@@ -3556,6 +3581,21 @@ namespace System.Windows.Forms {
                        InvalidateWholeWindow(handle);
                }
 
+               internal override void ResetMouseHover(IntPtr handle) {
+                       Hwnd    hwnd;
+
+                       hwnd = Hwnd.ObjectFromHandle(handle);
+                       if (hwnd == null) {
+                               return;
+                       }
+
+                       HoverState.Timer.Enabled = true;
+                       HoverState.X = MousePosition.X;
+                       HoverState.Y = MousePosition.Y;
+                       HoverState.Window = handle;
+               }
+
+
                internal override void ScreenToClient(IntPtr handle, ref int x, ref int y) {
                        int     dest_x_return;
                        int     dest_y_return;