Author: everaldo
Date: 2008-01-23 11:55:35 -0500 (Wed, 23 Jan 2008)
New Revision: 93671

Modified:
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Control.cs
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Form.cs
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuAPI.cs
Log:
2008-01-23  Everaldo Canuto  <[EMAIL PROTECTED]>

        [Fixes bugs #343966, #338511 and other non reported (context)menu bugs]
        
        * Form.cs: Remove all active_tracker (used by menu) stuff, it is now 
moved 
        to Control class, it makes possible to grab menu to controls that can't 
        reach Form using parent tree. Handle for WmButtonUp, WmButtonDown and
        WmMouseMove removed since it was used only to track menu events.

        * Control.cs:
        - Moved all active_tracker stuff from Form.
        - ProcessActiveTracker added to prevent code duplicity, now mouse 
events 
        can call this method instead of reimplement all necessary code handle 
for
        menu tracker.
        - Call to ProcessActiveTracker for mouse events (WmButtonUp, 
WmButtonDown
        and WmMouseMove).
        
        * MenuAPI.cs: 
        - Remove special handle to ToolStripOverflow, now we can grab menu to 
        controls that can't reach Form using parent tree.
        - Change type of grab_control from Form to Control.



Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2008-01-23 16:46:54 UTC (rev 93670)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2008-01-23 16:55:35 UTC (rev 93671)
@@ -1,3 +1,25 @@
+2008-01-23  Everaldo Canuto  <[EMAIL PROTECTED]>
+
+       [Fixes bugs #343966, #338511 and other non reported (context)menu bugs]
+       
+       * Form.cs: Remove all active_tracker (used by menu) stuff, it is now 
moved 
+       to Control class, it makes possible to grab menu to controls that can't 
+       reach Form using parent tree. Handle for WmButtonUp, WmButtonDown and
+       WmMouseMove removed since it was used only to track menu events.
+
+       * Control.cs:
+       - Moved all active_tracker stuff from Form.
+       - ProcessActiveTracker added to prevent code duplicity, now mouse 
events 
+       can call this method instead of reimplement all necessary code handle 
for
+       menu tracker.
+       - Call to ProcessActiveTracker for mouse events (WmButtonUp, 
WmButtonDown
+       and WmMouseMove).
+       
+       * MenuAPI.cs: 
+       - Remove special handle to ToolStripOverflow, now we can grab menu to 
+       controls that can't reach Form using parent tree.
+       - Change type of grab_control from Form to Control.
+
 2008-01-22  Geoff Norton  <[EMAIL PROTECTED]>
 
        * TextBoxBase.cs: Split up the sizing of controls and placing of 

Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Control.cs
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Control.cs       
2008-01-23 16:46:54 UTC (rev 93670)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Control.cs       
2008-01-23 16:55:35 UTC (rev 93671)
@@ -1146,6 +1146,20 @@
                #endregion      // Public Constructors
 
                #region Internal Properties
+               
+               private MenuTracker active_tracker;
+               
+               internal MenuTracker ActiveTracker {
+                       get { return active_tracker; }
+                       set {
+                               if (value == active_tracker)
+                                       return;
+
+                               Capture = value != null;
+                               active_tracker = value;
+                       }
+               }
+
                // Control is currently selected, like Focused, except 
maintains state
                // when Form loses focus
                internal bool InternalSelected {
@@ -1309,7 +1323,50 @@
                internal Graphics DeviceContext {
                        get { return Hwnd.bmp_g; }
                }
-               
+
+               private void ProcessActiveTracker (ref Message m)
+               {
+                       bool is_up = ((Msg) m.Msg == Msg.WM_LBUTTONUP) ||
+                                                ((Msg) m.Msg == 
Msg.WM_RBUTTONUP);
+                       
+                       MouseButtons mb = FromParamToMouseButtons ((int) 
m.WParam.ToInt32 ());
+                       
+                       // We add in the button that was released (not sent in 
WParam)
+                       if (is_up) {
+                               switch ((Msg)m.Msg) {
+                               case Msg.WM_LBUTTONUP:
+                                       mb |= MouseButtons.Left;
+                                       break;
+                               case Msg.WM_RBUTTONUP:
+                                       mb |= MouseButtons.Right;
+                                       break;
+                               }
+                       }
+                       
+                       MouseEventArgs args = new MouseEventArgs (
+                               mb,
+                               mouse_clicks,
+                               Control.MousePosition.X,
+                               Control.MousePosition.Y,
+                               0);
+
+                       if (is_up) {
+                               active_tracker.OnMouseUp (args);
+                               mouse_clicks = 1;
+                       } else {
+                               if (!active_tracker.OnMouseDown (args)) {
+                                       Control control = GetRealChildAtPoint 
(Cursor.Position);
+                                       if (control != null) {
+                                               Point pt = 
control.PointToClient (Cursor.Position);
+                                               XplatUI.SendMessage 
(control.Handle, 
+                                                       (Msg)m.Msg, 
+                                                       m.WParam, 
+                                                       MakeParam (pt.X, pt.Y));
+                                       }
+                               }
+                       }
+               }
+
                private Control FindControlToInvokeOn ()
                {
                        Control p = this;
@@ -1564,7 +1621,6 @@
                                buttons |= MouseButtons.Right;
                                
                        return buttons;
-
                }
 
                internal virtual void FireEnter () {
@@ -5142,7 +5198,6 @@
                                        return;
                                }
 
-
                                case Msg.WM_MOUSEMOVE: {
                                        WmMouseMove (ref m);
                                        return;
@@ -5326,7 +5381,14 @@
                        m.Result = (IntPtr)1;
                }
 
-               private void WmLButtonUp (ref Message m) {
+               private void WmLButtonUp (ref Message m)
+               {
+                       // Menu handle.
+                       if (XplatUI.IsEnabled (Handle) && active_tracker != 
null) {
+                               ProcessActiveTracker (ref m);
+                               return;
+                       }
+
                        MouseEventArgs me;
 
                        me = new MouseEventArgs (FromParamToMouseButtons ((int) 
m.WParam.ToInt32()) | MouseButtons.Left, 
@@ -5345,8 +5407,15 @@
                                mouse_clicks = 1;
                        }
                }
-                                       
-               private void WmLButtonDown (ref Message m) {
+
+               private void WmLButtonDown (ref Message m)
+               {
+                       // Menu handle.
+                       if (XplatUI.IsEnabled (Handle) && active_tracker != 
null) {
+                               ProcessActiveTracker (ref m);
+                               return;
+                       }
+               
                        ValidationFailed = false;
                        if (CanSelect) {
                                Select (true, true);
@@ -5398,7 +5467,14 @@
                                0));
                }
 
-               private void WmRButtonUp (ref Message m) {
+               private void WmRButtonUp (ref Message m)
+               {
+                       // Menu handle.
+                       if (XplatUI.IsEnabled (Handle) && active_tracker != 
null) {
+                               ProcessActiveTracker (ref m);
+                               return;
+                       }
+
                        MouseEventArgs  me;
                        Point           pt;
 
@@ -5424,7 +5500,14 @@
                        }
                }
                                        
-               private void WmRButtonDown (ref Message m) {
+               private void WmRButtonDown (ref Message m)
+               {
+                       // Menu handle.
+                       if (XplatUI.IsEnabled (Handle) && active_tracker != 
null) {
+                               ProcessActiveTracker (ref m);
+                               return;
+                       }
+
                        InternalCapture = true;
                        OnMouseDown (new MouseEventArgs 
(FromParamToMouseButtons ((int) m.WParam.ToInt32()), 
                                mouse_clicks, LowOrder ((int) m.LParam.ToInt32 
()), HighOrder ((int) m.LParam.ToInt32 ()), 
@@ -5488,6 +5571,18 @@
 
 
                private void WmMouseMove (ref Message m) {
+                       if (XplatUI.IsEnabled (Handle) && active_tracker != 
null) {
+                               MouseEventArgs args = new MouseEventArgs (
+                                       FromParamToMouseButtons 
((int)m.WParam.ToInt32 ()),
+                                       mouse_clicks,
+                                       Control.MousePosition.X,
+                                       Control.MousePosition.Y,
+                                       0);
+
+                               active_tracker.OnMotion (args);
+                               return;
+                       }
+                       
                        OnMouseMove  (new MouseEventArgs 
(FromParamToMouseButtons ((int) m.WParam.ToInt32()), 
                                mouse_clicks, 
                                LowOrder ((int) m.LParam.ToInt32 ()), HighOrder 
((int) m.LParam.ToInt32 ()), 

Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Form.cs
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Form.cs  
2008-01-23 16:46:54 UTC (rev 93670)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Form.cs  
2008-01-23 16:55:35 UTC (rev 93671)
@@ -86,7 +86,6 @@
                private double                  opacity;
                internal ApplicationContext     context;
                Color                           transparency_key;
-               internal MenuTracker            active_tracker;
                private bool                    is_loaded;
                internal int                    is_changing_visible_state;
                internal bool                   has_been_visible;
@@ -940,17 +939,6 @@
                        }
                }
 
-               internal MenuTracker ActiveTracker {
-                       get { return active_tracker; }
-                       set {
-                               if (value == active_tracker)
-                                       return;
-
-                               Capture = value != null;
-                               active_tracker = value;
-                       }
-               }
-
                internal MdiClient MdiContainer {
                        get { return mdi_container; }
                }
@@ -2534,25 +2522,6 @@
                                break;
                        }
 
-                       case Msg.WM_MOUSEMOVE: {
-                               WmMouseMove (ref m);
-                               break;
-                       }
-
-                       case Msg.WM_LBUTTONDOWN:
-                       case Msg.WM_MBUTTONDOWN:
-                       case Msg.WM_RBUTTONDOWN: {
-                               WmButtonDown (ref m);
-                               return;
-                       }
-
-                       case Msg.WM_LBUTTONUP:
-                       case Msg.WM_MBUTTONUP:
-                       case Msg.WM_RBUTTONUP: {
-                               WmButtonUp (ref m);
-                               return;
-                       }
-
                        case Msg.WM_GETMINMAXINFO: {
                                WmGetMinMaxInfo (ref m);
                                break;
@@ -2814,78 +2783,6 @@
                        DefWndProc (ref m);             
                }
                
-               private void WmMouseMove (ref Message m)
-               {
-                       if (XplatUI.IsEnabled (Handle) && active_tracker != 
null) {
-                               MouseEventArgs args = new MouseEventArgs (
-                                       FromParamToMouseButtons 
((int)m.WParam.ToInt32 ()),
-                                       mouse_clicks,
-                                       Control.MousePosition.X,
-                                       Control.MousePosition.Y,
-                                       0);
-
-                               active_tracker.OnMotion (args);
-                               return;
-                       }
-                       base.WndProc (ref m);
-               }
-               
-               private void WmButtonDown (ref Message m)
-               {
-                       if (XplatUI.IsEnabled (Handle) && active_tracker != 
null) {
-                               MouseEventArgs args = new MouseEventArgs (
-                                       FromParamToMouseButtons 
((int)m.WParam.ToInt32 ()),
-                                       mouse_clicks,
-                                       Control.MousePosition.X,
-                                       Control.MousePosition.Y,
-                                       0);
-
-                               if (!active_tracker.OnMouseDown (args)) {
-                                       Control control = GetRealChildAtPoint 
(Cursor.Position);
-                                       if (control != null) {
-                                               Point pt = 
control.PointToClient (Cursor.Position);
-                                               XplatUI.SendMessage 
(control.Handle, (Msg)m.Msg, m.WParam, MakeParam (pt.X, pt.Y));
-                                       }
-                               }
-
-                               return;
-                       }
-
-                       base.WndProc (ref m);
-               }
-               
-               private void WmButtonUp (ref Message m)
-               {
-                       if (XplatUI.IsEnabled (Handle) && active_tracker != 
null) {
-                               MouseButtons mb = FromParamToMouseButtons 
((int)m.WParam.ToInt32 ());
-
-                               // We add in the button that was released (not 
sent in WParam)
-                               switch ((Msg)m.Msg) {
-                               case Msg.WM_LBUTTONUP:
-                                       mb |= MouseButtons.Left;
-                                       break;
-                               case Msg.WM_MBUTTONUP:
-                                       mb |= MouseButtons.Middle;
-                                       break;
-                               case Msg.WM_RBUTTONUP:
-                                       mb |= MouseButtons.Right;
-                                       break;
-                               }
-
-                               MouseEventArgs args = new MouseEventArgs (
-                                       mb,
-                                       mouse_clicks,
-                                       Control.MousePosition.X,
-                                       Control.MousePosition.Y,
-                                       0);
-
-                               active_tracker.OnMouseUp (args);
-                               mouse_clicks = 1;
-                               return;
-                       }
-                       base.WndProc (ref m);
-               }
-               
                private void WmGetMinMaxInfo (ref Message m)
                {
                        MINMAXINFO mmi;

Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuAPI.cs
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuAPI.cs       
2008-01-23 16:46:54 UTC (rev 93670)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuAPI.cs       
2008-01-23 16:55:35 UTC (rev 93671)
@@ -43,7 +43,7 @@
                internal bool hotkey_active;
                public Menu CurrentMenu;
                public Menu TopMenu;
-               Form grab_control;
+               Control grab_control;
                Point last_motion = Point.Empty;
                
            public MenuTracker (Menu top_menu)
@@ -53,16 +53,13 @@
                                AddShortcuts (item);
 
                        if (top_menu is ContextMenu) {
-                                                       
+       
                                Control source_control = (top_menu as 
ContextMenu).SourceControl;
-#if NET_2_0                            
-                               if (source_control.Parent != null && 
(source_control.Parent is ToolStripOverflow)) {
-                                       ToolStrip toolstrip = 
(source_control.Parent as ToolStripOverflow).ParentToolStrip;
-                                       if (toolstrip != null)
-                                               source_control = 
toolstrip.FindForm ();
-                               }
-#endif
                                grab_control = source_control.FindForm ();
+
+                               if (grab_control == null)
+                                       grab_control = source_control;
+
                                grab_control.ActiveTracker = this;
                        } else
                                grab_control = top_menu.Wnd.FindForm ();
@@ -775,9 +772,9 @@
        internal class PopUpWindow : Control
        {
                private Menu menu;
-               private Form form;
+               private Control form;
 
-               public PopUpWindow (Form form, Menu menu): base ()
+               public PopUpWindow (Control form, Menu menu): base ()
                {
                        this.menu = menu;
                        this.form = form;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to