namespace DevComponents.DotNetBar
{
    using System;
    using System.Drawing;
    /// 
    /// Adds neccessary functions to base item so it supports images properly.
    /// If your item implements images you should derive from this class instead of BaseItem
    /// 
    [System.ComponentModel.ToolboxItem(false),System.ComponentModel.DesignTimeVisible(false)]
    public abstract class ImageItem:BaseItem
    {
		private System.Drawing.Size m_SubItemsImageSize;  // Biggest Image size for the sub items, they would access this property so they know how to draw themself
		private System.Drawing.Size m_ImageSize;
		internal static System.Drawing.Size _InitalImageSize=new System.Drawing.Size(16,16);
		/// 
		/// Create new instance of ImageItem.
		/// 
		public ImageItem():this("","") {}
		/// 
		/// Create new instance of ImageItem and assigns the item name.
		/// 
		/// Item name.
		public ImageItem(string sName):this(sName,"") {}
		/// 
		/// Create new instance of ImageItem and assigns the item name and text.
		/// 
		/// Item name.
		/// Item text.
        public ImageItem(string sName, string ItemText):base(sName, ItemText)
        {
			m_SubItemsImageSize=_InitalImageSize;
			m_ImageSize=_InitalImageSize;
        }
		[System.ComponentModel.Browsable(false),System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
		public virtual System.Drawing.Size ImageSize
		{
			get
			{
				return m_ImageSize;
			}
			set
			{
				m_ImageSize=value;
			}
		}
		/// 
		/// 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 virtual System.Drawing.Size SubItemsImageSize
		{
			get
			{
				return m_SubItemsImageSize;
			}
			set
			{
				m_SubItemsImageSize=value;
			}
		}
		protected internal override void OnItemAdded(BaseItem objItem)
		{
			base.OnItemAdded(objItem);
			ImageItem objImageItem=objItem as ImageItem;
			if(objImageItem!=null)
			{
                Size newSize = m_SubItemsImageSize;
				if(objImageItem.ImageSize.Width>m_SubItemsImageSize.Width)
                    newSize.Width = objImageItem.ImageSize.Width;
				if(objImageItem.ImageSize.Height>m_SubItemsImageSize.Height)
                    newSize.Height = objImageItem.ImageSize.Height;
                this.SubItemsImageSize = newSize;
			}
		}
		/*public override void AddSubItem(BaseItem objItem, int Position)
		{
			base.AddSubItem(objItem, Position);
			ImageItem objImageItem=objItem as ImageItem;
			if(objImageItem!=null)
			{
				if(objImageItem.ImageSize.Width>m_SubItemsImageSize.Width)
					m_SubItemsImageSize.Width=objImageItem.ImageSize.Width;
				if(objImageItem.ImageSize.Height>m_SubItemsImageSize.Height)
					m_SubItemsImageSize.Height=objImageItem.ImageSize.Height;
			}
		}*/
		/// 
		/// Must be called by any sub item that implements the image when image has changed
		/// 
		public virtual void OnSubItemImageSizeChanged(BaseItem objItem)
		{
			ImageItem objImageItem=objItem as ImageItem;
			if(objImageItem==null)
				return;
			if(this.SubItems.Count==1)
			{
                this.SubItemsImageSize = new Size(objImageItem.ImageSize.Width, objImageItem.ImageSize.Height);
			}
			else
			{
                Size newSize = m_SubItemsImageSize;
				if(objImageItem.ImageSize.Width>m_SubItemsImageSize.Width)
					newSize.Width=objImageItem.ImageSize.Width;
				if(objImageItem.ImageSize.Height>m_SubItemsImageSize.Height)
                    newSize.Height = objImageItem.ImageSize.Height;
                this.SubItemsImageSize = newSize;
			}
		}
		protected override void OnIsOnCustomizeDialogChanged()
		{
			if(this.IsOnCustomizeDialog && m_ImageSize.Width==_InitalImageSize.Width && m_ImageSize.Height==_InitalImageSize.Height)
                m_ImageSize=new System.Drawing.Size(16,16);
			base.OnIsOnCustomizeDialogChanged();
		}
		/// 
		/// Called after image on an item has changed.
		/// 
		[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
		public virtual void OnImageChanged(){}
		/// 
		/// Refreshes internal image size structure.
		/// 
		[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
		public virtual void RefreshImageSize()
		{
			this.SubItemsImageSize=Dpi.Size(_InitalImageSize);
			m_ImageSize=_InitalImageSize;
			this.OnImageChanged();
			if(m_SubItems!=null)
			{
				foreach(BaseItem item in this.SubItems)
				{
					if(item is ImageItem)
						((ImageItem)item).RefreshImageSize();
				}
			}
		}
        /// 
        /// Occurs after an item has been removed.
        /// 
        /// Item being removed.
        protected internal override void OnAfterItemRemoved(BaseItem item, int itemIndex)
        {
            base.OnAfterItemRemoved(item, itemIndex);
            if (item != null)
                this.RefreshSubItemImageSize();
        }
		/// 
		/// Refreshes internal image size structure.
		/// 
		[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
		public virtual void RefreshSubItemImageSize()
		{
			this.SubItemsImageSize=System.Drawing.Size.Empty;
			if(m_SubItems!=null)
			{
				foreach(BaseItem item in this.SubItems)
				{
					ImageItem objImageItem=item as ImageItem;
					if(objImageItem!=null)
					{
                        Size newSize = m_SubItemsImageSize;
						if(objImageItem.ImageSize.Width>m_SubItemsImageSize.Width)
							newSize.Width=objImageItem.ImageSize.Width;
						if(objImageItem.ImageSize.Height>m_SubItemsImageSize.Height)
							newSize.Height=objImageItem.ImageSize.Height;
                        this.SubItemsImageSize = newSize;
					}
				}
			}
            if (this.SubItemsImageSize.IsEmpty)
                this.SubItemsImageSize = Dpi.Size(_InitalImageSize);
		}
        protected override void ScaleItem(SizeF factor)
        {
            base.ScaleItem(factor); // Notify children first so they can update image size and so we can pick it up next
            RefreshSubItemImageSize();
        }
    }
}