aboutsummaryrefslogtreecommitdiff
path: root/source/ShiftUI/Internal/MainMenu.cs
diff options
context:
space:
mode:
authorMichaelTheShifter <[email protected]>2016-07-20 09:40:36 -0400
committerMichaelTheShifter <[email protected]>2016-07-20 09:40:36 -0400
commitd40fed5ce2bc806a91245adb18039634eac13ed0 (patch)
treef1d7168aee6db109ac2c738ad18c9db667a6ba69 /source/ShiftUI/Internal/MainMenu.cs
parentf1856e8ed30ed882229fd3fa2a4038122a5fb441 (diff)
downloadshiftos-c--d40fed5ce2bc806a91245adb18039634eac13ed0.tar.gz
shiftos-c--d40fed5ce2bc806a91245adb18039634eac13ed0.tar.bz2
shiftos-c--d40fed5ce2bc806a91245adb18039634eac13ed0.zip
Move ShiftUI source code to ShiftOS
This'll be a lot easier to work on.
Diffstat (limited to 'source/ShiftUI/Internal/MainMenu.cs')
-rw-r--r--source/ShiftUI/Internal/MainMenu.cs216
1 files changed, 216 insertions, 0 deletions
diff --git a/source/ShiftUI/Internal/MainMenu.cs b/source/ShiftUI/Internal/MainMenu.cs
new file mode 100644
index 0000000..2bb0f3f
--- /dev/null
+++ b/source/ShiftUI/Internal/MainMenu.cs
@@ -0,0 +1,216 @@
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// 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-2005 Novell, Inc.
+//
+// Authors:
+// Jordi Mas i Hernandez, [email protected]
+//
+//
+
+// COMPLETE
+
+using System.ComponentModel;
+using System.Drawing;
+using System;
+
+namespace ShiftUI
+{
+ [ToolboxItemFilter("ShiftUI.MainMenu", ToolboxItemFilterType.Allow)]
+ public class MainMenu : Menu
+ {
+ private RightToLeft right_to_left = RightToLeft.Inherit;
+ private Form form = null;
+
+ public MainMenu () : base (null)
+ {
+
+ }
+
+ public MainMenu (MenuItem[] items) : base (items)
+ {
+
+ }
+
+ public MainMenu (IContainer container) : this ()
+ {
+ container.Add (this);
+ }
+
+ #region Events
+
+ static object CollapseEvent = new object ();
+
+ public event EventHandler Collapse {
+ add { Events.AddHandler (CollapseEvent, value); }
+ remove { Events.RemoveHandler (CollapseEvent, value); }
+ }
+
+ #endregion Events
+
+ #region Public Properties
+ [Localizable(true)]
+ [AmbientValue (RightToLeft.Inherit)]
+ public virtual RightToLeft RightToLeft {
+ get { return right_to_left;}
+ set { right_to_left = value; }
+ }
+
+ #endregion Public Properties
+
+ #region Public Methods
+
+ public virtual MainMenu CloneMenu ()
+ {
+ MainMenu new_menu = new MainMenu ();
+ new_menu.CloneMenu (this);
+ return new_menu;
+ }
+
+ protected override IntPtr CreateMenuHandle ()
+ {
+ return IntPtr.Zero;
+ }
+
+ protected override void Dispose (bool disposing)
+ {
+ base.Dispose (disposing);
+ }
+
+ public Form GetForm ()
+ {
+ return form;
+ }
+
+ public override string ToString ()
+ {
+ return base.ToString () + ", GetForm: " + form;
+ }
+
+ protected internal virtual void OnCollapse (EventArgs e)
+ {
+ EventHandler eh = (EventHandler) (Events [CollapseEvent]);
+ if (eh != null)
+ eh (this, e);
+ }
+
+ #endregion Public Methods
+
+ #region Private Methods
+
+ internal void Draw ()
+ {
+ Message m = Message.Create (Wnd.window.Handle, (int) Msg.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
+ PaintEventArgs pe = XplatUI.PaintEventStart (ref m, Wnd.window.Handle, false);
+ Draw (pe, Rect);
+ }
+
+ internal void Draw (Rectangle rect)
+ {
+ if (Wnd.IsHandleCreated) {
+ Point pt = XplatUI.GetMenuOrigin (Wnd.window.Handle);
+ Message m = Message.Create (Wnd.window.Handle, (int)Msg.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
+ PaintEventArgs pevent = XplatUI.PaintEventStart (ref m, Wnd.window.Handle, false);
+ pevent.Graphics.SetClip (new Rectangle (rect.X + pt.X, rect.Y + pt.Y, rect.Width, rect.Height));
+ Draw (pevent, Rect);
+ XplatUI.PaintEventEnd (ref m, 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 MenuTracker (this);
+ tracker.GrabControl = form;
+ }
+ }
+
+ 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) */
+
+ if (!Wnd.IsHandleCreated)
+ return;
+
+ Message m = Message.Create (Wnd.window.Handle, (int) Msg.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
+ PaintEventArgs pevent = XplatUI.PaintEventStart (ref m, Wnd.window.Handle, false);
+ pevent.Graphics.SetClip (clip);
+
+ Draw (pevent, clip);
+ }
+
+ /* Mouse events from the form */
+ internal void OnMouseDown (object window, MouseEventArgs args)
+ {
+ tracker.OnMouseDown (args);
+ }
+
+ internal void OnMouseMove (object window, MouseEventArgs e)
+ {
+ MouseEventArgs args = new MouseEventArgs (e.Button, e.Clicks, Widget.MousePosition.X, Widget.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
+ }
+}
+
+