// 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 RightToLeft right_to_left = RightToLeft.Inherit;
private Form form = null;
- private MenuAPI.TRACKER tracker = null;
public MainMenu () : base (null)
{
}
+#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; }
}
protected override IntPtr CreateMenuHandle ()
- {
- return MenuAPI.CreateMenu ();
+ {
+ return IntPtr.Zero;
}
- protected void Dispose (bool disposing)
+ protected override void Dispose (bool disposing)
{
base.Dispose (disposing);
}
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;
+ Wnd = form;
- if (tracker == null) {
- tracker = new MenuAPI.TRACKER ();
- tracker.hCurrentMenu = tracker.hTopMenu = Handle;
- }
+ 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);
+ 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
}
}