///////////////////////////////////////////////////////////////// // // // Neoforce Controls // // // //////////////////////////////////////////////////////////////// // // // File: Control.cs // // // // Version: 0.7 // // // // Date: 11/09/2010 // // // // Author: Tom Shane // // // //////////////////////////////////////////////////////////////// // // // Copyright (c) by Tom Shane // // // //////////////////////////////////////////////////////////////// #region //// Using ///////////// //////////////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; #if (!XBOX && !XBOX_FAKE) using System.Media; using System.Collections; using System.ComponentModel; #endif //////////////////////////////////////////////////////////////////////////// #endregion namespace TomShane.Neoforce.Controls { #region //// Classes /////////// //////////////////////////////////////////////////////////////////////////// /// /// Defines the gamepad actions mapping. /// public class GamePadActions { public GamePadButton Click = GamePadButton.A; public GamePadButton Press = GamePadButton.Y; public GamePadButton Left = GamePadButton.LeftStickLeft; public GamePadButton Right = GamePadButton.LeftStickRight; public GamePadButton Up = GamePadButton.LeftStickUp; public GamePadButton Down = GamePadButton.LeftStickDown; public GamePadButton NextControl = GamePadButton.RightShoulder; public GamePadButton PrevControl = GamePadButton.LeftShoulder; public GamePadButton ContextMenu = GamePadButton.X; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Defines type used as a controls collection. /// public class ControlsList: EventedList { public ControlsList(): base() {} public ControlsList(int capacity): base(capacity) {} public ControlsList(IEnumerable collection): base(collection) {} } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Defines the base class for all controls. /// public class Control: Component { #region //// Consts///////////// //////////////////////////////////////////////////////////////////////////// public static readonly Color UndefinedColor = new Color(255, 255, 255, 0); //////////////////////////////////////////////////////////////////////////// #endregion #region //// Fields //////////// //////////////////////////////////////////////////////////////////////////// internal static ControlsList Stack = new ControlsList(); //////////////////////////////////////////////////////////////////////////// #if (!XBOX && !XBOX_FAKE) //////////////////////////////////////////////////////////////////////////// private Cursor cursor = null; //////////////////////////////////////////////////////////////////////////// #endif //////////////////////////////////////////////////////////////////////////// private Color color = UndefinedColor; private Color textColor = UndefinedColor; private Color backColor = Color.Transparent; private byte alpha = 255; private Anchors anchor = Anchors.Left | Anchors.Top; private Anchors resizeEdge = Anchors.All; private string text = "Control"; private bool visible = true; private bool enabled = true; private SkinControl skin = null; private Control parent = null; private Control root = null; private int left = 0; private int top = 0; private int width = 64; private int height = 64; private bool suspended = false; private ContextMenu contextMenu = null; private long tooltipTimer = 0; private long doubleClickTimer = 0; private MouseButton doubleClickButton = MouseButton.None; private Type toolTipType = typeof(ToolTip); private ToolTip toolTip = null; private bool doubleClicks = true; private bool outlineResizing = false; private bool outlineMoving = false; private string name = "Control"; private object tag = null; private GamePadActions gamePadActions = new GamePadActions(); private bool designMode = false; private bool partialOutline = true; private Rectangle drawingRect = Rectangle.Empty; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private ControlsList controls = new ControlsList(); private Rectangle movableArea = Rectangle.Empty; private bool passive = false; private bool detached = false; private bool movable = false; private bool resizable = false; private bool invalidated = true; private bool canFocus = true; private int resizerSize = 4; private int minimumWidth = 0; private int maximumWidth = 4096; private int minimumHeight = 0; private int maximumHeight = 4096; private int topModifier = 0; private int leftModifier = 0; private int virtualHeight = 64; private int virtualWidth = 64; private bool stayOnBack = false; private bool stayOnTop = false; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private RenderTarget2D target; private Point pressSpot = Point.Zero; private int[] pressDiff = new int[4]; private Alignment resizeArea = Alignment.None; private bool hovered = false; private bool inside = false; private bool[] pressed = new bool[32]; private bool isMoving = false; private bool isResizing = false; private Margins margins = new Margins(4, 4, 4, 4); private Margins anchorMargins = new Margins(); private Margins clientMargins = new Margins(); private Rectangle outlineRect = Rectangle.Empty; /// /// Tracks the position of the mouse scroll wheel /// private int scrollWheel = 0; //////////////////////////////////////////////////////////////////////////// #endregion #region //// Properties //////// #if (!XBOX && !XBOX_FAKE) //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the cursor displaying over the control. /// public Cursor Cursor { get { return cursor; } set { cursor = value; } } //////////////////////////////////////////////////////////////////////////// #endif //////////////////////////////////////////////////////////////////////////// /// /// Gets a list of all child controls. /// public virtual IEnumerable Controls { get { return controls; } } /// /// Gets or sets a rectangular area that reacts on moving the control with the mouse. /// public virtual Rectangle MovableArea { get { return movableArea; } set { movableArea = value; } } /// /// Gets a value indicating whether this control is a child control. /// public virtual bool IsChild { get { return (parent != null); } } /// /// Gets a value indicating whether this control is a parent control. /// public virtual bool IsParent { get { return (controls != null && controls.Count > 0); } } /// /// Gets a value indicating whether this control is a root control. /// public virtual bool IsRoot { get { return (root == this); } } /// /// Gets or sets a value indicating whether this control can receive focus. /// public virtual bool CanFocus { get { return canFocus; } set { canFocus = value; } } /// /// Gets or sets a value indicating whether this control is rendered off the parents texture. /// public virtual bool Detached { get { return detached; } set { detached = value; } } /// /// Gets or sets a value indicating whether this controls can receive user input events. /// public virtual bool Passive { get { return passive; } set { passive = value; } } /// /// Gets or sets a value indicating whether this control can be moved by the mouse. /// public virtual bool Movable { get { return movable; } set { movable = value; } } /// /// Gets or sets a value indicating whether this control can be resized by the mouse. /// public virtual bool Resizable { get { return resizable; } set { resizable = value; } } /// /// Gets or sets the size of the rectangular borders around the control used for resizing by the mouse. /// public virtual int ResizerSize { get { return resizerSize; } set { resizerSize = value; } } /// /// Gets or sets the ContextMenu associated with this control. /// public virtual ContextMenu ContextMenu { get { return contextMenu; } set { contextMenu = value; } } /// /// Gets or sets a value indicating whether this control should process mouse double-clicks. /// public virtual bool DoubleClicks { get { return doubleClicks; } set { doubleClicks = value; } } /// /// Gets or sets a value indicating whether this control should use ouline resizing. /// public virtual bool OutlineResizing { get { return outlineResizing; } set { outlineResizing = value; } } /// /// Gets or sets a value indicating whether this control should use outline moving. /// public virtual bool OutlineMoving { get { return outlineMoving; } set { outlineMoving = value; } } /// /// Gets or sets the object that contains data about the control. /// public virtual object Tag { get { return tag; } set { tag = value; } } /// /// Gets or sets the value indicating the distance from another control. Usable with StackPanel control. /// public virtual Margins Margins { get { return margins; } set { margins = value; } } /// /// Gets or sets the value indicating wheter control is in design mode. /// public virtual bool DesignMode { get { return designMode; } set { designMode = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets gamepad actions for the control. /// public virtual GamePadActions GamePadActions { get { return gamePadActions; } set { gamePadActions = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the value indicating whether the control outline is displayed only for certain edges. /// public virtual bool PartialOutline { get { return partialOutline; } set { partialOutline = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the value indicating whether the control is allowed to be brought in the front. /// public virtual bool StayOnBack { get { return stayOnBack; } set { if (value && stayOnTop) stayOnTop = false; stayOnBack = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the value indicating that the control should stay on top of other controls. /// public virtual bool StayOnTop { get { return stayOnTop; } set { if (value && stayOnBack) stayOnBack = false; stayOnTop = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets a name of the control. /// public virtual string Name { get { return name; } set { name = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets a value indicating whether this control has input focus. /// public virtual bool Focused { get { return (Manager.FocusedControl == this); } set { this.Invalidate(); if (value) { bool f = Focused; Manager.FocusedControl = this; if (!Suspended && value && !f) OnFocusGained(new EventArgs()); if (Focused && Root != null && Root is Container) { (Root as Container).ScrollTo(this); } } else { bool f = Focused; if (Manager.FocusedControl == this) Manager.FocusedControl = null; if (!Suspended && !value && f) OnFocusLost(new EventArgs()); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets a value indicating current state of the control. /// public virtual ControlState ControlState { get { if (DesignMode) return ControlState.Enabled; else if (Suspended) return ControlState.Disabled; else { if (!enabled) return ControlState.Disabled; if ((IsPressed && inside) || (Focused && IsPressed)) return ControlState.Pressed; else if (hovered && !IsPressed) return ControlState.Hovered; else if ((Focused && !inside) || (hovered && IsPressed && !inside) || (Focused && !hovered && inside)) return ControlState.Focused; else return ControlState.Enabled; } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual Type ToolTipType { get { return toolTipType; } set { toolTipType = value; if (toolTip != null) { toolTip.Dispose(); toolTip = null; } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual ToolTip ToolTip { get { if (toolTip == null) { Type[] t = new Type[1] {typeof(Manager)}; object[] p = new object[1] {Manager}; toolTip = (ToolTip)toolTipType.GetConstructor(t).Invoke(p); toolTip.Init(); toolTip.Visible = false; } return toolTip; } set { toolTip = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// internal protected virtual bool IsPressed { get { for (int i = 0; i < pressed.Length - 1; i++) { if (pressed[i]) return true; } return false; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// internal virtual int TopModifier { get { return topModifier; } set { topModifier = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// internal virtual int LeftModifier { get { return leftModifier; } set { leftModifier = value; } } //////////////////////////////////////////////////////////////////////////// internal virtual int VirtualHeight { get { return GetVirtualHeight(); } //set { virtualHeight = value; } } //////////////////////////////////////////////////////////////////////////// internal virtual int VirtualWidth { get { return GetVirtualWidth(); } //set { virtualWidth = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets an area where is the control supposed to be drawn. /// public Rectangle DrawingRect { get { return drawingRect; } private set { drawingRect = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets a value indicating whether this control should receive any events. /// public virtual bool Suspended { get { return suspended; } set { suspended = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// internal protected virtual bool Hovered { get { return hovered; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// internal protected virtual bool Inside { get { return inside; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// internal protected virtual bool[] Pressed { get { return pressed; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets a value indicating whether this controls is currently being moved. /// protected virtual bool IsMoving { get { return isMoving; } set { isMoving = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets a value indicating whether this controls is currently being resized. /// protected virtual bool IsResizing { get { return isResizing; } set { isResizing = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the edges of the container to which a control is bound and determines how a control is resized with its parent. /// public virtual Anchors Anchor { get { return anchor; } set { anchor = value; SetAnchorMargins(); if (!Suspended) OnAnchorChanged(new EventArgs()); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the edges of the contol which are allowed for resizing. /// public virtual Anchors ResizeEdge { get { return resizeEdge; } set { resizeEdge = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the skin used for rendering the control. /// public virtual SkinControl Skin { get { return skin; } set { skin = value; ClientMargins = skin.ClientMargins; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the text associated with this control. /// public virtual string Text { get { return text; } set { text = value; Invalidate(); if (!Suspended) OnTextChanged(new EventArgs()); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the alpha value for this control. /// public virtual byte Alpha { get { return alpha; } set { alpha = value; if (!Suspended) OnAlphaChanged(new EventArgs()); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the background color for the control. /// public virtual Color BackColor { get { return backColor; } set { backColor = value; Invalidate(); if (!Suspended) OnBackColorChanged(new EventArgs()); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the color for the control. /// public virtual Color Color { get { return color; } set { if (value != color) { color = value; Invalidate(); if (!Suspended) OnColorChanged(new EventArgs()); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the text color for the control. /// public virtual Color TextColor { get { return textColor; } set { if (value != textColor) { textColor = value; Invalidate(); if (!Suspended) OnTextColorChanged(new EventArgs()); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets a value indicating whether the control can respond to user interaction. /// public virtual bool Enabled { get { return enabled; } set { if (Root != null && Root != this && !Root.Enabled && value) return; enabled = value; Invalidate(); foreach (Control c in controls) { c.Enabled = value; } if (!Suspended) OnEnabledChanged(new EventArgs()); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets a value that indicates whether the control is rendered. /// public virtual bool Visible { get { return (visible && (parent == null || parent.Visible)); } set { visible = value; Invalidate(); if (!Suspended) OnVisibleChanged(new EventArgs()); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the parent for the control. /// public virtual Control Parent { get { return parent; } set { if (parent != value) { if (value != null) value.Add(this); else Manager.Add(this); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the root for the control. /// public virtual Control Root { get { return root; } private set { if (root != value) { root = value; foreach (Control c in controls) { c.Root = root; } if (!Suspended) OnRootChanged(new EventArgs()); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the distance, in pixels, between the left edge of the control and the left edge of its parent. /// public virtual int Left { get { return left; } set { if (left != value) { int old = left; left = value; SetAnchorMargins(); if (!Suspended) OnMove(new MoveEventArgs(left, top, old, top)); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the distance, in pixels, between the top edge of the control and the top edge of its parent. /// public virtual int Top { get { return top; } set { if (top != value) { int old = top; top = value; SetAnchorMargins(); if (!Suspended) OnMove(new MoveEventArgs(left, top, left, old)); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the width of the control. /// public virtual int Width { get { return width; } set { if (width != value) { int old = width; width = value; if (skin != null) { if (width + skin.OriginMargins.Horizontal > MaximumWidth) width = MaximumWidth - skin.OriginMargins.Horizontal; } else { if (width > MaximumWidth) width = MaximumWidth; } if (width < MinimumWidth) width = MinimumWidth; if (width > 0) SetAnchorMargins(); if (!Suspended) OnResize(new ResizeEventArgs(width, height, old, height)); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the height of the control. /// public virtual int Height { get { return height; } set { if (height != value) { int old = height; height = value; if (skin != null) { if (height + skin.OriginMargins.Vertical > MaximumHeight) height = MaximumHeight - skin.OriginMargins.Vertical; } else { if (height > MaximumHeight) height = MaximumHeight; } if (height < MinimumHeight) height = MinimumHeight; if (height > 0) SetAnchorMargins(); if (!Suspended) OnResize(new ResizeEventArgs(width, height, width, old)); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the minimum width in pixels the control can be sized to. /// public virtual int MinimumWidth { get { return minimumWidth; } set { minimumWidth = value; if (minimumWidth < 0) minimumWidth = 0; if (minimumWidth > maximumWidth) minimumWidth = maximumWidth; if (width < MinimumWidth) Width = MinimumWidth; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// /// Gets or sets the minimum height in pixels the control can be sized to. /// public virtual int MinimumHeight { get { return minimumHeight; } set { minimumHeight = value; if (minimumHeight < 0) minimumHeight = 0; if (minimumHeight > maximumHeight) minimumHeight = maximumHeight; if (height < MinimumHeight) Height = MinimumHeight; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// /// Gets or sets the maximum width in pixels the control can be sized to. /// public virtual int MaximumWidth { get { int max = maximumWidth; if (max > Manager.TargetWidth) max = Manager.TargetWidth; return max; } set { maximumWidth = value; if (maximumWidth < minimumWidth) maximumWidth = minimumWidth; if (width > MaximumWidth) Width = MaximumWidth; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// /// Gets or sets the maximum height in pixels the control can be sized to. /// public virtual int MaximumHeight { get { int max = maximumHeight; if (max > Manager.TargetHeight) max = Manager.TargetHeight; return max; } set { maximumHeight = value; if (maximumHeight < minimumHeight) maximumHeight = minimumHeight; if (height > MaximumHeight) Height = MaximumHeight; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual int AbsoluteLeft { get { if (parent == null) return left + LeftModifier; else if (parent.Skin == null) return parent.AbsoluteLeft + left + LeftModifier; else return parent.AbsoluteLeft + left - parent.Skin.OriginMargins.Left + LeftModifier; } } //////////////////////////////////////////////////////////////////////////// public virtual int AbsoluteTop { get { if (parent == null) return top + TopModifier; else if (parent.Skin == null) return parent.AbsoluteTop + top + TopModifier; else return parent.AbsoluteTop + top - parent.Skin.OriginMargins.Top + TopModifier; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual int OriginLeft { get { if (skin == null) return AbsoluteLeft; return AbsoluteLeft - skin.OriginMargins.Left; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual int OriginTop { get { if (skin == null) return AbsoluteTop; return AbsoluteTop - skin.OriginMargins.Top; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual int OriginWidth { get { if (skin == null) return width; return width + skin.OriginMargins.Left + skin.OriginMargins.Right; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual int OriginHeight { get { if (skin == null) return height; return height + skin.OriginMargins.Top + skin.OriginMargins.Bottom; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual Margins ClientMargins { get { return clientMargins; } set { clientMargins = value; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual int ClientLeft { get { //if (skin == null) return Left; return ClientMargins.Left; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual int ClientTop { get { //if (skin == null) return Top; return ClientMargins.Top; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual int ClientWidth { get { //if (skin == null) return Width; return OriginWidth - ClientMargins.Left - ClientMargins.Right; } set { Width = value + ClientMargins.Horizontal - skin.OriginMargins.Horizontal; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual int ClientHeight { get { //if (skin == null) return Height; return OriginHeight - ClientMargins.Top - ClientMargins.Bottom; } set { Height = value + ClientMargins.Vertical - skin.OriginMargins.Vertical; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual Rectangle AbsoluteRect { get { return new Rectangle(AbsoluteLeft, AbsoluteTop, OriginWidth, OriginHeight); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual Rectangle OriginRect { get { return new Rectangle(OriginLeft, OriginTop, OriginWidth, OriginHeight); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual Rectangle ClientRect { get { return new Rectangle(ClientLeft, ClientTop, ClientWidth, ClientHeight); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual Rectangle ControlRect { get { return new Rectangle(Left, Top, Width, Height); } set { Left = value.Left; Top = value.Top; Width = value.Width; Height = value.Height; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private Rectangle OutlineRect { get { return outlineRect; } set { outlineRect = value; if (value != Rectangle.Empty) { if (outlineRect.Width > MaximumWidth) outlineRect.Width = MaximumWidth; if (outlineRect.Height > MaximumHeight) outlineRect.Height = MaximumHeight; if (outlineRect.Width < MinimumWidth) outlineRect.Width = MinimumWidth; if (outlineRect.Height < MinimumHeight) outlineRect.Height = MinimumHeight; } } } //////////////////////////////////////////////////////////////////////////// #endregion #region //// Events //////////// //////////////////////////////////////////////////////////////////////////// public event EventHandler Click; public event EventHandler DoubleClick; public event MouseEventHandler MouseDown; public event MouseEventHandler MousePress; public event MouseEventHandler MouseUp; public event MouseEventHandler MouseMove; public event MouseEventHandler MouseOver; public event MouseEventHandler MouseOut; /// /// Occurs when the mouse scroll wheel position changes /// public event MouseEventHandler MouseScroll; public event KeyEventHandler KeyDown; public event KeyEventHandler KeyPress; public event KeyEventHandler KeyUp; public event GamePadEventHandler GamePadDown; public event GamePadEventHandler GamePadUp; public event GamePadEventHandler GamePadPress; public event MoveEventHandler Move; public event MoveEventHandler ValidateMove; public event ResizeEventHandler Resize; public event ResizeEventHandler ValidateResize; public event DrawEventHandler Draw; public event EventHandler MoveBegin; public event EventHandler MoveEnd; public event EventHandler ResizeBegin; public event EventHandler ResizeEnd; public event EventHandler ColorChanged; public event EventHandler TextColorChanged; public event EventHandler BackColorChanged; public event EventHandler TextChanged; public event EventHandler AnchorChanged; public event EventHandler SkinChanging; public event EventHandler SkinChanged; public event EventHandler ParentChanged; public event EventHandler RootChanged; public event EventHandler VisibleChanged; public event EventHandler EnabledChanged; public event EventHandler AlphaChanged; public event EventHandler FocusLost; public event EventHandler FocusGained; public event DrawEventHandler DrawTexture; //////////////////////////////////////////////////////////////////////////// #endregion #region //// Constructors ////// //////////////////////////////////////////////////////////////////////////// public Control(Manager manager): base(manager) { if (Manager == null) { throw new Exception("Control cannot be created. Manager instance is needed."); } else if (Manager.Skin == null) { throw new Exception("Control cannot be created. No skin loaded."); } text = Utilities.DeriveControlName(this); root = this; InitSkin(); CheckLayer(skin, "Control"); if (Skin != null) { SetDefaultSize(width, height); SetMinimumSize(MinimumWidth, MinimumHeight); ResizerSize = skin.ResizerSize; } Stack.Add(this); } //////////////////////////////////////////////////////////////////////////// #endregion #region //// Destructors /////// //////////////////////////////////////////////////////////////////////////// protected override void Dispose(bool disposing) { if (disposing) { if (parent != null) parent.Remove(this); else if (Manager != null) Manager.Remove(this); if (Manager.OrderList != null) Manager.OrderList.Remove(this); // Possibly we added the menu to another parent than this control, // so we dispose it manually, beacause in logic it belongs to this control. if (contextMenu != null) { contextMenu.Dispose(); contextMenu = null; } // Recursively disposing all controls. The collection might change from its children, // so we check it on count greater than zero. if (controls != null) { int c = controls.Count; for (int i = 0; i < c; i++) { if (controls.Count > 0) { controls[0].Dispose(); } } } // Disposes tooltip owned by Manager if (toolTip != null && !Manager.Disposing) { toolTip.Dispose(); toolTip = null; } // Removing this control from the global stack. Stack.Remove(this); if (target != null) { target.Dispose(); target = null; } } base.Dispose(disposing); } //////////////////////////////////////////////////////////////////////////// #endregion #region //// Methods /////////// #region //// Private /////////// //////////////////////////////////////////////////////////////////////////// private int GetVirtualHeight() { if (this.Parent is Container && (this.Parent as Container).AutoScroll) { int maxy = 0; foreach (Control c in Controls) { if ((c.Anchor & Anchors.Bottom) != Anchors.Bottom && c.Visible) { if (c.Top + c.Height > maxy) maxy = c.Top + c.Height; } } if (maxy < Height) maxy = Height; return maxy; } else { return Height; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private int GetVirtualWidth() { if (this.Parent is Container && (this.Parent as Container).AutoScroll) { int maxx = 0; foreach (Control c in Controls) { if ((c.Anchor & Anchors.Right) != Anchors.Right && c.Visible) { if (c.Left + c.Width > maxx) maxx = c.Left + c.Width; } } if (maxx < Width) maxx = Width; return maxx; } else { return Width; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private Rectangle GetClippingRect(Control c) { Rectangle r = Rectangle.Empty; r = new Rectangle(c.OriginLeft - root.AbsoluteLeft, c.OriginTop - root.AbsoluteTop, c.OriginWidth, c.OriginHeight); int x1 = r.Left; int x2 = r.Right; int y1 = r.Top; int y2 = r.Bottom; Control ctrl = c.Parent; while (ctrl != null) { int cx1 = ctrl.OriginLeft - root.AbsoluteLeft; int cy1 = ctrl.OriginTop - root.AbsoluteTop; int cx2 = cx1 + ctrl.OriginWidth; int cy2 = cy1 + ctrl.OriginHeight; if (x1 < cx1) x1 = cx1; if (y1 < cy1) y1 = cy1; if (x2 > cx2) x2 = cx2; if (y2 > cy2) y2 = cy2; ctrl = ctrl.Parent; } int fx2 = x2 - x1; int fy2 = y2 - y1; if (x1 < 0) x1 = 0; if (y1 < 0) y1 = 0; if (fx2 < 0) fx2 = 0; if (fy2 < 0) fy2 = 0; if (x1 > root.Width) { x1 = root.Width; } if (y1 > root.Height){ y1 = root.Height; } if (fx2 > root.Width) fx2 = root.Width; if (fy2 > root.Height) fy2 = root.Height; Rectangle ret = new Rectangle(x1, y1, fx2, fy2); return ret; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private RenderTarget2D CreateRenderTarget(int width, int height) { if (width > 0 && height > 0) { return new RenderTarget2D(Manager.GraphicsDevice, width, height, false, SurfaceFormat.Color, DepthFormat.None, Manager.GraphicsDevice.PresentationParameters.MultiSampleCount, Manager._RenderTargetUsage); } return null; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// internal virtual void PrepareTexture(Renderer renderer, GameTime gameTime) { if (visible) { if (invalidated) { OnDrawTexture(new DrawEventArgs(renderer, new Rectangle(0, 0, OriginWidth, OriginHeight), gameTime)); if (target == null || target.Width < OriginWidth || target.Height < OriginHeight) { if (target != null) { target.Dispose(); target = null; } int w = OriginWidth + (Manager.TextureResizeIncrement - (OriginWidth % Manager.TextureResizeIncrement)); int h = OriginHeight + (Manager.TextureResizeIncrement - (OriginHeight % Manager.TextureResizeIncrement)); if (h > Manager.TargetHeight) h = Manager.TargetHeight; if (w > Manager.TargetWidth) w = Manager.TargetWidth; target = CreateRenderTarget(w, h); } if (target != null) { Manager.GraphicsDevice.SetRenderTarget(target); target.GraphicsDevice.Clear(backColor); Rectangle rect = new Rectangle(0, 0, OriginWidth, OriginHeight); DrawControls(renderer, rect, gameTime, false); Manager.GraphicsDevice.SetRenderTarget(null); } invalidated = false; } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private bool CheckDetached(Control c) { Control parent = c.Parent; while (parent != null) { if (parent.Detached) { return true; } parent = parent.Parent; } return c.Detached; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void DrawChildControls(Renderer renderer, GameTime gameTime, bool firstDetachedLevel) { if (controls != null) { foreach (Control c in controls) { // We skip detached controls for first level after root (they are rendered separately in Draw() method) if (((c.Root == c.Parent && !c.Detached) || c.Root != c.Parent) && AbsoluteRect.Intersects(c.AbsoluteRect) && c.visible) { Manager.GraphicsDevice.ScissorRectangle = GetClippingRect(c); Rectangle rect = new Rectangle(c.OriginLeft - root.AbsoluteLeft, c.OriginTop - root.AbsoluteTop, c.OriginWidth, c.OriginHeight); if (c.Root != c.Parent && ((!c.Detached && CheckDetached(c)) || firstDetachedLevel)) { rect = new Rectangle(c.OriginLeft, c.OriginTop, c.OriginWidth, c.OriginHeight); Manager.GraphicsDevice.ScissorRectangle = rect; } renderer.Begin(BlendingMode.Default); c.DrawingRect = rect; c.DrawControl(renderer, rect, gameTime); DrawEventArgs args = new DrawEventArgs(); args.Rectangle = rect; args.Renderer = renderer; args.GameTime = gameTime; c.OnDraw(args); renderer.End(); c.DrawChildControls(renderer, gameTime, firstDetachedLevel); c.DrawOutline(renderer, true); } } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void DrawControls(Renderer renderer, Rectangle rect, GameTime gameTime, bool firstDetach) { renderer.Begin(BlendingMode.Default); DrawingRect = rect; DrawControl(renderer, rect, gameTime); DrawEventArgs args = new DrawEventArgs(); args.Rectangle = rect; args.Renderer = renderer; args.GameTime = gameTime; OnDraw(args); renderer.End(); DrawChildControls(renderer, gameTime, firstDetach); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void DrawDetached(Control control, Renderer renderer, GameTime gameTime) { if (control.Controls != null) { foreach (Control c in control.Controls) { if (c.Detached && c.Visible) { c.DrawControls(renderer, new Rectangle(c.OriginLeft, c.OriginTop, c.OriginWidth, c.OriginHeight), gameTime, true); } } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// internal virtual void Render(Renderer renderer, GameTime gameTime) { if (visible && target != null) { bool draw = true; if (draw) { renderer.Begin(BlendingMode.Default); renderer.Draw(target, OriginLeft, OriginTop, new Rectangle(0, 0, OriginWidth, OriginHeight), Color.FromNonPremultiplied(255, 255, 255, Alpha)); renderer.End(); DrawDetached(this, renderer, gameTime); DrawOutline(renderer, false); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void DrawOutline(Renderer renderer, bool child) { if (!OutlineRect.IsEmpty) { Rectangle r = OutlineRect; if (child) { r = new Rectangle(OutlineRect.Left + (parent.AbsoluteLeft - root.AbsoluteLeft), OutlineRect.Top + (parent.AbsoluteTop - root.AbsoluteTop), OutlineRect.Width, OutlineRect.Height); } Texture2D t = Manager.Skin.Controls["Control.Outline"].Layers[0].Image.Resource; int s = resizerSize; Rectangle r1 = new Rectangle(r.Left + leftModifier, r.Top + topModifier, r.Width, s); Rectangle r2 = new Rectangle(r.Left + leftModifier, r.Top + s + topModifier, resizerSize, r.Height - (2 * s)); Rectangle r3 = new Rectangle(r.Right - s + leftModifier, r.Top + s + topModifier, s, r.Height - (2 * s)); Rectangle r4 = new Rectangle(r.Left + leftModifier, r.Bottom - s + topModifier, r.Width, s); Color c = Manager.Skin.Controls["Control.Outline"].Layers[0].States.Enabled.Color; renderer.Begin(BlendingMode.Default); if ((ResizeEdge & Anchors.Top) == Anchors.Top || !partialOutline) renderer.Draw(t, r1, c); if ((ResizeEdge & Anchors.Left) == Anchors.Left || !partialOutline) renderer.Draw(t, r2, c); if ((ResizeEdge & Anchors.Right) == Anchors.Right || !partialOutline) renderer.Draw(t, r3, c); if ((ResizeEdge & Anchors.Bottom) == Anchors.Bottom || !partialOutline) renderer.Draw(t, r4, c); renderer.End(); } else if (DesignMode && Focused) { Rectangle r = ControlRect; if (child) { r = new Rectangle(r.Left + (parent.AbsoluteLeft - root.AbsoluteLeft), r.Top + (parent.AbsoluteTop - root.AbsoluteTop), r.Width, r.Height); } Texture2D t = Manager.Skin.Controls["Control.Outline"].Layers[0].Image.Resource; int s = resizerSize; Rectangle r1 = new Rectangle(r.Left + leftModifier, r.Top + topModifier, r.Width, s); Rectangle r2 = new Rectangle(r.Left + leftModifier, r.Top + s + topModifier, resizerSize, r.Height - (2 * s)); Rectangle r3 = new Rectangle(r.Right - s + leftModifier, r.Top + s + topModifier, s, r.Height - (2 * s)); Rectangle r4 = new Rectangle(r.Left + leftModifier, r.Bottom - s + topModifier, r.Width, s); Color c = Manager.Skin.Controls["Control.Outline"].Layers[0].States.Enabled.Color; renderer.Begin(BlendingMode.Default); renderer.Draw(t, r1, c); renderer.Draw(t, r2, c); renderer.Draw(t, r3, c); renderer.Draw(t, r4, c); renderer.End(); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void SetPosition(int left, int top) { this.left = left; this.top = top; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void SetSize(int width, int height) { this.width = width; this.height = height; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// internal void SetAnchorMargins() { if (Parent != null) { anchorMargins.Left = Left; anchorMargins.Top = Top; anchorMargins.Right = Parent.VirtualWidth - Width - Left; anchorMargins.Bottom = Parent.VirtualHeight - Height - Top; } else { anchorMargins = new Margins(); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void ProcessAnchor(ResizeEventArgs e) { if (((Anchor & Anchors.Right) == Anchors.Right) && ((Anchor & Anchors.Left) != Anchors.Left)) { Left = Parent.VirtualWidth - Width - anchorMargins.Right; } else if (((Anchor & Anchors.Right) == Anchors.Right) && ((Anchor & Anchors.Left) == Anchors.Left)) { Width = Parent.VirtualWidth - Left - anchorMargins.Right; } else if (((Anchor & Anchors.Right) != Anchors.Right) && ((Anchor & Anchors.Left) != Anchors.Left)) { int diff = (e.Width - e.OldWidth); if (e.Width % 2 != 0 && diff != 0) { diff += (diff / Math.Abs(diff)); } Left += (diff / 2); } if (((Anchor & Anchors.Bottom) == Anchors.Bottom) && ((Anchor & Anchors.Top) != Anchors.Top)) { Top = Parent.VirtualHeight - Height - anchorMargins.Bottom; } else if (((Anchor & Anchors.Bottom) == Anchors.Bottom) && ((Anchor & Anchors.Top) == Anchors.Top)) { Height = Parent.VirtualHeight - Top - anchorMargins.Bottom; } else if (((Anchor & Anchors.Bottom) != Anchors.Bottom) && ((Anchor & Anchors.Top) != Anchors.Top)) { int diff = (e.Height - e.OldHeight); if (e.Height % 2 != 0 && diff != 0) { diff += (diff / Math.Abs(diff)); } Top += (diff / 2); } } //////////////////////////////////////////////////////////////////////////// #endregion #region //// Protected ///////// //////////////////////////////////////////////////////////////////////////// public override void Init() { base.Init(); OnMove(new MoveEventArgs()); OnResize(new ResizeEventArgs()); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected internal virtual void InitSkin() { if (Manager != null && Manager.Skin != null && Manager.Skin.Controls != null) { SkinControl s = Manager.Skin.Controls[Utilities.DeriveControlName(this)]; if (s != null) Skin = new SkinControl(s); else Skin = new SkinControl(Manager.Skin.Controls["Control"]); } else { throw new Exception("Control skin cannot be initialized. No skin loaded."); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void SetDefaultSize(int width, int height) { if (skin.DefaultSize.Width > 0) Width = skin.DefaultSize.Width; else Width = width; if (skin.DefaultSize.Height > 0) Height = skin.DefaultSize.Height; else Height = height; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void SetMinimumSize(int minimumWidth, int minimumHeight) { if (skin.MinimumSize.Width > 0) MinimumWidth = skin.MinimumSize.Width; else MinimumWidth = minimumWidth; if (skin.MinimumSize.Height > 0) MinimumHeight = skin.MinimumSize.Height; else MinimumHeight = minimumHeight; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected internal void OnDeviceSettingsChanged(DeviceEventArgs e) { if (!e.Handled) { Invalidate(); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void DrawControl(Renderer renderer, Rectangle rect, GameTime gameTime) { if (backColor != UndefinedColor && backColor != Color.Transparent) { renderer.Draw(Manager.Skin.Images["Control"].Resource, rect, backColor); } renderer.DrawLayer(this, skin.Layers[0], rect); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected internal override void Update(GameTime gameTime) { base.Update(gameTime); ToolTipUpdate(); if (controls != null) { ControlsList list = new ControlsList(); list.AddRange(controls); foreach (Control c in list) { c.Update(gameTime); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected internal virtual void CheckLayer(SkinControl skin, string layer) { if (!(skin != null && skin.Layers != null && skin.Layers.Count > 0 && skin.Layers[layer] != null)) { throw new Exception("Unable to read skin layer \"" + layer + "\" for control \"" + Utilities.DeriveControlName(this) + "\"."); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected internal virtual void CheckLayer(SkinControl skin, int layer) { if (!(skin != null && skin.Layers != null && skin.Layers.Count > 0 && skin.Layers[layer] != null)) { throw new Exception("Unable to read skin layer with index \"" + layer.ToString() + "\" for control \"" + Utilities.DeriveControlName(this) + "\"."); } } //////////////////////////////////////////////////////////////////////////// #endregion #region //// Public //////////// //////////////////////////////////////////////////////////////////////////// public virtual Control GetControl(string name) { Control ret = null; foreach (Control c in Controls) { if (c.Name.ToLower() == name.ToLower()) { ret = c; break; } else { ret = c.GetControl(name); if (ret != null) break; } } return ret; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void Add(Control control) { if (control != null) { if (!controls.Contains(control)) { if (control.Parent != null) control.Parent.Remove(control); else Manager.Remove(control); control.Manager = Manager; control.parent = this; control.Root = root; control.Enabled = (Enabled ? control.Enabled : Enabled); controls.Add(control); virtualHeight = GetVirtualHeight(); virtualWidth = GetVirtualWidth(); Manager.DeviceSettingsChanged += new DeviceEventHandler(control.OnDeviceSettingsChanged); Manager.SkinChanging += new SkinEventHandler(control.OnSkinChanging); Manager.SkinChanged += new SkinEventHandler(control.OnSkinChanged); Resize += new ResizeEventHandler(control.OnParentResize); control.SetAnchorMargins(); if (!Suspended) OnParentChanged(new EventArgs()); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void Remove(Control control) { if (control != null) { if (control.Focused && control.Root != null) control.Root.Focused = true; else if (control.Focused) control.Focused = false; controls.Remove(control); control.parent = null; control.Root = control; Resize -= control.OnParentResize; Manager.DeviceSettingsChanged -= control.OnDeviceSettingsChanged; Manager.SkinChanging -= control.OnSkinChanging; Manager.SkinChanged -= control.OnSkinChanged; if (!Suspended) OnParentChanged(new EventArgs()); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual bool Contains(Control control, bool recursively) { if (Controls != null) { foreach (Control c in Controls) { if (c == control) return true; if (recursively && c.Contains(control, true)) return true; } } return false; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void Invalidate() { invalidated = true; if (parent != null) { parent.Invalidate(); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void BringToFront() { if (Manager != null) Manager.BringToFront(this); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void SendToBack() { if (Manager != null) Manager.SendToBack(this); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void Show() { Visible = true; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void Hide() { Visible = false; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void Refresh() { OnMove(new MoveEventArgs(left, top, left, top)); OnResize(new ResizeEventArgs(width, height, width, height)); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void SendMessage(Message message, EventArgs e) { MessageProcess(message, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void MessageProcess(Message message, EventArgs e) { switch (message) { case Message.Click: { ClickProcess(e as MouseEventArgs); break; } case Message.MouseDown: { MouseDownProcess(e as MouseEventArgs); break; } case Message.MouseUp: { MouseUpProcess(e as MouseEventArgs); break; } case Message.MousePress: { MousePressProcess(e as MouseEventArgs); break; } case Message.MouseScroll: { MouseScrollProcess(e as MouseEventArgs); break; } case Message.MouseMove: { MouseMoveProcess(e as MouseEventArgs); break; } case Message.MouseOver: { MouseOverProcess(e as MouseEventArgs); break; } case Message.MouseOut: { MouseOutProcess(e as MouseEventArgs); break; } case Message.GamePadDown: { GamePadDownProcess(e as GamePadEventArgs); break; } case Message.GamePadUp: { GamePadUpProcess(e as GamePadEventArgs); break; } case Message.GamePadPress: { GamePadPressProcess(e as GamePadEventArgs); break; } case Message.KeyDown: { KeyDownProcess(e as KeyEventArgs); break; } case Message.KeyUp: { KeyUpProcess(e as KeyEventArgs); break; } case Message.KeyPress: { KeyPressProcess(e as KeyEventArgs); break; } } } //////////////////////////////////////////////////////////////////////////// #endregion #region //// GamePad /////////// //////////////////////////////////////////////////////////////////////////// private void GamePadPressProcess(GamePadEventArgs e) { Invalidate(); if (!Suspended) OnGamePadPress(e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void GamePadUpProcess(GamePadEventArgs e) { Invalidate(); if (e.Button == GamePadActions.Press && pressed[(int)e.Button]) { pressed[(int)e.Button] = false; } if (!Suspended) OnGamePadUp(e); if (e.Button == GamePadActions.ContextMenu && !e.Handled) { if (contextMenu != null) { contextMenu.Show(this, AbsoluteLeft + 8, AbsoluteTop + 8); } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void GamePadDownProcess(GamePadEventArgs e) { Invalidate(); ToolTipOut(); if (e.Button == GamePadActions.Press && !IsPressed) { pressed[(int)e.Button] = true; } if (!Suspended) OnGamePadDown(e); } //////////////////////////////////////////////////////////////////////////// #endregion #region //// Keyboard ////////// //////////////////////////////////////////////////////////////////////////// private void KeyPressProcess(KeyEventArgs e) { Invalidate(); if (!Suspended) OnKeyPress(e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void KeyDownProcess(KeyEventArgs e) { Invalidate(); ToolTipOut(); if (e.Key == Microsoft.Xna.Framework.Input.Keys.Space && !IsPressed) { pressed[(int)MouseButton.None] = true; } if (!Suspended) OnKeyDown(e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void KeyUpProcess(KeyEventArgs e) { Invalidate(); if (e.Key == Microsoft.Xna.Framework.Input.Keys.Space && pressed[(int)MouseButton.None]) { pressed[(int)MouseButton.None] = false; } if (!Suspended) OnKeyUp(e); if (e.Key == Microsoft.Xna.Framework.Input.Keys.Apps && !e.Handled) { if (contextMenu != null) { contextMenu.Show(this, AbsoluteLeft + 8, AbsoluteTop + 8); } } } //////////////////////////////////////////////////////////////////////////// #endregion #region //// Mouse ///////////// //////////////////////////////////////////////////////////////////////////// private void MouseDownProcess(MouseEventArgs e) { Invalidate(); pressed[(int)e.Button] = true; if (e.Button == MouseButton.Left) { pressSpot = new Point(TransformPosition(e).Position.X, TransformPosition(e).Position.Y); if (CheckResizableArea(e.Position)) { pressDiff[0] = pressSpot.X; pressDiff[1] = pressSpot.Y; pressDiff[2] = Width - pressSpot.X; pressDiff[3] = Height - pressSpot.Y; IsResizing = true; if (outlineResizing) OutlineRect = ControlRect; if (!Suspended) OnResizeBegin(e); } else if (CheckMovableArea(e.Position)) { IsMoving = true; if (outlineMoving) OutlineRect = ControlRect; if (!Suspended) OnMoveBegin(e); } } ToolTipOut(); if (!Suspended) OnMouseDown(TransformPosition(e)); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void MouseUpProcess(MouseEventArgs e) { Invalidate(); if (pressed[(int)e.Button] || isMoving || isResizing) { pressed[(int)e.Button] = false; if (e.Button == MouseButton.Left) { if (IsResizing) { IsResizing = false; if (outlineResizing) { Left = OutlineRect.Left; Top = OutlineRect.Top; Width = OutlineRect.Width; Height = OutlineRect.Height; OutlineRect = Rectangle.Empty; } if (!Suspended) OnResizeEnd(e); } else if (IsMoving) { IsMoving = false; if (outlineMoving) { Left = OutlineRect.Left; Top = OutlineRect.Top; OutlineRect = Rectangle.Empty; } if (!Suspended) OnMoveEnd(e); } } if (!Suspended) OnMouseUp(TransformPosition(e)); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// void MousePressProcess(MouseEventArgs e) { if (pressed[(int)e.Button] && !IsMoving && !IsResizing) { if (!Suspended) OnMousePress(TransformPosition(e)); } } //////////////////////////////////////////////////////////////////////////// void MouseScrollProcess(MouseEventArgs e) { if (!IsMoving && !IsResizing && !Suspended) { OnMouseScroll(e); } } //////////////////////////////////////////////////////////////////////////// private void MouseOverProcess(MouseEventArgs e) { Invalidate(); hovered = true; ToolTipOver(); #if (!XBOX && !XBOX_FAKE) if (cursor != null && Manager.Cursor != cursor) Manager.Cursor = cursor; #endif if (!Suspended) OnMouseOver(e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void MouseOutProcess(MouseEventArgs e) { Invalidate(); hovered = false; ToolTipOut(); #if (!XBOX && !XBOX_FAKE) Manager.Cursor = Manager.Skin.Cursors["Default"].Resource; #endif if (!Suspended) OnMouseOut(e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void MouseMoveProcess(MouseEventArgs e) { if (CheckPosition(e.Position) && !inside) { inside = true; Invalidate(); } else if (!CheckPosition(e.Position) && inside) { inside = false; Invalidate(); } PerformResize(e); if (!IsResizing && IsMoving) { int x = (parent != null) ? parent.AbsoluteLeft : 0; int y = (parent != null) ? parent.AbsoluteTop : 0; int l = e.Position.X - x - pressSpot.X - leftModifier; int t = e.Position.Y - y - pressSpot.Y - topModifier; if (!Suspended) { MoveEventArgs v = new MoveEventArgs(l, t, Left, Top); OnValidateMove(v); l = v.Left; t = v.Top; } if (outlineMoving) { OutlineRect = new Rectangle(l, t, OutlineRect.Width, OutlineRect.Height); if (parent != null) parent.Invalidate(); } else { Left = l; Top = t; } } if (!Suspended) { OnMouseMove(TransformPosition(e)); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void ClickProcess(EventArgs e) { long timer = (long)TimeSpan.FromTicks(DateTime.Now.Ticks).TotalMilliseconds; MouseEventArgs ex = (e is MouseEventArgs) ? (MouseEventArgs)e : new MouseEventArgs(); if ((doubleClickTimer == 0 || (timer - doubleClickTimer > Manager.DoubleClickTime)) || !doubleClicks) { TimeSpan ts = new TimeSpan(DateTime.Now.Ticks); doubleClickTimer = (long)ts.TotalMilliseconds; doubleClickButton = ex.Button; if (!Suspended) OnClick(e); } else if (timer - doubleClickTimer <= Manager.DoubleClickTime && (ex.Button == doubleClickButton && ex.Button != MouseButton.None)) { doubleClickTimer = 0; if (!Suspended) OnDoubleClick(e); } else { doubleClickButton = MouseButton.None; } if (ex.Button == MouseButton.Right && contextMenu != null && !e.Handled) { contextMenu.Show(this, ex.Position.X, ex.Position.Y); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void ToolTipUpdate() { if (Manager.ToolTipsEnabled && toolTip != null && tooltipTimer > 0 && (TimeSpan.FromTicks(DateTime.Now.Ticks).TotalMilliseconds - tooltipTimer) >= Manager.ToolTipDelay) { tooltipTimer = 0; toolTip.Visible = true; Manager.Add(toolTip); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void ToolTipOver() { if (Manager.ToolTipsEnabled && toolTip != null && tooltipTimer == 0) { TimeSpan ts = new TimeSpan(DateTime.Now.Ticks); tooltipTimer = (long)ts.TotalMilliseconds; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void ToolTipOut() { if (Manager.ToolTipsEnabled && toolTip != null) { tooltipTimer = 0; toolTip.Visible = false; Manager.Remove(toolTip); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private bool CheckPosition(Point pos) { if ((pos.X >= AbsoluteLeft) && (pos.X < AbsoluteLeft + Width )) { if ((pos.Y >= AbsoluteTop) && (pos.Y < AbsoluteTop + Height)) { return true; } } return false; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private bool CheckMovableArea(Point pos) { if (movable) { Rectangle rect = movableArea; if (rect == Rectangle.Empty) { rect = new Rectangle(0, 0, width, height); } pos.X -= AbsoluteLeft; pos.Y -= AbsoluteTop; if ((pos.X >= rect.X) && (pos.X < rect.X + rect.Width)) { if ((pos.Y >= rect.Y) && (pos.Y < rect.Y + rect.Height)) { return true; } } } return false; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private bool CheckResizableArea(Point pos) { if (resizable) { pos.X -= AbsoluteLeft; pos.Y -= AbsoluteTop; if ((pos.X >= 0 && pos.X < resizerSize && pos.Y >= 0 && pos.Y < Height) || (pos.X >= Width - resizerSize && pos.X < Width && pos.Y >=0 && pos.Y < Height) || (pos.Y >= 0 && pos.Y < resizerSize && pos.X >=0 && pos.X < Width) || (pos.Y >= Height - resizerSize && pos.Y < Height && pos.X >=0 && pos.X < Width)) { return true; } } return false; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected MouseEventArgs TransformPosition(MouseEventArgs e) { MouseEventArgs ee = new MouseEventArgs(e.State, e.Button, e.Position); ee.Difference = e.Difference; ee.Position.X = ee.State.X - AbsoluteLeft; ee.Position.Y = ee.State.Y - AbsoluteTop; return ee; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private int CheckWidth(ref int w) { int diff = 0; if (w > MaximumWidth) { diff = MaximumWidth - w; w = MaximumWidth; } if (w < MinimumWidth) { diff = MinimumWidth - w; w = MinimumWidth; } return diff; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private int CheckHeight(ref int h) { int diff = 0; if (h > MaximumHeight) { diff = MaximumHeight - h; h = MaximumHeight; } if (h < MinimumHeight) { diff = MinimumHeight - h; h = MinimumHeight; } return diff; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void PerformResize(MouseEventArgs e) { if (resizable && !IsMoving) { if (!IsResizing) { #if (!XBOX && !XBOX_FAKE) GetResizePosition(e); Manager.Cursor = Cursor = GetResizeCursor(); #endif } if (IsResizing) { invalidated = true; bool top = false; bool bottom = false; bool left = false; bool right = false; if ((resizeArea == Alignment.TopCenter || resizeArea == Alignment.TopLeft || resizeArea == Alignment.TopRight) && (resizeEdge & Anchors.Top) == Anchors.Top) top = true; else if ((resizeArea == Alignment.BottomCenter || resizeArea == Alignment.BottomLeft || resizeArea == Alignment.BottomRight) && (resizeEdge & Anchors.Bottom) == Anchors.Bottom) bottom = true; if ((resizeArea == Alignment.MiddleLeft || resizeArea == Alignment.BottomLeft || resizeArea == Alignment.TopLeft) && (resizeEdge & Anchors.Left) == Anchors.Left) left = true; else if ((resizeArea == Alignment.MiddleRight || resizeArea == Alignment.BottomRight || resizeArea == Alignment.TopRight) && (resizeEdge & Anchors.Right) == Anchors.Right) right = true; int w = Width; int h = Height; int l = Left; int t = Top; if (outlineResizing && !OutlineRect.IsEmpty) { l = OutlineRect.Left; t = OutlineRect.Top; w = OutlineRect.Width; h = OutlineRect.Height; } int px = e.Position.X - (parent != null ? parent.AbsoluteLeft : 0); int py = e.Position.Y - (parent != null ? parent.AbsoluteTop : 0); if (left) { w = w + (l - px) + leftModifier + pressDiff[0]; l = px - leftModifier - pressDiff[0] - CheckWidth(ref w); } else if (right) { w = px - l - leftModifier + pressDiff[2]; CheckWidth(ref w); } if (top) { h = h + (t - py) + topModifier + pressDiff[1]; t = py - topModifier - pressDiff[1] - CheckHeight(ref h); } else if (bottom) { h = py - t - topModifier + pressDiff[3]; CheckHeight(ref h); } if (!Suspended) { ResizeEventArgs v = new ResizeEventArgs(w, h, Width, Height); OnValidateResize(v); if (top) { // Compensate for a possible height change from Validate event t += (h - v.Height); } if (left) { // Compensate for a possible width change from Validate event l += (w - v.Width); } w = v.Width; h = v.Height; } if (outlineResizing) { OutlineRect = new Rectangle(l, t, w, h); if (parent != null) parent.Invalidate(); } else { Width = w; Height = h; Top = t; Left = l; } } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// #if (!XBOX && !XBOX_FAKE) private Cursor GetResizeCursor() { Cursor cur = Cursor; switch (resizeArea) { case Alignment.TopCenter: { return ((resizeEdge & Anchors.Top) == Anchors.Top) ? Manager.Skin.Cursors["Vertical"].Resource : Cursor; } case Alignment.BottomCenter: { return ((resizeEdge & Anchors.Bottom) == Anchors.Bottom) ? Manager.Skin.Cursors["Vertical"].Resource : Cursor; } case Alignment.MiddleLeft: { return ((resizeEdge & Anchors.Left) == Anchors.Left) ? Manager.Skin.Cursors["Horizontal"].Resource : Cursor; } case Alignment.MiddleRight: { return ((resizeEdge & Anchors.Right) == Anchors.Right) ? Manager.Skin.Cursors["Horizontal"].Resource : Cursor; } case Alignment.TopLeft: { return ((resizeEdge & Anchors.Left) == Anchors.Left && (resizeEdge & Anchors.Top) == Anchors.Top) ? Manager.Skin.Cursors["DiagonalLeft"].Resource : Cursor; } case Alignment.BottomRight: { return ((resizeEdge & Anchors.Bottom) == Anchors.Bottom && (resizeEdge & Anchors.Right) == Anchors.Right) ? Manager.Skin.Cursors["DiagonalLeft"].Resource : Cursor; } case Alignment.TopRight: { return ((resizeEdge & Anchors.Top) == Anchors.Top && (resizeEdge & Anchors.Right) == Anchors.Right) ? Manager.Skin.Cursors["DiagonalRight"].Resource : Cursor; } case Alignment.BottomLeft: { return ((resizeEdge & Anchors.Bottom) == Anchors.Bottom && (resizeEdge & Anchors.Left) == Anchors.Left) ? Manager.Skin.Cursors["DiagonalRight"].Resource : Cursor; } } return Manager.Skin.Cursors["Default"].Resource; } #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void GetResizePosition(MouseEventArgs e) { int x = e.Position.X - AbsoluteLeft; int y = e.Position.Y - AbsoluteTop; bool l = false, t = false, r = false, b = false; resizeArea = Alignment.None; if (CheckResizableArea(e.Position)) { if (x < resizerSize) l = true; if (x >= Width - resizerSize) r = true; if (y < resizerSize) t = true; if (y >= Height - resizerSize) b = true; if (l && t) resizeArea = Alignment.TopLeft; else if (l && b) resizeArea = Alignment.BottomLeft; else if (r && t) resizeArea = Alignment.TopRight; else if (r && b) resizeArea = Alignment.BottomRight; else if (l) resizeArea = Alignment.MiddleLeft; else if (t) resizeArea = Alignment.TopCenter; else if (r) resizeArea = Alignment.MiddleRight; else if (b) resizeArea = Alignment.BottomCenter; } else { resizeArea = Alignment.None; } } //////////////////////////////////////////////////////////////////////////// #endregion #region //// Handlers ////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnMouseUp(MouseEventArgs e) { if (MouseUp != null) MouseUp.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnMouseDown(MouseEventArgs e) { if (MouseDown != null) MouseDown.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnMouseMove(MouseEventArgs e) { if (MouseMove != null) MouseMove.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnMouseOver(MouseEventArgs e) { if (MouseOver != null) MouseOver.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnMouseOut(MouseEventArgs e) { if (MouseOut != null) MouseOut.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnClick(EventArgs e) { if (Click != null) Click.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnDoubleClick(EventArgs e) { if (DoubleClick != null) DoubleClick.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnMove(MoveEventArgs e) { if (parent != null) parent.Invalidate(); if (Move != null) Move.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnResize(ResizeEventArgs e) { Invalidate(); if (Resize != null) Resize.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnValidateResize(ResizeEventArgs e) { if (ValidateResize != null) ValidateResize.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnValidateMove(MoveEventArgs e) { if (ValidateMove != null) ValidateMove.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnMoveBegin(EventArgs e) { if (MoveBegin != null) MoveBegin.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnMoveEnd(EventArgs e) { if (MoveEnd != null) MoveEnd.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnResizeBegin(EventArgs e) { if (ResizeBegin != null) ResizeBegin.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnResizeEnd(EventArgs e) { if (ResizeEnd != null) ResizeEnd.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnParentResize(object sender, ResizeEventArgs e) { ProcessAnchor(e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnKeyUp(KeyEventArgs e) { if (KeyUp != null) KeyUp.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnKeyDown(KeyEventArgs e) { if (KeyDown != null) KeyDown.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnKeyPress(KeyEventArgs e) { if (KeyPress != null) KeyPress.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnGamePadUp(GamePadEventArgs e) { if (GamePadUp != null) GamePadUp.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnGamePadDown(GamePadEventArgs e) { if (GamePadDown != null) GamePadDown.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnGamePadPress(GamePadEventArgs e) { if (GamePadPress != null) GamePadPress.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected internal void OnDraw(DrawEventArgs e) { if (Draw != null) Draw.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected void OnDrawTexture(DrawEventArgs e) { if (DrawTexture != null) DrawTexture.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnColorChanged(EventArgs e) { if (ColorChanged != null) ColorChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnTextColorChanged(EventArgs e) { if (TextColorChanged != null) TextColorChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnBackColorChanged(EventArgs e) { if (BackColorChanged != null) BackColorChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnTextChanged(EventArgs e) { if (TextChanged != null) TextChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnAnchorChanged(EventArgs e) { if (AnchorChanged != null) AnchorChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected internal virtual void OnSkinChanged(EventArgs e) { if (SkinChanged != null) SkinChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected internal virtual void OnSkinChanging(EventArgs e) { if (SkinChanging != null) SkinChanging.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnParentChanged(EventArgs e) { if (ParentChanged != null) ParentChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnRootChanged(EventArgs e) { if (RootChanged != null) RootChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnVisibleChanged(EventArgs e) { if (VisibleChanged != null) VisibleChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnEnabledChanged(EventArgs e) { if (EnabledChanged != null) EnabledChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnAlphaChanged(EventArgs e) { if (AlphaChanged != null) AlphaChanged.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnFocusLost(EventArgs e) { if (FocusLost != null) FocusLost.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnFocusGained(EventArgs e) { if (FocusGained != null) FocusGained.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// protected virtual void OnMousePress(MouseEventArgs e) { if (MousePress != null) MousePress.Invoke(this, e); } //////////////////////////////////////////////////////////////////////////// protected virtual void OnMouseScroll(MouseEventArgs e) { if (MouseScroll != null) MouseScroll.Invoke(this, e); } #endregion #endregion } //////////////////////////////////////////////////////////////////////////// #endregion }