using System;
using System.Windows.Forms;
using System.Collections;
using System.ComponentModel.Design;
using System.ComponentModel;
using System.Drawing;
namespace DevComponents.DotNetBar.Design
{
    /// 
    /// Summary description for SuperTabControlDesigner
    /// 
    public class SuperTabControlDesigner : SuperTabStripDesigner
    {
        #region Private variables
        private SuperTabControl _TabControl;
        #endregion
        public SuperTabControlDesigner()
        {
            TabsVisible = true;
        }
        #region Initialize
        public override void Initialize(IComponent component)
        {
            base.Initialize(component);
            if (component.Site.DesignMode == true)
            {
                _TabControl = component as SuperTabControl;
                if (_TabControl != null)
                {
                    TabStrip = _TabControl.TabStrip;
                    if (Inherited == true)
                    {
                        if (_TabControl.TabsVisible == false)
                            _TabControl.TabsVisible = true;
                        if (_TabControl.SelectedPanel != null)
                            _TabControl.SelectedPanel.BringToFront();
                    }
                    _TabControl.TabStrip.GetBaseItemContainer().SetDesignMode(true);
                }
            }
        }
        protected override BaseItem GetItemContainer()
        {
            return _TabControl.TabStrip.GetBaseItemContainer();
        }
        protected override Control GetItemContainerControl()
        {
            return _TabControl.TabStrip;
        }
        #endregion
        #region PreFilterProperties
        protected override void PreFilterProperties(IDictionary properties)
        {
            base.PreFilterProperties(properties);
            properties["SelectedTabIndex"] = TypeDescriptor.CreateProperty(typeof(SuperTabControlDesigner),
                (PropertyDescriptor)properties["SelectedTabIndex"], new Attribute[]
			{
				new BrowsableAttribute(true),
				new CategoryAttribute("Behavior")
            });
            properties["TabsVisible"] = TypeDescriptor.CreateProperty(typeof(SuperTabControlDesigner),
                (PropertyDescriptor)properties["TabsVisible"], new Attribute[]
			{
				new BrowsableAttribute(true),
				new CategoryAttribute("Behavior")
            });
        }
        /// 
        /// Gets or sets whether item is visible.
        /// 
        [Browsable(true), DevCoBrowsable(true), Category("Behavior")]
        [Description("Indicates the index of selected tab.")]
        public int SelectedTabIndex
        {
            get { return (int)ShadowProperties["SelectedTabIndex"]; }
            set { this.ShadowProperties["SelectedTabIndex"] = value; }
        }
        /// 
        /// Gets or sets whether tabs are visible. Default value is true.
        /// 
        [DefaultValue(true), Category("Appearance")]
        [Description("Indicates whether tabs are visible")]
        public bool TabsVisible
        {
            get { return ((bool)ShadowProperties["TabsVisible"]); }
            set { ShadowProperties["TabsVisible"] = value; }
        }
        #endregion
        
        #region PostFilterEvents
        protected override void  PostFilterEvents(IDictionary events)
        {
            events.Remove("MouseUp");
            events.Remove("MouseDown");
            events.Remove("MouseMove");
            events.Remove("MouseClick");
            events.Remove("MouseDoubleClick");
            events.Remove("MouseEnter");
            events.Remove("MouseHover");
            events.Remove("MouseLeave");
 	        base.PostFilterEvents(events);
        }
        #endregion
        #region CreateNewTab
        public override SuperTabItem CreateNewTab()
        {
            IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
            if (dh == null)
                return null;
            SuperTabItem tab = null;
            DesignerTransaction dt = dh.CreateTransaction();
            try
            {
                IComponentChangeService change =
                    GetService(typeof(IComponentChangeService)) as IComponentChangeService;
               
                if (change != null)
                    change.OnComponentChanging(this.Component, null);
                tab = dh.CreateComponent(typeof(SuperTabItem)) as SuperTabItem;
                SuperTabControlPanel panel = dh.CreateComponent(typeof(SuperTabControlPanel)) as SuperTabControlPanel;
                if (tab != null && panel != null)
                {
                    tab.Text = tab.Name;
                    _TabControl.CreateTab(tab, panel, -1);
                    _TabControl.SelectedTab = tab;
                }
                if (change != null)
                    change.OnComponentChanged(this.Component, null, null, null);
                if (change != null)
                {
                    change.OnComponentChanging(panel, null);
                    change.OnComponentChanged(panel, null, null, null);
                }
            }
            catch
            {
                dt.Cancel();
            }
            finally
            {
                if (!dt.Canceled)
                    dt.Commit();
            }
            return tab;
        }
        #endregion
        #region SelectNextTab
        protected override void SelectNextTab(object sender, EventArgs e)
        {
            if (_TabControl.SelectedTabIndex < _TabControl.Tabs.Count - 1)
                _TabControl.SelectNextTab();
        }
        #endregion
        #region SelectPreviousTab
        protected override void SelectPreviousTab(object sender, EventArgs e)
        {
            if (_TabControl.SelectedTabIndex > 0)
                _TabControl.SelectPreviousTab();
        }
        #endregion
        #region GetTabStrip
        protected SuperTabStrip GetTabStrip()
        {
            return (_TabControl.TabStrip);
        }
        #endregion
        #region GetIOwner
        protected override IOwner GetIOwner()
        {
            return (GetTabStrip());
        }
        #endregion
        #region CanParent
        public override bool CanParent(Control c)
        {
            return (c is SuperTabControlPanel);
        }
        #endregion
        #region AssociatedComponents
        public override ICollection AssociatedComponents
        {
            get
            {
                ArrayList list = new ArrayList(base.AssociatedComponents);
                foreach (BaseItem item in _TabControl.Tabs)
                    list.Add(item);
                return (list);
            }
        }
        #endregion
        #region ComponentChangeComponentAdded
        protected override void ComponentChangeComponentAdded(object sender, ComponentEventArgs e)
        {
            ISelectionService ss = this.GetService(typeof (ISelectionService)) as ISelectionService;
            if (ss != null && ss.PrimarySelection == _TabControl)
            {
                if (m_InsertItemTransaction == null)
                {
                    IDesignerHost dh = sender as IDesignerHost;
                    if (dh != null)
                        m_InsertItemTransaction = dh.CreateTransaction("Adding Item Clip");
                }
                IComponentChangeService cc =
                    GetService(typeof (IComponentChangeService)) as IComponentChangeService;
                if (cc != null)
                {
                    if (e.Component is BaseItem)
                    {
                        cc.OnComponentChanging(_TabControl, null);
                        _TabControl.Tabs.Add(e.Component as BaseItem);
                        cc.OnComponentChanged(_TabControl, null, null, null);
                        if (e.Component is SuperTabItem)
                            _TabControl.SelectedTab = e.Component as SuperTabItem;
                    }
                }
                if (m_InsertItemTransaction != null)
                {
                    m_InsertItemTransaction.Commit();
                    m_InsertItemTransaction = null;
                }
                RecalcLayout();
            }
        }
        #endregion
        #region OtherComponentRemoving
        protected override void OtherComponentRemoving(object sender, ComponentEventArgs e)
        {
            if (InternalRemove == true)
                return;
            IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
            if (dh == null)
                return;
            if (e.Component is SuperTabControlPanel &&
                _TabControl.Controls.Contains(e.Component as Control))
            {
                SuperTabControlPanel panel = e.Component as SuperTabControlPanel;
                _TabControl.Controls.Remove(panel);
                if (panel.TabItem != null)
                {
                    if (_TabControl.Tabs.Contains(panel.TabItem))
                        _TabControl.Tabs.Remove(panel.TabItem);
                    if (!Inherited)
                        dh.DestroyComponent(panel.TabItem);
                }
            }
            else if (e.Component is BaseItem &&
                _TabControl.Tabs.Contains(e.Component as BaseItem))
            {
                if (dh.TransactionDescription.StartsWith("Deleting") == false)
                {
                    BaseItem item = e.Component as BaseItem;
                    _TabControl.Tabs.Remove(item);
                    SuperTabItem tab = item as SuperTabItem;
                    if (tab != null)
                    {
                        if (tab.AttachedControl != null &&
                            _TabControl.Controls.Contains(tab.AttachedControl))
                        {
                            _TabControl.Controls.Remove(tab.AttachedControl);
                            dh.DestroyComponent(tab.AttachedControl);
                        }
                    }
                }
            }
            else if (e.Component == this.Control)
            {
                InternalRemove = true;
                try
                {
                    for (int i = _TabControl.Tabs.Count - 1; i >= 0; i--)
                        dh.DestroyComponent(_TabControl.Tabs[i]);
                }
                finally
                {
                    InternalRemove = false;
                }
            }
        }
        #endregion
        #region GetClientPoint
        protected override Point GetClientPoint(int x, int y)
        {
            Point p = _TabControl.TabStrip.PointToClient(new Point(x, y));
            return p;
        }
        #endregion
        #region Backstage Support
        protected override void OnitemCreated(BaseItem item)
        {
            if (item is ButtonItem && IsBackstageTab)
            {
                ButtonItem button = (ButtonItem)item;
                button.ButtonStyle = DevComponents.DotNetBar.eButtonStyle.ImageAndText;
                button.ColorTable = DevComponents.DotNetBar.eButtonColor.Blue;
                button.ImagePaddingVertical = 10;
                button.ImagePaddingHorizontal = 18;
                button.Stretch = true;
            }
            base.OnitemCreated(item);
        }
        internal bool IsBackstageTab
        {
            get
            {
                SuperTabControl tab = (SuperTabControl)this.Control;
                if (tab != null && tab.TabStrip != null)
                    return (tab.TabStrip.ApplicationButton != null);
                return false;
            }
        }
        #endregion
    }
}