2007-01-01 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / MainMenu.cs
index 2cd4b26e7a7fa0b59f53f358b0b265a621db5c8e..db9f068c5b38bef7d4a84353a24a50550ff20b16 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-// Copyright (c) 2004 Novell, Inc.
+// Copyright (c) 2004-2005 Novell, Inc.
 //
 // Authors:
 //     Jordi Mas i Hernandez, jordi@ximian.com
 //
 //
 
-// NOT COMPLETE
+// COMPLETE
+
+using System.ComponentModel;
+using System.Drawing;
 
 namespace System.Windows.Forms
 {
+       [ToolboxItemFilter("System.Windows.Forms.MainMenu", ToolboxItemFilterType.Allow)]
        public class MainMenu : Menu
        {
-               private RightToLeft right_to_left;
-               private Form form;
+               private RightToLeft right_to_left = RightToLeft.Inherit;
+               private Form form = null;
 
                public MainMenu () : base (null)
                {
-                       form = null;
+                       
                }
 
                public MainMenu (MenuItem[] items) : base (items)
                {
-                       form = null;
+                       
                }
 
-               #region Public Properties\r
-               \r
+#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; }
@@ -53,20 +67,22 @@ namespace System.Windows.Forms
                #endregion Public Properties
 
                #region Public Methods
-                       \r
-               public virtual MainMenu CloneMenu()
+                       
+               public virtual MainMenu CloneMenu ()
                {
-                       throw new NotImplementedException ();
+                       MainMenu new_menu = new MainMenu ();
+                       new_menu.CloneMenu (this);
+                       return new_menu;
                }
-               \r
+               
                protected override IntPtr CreateMenuHandle ()
-               {                               
-                       return MenuAPI.CreateMenu ();                                           
-               }\r
+               {                       
+                       return IntPtr.Zero;
+               }
 
-               protected void Dispose (bool disposing)
-               {
-                       throw new NotImplementedException ();
+               protected override void Dispose (bool disposing)
+               {                       
+                       base.Dispose (disposing);                       
                }
 
                public Form GetForm ()
@@ -76,31 +92,95 @@ namespace System.Windows.Forms
 
                public override string ToString ()
                {
-                       return base.ToString ();
+                       return base.ToString () + ", GetForm: " + form;
                }
 
                #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;
-                       MenuAPI.SetMenuBarWindow (Handle, form);
+                       Wnd = form;
+                       
+                       if (tracker == null)
+                               tracker = new MenuTracker (this); 
                }
                
+               internal override void OnMenuChanged (EventArgs e)
+               {
+                       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.OnMouseDown (args);
                }
                
-               internal void OnMouseMove (Form window, MouseEventArgs e)
-               {
-                       MenuAPI.TrackBarMouseEvent (Handle, window, e, MenuAPI.MenuMouseEvent.Move);
+               internal void OnMouseMove (object window, MouseEventArgs e)
+               {                       
+                       MouseEventArgs args = new MouseEventArgs (e.Button, e.Clicks, Control.MousePosition.X, Control.MousePosition.Y, e.Delta);
+                       tracker.OnMotion (args);
                }
-               
-               #endregion Private Methods\r
+
+               static object PaintEvent = new object ();
+
+               internal event PaintEventHandler Paint {
+                       add { Events.AddHandler (PaintEvent, value); }
+                       remove { Events.RemoveHandler (PaintEvent, value); }
+               }
+
+               #endregion Private Methods
        }
 }