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