using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using DevComponents.DotNetBar.Metro.Rendering;
using System.Windows.Forms;
namespace DevComponents.DotNetBar.Metro
{
    /// 
    /// Defines the internal container item for the MetroToolbar control.
    /// 
    [System.ComponentModel.ToolboxItem(false), System.ComponentModel.DesignTimeVisible(false)]
    public class MetroToolbarContainer : ImageItem, IDesignTimeProvider
    {
        #region Internal Implementation
        private SimpleItemContainer _MainItemsContainer = null;
        private ButtonItem _ExpandButton = null;
        private ItemContainer _ExtraItemsContainer = null;
        private MetroToolbar _MetroToolbar = null;
        /// 
        /// Creates new instance of the class and initializes it with the parent RibbonStrip control.
        /// 
        /// Reference to parent MetroToolbar control
        public MetroToolbarContainer(MetroToolbar parent)
        {
            _MetroToolbar = parent;
            // We contain other controls
            m_IsContainer = true;
            this.AccessibleRole = System.Windows.Forms.AccessibleRole.Grouping;
            _MainItemsContainer = new SimpleItemContainer();
            //_MainItemsContainer.LayoutOrientation = eOrientation.Horizontal;
            _MainItemsContainer.GlobalItem = false;
            _MainItemsContainer.Displayed = true;
            //_MainItemsContainer.ItemSpacing = 0;
            _MainItemsContainer.SetSystemContainer(true);
            _MainItemsContainer.ContainerControl = parent;
            _MainItemsContainer.DesignTimeVisible = false;
            _MainItemsContainer.Name = "_MainItemsContainer";
            this.SubItems.Add(_MainItemsContainer);
            _ExpandButton = new ButtonItem();
            _ExpandButton.Click += new EventHandler(ExpandButtonClick);
            _ExpandButton.ImagePaddingHorizontal = 12;
            _ExpandButton.ImagePaddingVertical = 10;
            _ExpandButton.Name = "sysMetroToolbarExpandButton";
            _ExpandButton.SetSystemItem(true);
            _ExpandButton.ContainerControl = parent;
            _ExpandButton.DesignTimeVisible = false;
            UpdateExpandButtonImage();
            this.SubItems.Add(_ExpandButton);
            _ExtraItemsContainer = new ItemContainer();
            _ExtraItemsContainer.LayoutOrientation = eOrientation.Horizontal;
            _ExtraItemsContainer.GlobalItem = false;
            _ExtraItemsContainer.Displayed = true;
            _ExtraItemsContainer.MultiLine = true;
            _ExtraItemsContainer.SetSystemContainer(true);
            _ExtraItemsContainer.ContainerControl = parent;
            _ExtraItemsContainer.DesignTimeVisible = false;
            _ExtraItemsContainer.Name = "_ExtraItemsContainer";
            this.SubItems.Add(_ExtraItemsContainer);
        }
        protected override void Dispose(bool disposing)
        {
            if (_ExpandButton.Image != null)
            {
                Image image = _ExpandButton.Image;
                _ExpandButton.Image = null;
                image.Dispose();
            }
            base.Dispose(disposing);
        }
        private void UpdateExpandButtonImage()
        {
            if (_ExpandButton.Image != null)
            {
                Image image = _ExpandButton.Image;
                _ExpandButton.Image = null;
                image.Dispose();
            }
            Bitmap bitmap = new Bitmap(16, 16);
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                using (SolidBrush brush = new SolidBrush(MetroRender.GetColorTable().ForeColor))
                {
                    g.FillEllipse(brush, new Rectangle(0, 2, 4, 4));
                    g.FillEllipse(brush, new Rectangle(6, 2, 4, 4));
                    g.FillEllipse(brush, new Rectangle(12, 2, 4, 4));
                }
            }
            _ExpandButton.Image = bitmap;
        }
        void ExpandButtonClick(object sender, EventArgs e)
        {
            _MetroToolbar.Expanded = !_MetroToolbar.Expanded;
        }
        /// 
        /// Paints this base container
        /// 
        public override void Paint(ItemPaintArgs pa)
        {
            if (this.SuspendLayout)
                return;
            _MainItemsContainer.Paint(pa);
            _ExpandButton.Paint(pa);
            _ExtraItemsContainer.Paint(pa);
        }
        public override void RecalcSize()
        {
            if (ExpandButtonVisible)
            {
                _ExpandButton.Displayed = true;
                _ExpandButton.RecalcSize();
                _ExpandButton.SetDisplayRectangle(new Rectangle(this.WidthInternal - _ExpandButton.WidthInternal, this.TopInternal, _ExpandButton.WidthInternal, _ExpandButton.HeightInternal));
            }
            else
            {
                _ExpandButton.Displayed = false;
                _ExpandButton.HeightInternal = 0;
                _ExpandButton.WidthInternal = 0;
            }
            _MainItemsContainer.LeftInternal = this.LeftInternal;
            _MainItemsContainer.TopInternal = this.TopInternal;
            if (_MainItemsContainer.VisibleSubItems == 0)
            {
                _MainItemsContainer.MinimumSize = new Size(this.WidthInternal - _ExpandButton.WidthInternal, 28);
            }
            else
            {
                _MainItemsContainer.MinimumSize = Size.Empty;
                _MainItemsContainer.WidthInternal = this.WidthInternal - _ExpandButton.WidthInternal;
                _MainItemsContainer.HeightInternal = 0;
            }
            _MainItemsContainer.RecalcSize();
            
            const int MainExtraItemsSpacing = 1;
            _ExtraItemsContainer.TopInternal = this.TopInternal + Math.Max(_MainItemsContainer.HeightInternal, _ExpandButton.HeightInternal) + MainExtraItemsSpacing;
            if (_ExtraItemsContainer.VisibleSubItems == 0)
            {
                _ExtraItemsContainer.MinimumSize = new Size(this.WidthInternal, 28);
            }
            else
            {
                _ExtraItemsContainer.MinimumSize = Size.Empty;
                _ExtraItemsContainer.WidthInternal = this.WidthInternal;
                _ExtraItemsContainer.HeightInternal = 0;
            }
            _ExtraItemsContainer.RecalcSize();
            this.HeightInternal = Math.Max(_ExpandButton.HeightInternal, _MainItemsContainer.HeightInternal) + _ExtraItemsContainer.HeightInternal + MainExtraItemsSpacing;
            base.RecalcSize();
        }
        /// 
        /// Returns copy of GenericItemContainer item
        /// 
        public override BaseItem Copy()
        {
            MetroToolbarContainer objCopy = new MetroToolbarContainer(_MetroToolbar);
            this.CopyToItem(objCopy);
            return objCopy;
        }
        protected override void CopyToItem(BaseItem copy)
        {
            RibbonStripContainerItem objCopy = copy as RibbonStripContainerItem;
            base.CopyToItem(objCopy);
        }
        private bool _ExpandButtonVisible = true;
        /// 
        /// Gets or sets whether Expand button is visible. Default value is true.
        /// 
        [DefaultValue(true)]
        public bool ExpandButtonVisible
        {
            get { return _ExpandButtonVisible; }
            set
            {
                if (value != _ExpandButtonVisible)
                {
                    bool oldValue = _ExpandButtonVisible;
                    _ExpandButtonVisible = value;
                    OnExpandButtonVisibleChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Called when ExpandButtonVisible property has changed.
        /// 
        /// Old property value
        /// New property value
        protected virtual void OnExpandButtonVisibleChanged(bool oldValue, bool newValue)
        {
            //OnPropertyChanged(new PropertyChangedEventArgs("ExpandButtonVisible"));
            this.NeedRecalcSize = true;
            _MetroToolbar.RecalcLayout();
        }
        /// 
        /// Gets reference to container that host items.
        /// 
        public SimpleItemContainer MainItemsContainer
        {
            get
            {
                return _MainItemsContainer;
            }
        }
        /// 
        /// Gets reference to container that hosts extra items.
        /// 
        public ItemContainer ExtraItemsContainer
        {
            get
            {
                return _ExtraItemsContainer;
            }
        }
        public void UpdateSystemColors()
        {
            UpdateExpandButtonImage();
        }
        #endregion
        #region IDesignTimeProvider Members
        public InsertPosition GetInsertPosition(Point pScreen, BaseItem DragItem)
        {
            InsertPosition pos = null;
            Point clientPoint = _MetroToolbar.PointToClient(pScreen);
            if(_MainItemsContainer.DisplayRectangle.Contains(clientPoint) || !_MetroToolbar.Expanded)
                pos = ((IDesignTimeProvider)_MainItemsContainer).GetInsertPosition(pScreen, DragItem);
            if (pos == null && _MetroToolbar.Expanded)
            {
                pos = ((IDesignTimeProvider)_ExtraItemsContainer).GetInsertPosition(pScreen, DragItem);
            }
            return pos;
        }
        public void DrawReversibleMarker(int iPos, bool Before)
        {
            DesignTimeProviderContainer.DrawReversibleMarker(this, iPos, Before);
        }
        public void InsertItemAt(BaseItem objItem, int iPos, bool Before)
        {
            DesignTimeProviderContainer.InsertItemAt(this, objItem, iPos, Before);
        }
        /// 
        /// Gets or sets a value indicating whether the item is expanded or not. For Popup items this would indicate whether the item is popped up or not.
        /// 
        [System.ComponentModel.Browsable(false), System.ComponentModel.DefaultValue(false), System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
        public override bool Expanded
        {
            get
            {
                return base.Expanded;
            }
            set
            {
                base.Expanded = value;
                if (!value)
                {
                    foreach (BaseItem item in this.SubItems)
                        item.Expanded = false;
                }
            }
        }
        /// 
        /// When parent items does recalc size for its sub-items it should query
        /// image size and store biggest image size into this property.
        /// 
        [System.ComponentModel.Browsable(false), System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
        public override System.Drawing.Size SubItemsImageSize
        {
            get
            {
                return base.SubItemsImageSize;
            }
            set
            {
                //m_SubItemsImageSize = value;
            }
        }
        #endregion
    }
}