using System; //using System.Drawing; using Gwen.ControlInternal; namespace Gwen.Control { /// /// Base resizable control. /// public class ResizableControl : Base { private bool m_ClampMovement; private readonly Resizer[] m_Resizer; /// /// Determines whether control's position should be restricted to its parent bounds. /// public bool ClampMovement { get { return m_ClampMovement; } set { m_ClampMovement = value; } } /// /// Invoked when the control has been resized. /// public event GwenEventHandler Resized; /// /// Initializes a new instance of the class. /// /// Parent control. public ResizableControl(Base parent) : base(parent) { m_Resizer = new Resizer[10]; MinimumSize = new Point(5, 5); m_ClampMovement = false; m_Resizer[2] = new Resizer(this); m_Resizer[2].Dock = Pos.Bottom; m_Resizer[2].ResizeDir = Pos.Bottom; m_Resizer[2].Resized += OnResized; m_Resizer[2].Target = this; m_Resizer[1] = new Resizer(m_Resizer[2]); m_Resizer[1].Dock = Pos.Left; m_Resizer[1].ResizeDir = Pos.Bottom | Pos.Left; m_Resizer[1].Resized += OnResized; m_Resizer[1].Target = this; m_Resizer[3] = new Resizer(m_Resizer[2]); m_Resizer[3].Dock = Pos.Right; m_Resizer[3].ResizeDir = Pos.Bottom | Pos.Right; m_Resizer[3].Resized += OnResized; m_Resizer[3].Target = this; m_Resizer[8] = new Resizer(this); m_Resizer[8].Dock = Pos.Top; m_Resizer[8].ResizeDir = Pos.Top; m_Resizer[8].Resized += OnResized; m_Resizer[8].Target = this; m_Resizer[7] = new Resizer(m_Resizer[8]); m_Resizer[7].Dock = Pos.Left; m_Resizer[7].ResizeDir = Pos.Left | Pos.Top; m_Resizer[7].Resized += OnResized; m_Resizer[7].Target = this; m_Resizer[9] = new Resizer(m_Resizer[8]); m_Resizer[9].Dock = Pos.Right; m_Resizer[9].ResizeDir = Pos.Right | Pos.Top; m_Resizer[9].Resized += OnResized; m_Resizer[9].Target = this; m_Resizer[4] = new Resizer(this); m_Resizer[4].Dock = Pos.Left; m_Resizer[4].ResizeDir = Pos.Left; m_Resizer[4].Resized += OnResized; m_Resizer[4].Target = this; m_Resizer[6] = new Resizer(this); m_Resizer[6].Dock = Pos.Right; m_Resizer[6].ResizeDir = Pos.Right; m_Resizer[6].Resized += OnResized; m_Resizer[6].Target = this; } /// /// Handler for the resized event. /// /// Event source. protected virtual void OnResized(Base control) { if (Resized != null) Resized.Invoke(this); } protected Resizer GetResizer(int i) { return m_Resizer[i]; } /// /// Disables resizing. /// public void DisableResizing() { for (int i = 0; i < 10; i++) { if (m_Resizer[i] == null) continue; m_Resizer[i].MouseInputEnabled = false; m_Resizer[i].IsHidden = true; Padding = new Padding(m_Resizer[i].Width, m_Resizer[i].Width, m_Resizer[i].Width, m_Resizer[i].Width); } } /// /// Enables resizing. /// public void EnableResizing() { for (int i = 0; i < 10; i++) { if (m_Resizer[i] == null) continue; m_Resizer[i].MouseInputEnabled = true; m_Resizer[i].IsHidden = false; Padding = new Padding(0, 0, 0, 0); // todo: check if ok } } /// /// Sets the control bounds. /// /// X position. /// Y position. /// Width. /// Height. /// /// True if bounds changed. /// public override bool SetBounds(int x, int y, int width, int height) { Point minSize = MinimumSize; // Clamp Minimum Size if (width < minSize.X) width = minSize.X; if (height < minSize.Y) height = minSize.Y; // Clamp to parent's window Base parent = Parent; if (parent != null && m_ClampMovement) { if (x + width > parent.Width) x = parent.Width - width; if (x < 0) x = 0; if (y + height > parent.Height) y = parent.Height - height; if (y < 0) y = 0; } return base.SetBounds(x, y, width, height); } } }