using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
using System.ComponentModel.Design.Serialization;
using System.CodeDom;
using System.Drawing;
using System.Collections;
namespace DevComponents.DotNetBar
{
	/// 
	/// Summary description for ExplorerBarDesigner.
	/// 
	public class ExplorerBarDesigner:BarBaseControlDesigner
	{
		#region Internal Implementation
		public ExplorerBarDesigner():base()
		{
			this.EnableItemDragDrop=true;
		}
		public override void Initialize(IComponent component) 
		{
			base.Initialize(component);
			if(!component.Site.DesignMode)
				return;
			ExplorerBar bar=this.Control as ExplorerBar;
			if(bar!=null)
				bar.SetDesignMode();
		}
		public override DesignerVerbCollection Verbs 
		{
			get 
			{
				DesignerVerb[] verbs = new DesignerVerb[]
					{
						new DesignerVerb("Create Group", new EventHandler(OnAddGroup)),
						new DesignerVerb("Create Button", new EventHandler(OnAddButton))
					};
				return new DesignerVerbCollection(verbs);
			}
		}
#if FRAMEWORK20
        public override void InitializeNewComponent(IDictionary defaultValues)
        {
            base.InitializeNewComponent(defaultValues);
            SetDesignTimeDefaults();
        }
#else
		public override void OnSetComponentDefaults()
		{
			base.OnSetComponentDefaults();
			SetDesignTimeDefaults();
		}
#endif
        private void SetDesignTimeDefaults()
        {
            if (this.Control is ExplorerBar)
            {
                ExplorerBar eb = this.Control as ExplorerBar;
                eb.ApplyDefaultSettings();
                eb.ThemeAware = true;
            }
        }
		protected override BaseItem GetItemContainer()
		{
			ExplorerBar bar=this.Control as ExplorerBar;
			if(bar!=null)
				return bar.ItemsContainer;
			return null;
		}
		protected override void RecalcLayout()
		{
			ExplorerBar bar=this.GetItemContainerControl() as ExplorerBar;
			if(bar!=null)
				bar.RecalcLayout();
		}
		protected override void OnSubItemsChanging()
		{
			base.OnSubItemsChanging();
			IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
			if(change!=null)
			{
				ExplorerBar bar=this.GetItemContainerControl() as ExplorerBar;
				change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(bar).Find("Groups",true));
			}
		}
		protected override void OnSubItemsChanged()
		{
			base.OnSubItemsChanged();
			IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
			if(change!=null)
			{
				ExplorerBar bar=this.GetItemContainerControl() as ExplorerBar;
				change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(bar).Find("Groups",true),null,null);
			}
		}
//		/// 
//		/// Triggered when some other component on the form is removed.
//		/// 
//		protected override void ComponentRemoved(object sender, ComponentEventArgs e)
//		{
//			base.ComponentRemoved(sender,e);
//			if(e.Component is ExplorerBarGroupItem)
//			{
//				ExplorerBar bar=this.GetItemContainerControl() as ExplorerBar;
//				if(bar.Groups.Contains(e.Component as BaseItem))
//					bar.Groups.Remove(e.Component as BaseItem);
//				DestroySubItems(e.Component as BaseItem);
//				bar.RecalcLayout();
//			}
//		}
		#endregion
		#region Design-Time Item Creation
		private void OnAddGroup(object sender, EventArgs e)
		{
			CreateGroup();
		}
		private ExplorerBarGroupItem CreateGroup()
		{
			ExplorerBar bar=this.Component as ExplorerBar;
			ExplorerBarGroupItem item=null;
			IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
			if(bar!=null && dh!=null)
			{
				OnSubItemsChanging();
				item=dh.CreateComponent(typeof(ExplorerBarGroupItem)) as ExplorerBarGroupItem;
				if(item==null)
					return null;
				item.SetDefaultAppearance();
				item.Text="New Group";
				item.Expanded=true;
				bar.Groups.Add(item);
				OnSubItemsChanged();
			}
			return item;
		}
		private void OnAddButton(object sender, EventArgs e)
		{
			ExplorerBar bar=this.Component as ExplorerBar;
			ExplorerBarGroupItem group=null;
			IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
			ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
			
			if(selection!=null && selection.PrimarySelection is ExplorerBarGroupItem)
			{
				group=selection.PrimarySelection as ExplorerBarGroupItem;
			}
			else if(bar.Groups.Count>0)
			{
				System.Drawing.Point point=bar.PointToClient(Form.MousePosition);
				if(bar.Bounds.Contains(point))
				{
					foreach(BaseItem item in bar.Groups)
					{
						if(item.DisplayRectangle.Contains(point))
						{
							group=item as ExplorerBarGroupItem;
							break;
						}
					}
				}
				if(group==null)
				{
					foreach(BaseItem item in bar.Groups)
					{
						if(item.Visible)
						{
							group=item as ExplorerBarGroupItem;
							break;
						}
					}
				}
			}
			if(group==null)
				group=CreateGroup();
			IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
			if(change!=null)
				change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(group).Find("SubItems",true));
			ButtonItem button=dh.CreateComponent(typeof(ButtonItem)) as ButtonItem;
			if(button==null)
				return;
			ExplorerBarGroupItem.SetDesignTimeDefaults(button,group.StockStyle); 
			group.SubItems.Add(button);
			if(change!=null)
				change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(group).Find("SubItems",true),null,null);
			this.RecalcLayout();
		}
		protected override bool CanDragItem(BaseItem item)
		{
			if(item is ExplorerBarGroupItem)
				return false;
			return base.CanDragItem(item);
		}
		#endregion
	}
}