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(); } } }