using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; namespace MrAG { public partial class Gui { public class Key { public bool Shift, Alt, Ctrl; public string Letter; public int Char; } public enum MouseKey : byte {Left = 1, Right = 2, Middle = 3} public static MouseState CurMouseState = Mouse.GetState(); public static System.Windows.Forms.Form MainForm; public static Action OnScreenMouseClick; public static Action OnScreenMouseUp; public static Action OnScreenMouseDown; public static Action OnScreenKeyPress; public static bool AcceptInput = true; private static List Objects = new List(); private static int curscrollval = 0; private static Base _currentfocus; internal static bool BroughtToFront; public static Base CurrentFocus{ get { return _currentfocus; } set { if (_currentfocus != null) { _currentfocus.FocusLost(); if (_currentfocus.OnUnFocus != null) _currentfocus.OnUnFocus.Invoke(); } _currentfocus = value; if (_currentfocus != null){ _currentfocus.FocusGained(); if (_currentfocus.OnFocus != null) _currentfocus.OnFocus.Invoke(); } } } public static void Initialize(GameWindow w) { MainForm = (System.Windows.Forms.Form)System.Windows.Forms.Form.FromHandle(w.Handle); MainForm.KeyPreview = true; MainForm.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(KeyPress); MainForm.MouseClick += new System.Windows.Forms.MouseEventHandler(MouseClick); MainForm.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(MouseDoubleClick); MainForm.MouseUp += new System.Windows.Forms.MouseEventHandler(MouseUp); MainForm.MouseDown += new System.Windows.Forms.MouseEventHandler(MouseDown); } public static void AddObject(Gui.Base obj) { obj.Removed = false; Objects.Add(obj); } public static void RemoveObject(Gui.Base obj) { obj.Removed = true; if (obj.Parent != null) { obj.Parent.Children.Remove(obj); } else { Objects.Remove(obj); } } public static void Draw() { for (int i = 0; i < Objects.Count; i++){ if (Objects[i].Render){ Objects[i].Draw(); if (BroughtToFront){ BroughtToFront = false; i--; } } } } public static string ParseOemKey(string Input, bool Shift) { switch (Input) { case "Space": return " "; case "Tab": return " "; case "OemMinus": return Shift ? "_" : "-"; case "Oemplus": return Shift ? "+" : "="; case "OemPeriod": return Shift ? ">" : "."; case "Oemcomma": return Shift ? "<" : ","; case "OemQuestion": return Shift ? "?" : "/"; case "OemOpenBrackets": return Shift ? "{" : "["; case "Oem1": return Shift ? ":" : ";"; case "Oem5": return Shift ? "|" : "\\"; case "Oem6": return Shift ? "}" : "]"; case "Oem7": return Shift ? "\"" : "'"; case "Return": return "\n"; case "ShiftKey": return ""; case "Back": return "Backspace"; } return ""; } public static string ParseNumberKey(string Input, bool Shift) { int Num = int.Parse(Input[Input.Length - 1].ToString()); if (Shift) { switch (int.Parse(Input[1].ToString())) { case 1: return "!"; case 2: return "@"; case 3: return "#"; case 4: return "$"; case 5: return "%"; case 6: return "^"; case 7: return "&"; case 8: return "*"; case 9: return "("; case 0: return ")"; } } else return Num.ToString(); return ""; } private static void KeyPress(object sender, System.Windows.Forms.PreviewKeyDownEventArgs args) { string letter = ""; string[] Parts = args.KeyData.ToString().Split(new string[] { ", " }, StringSplitOptions.None); if (Parts[0].Length == 1) { if (args.Shift) letter += Parts[0].ToUpper(); else letter += Parts[0].ToLower(); } else if ((Parts[0].Length == 2 && Parts[0][0] == 'D') || Parts[0].StartsWith("NumPad")) letter += ParseNumberKey(Parts[0], args.Shift); else { letter += ParseOemKey(Parts[0], args.Shift); } Key keypressed = new Key { Alt = args.Alt, Ctrl = args.Control, Shift = args.Shift, Letter = letter, Char = (int)args.KeyCode }; if (CurrentFocus != null && CurrentFocus.Render && AcceptInput) { if (CurrentFocus.Enabled){ CurrentFocus.KeyPress(keypressed); if (CurrentFocus.OnKeyPress != null) CurrentFocus.OnKeyPress.Invoke(); } } else { if (OnScreenKeyPress != null) OnScreenKeyPress.Invoke(keypressed); } } private static void MouseClick(object sender, System.Windows.Forms.MouseEventArgs args) { if (AcceptInput){ byte btn = 0; switch (args.Button) { case System.Windows.Forms.MouseButtons.Left: btn = 1; break; case System.Windows.Forms.MouseButtons.Right: btn = 2; break; case System.Windows.Forms.MouseButtons.Middle: btn = 3; break; } if (CurrentFocus != null) { if (CurrentFocus.Hovering()) { if (!DoMouseAction(CurrentFocus, btn, 2)) { if (OnScreenMouseClick != null) OnScreenMouseClick.Invoke(args.X, args.Y, (MouseKey)btn); } } else { CurrentFocus = null; } } else { if (OnScreenMouseClick != null) OnScreenMouseClick.Invoke(args.X, args.Y, (MouseKey)btn); } } } private static void MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs args) { if (AcceptInput){ byte btn = 0; switch (args.Button) { case System.Windows.Forms.MouseButtons.Left: btn = 1; break; case System.Windows.Forms.MouseButtons.Right: btn = 2; break; case System.Windows.Forms.MouseButtons.Middle: btn = 3; break; } if (CurrentFocus != null) { if (CurrentFocus.Hovering()) { if (!DoMouseAction(CurrentFocus, btn, 3)) { if (OnScreenMouseClick != null) OnScreenMouseClick.Invoke(args.X, args.Y, (MouseKey)btn); } } else { CurrentFocus = null; } } else { if (OnScreenMouseClick != null) OnScreenMouseClick.Invoke(args.X, args.Y, (MouseKey)btn); } } } private static void MouseUp(object sender, System.Windows.Forms.MouseEventArgs args) { if (AcceptInput){ byte btn = 0; switch (args.Button) { case System.Windows.Forms.MouseButtons.Left: btn = 1; break; case System.Windows.Forms.MouseButtons.Right: btn = 2; break; case System.Windows.Forms.MouseButtons.Middle: btn = 3; break; } if (CurrentFocus != null){ if (CurrentFocus.Hovering()) { if (!DoMouseAction(CurrentFocus, btn, 1)) { if (OnScreenMouseUp != null) OnScreenMouseUp.Invoke(args.X, args.Y, (MouseKey)btn); } } else { CurrentFocus = null; } }else{ if (OnScreenMouseUp != null) OnScreenMouseUp.Invoke(args.X, args.Y, (MouseKey)btn); } } } private static void MouseDown(object sender, System.Windows.Forms.MouseEventArgs args) { byte btn = 0; switch (args.Button) { case System.Windows.Forms.MouseButtons.Left: btn = 1; break; case System.Windows.Forms.MouseButtons.Right: btn = 2; break; case System.Windows.Forms.MouseButtons.Middle: btn = 3; break; } if (AcceptInput){ CurrentFocus = null; for(int i = Objects.Count - 1; i > -1; i--) if (DoMouseAction(Objects[i], btn, 0)) return; } if (OnScreenMouseDown != null) OnScreenMouseDown.Invoke(args.X, args.Y, (MouseKey)btn); } private static bool DoMouseAction(Base obj, byte btn, byte press){ if (!obj.Render || !obj.Enabled) return false; int x = MrAG.Gui.CurMouseState.X; int y = MrAG.Gui.CurMouseState.Y; bool yes = false; for(int i = obj.Children.Count - 1; i > -1; i--){ if (DoMouseAction(obj.Children[i], btn, press)){ yes = true; break; } } if (!yes) if (obj.Hovering()){ yes = true; CurrentFocus = obj; obj.SetFocus(); if (press != 1)obj.BringToFront(); if (obj.Enabled) { switch (press){ case 0: switch (btn) { case 1: obj.LeftMousePress(x - obj.X, y - obj.Y); if (obj.OnLeftMousePress != null) obj.OnLeftMousePress.Invoke(); if (obj.OnArgumentedLeftMousePress != null) obj.OnArgumentedLeftMousePress.Invoke(obj); break; case 2: obj.RightMousePress(x - obj.X, y - obj.Y); if (obj.OnRightMousePress != null) obj.OnRightMousePress.Invoke(); if (obj.OnArgumentedRightMousePress != null) obj.OnArgumentedRightMousePress.Invoke(obj); break; case 3: obj.MiddleMousePress(x - obj.X, y - obj.Y); if (obj.OnLeftMousePress != null) obj.OnLeftMousePress.Invoke(); if (obj.OnArgumentedLeftMousePress != null) obj.OnArgumentedLeftMousePress.Invoke(obj); break; } break; case 1: switch (btn) { case 1: obj.LeftMouseRelease(x - obj.X, y - obj.Y); if (obj.OnLeftMouseRelease != null) obj.OnLeftMouseRelease.Invoke(); if (obj.OnArgumentedLeftMouseRelease != null) obj.OnArgumentedLeftMouseRelease.Invoke(obj); break; case 2: obj.RightMouseRelease(x - obj.X, y - obj.Y); if (obj.OnRightMouseRelease != null) obj.OnRightMouseRelease.Invoke(); if (obj.OnArgumentedRightMouseRelease != null) obj.OnArgumentedRightMouseRelease.Invoke(obj); break; case 3: obj.MiddleMouseRelease(x - obj.X, y - obj.Y); if (obj.OnLeftMouseRelease != null) obj.OnLeftMouseRelease.Invoke(); if (obj.OnArgumentedLeftMouseRelease != null) obj.OnArgumentedLeftMouseRelease.Invoke(obj); break; } break; case 2: obj.DoClick(x - obj.X, y - obj.Y, (MouseKey)btn); switch (btn) { case 1: obj.LeftMouseClick(x - obj.X, y - obj.Y); if (obj.OnLeftMouseClick != null) obj.OnLeftMouseClick.Invoke(); if (obj.OnArgumentedLeftMouseClick != null) obj.OnArgumentedLeftMouseClick.Invoke(obj); break; case 2: obj.RightMouseClick(x - obj.X, y - obj.Y); if (obj.OnRightMouseClick != null) obj.OnRightMouseClick.Invoke(); if (obj.OnArgumentedRightMouseClick != null) obj.OnArgumentedRightMouseClick.Invoke(obj); break; case 3: obj.MiddleMouseClick(x - obj.X, y - obj.Y); if (obj.OnLeftMouseClick != null) obj.OnLeftMouseClick.Invoke(); if (obj.OnArgumentedLeftMouseClick != null) obj.OnArgumentedLeftMouseClick.Invoke(obj); break; } break; case 3: obj.DoDoubleClick(x - obj.X, y - obj.Y, (MouseKey)btn); switch (btn) { case 1: obj.LeftMouseClick(x - obj.X, y - obj.Y); if (obj.OnLeftDoubleMouseClick != null) obj.OnLeftDoubleMouseClick.Invoke(); if (obj.OnArgumentedLeftDoubleMouseClick != null) obj.OnArgumentedLeftDoubleMouseClick.Invoke(obj); break; case 2: obj.RightMouseClick(x - obj.X, y - obj.Y); if (obj.OnRightDoubleMouseClick != null) obj.OnRightDoubleMouseClick.Invoke(); if (obj.OnArgumentedRightDoubleMouseClick != null) obj.OnArgumentedRightDoubleMouseClick.Invoke(obj); break; case 3: obj.MiddleMouseClick(x - obj.X, y - obj.Y); if (obj.OnLeftDoubleMouseClick != null) obj.OnLeftDoubleMouseClick.Invoke(); if (obj.OnArgumentedLeftDoubleMouseClick != null) obj.OnArgumentedLeftDoubleMouseClick.Invoke(obj); break; } break; } } } return yes; } public static void Update() { CurMouseState = Mouse.GetState(); int scrollrem = curscrollval - CurMouseState.ScrollWheelValue; if (scrollrem != 0) { if (CurrentFocus != null) { bool up = scrollrem < 0; if (scrollrem < 0) scrollrem = -scrollrem; while (scrollrem > 0) { if (up) { CurrentFocus.DoScrollUp(); if (CurrentFocus.OnScrollUp != null) CurrentFocus.OnScrollUp.Invoke(); } else { CurrentFocus.DoScrollDown(); if (CurrentFocus.OnScrollDown != null) CurrentFocus.OnScrollDown.Invoke(); } scrollrem -= 120; } } curscrollval = CurMouseState.ScrollWheelValue; } for (int i = 0; i < Objects.Count; i++){ Objects[i].Update(); if (BroughtToFront){ BroughtToFront = false; i--; } } } } }