2007-01-10 Jonathan Pobst <jpobst@novell.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / MenuItem.cs
index 6374afdb67b9253daa83d3b2928b44584cdaab76..00076ec0e1daace42c0646482f10304dfc8bcfd0 100644 (file)
@@ -137,11 +137,36 @@ namespace System.Windows.Forms
                }
 
                #region Events
-               public event EventHandler Click;
-               public event DrawItemEventHandler DrawItem;
-               public event MeasureItemEventHandler MeasureItem;
-               public event EventHandler Popup;
-               public event EventHandler Select;
+               static object ClickEvent = new object ();
+               static object DrawItemEvent = new object ();
+               static object MeasureItemEvent = new object ();
+               static object PopupEvent = new object ();
+               static object SelectEvent = new object ();
+
+               public event EventHandler Click {
+                       add { Events.AddHandler (ClickEvent, value); }
+                       remove { Events.RemoveHandler (ClickEvent, value); }
+               }
+
+               public event DrawItemEventHandler DrawItem {
+                       add { Events.AddHandler (DrawItemEvent, value); }
+                       remove { Events.RemoveHandler (DrawItemEvent, value); }
+               }
+
+               public event MeasureItemEventHandler MeasureItem {
+                       add { Events.AddHandler (MeasureItemEvent, value); }
+                       remove { Events.RemoveHandler (MeasureItemEvent, value); }
+               }
+
+               public event EventHandler Popup {
+                       add { Events.AddHandler (PopupEvent, value); }
+                       remove { Events.RemoveHandler (PopupEvent, value); }
+               }
+
+               public event EventHandler Select {
+                       add { Events.AddHandler (SelectEvent, value); }
+                       remove { Events.RemoveHandler (SelectEvent, value); }
+               }
                #endregion // Events
 
                #region Public Properties
@@ -176,7 +201,13 @@ namespace System.Windows.Forms
                [Localizable(true)]
                public bool Enabled {
                        get { return enabled; }
-                       set { enabled = value; }
+                       set {
+                               if (enabled == value)
+                                       return;
+                                       
+                               enabled = value;
+                               Invalidate ();
+                       }
                }
 
                [Browsable(false)]
@@ -209,7 +240,6 @@ namespace System.Windows.Forms
                                        MenuItems.Remove (item);
                                mdilist_items.Clear ();
                                mdilist_items = null;
-                               
                        }
                }
 
@@ -331,7 +361,7 @@ namespace System.Windows.Forms
                
                internal bool MeasureEventDefined {
                        get { 
-                               if (ownerdraw == true && MeasureItem != null) {
+                               if (ownerdraw == true && Events [MeasureItemEvent] != null) {
                                        return true;
                                } else {
                                        return false;
@@ -376,6 +406,17 @@ namespace System.Windows.Forms
                        }
                }
                
+               internal bool VisibleItems {
+                       get { 
+                               if (menu_items != null) {
+                                       foreach (MenuItem mi in menu_items)
+                                               if (mi.Visible)
+                                                       return true;
+                               }
+                               return false;
+                       }
+               }
+
                internal new int Width {
                        get { return bounds.Width; }
                        set { bounds.Width = value; }
@@ -444,11 +485,11 @@ namespace System.Windows.Forms
                        Visible = menuitem.Visible;
 
                        // Events
-                       Click = menuitem.Click;
-                       DrawItem = menuitem.DrawItem;
-                       MeasureItem = menuitem.MeasureItem;
-                       Popup = menuitem.Popup;
-                       Select = menuitem.Select;
+                       Events[ClickEvent] = menuitem.Events[ClickEvent];
+                       Events[DrawItemEvent] = menuitem.Events[DrawItemEvent];
+                       Events[MeasureItemEvent] = menuitem.Events[MeasureItemEvent];
+                       Events[PopupEvent] = menuitem.Events[PopupEvent];
+                       Events[SelectEvent] = menuitem.Events[SelectEvent];
                }
 
                protected override void Dispose (bool disposing)
@@ -471,15 +512,17 @@ namespace System.Windows.Forms
 
                protected virtual void OnClick (EventArgs e)
                {
-                       if (Click != null)
-                               Click (this, e);
+                       EventHandler eh = (EventHandler)(Events [ClickEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnDrawItem (DrawItemEventArgs e)
                {
                        if (OwnerDraw) {
-                               if (DrawItem != null)
-                                       DrawItem (this, e);
+                               DrawItemEventHandler eh = (DrawItemEventHandler)(Events [DrawItemEvent]);
+                               if (eh != null)
+                                       eh (this, e);
                                return;
                        }
 
@@ -494,20 +537,26 @@ namespace System.Windows.Forms
 
                protected virtual void OnMeasureItem (MeasureItemEventArgs e)
                {
-                       if (OwnerDraw && MeasureItem != null)
-                               MeasureItem (this, e);
+                       if (!OwnerDraw)
+                               return;
+
+                       MeasureItemEventHandler eh = (MeasureItemEventHandler)(Events [MeasureItemEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnPopup (EventArgs e)
                {
-                       if (Popup != null)
-                               Popup (this, e);
+                       EventHandler eh = (EventHandler)(Events [PopupEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnSelect (EventArgs e)
                {
-                       if (Select != null)
-                               Select (this, e);
+                       EventHandler eh = (EventHandler)(Events [SelectEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                public void PerformClick ()
@@ -564,10 +613,13 @@ namespace System.Windows.Forms
                                        if (mdicontainer == null)
                                                break;
 
+                                       
                                        // Remove closed forms
-                                       foreach (MenuItem item in mdilist_items.Keys) {
+                                       MenuItem[] items = new MenuItem[mdilist_items.Count];
+                                       mdilist_items.Keys.CopyTo (items, 0);
+                                       foreach (MenuItem item in items) {
                                                Form mdichild = (Form) mdilist_items [item];
-                                               if (!mdicontainer.original_order.Contains (mdichild)) {
+                                               if (!mdicontainer.mdi_child_list.Contains(mdichild)) {
                                                        mdilist_items.Remove (item);
                                                        mdilist_forms.Remove (mdichild);
                                                        MenuItems.Remove (item);
@@ -575,8 +627,8 @@ namespace System.Windows.Forms
                                        }
                                        
                                        // Add new forms and update state for existing forms.
-                                       for ( int i = 0; i < mdicontainer.original_order.Count; i++) {
-                                               Form mdichild = (Form) mdicontainer.original_order [i];
+                                       for (int i = 0; i < mdicontainer.mdi_child_list.Count; i++) {
+                                               Form mdichild = (Form)mdicontainer.mdi_child_list[i];
                                                MenuItem item;
                                                if (mdilist_forms.Contains (mdichild)) {
                                                        item = (MenuItem) mdilist_forms [mdichild];
@@ -738,7 +790,7 @@ namespace System.Windows.Forms
 
                private void MdiWindowClickHandler (object sender, EventArgs e)
                {
-                       Form mdichild = (Form) mdilist_items [SelectedItem];
+                       Form mdichild = (Form) mdilist_items [sender];
 
                        // people could add weird items to the Window menu
                        // so we can't assume its just us