using System;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace DevComponents.DotNetBar
{
    /// 
    /// Represents a view of CrumbBarItem displayed inside of CrumbBar control.
    /// 
    public class CrumbBarItemView : ButtonItem
    {
        #region Internal Implementation
        /// 
        /// Initializes a new instance of the CrumbBarItemView class.
        /// 
        public CrumbBarItemView():base()
        {
            this.SubItemsExpandWidth = 15;
            this.HorizontalPadding = 2;
        }
        private CrumbBarItem _AttachedItem;
        /// 
        /// Gets the item attached to the view.
        /// 
        public CrumbBarItem AttachedItem
        {
            get { return _AttachedItem; }
            internal set
            {
                if (_AttachedItem != null)
                {
                    _AttachedItem.TextChanged -= new EventHandler(AttachedItemTextChanged);
                    _AttachedItem.SubItemsChanged -= new System.ComponentModel.CollectionChangeEventHandler(AttachedItemSubItemsChanged);
                    _AttachedItem.PopupClose -= new EventHandler(AttachedItemPopupClose);
                }
                _AttachedItem = value;
                if (_AttachedItem != null)
                {
                    this.Text = _AttachedItem.Text;
                    this.Cursor = _AttachedItem.Cursor;
                    this.ForeColor = _AttachedItem.ForeColor;
                    this.HotForeColor = _AttachedItem.HotForeColor;
                    this.Tooltip = _AttachedItem.Tooltip;
                    _AttachedItem.TextChanged += new EventHandler(AttachedItemTextChanged);
                    _AttachedItem.SubItemsChanged += new System.ComponentModel.CollectionChangeEventHandler(AttachedItemSubItemsChanged);
                    _AttachedItem.PopupClose += new EventHandler(AttachedItemPopupClose);
                    if (AnyVisibleItems)
                        this.PopupType = ePopupType.Container;
                    else
                        this.PopupType = ePopupType.Menu;
                }
                else
                    this.PopupType = ePopupType.Menu;
            }
        }
        private DateTime _PopupCloseTime = DateTime.MinValue;
        private void AttachedItemPopupClose(object sender, EventArgs e)
        {
            _Expanded = false;
            CrumbBarViewContainer c = this.Parent as CrumbBarViewContainer;
            if (c != null)
                c.OnSubItemExpandChange(this);
            _PopupCloseTime = DateTime.Now;
            this.Refresh();
        }
        public override void InternalMouseDown(MouseEventArgs objArg)
        {
            if (_PopupCloseTime != DateTime.MinValue && DateTime.Now.Subtract(_PopupCloseTime).TotalMilliseconds < 200)
            {
                _PopupCloseTime = DateTime.MinValue;
                return;
            }
            base.InternalMouseDown(objArg);
        }
        public override void InternalMouseEnter()
        {
            CrumbBarViewContainer parent = this.Parent as CrumbBarViewContainer;
            if (parent != null && parent.Expanded && AnyVisibleItems)
            {
                parent.Expanded = false;
                this.Expanded = true;
            }
            base.InternalMouseEnter();
        }
        private bool AnyVisibleItems
        {
            get
            {
                if (_AttachedItem != null)
                {
                    foreach (BaseItem item in _AttachedItem.SubItems)
                    {
                        if (item.Visible) return true;
                    }
                }
                return false;
            }
        }
        private void AttachedItemSubItemsChanged(object sender, System.ComponentModel.CollectionChangeEventArgs e)
        {
            UpdatePopupType();
        }
        private void UpdatePopupType()
        {
            if (AnyVisibleItems && !(this.Parent is CrumbBarOverflowButton))
                this.PopupType = ePopupType.Container;
            else
                this.PopupType = ePopupType.Menu;
        }
        protected override void OnParentChanged()
        {
            UpdatePopupType();
            base.OnParentChanged();
        }
        void AttachedItemTextChanged(object sender, EventArgs e)
        {
            this.Text = _AttachedItem.Text;
        }
        protected override void Dispose(bool disposing)
        {
            this.AttachedItem = null;
            base.Dispose(disposing);
        }
        internal static object CreateViewForItem(CrumbBarItem item)
        {
            CrumbBarItemView view = new CrumbBarItemView();
            view.AttachedItem = item;
            return view;
        }
        private bool _Expanded = false;
        /// 
        /// 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 _Expanded;
            }
            set
            {
                if (_Expanded != value)
                {
                    _Expanded = value;
                    InternalExpandedChanged();
                }
            }
        }
        private void InternalExpandedChanged()
        {
            if (!_Expanded)
            {
                _AttachedItem.Expanded = false;
            }
            else
            {
                Control parent=this.ContainerControl as Control;
                if(parent==null) return;
                Point p = new Point(this.SubItemsRect.X - 10, this.SubItemsRect.Bottom - 1);
                p.Offset(this.DisplayRectangle.Location.X, this.DisplayRectangle.Location.Y);
                p = parent.PointToScreen(p);
                _AttachedItem.PopupMenu(p);
            }
            CrumbBarViewContainer c = this.Parent as CrumbBarViewContainer;
            if (c != null)
                c.OnSubItemExpandChange(this);
        }
        protected override void OnClick()
        {
            CrumbBar bar = this.ContainerControl as CrumbBar;
            if (bar == null) bar = this.GetOwner() as CrumbBar;
            base.OnClick();
            if (bar != null)
            {
                bar.SelectedItem = _AttachedItem;
            }
        }
        protected override void RenderButton(ItemPaintArgs p)
        {
            if (!p.IsOnMenu)
            {
                Rendering.BaseRenderer renderer = p.Renderer;
                if (renderer != null)
                {
                    p.ButtonItemRendererEventArgs.Graphics = p.Graphics;
                    p.ButtonItemRendererEventArgs.ButtonItem = this;
                    p.ButtonItemRendererEventArgs.ItemPaintArgs = p;
                    renderer.DrawCrumbBarItemView(p.ButtonItemRendererEventArgs);
                    return;
                }
            }
            base.RenderButton(p);
        }
        /// 
        /// Returns copy of ExplorerBarContainerItem item
        /// 
        public override BaseItem Copy()
        {
            CrumbBarItemView objCopy = new CrumbBarItemView();
            this.CopyToItem(objCopy);
            return objCopy;
        }
        protected override void CopyToItem(BaseItem copy)
        {
            CrumbBarItemView objCopy = copy as CrumbBarItemView;
            base.CopyToItem(objCopy);
        }
        #endregion
    }
}