using System;
using System.Collections.Generic;
using System.Text;
using DevComponents.DotNetBar.Metro.Rendering;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace DevComponents.DotNetBar.Metro
{
    /// 
    /// Represents Metro-UI Status Bar control.
    /// 
    [ToolboxBitmap(typeof(MetroShell), "MetroStatusBar.ico"), ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.MetroStatusBarDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf"), System.Runtime.InteropServices.ComVisible(false)]
    public class MetroStatusBar : ItemControl
    {
        #region Constructor
        private GenericItemContainer _ItemContainer = null;
        /// 
        /// Initializes a new instance of the MetroStatusBar class.
        /// 
        public MetroStatusBar()
        {
            _ItemContainer = new GenericItemContainer();
            _ItemContainer.GlobalItem = false;
            _ItemContainer.ContainerControl = this;
            _ItemContainer.Stretch = true;
            _ItemContainer.Displayed = true;
            _ItemContainer.WrapItems = false;
            _ItemContainer.ItemSpacing = 2;
            _ItemContainer.PaddingTop = 1;
            _ItemContainer.PaddingBottom = 4;
            _ItemContainer.PaddingLeft = 4;
            _ItemContainer.PaddingRight = 1;
            _ItemContainer.ToolbarItemsAlign = eContainerVerticalAlignment.Middle;
            _ItemContainer.EventHeight = false;
            _ItemContainer.FillsContainerControl = true;
            _ItemContainer.Style = eDotNetBarStyle.StyleManagerControlled;
            this.ColorScheme.Style = eDotNetBarStyle.StyleManagerControlled;
            _ItemContainer.SetOwner(this);
            _ItemContainer.LayoutType = eLayoutType.Toolbar;
            this.SetBaseItemContainer(_ItemContainer);
            this.DragDropSupport = true;
            this.ItemAdded += new EventHandler(ChildItemAdded);
            this.ItemRemoved += new ItemRemovedEventHandler(ChildItemRemoved);
        }
        protected override void Dispose(bool disposing)
        {
            this.ItemAdded -= new EventHandler(ChildItemAdded);
            this.ItemRemoved -= new ItemRemovedEventHandler(ChildItemRemoved);
            base.Dispose(disposing);
        }
        #endregion
        #region Implementation
        /// 
        /// Indicates whether items that cannot fit are displayed on popup.
        /// 
        [DefaultValue(true), Category("Behavior"), Description("Indicates whether items that cannot fit are displayed on popup.")]
        public bool OverflowEnabled
        {
            get { return _ItemContainer.OverflowEnabled; }
            set
            {
                _ItemContainer.OverflowEnabled = value;
                if (this.IsHandleCreated)
                    RecalcLayout();
            }
        }
        
        private void ChildItemAdded(object sender, EventArgs e)
        {
            this.RecalcLayout();
        }
        private void ChildItemRemoved(object sender, ItemRemovedEventArgs e)
        {
            this.RecalcLayout();
        }
        protected override void PaintControlBackground(ItemPaintArgs pa)
        {
            MetroRender.Paint(this, pa);
            base.PaintControlBackground(pa);
        }
        /// 
        /// Returns collection of items on a bar.
        /// 
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Browsable(false)]
        public SubItemsCollection Items
        {
            get
            {
                return _ItemContainer.SubItems;
            }
        }
        private readonly int ResizeHandleWidth = 10;
        protected override Rectangle GetItemContainerRectangle()
        {
            Rectangle ic = base.GetItemContainerRectangle();
            if (_ResizeHandleVisible)
            {
                ic.Width -= ResizeHandleWidth;
                if (this.RightToLeft == System.Windows.Forms.RightToLeft.Yes)
                    ic.X += ResizeHandleWidth;
            }
            return ic;
        }
        private bool _ResizeHandleVisible = true;
        /// 
        /// Gets or sets whether resize handle used to resize the parent form is visible. 
        /// 
        [DefaultValue(true), Category("Appearance"), Description("Indicates whether resize handle used to resize the parent form is visible.")]
        public bool ResizeHandleVisible
        {
            get { return _ResizeHandleVisible; }
            set
            {
                if (value != _ResizeHandleVisible)
                {
                    bool oldValue = _ResizeHandleVisible;
                    _ResizeHandleVisible = value;
                    OnResizeHandleVisibleChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Called when ResizeHandleVisible property has changed.
        /// 
        /// Old property value
        /// New property value
        protected virtual void OnResizeHandleVisibleChanged(bool oldValue, bool newValue)
        {
            //OnPropertyChanged(new PropertyChangedEventArgs("ResizeHandleVisible"));
            this.RecalcLayout();
        }
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            if (_ResizeHandleVisible && m.Msg == (int)WinApi.WindowsMessages.WM_NCHITTEST)
            {
                // Get position being tested...
                int x = WinApi.LOWORD(m.LParam);
                int y = WinApi.HIWORD(m.LParam);
                Point p = PointToClient(new Point(x, y));
                int resizeHandleWidth = Dpi.Width(ResizeHandleWidth);
                Rectangle resizeBounds = (this.RightToLeft == System.Windows.Forms.RightToLeft.Yes) ?
                    new Rectangle(0, this.Height - resizeHandleWidth, resizeHandleWidth, resizeHandleWidth) :
                    new Rectangle(this.Width - resizeHandleWidth, this.Height - resizeHandleWidth, resizeHandleWidth, resizeHandleWidth);
                if (resizeBounds.Contains(p))
                {
                    m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.TransparentOrCovered);
                    return;
                }
            }
            base.WndProc(ref m);
        }
        /// 
        /// Gets or sets spacing between items, default value is 2.
        /// 
        [DefaultValue(2), Category("Appearance"), Description("Gets or sets spacing between items.")]
        public int ItemSpacing
        {
            get { return _ItemContainer.ItemSpacing; }
            set
            {
                _ItemContainer.ItemSpacing = value;
                this.RecalcLayout();
            }
        }
        protected override Size DefaultSize
        {
            get
            {
                return new Size(200, 22);
            }
        }
        #endregion
        #region Licensing
#if !TRIAL
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            if (NativeFunctions.keyValidated2 != 266)
                TextDrawing.DrawString(e.Graphics, "Invalid License", this.Font, Color.FromArgb(180, Color.Red), this.ClientRectangle, eTextFormat.Bottom | eTextFormat.HorizontalCenter);
        }
        private string _LicenseKey = "";
        [Browsable(false), DefaultValue("")]
        public string LicenseKey
        {
            get { return _LicenseKey; }
            set
            {
                if (NativeFunctions.ValidateLicenseKey(value))
                    return;
                _LicenseKey = (!NativeFunctions.CheckLicenseKey(value) ? "9dsjkhds7" : value);
            }
        }
#endif
        #endregion
    }
}