2007-01-01 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / MainMenu.cs
index 0d44f192ff4c898bdbfce53bfb41063926599700..db9f068c5b38bef7d4a84353a24a50550ff20b16 100644 (file)
@@ -27,6 +27,7 @@
 // COMPLETE
 
 using System.ComponentModel;
+using System.Drawing;
 
 namespace System.Windows.Forms
 {
@@ -35,7 +36,6 @@ namespace System.Windows.Forms
        {
                private RightToLeft right_to_left = RightToLeft.Inherit;
                private Form form = null;
-               private MenuAPI.TRACKER tracker = null;
 
                public MainMenu () : base (null)
                {
@@ -47,8 +47,18 @@ namespace System.Windows.Forms
                        
                }
 
+#if NET_2_0
+               public MainMenu (IContainer container) : this ()
+               {
+                       container.Add (this);
+               }
+#endif
+
                #region Public Properties
                [Localizable(true)]
+#if NET_2_0
+               [AmbientValue (RightToLeft.Inherit)]
+#endif
                public virtual RightToLeft RightToLeft {
                        get { return right_to_left;}
                        set { right_to_left = value; }
@@ -66,8 +76,8 @@ namespace System.Windows.Forms
                }
                
                protected override IntPtr CreateMenuHandle ()
-               {                               
-                       return MenuAPI.CreateMenu (this);                                               
+               {                       
+                       return IntPtr.Zero;
                }
 
                protected override void Dispose (bool disposing)
@@ -88,40 +98,88 @@ namespace System.Windows.Forms
                #endregion Public Methods
                
                #region Private Methods
+
+               internal void Draw () {
+                       Draw (Rect);
+               }
+
+               internal void Draw (Rectangle clip_rect) {
+                       PaintEventArgs pe;
+
+                       if (Wnd.IsHandleCreated) {
+                               pe = XplatUI.PaintEventStart(Wnd.window.Handle, false);
+                               pe.Graphics.Clip = new Region (clip_rect);
+                               Draw (pe, Rect);
+                               XplatUI.PaintEventEnd(Wnd.window.Handle, false);
+                       }
+               }
+
+               internal void Draw (PaintEventArgs pe)          
+               {
+                       Draw (pe, Rect);
+               }
+
+               internal void Draw (PaintEventArgs pe, Rectangle rect)
+               {
+                       if (!Wnd.IsHandleCreated)
+                               return;
+
+                       X = rect.X;
+                       Y = rect.Y;
+                       Height = Rect.Height;
+
+                       ThemeEngine.Current.DrawMenuBar (pe.Graphics, this, rect);
+
+                       PaintEventHandler eh = (PaintEventHandler)(Events [PaintEvent]);
+                       if (eh != null)
+                               eh (this, pe);
+               }
+
+               internal override void InvalidateItem (MenuItem item)
+               {
+                       Draw (item.bounds);
+               }
                
                internal void SetForm (Form form)
                {
                        this.form = form;
+                       Wnd = form;
                        
-                       if (tracker == null) {
-                               tracker = new MenuAPI.TRACKER (); 
-                               tracker.hCurrentMenu = tracker.hTopMenu = Handle;
-                       }
+                       if (tracker == null)
+                               tracker = new MenuTracker (this); 
                }
                
-               internal override void MenuChanged ()
+               internal override void OnMenuChanged (EventArgs e)
                {
-                       base.MenuChanged ();
-                       tracker = new MenuAPI.TRACKER (); 
-                       tracker.hCurrentMenu = tracker.hTopMenu = menu_handle;
-
-                       MenuAPI.SetMenuBarWindow (menu_handle, form);
-                       // TODO: Need to invalidate & redraw topmenu
+                       base.OnMenuChanged (EventArgs.Empty);
+                       if (form == null)
+                               return;
+
+                       Rectangle clip = Rect;
+                       Height = 0; /* need this so the theme code will re-layout the menu items
+                                      (why is the theme code doing the layout?  argh) */
+                       Draw (clip);
                }
 
-
                /* Mouse events from the form */
-               internal void OnMouseDown (Form window, MouseEventArgs e)
+               internal void OnMouseDown (object window, MouseEventArgs args)
                {                       
-                       MenuAPI.TrackBarMouseEvent (Handle, window, e, MenuAPI.MenuMouseEvent.Down, tracker);
+                       tracker.OnMouseDown (args);
                }
                
-               internal void OnMouseMove (Form window, MouseEventArgs e)
+               internal void OnMouseMove (object window, MouseEventArgs e)
                {                       
-                       MouseEventArgs ev = new MouseEventArgs (e.Button, e.Clicks, Control.MousePosition.X, Control.MousePosition.Y, e.Delta);
-                       MenuAPI.TrackBarMouseEvent (Handle, window, ev, MenuAPI.MenuMouseEvent.Move, tracker);
+                       MouseEventArgs args = new MouseEventArgs (e.Button, e.Clicks, Control.MousePosition.X, Control.MousePosition.Y, e.Delta);
+                       tracker.OnMotion (args);
                }
-               
+
+               static object PaintEvent = new object ();
+
+               internal event PaintEventHandler Paint {
+                       add { Events.AddHandler (PaintEvent, value); }
+                       remove { Events.RemoveHandler (PaintEvent, value); }
+               }
+
                #endregion Private Methods
        }
 }