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