using System;
using System.Drawing;
using System.Drawing.Design;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
///
/// Represents the Explorer-Bar Group item.
///
[System.ComponentModel.ToolboxItem(false), Designer("DevComponents.DotNetBar.Design.ExplorerBarGroupItemDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")]
public class ExplorerBarGroupItem:ImageItem,IDesignTimeProvider
{
#region Private Variables
private Rectangle m_ExpandButtonRect=Rectangle.Empty;
private bool m_ExpandButtonHot=false;
private int m_Margin=2;
private bool m_MouseOver=false;
private bool m_MouseDown=false;
private Rectangle m_PanelRect=Rectangle.Empty;
private ItemStyleMapper m_HeaderStyle=null;
private ItemStyleMapper m_HeaderHotStyle=null;
private ItemStyleMapper m_BackgroundStyle=null;
private ElementStyle m_TitleStyle = null;
private ElementStyle m_TitleHotStyle = null;
private ElementStyle m_BackStyle = null;
private eExplorerBarStockStyle m_StockStyle=eExplorerBarStockStyle.Custom;
private bool m_ExpandButtonVisible=true;
//private eBarImageSize m_ItemImageSize=eBarImageSize.Default;
private System.Drawing.Point m_MouseDownPt;
// Used to host items that have windows associated with them....
//private ExplorerBarPanelControlHost m_ControlHost=null;
private const int EXPAND_MARGIN=25;
private System.Drawing.Image m_Image=null;
private int m_ImageIndex=-1; // Image index if image from ImageList is used
private System.Drawing.Image m_ImageCachedIdx=null;
private int m_SubItemsMargin=4;
private bool m_XPSpecialGroup=false;
// Expand Button Colors
private Color m_ExpandBorderColor=Color.DarkGray;
private Color m_ExpandBackColor=Color.White;
private Color m_ExpandForeColor=SystemColors.ActiveCaption;
private Color m_ExpandHotBorderColor=Color.DarkGray;
private Color m_ExpandHotBackColor=Color.White;
private Color m_ExpandHotForeColor=SystemColors.ActiveCaption;
private bool m_HeaderExpands=true;
private bool m_WordWrapSubItems=true;
private const string INFO_EMPTYPANEL="Right-click header and choose one of Create commands or use SubItems collection to create new buttons. You can also drag & drop controls on this panel.";
private bool m_DropShadow=true;
private ShadowPaintInfo m_ShadowPaintInfo=null;
#endregion
///
/// Creates new instance of ExplorerBarGroupItem.
///
public ExplorerBarGroupItem():this("","") {}
///
/// Creates new instance of ExplorerBarGroupItem and assigns the name to it.
///
/// Item name.
public ExplorerBarGroupItem(string sItemName):this(sItemName,"") {}
///
/// Creates new instance of ExplorerBarGroupItem and assigns the name and text to it.
///
/// Item name.
/// item text.
public ExplorerBarGroupItem(string sItemName, string ItemText):base(sItemName,ItemText)
{
m_IsContainer=true;
m_AllowOnlyOneSubItemExpanded=false;
m_TitleStyle = new ElementStyle();
m_TitleStyle.StyleChanged += new EventHandler(this.VisualPropertyChanged);
m_TitleHotStyle = new ElementStyle();
m_TitleHotStyle.StyleChanged += new EventHandler(this.VisualPropertyChanged);
m_BackStyle = new ElementStyle();
m_BackStyle.StyleChanged += new EventHandler(this.VisualPropertyChanged);
m_HeaderStyle = new ItemStyleMapper(m_TitleStyle);
m_HeaderHotStyle = new ItemStyleMapper(m_TitleHotStyle);
m_BackgroundStyle = new ItemStyleMapper(m_BackStyle);
SubItemsImageSize = new Size(12, 12);
ImageSize = new Size(12, 12);
//try
//{
// m_HeaderStyle.Font=new Font(System.Windows.Forms.SystemInformation.MenuFont,FontStyle.Bold);
// m_HeaderHotStyle.Font=new Font(System.Windows.Forms.SystemInformation.MenuFont,FontStyle.Bold);
//}
//catch
//{
// m_HeaderStyle.Font=System.Windows.Forms.SystemInformation.MenuFont.Clone() as Font;
// m_HeaderHotStyle.Font=System.Windows.Forms.SystemInformation.MenuFont.Clone() as Font;
//}
BarFunctions.SetExplorerBarStyle(this,m_StockStyle);
//m_BackgroundStyle.VisualPropertyChanged+=new EventHandler(this.VisualPropertyChanged);
//m_HeaderStyle.VisualPropertyChanged+=new EventHandler(this.VisualPropertyChanged);
//m_HeaderHotStyle.VisualPropertyChanged+=new EventHandler(this.VisualPropertyChanged);
}
protected override void Dispose(bool disposing)
{
if (BarUtilities.DisposeItemImages && !this.DesignMode)
{
BarUtilities.DisposeImage(ref m_Image);
BarUtilities.DisposeImage(ref m_ImageCachedIdx);
}
base.Dispose(disposing);
}
///
/// Returns copy of ExplorerBarGroupItem item.
///
public override BaseItem Copy()
{
ExplorerBarGroupItem objCopy=new ExplorerBarGroupItem();
this.CopyToItem(objCopy);
return objCopy;
}
protected override void CopyToItem(BaseItem copy)
{
ExplorerBarGroupItem objCopy=copy as ExplorerBarGroupItem;
base.CopyToItem(objCopy);
//objCopy.ItemImageSize=m_ItemImageSize;
}
private void VisualPropertyChanged(object sender, EventArgs e)
{
VisualPropertyChanged();
}
internal void VisualPropertyChanged()
{
//ExplorerBar eb=this.ContainerControl as ExplorerBar;
//if(eb!=null)
//{
// ColorScheme cs=eb.ColorScheme;
// m_BackgroundStyle.ApplyColorScheme(cs);
// m_HeaderHotStyle.ApplyColorScheme(cs);
// m_HeaderStyle.ApplyColorScheme(cs);
//}
OnAppearanceChanged();
}
public override void RecalcSize()
{
System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control;
if(!IsHandleValid(objCtrl))
return;
Graphics g=Graphics.FromHwnd(objCtrl.Handle);
SizeF objStringSize=SizeF.Empty;
System.Drawing.Image image=this.GetImage();
string text=m_Text;
if(text=="")
text=" ";
int margin = Dpi.Width(m_Margin);
int textArea=m_Rect.Width-margin*2;
int expandMargin = Dpi.Width(EXPAND_MARGIN);
if(m_ExpandButtonVisible)
textArea-=expandMargin;
if(image!=null)
textArea-=(image.Width+margin*2);
if(textArea<=0)
textArea=1;
bool disposeFont = false;
Font font = this.GetFont(out disposeFont);
objStringSize = TextDrawing.MeasureString(g, text, font, textArea, m_TitleStyle.TextFormat);
if (disposeFont) font.Dispose();
g.Dispose();
m_Rect.Height=Dpi.Height23;
if(m_Rect.Height<(int)objStringSize.Height+margin*2)
m_Rect.Height=(int)objStringSize.Height+margin*2;
if(image!=null)
{
int h=m_Rect.Height;
if(image.Height>m_Rect.Height)
m_Rect.Height=image.Height+margin*2;
m_PanelRect=new Rectangle(0,m_Rect.Height-h,m_Rect.Width,h);
}
else
m_PanelRect=new Rectangle(0,0,m_Rect.Width,m_Rect.Height);
if(m_ExpandButtonVisible)
{
m_ExpandButtonRect=new Rectangle(m_PanelRect.Right-expandMargin,m_PanelRect.Y,expandMargin,m_PanelRect.Height);
}
if(this.Expanded)
{
if(m_SubItems!=null)
{
int iTop=m_Rect.Bottom+1;
int iLeft=m_Rect.Left+m_SubItemsMargin;
// if(m_ControlHost!=null)
// {
// iTop=0;
// iLeft=0;
// }
int iIndex=-1;
foreach(BaseItem item in m_SubItems)
{
iIndex++;
if(!item.Visible)
{
item.Displayed=false;
continue;
}
item.WidthInternal=m_Rect.Width-m_SubItemsMargin*2;
item.RecalcSize();
item.WidthInternal=m_Rect.Width-m_SubItemsMargin*2;
if(item.BeginGroup)
{
iTop+=Dpi.Height3;
}
item.TopInternal=iTop;
item.LeftInternal=iLeft;
iTop+=item.HeightInternal;
item.Displayed=true;
}
m_Rect.Height=iTop-m_Rect.Top+Dpi.Height2;
}
}
else
{
foreach(BaseItem item in m_SubItems)
{
item.Displayed=false;
}
}
if(this.Expanded && this.DesignMode && this.SubItems.Count==0 && this.Parent!=null && this.Parent.SubItems.Count==1)
{
m_Rect.Height+=64;
}
base.RecalcSize();
}
private Image GetImage()
{
if(m_Image!=null)
return m_Image;
if(m_ImageIndex>=0)
{
return GetImageFromImageList(m_ImageIndex);
}
return null;
}
private Image GetImageFromImageList(int ImageIndex)
{
if(ImageIndex>=0)
{
IOwner owner=null;
Bar bar=null;
if(owner==null) owner=this.GetOwner() as IOwner;
if(bar==null) bar=this.ContainerControl as Bar;
if(owner!=null)
{
try
{
if(owner.ImagesMedium!=null)
{
if(m_ImageCachedIdx==null)
m_ImageCachedIdx=owner.ImagesMedium.Images[ImageIndex];
return m_ImageCachedIdx;
}
}
catch(Exception)
{
return null;
}
}
}
return null;
}
private ShadowPaintInfo GetShadowPaintInfo()
{
if(m_ShadowPaintInfo==null)
m_ShadowPaintInfo=new ShadowPaintInfo();
m_ShadowPaintInfo.Size=3;
return m_ShadowPaintInfo;
}
private bool m_IsPainting = false;
public override void Paint(ItemPaintArgs pa)
{
if(this.DisplayRectangle.Width<=0 || this.DisplayRectangle.Height<=0 || m_IsPainting)
return;
m_IsPainting = true;
try
{
if (this.IsThemed)
{
PaintThemed(pa);
this.DrawInsertMarker(pa.Graphics);
return;
}
if (this.SuspendLayout)
return;
System.Drawing.Graphics g = pa.Graphics;
if (m_NeedRecalcSize)
RecalcSize();
Rectangle r = m_PanelRect;
r.Offset(m_Rect.X, m_Rect.Y);
bool disposeFont = false;
Font font = this.GetFont(out disposeFont);
System.Windows.Forms.Control ctrl = this.ContainerControl as System.Windows.Forms.Control;
System.Drawing.Image image = this.GetImage();
Rectangle rText = r;
int margin = Dpi.Width(m_Margin);
rText.X += margin;
// This is left margin of the text
rText.X += margin * 2;
rText.Width -= (margin * 3);
if (image != null)
{
rText.Width -= (image.Width + margin);
rText.X += (image.Width + margin);
}
if (m_ExpandButtonVisible)
rText.Width -= Dpi.Width(EXPAND_MARGIN);
ElementStyleDisplayInfo info = new ElementStyleDisplayInfo();
info.Bounds = r;
info.Graphics = g;
if (m_MouseOver)
info.Style = m_TitleHotStyle;
else
info.Style = m_TitleStyle;
ElementStyleDisplay.Paint(info);
if (info.Style.Font != null)
font = info.Style.Font;
if (pa.RightToLeft)
{
TextDrawing.DrawString(g, m_Text, font, info.Style.TextColor, GetRtlRectangle(m_PanelRect, rText), info.Style.TextFormat | eTextFormat.RightToLeft);
}
else
TextDrawing.DrawString(g, m_Text, font, info.Style.TextColor, rText, info.Style.TextFormat);
//g.ResetClip();
//g.Clip=oldClip;
if (m_ExpandButtonVisible)
{
Rectangle expandedRect = m_ExpandButtonRect;
expandedRect.Offset(m_Rect.X, m_Rect.Y);
if (pa.RightToLeft)
PaintExpandButton(pa, GetRtlRectangle(m_Rect, expandedRect), m_MouseOver, m_MouseDown, m_Expanded);
else
PaintExpandButton(pa, expandedRect, m_MouseOver, m_MouseDown, m_Expanded);
}
int cornerSize = m_TitleStyle.CornerDiameter;
// Paint Background
Rectangle backRect = new Rectangle(m_Rect.X, m_PanelRect.Bottom + m_Rect.Y, m_Rect.Width, m_Rect.Height - m_PanelRect.Bottom);
if (backRect.Width > 0 && backRect.Height > 0)
{
//g.Clip=new Region(backRect);
info.Style = m_BackStyle;
info.Bounds = backRect;
ElementStyleDisplay.Paint(info);
//m_BackgroundStyle.Paint(g,backRect,"",Rectangle.Empty,this.GetFont(),new Point[]{new Point(backRect.X,backRect.Y),new Point(backRect.X,backRect.Bottom-1),new Point(backRect.X,backRect.Bottom-1),new Point(backRect.Right-1,backRect.Bottom-1),new Point(backRect.Right-1,backRect.Bottom-1),new Point(backRect.Right-1,backRect.Y)});
//g.ResetClip();
//g.Clip=oldClip;
if (m_DropShadow)
{
ShadowPaintInfo shadowInfo = GetShadowPaintInfo();
shadowInfo.Rectangle = new Rectangle(m_Rect.X, m_Rect.Y + m_PanelRect.Top + cornerSize, m_Rect.Width, m_Rect.Height - m_PanelRect.Top - cornerSize);
shadowInfo.Graphics = g;
ShadowPainter.Paint(shadowInfo);
}
}
else
{
if (m_DropShadow)
{
r.Y += cornerSize;
r.Height -= cornerSize;
ShadowPaintInfo shadowInfo = GetShadowPaintInfo();
shadowInfo.Rectangle = r;
shadowInfo.Graphics = g;
ShadowPainter.Paint(shadowInfo);
}
}
// Draw Image
if (image != null)
{
if (pa.RightToLeft)
g.DrawImage(image, GetRtlRectangle(m_PanelRect, new Rectangle(r.Left + margin, r.Bottom - margin - image.Height, image.Width, image.Height)));
else
g.DrawImage(image, r.Left + margin, r.Bottom - margin - image.Height, image.Width, image.Height);
}
if (this.Focused)
{
if (this.DesignMode)
{
Rectangle rFocus = r;
rFocus.Inflate(-1, -1);
if (pa.RightToLeft) rFocus = GetRtlRectangle(m_PanelRect, rFocus);
DesignTime.DrawDesignTimeSelection(g, r, pa.Colors.ItemDesignTimeBorder);
}
else
{
Rectangle rFocus = rText;
rFocus.Inflate(0, -1);
rFocus.Width -= 2;
rFocus.X -= 2;
if (pa.RightToLeft) rFocus = GetRtlRectangle(m_PanelRect, rFocus);
System.Windows.Forms.ControlPaint.DrawFocusRectangle(g, rFocus);
}
}
if ((this.Expanded || this.Parent is ExplorerBarContainerItem && ((ExplorerBarContainerItem)this.Parent)._Animating) && m_SubItems != null) // && m_ControlHost==null)
{
r = new Rectangle(m_Rect.X, m_Rect.Y + r.Height + 1, m_Rect.Width, m_Rect.Height - r.Height - 1);
for (int i = 0; i < m_SubItems.Count; i++)
{
BaseItem item = m_SubItems[i];
if (!item.Displayed || !item.Visible)
continue;
if (item.BeginGroup)
{
using (Pen line = new Pen(pa.Colors.ItemSeparator, 1))
g.DrawLine(line, item.LeftInternal + 2, item.TopInternal - 2, item.DisplayRectangle.Right - 4, item.TopInternal - 2);
}
item.Paint(pa);
}
}
if (disposeFont)
font.Dispose();
this.DrawInsertMarker(pa.Graphics);
PaintInfoText(pa);
}
finally
{
m_IsPainting = false;
}
}
private Rectangle GetRtlRectangle(Rectangle bounds, Rectangle r)
{
return new Rectangle(bounds.Right - (r.Width + (r.X - bounds.X)), r.Y, r.Width, r.Height);
}
private void PaintThemed(ItemPaintArgs pa)
{
if(this.SuspendLayout)
return;
System.Drawing.Graphics g;
if(m_NeedRecalcSize)
RecalcSize();
Bitmap bmp=new Bitmap(this.DisplayRectangle.Width,this.DisplayRectangle.Height,pa.Graphics);
g=Graphics.FromImage(bmp);
ThemeExplorerBar theme=pa.ThemeExplorerBar;
Rectangle r=m_PanelRect;
ThemeExplorerBarParts part=ThemeExplorerBarParts.NormalGroupHead;
ThemeExplorerBarStates state=ThemeExplorerBarStates.NormalGroupHeadNormal;
if(m_XPSpecialGroup)
part=ThemeExplorerBarParts.SpecialGroupHead;
theme.DrawBackground(g,part,state,r);
// Paint Background
Rectangle backRect=new Rectangle(0,m_PanelRect.Bottom,m_Rect.Width+(m_XPSpecialGroup?0:0),m_Rect.Height-m_PanelRect.Bottom);
if(backRect.Width>0 && backRect.Height>0)
{
ThemeExplorerBarParts partBack;
ThemeExplorerBarStates stateBack;
if(m_XPSpecialGroup)
{
partBack=ThemeExplorerBarParts.SpecialGroupBackground;
stateBack=ThemeExplorerBarStates.SpecialGroupBackgroundNormal;
}
else
{
partBack=ThemeExplorerBarParts.NormalGroupBackground;
stateBack=ThemeExplorerBarStates.NormalGroupBackgroundNormal;
}
theme.DrawBackground(g,partBack,stateBack,backRect);
}
System.Drawing.Image image=this.GetImage();
Rectangle rText=r;
int margin = Dpi.Width(m_Margin);
rText.X+=margin;
// This is left margin of the text
rText.X+=margin*2;
rText.Width-=(margin*5);
if(image!=null)
{
rText.Width-=(image.Width+margin);
rText.X+=(image.Width+margin);
}
if(m_ExpandButtonVisible)
rText.Width-=Dpi.Width(EXPAND_MARGIN);
bool disposeFont = false;
Font font=this.GetFont(out disposeFont);
ElementStyle style = m_TitleStyle;
if (m_MouseOver)
style = m_TitleHotStyle;
if (style.Font != null)
font = style.Font;
if (pa.RightToLeft)
{
TextDrawing.DrawStringLegacy(g, m_Text, font, style.TextColor, GetRtlRectangle(m_PanelRect, rText), style.TextFormat | eTextFormat.RightToLeft);
}
else
TextDrawing.DrawStringLegacy(g, m_Text, font, style.TextColor, rText, style.TextFormat);
if(m_ExpandButtonVisible)
{
ThemeExplorerBarParts part2=part;
Rectangle expandedRect=m_ExpandButtonRect;
if(m_XPSpecialGroup)
{
if(this.Expanded)
{
part=ThemeExplorerBarParts.SpecialGroupCollapse;
if(m_ExpandButtonHot)
state=ThemeExplorerBarStates.SpecialGroupCollapseHot;
else
state=ThemeExplorerBarStates.SpecialGroupCollapseNormal;
}
else
{
part=ThemeExplorerBarParts.SpecialGroupExpand;
if(m_ExpandButtonHot)
state=ThemeExplorerBarStates.SpecialGroupExpandHot;
else
state=ThemeExplorerBarStates.SpecialGroupExpandNormal;
}
}
else
{
if(this.Expanded)
{
part=ThemeExplorerBarParts.NormalGroupCollapse;
if(m_ExpandButtonHot)
state=ThemeExplorerBarStates.NormalGroupCollapseHot;
else
state=ThemeExplorerBarStates.NormalGroupCollapseNormal;
}
else
{
part=ThemeExplorerBarParts.NormalGroupExpand;
if(m_ExpandButtonHot)
state=ThemeExplorerBarStates.NormalGroupExpandHot;
else
state=ThemeExplorerBarStates.NormalGroupExpandNormal;
}
}
if(pa.RightToLeft)
theme.DrawBackground(g, part, state, GetRtlRectangle(m_Rect, expandedRect));
else
theme.DrawBackground(g,part,state, expandedRect);
}
// Draw Image
if(image!=null)
{
if(pa.RightToLeft)
g.DrawImage(image, GetRtlRectangle(m_PanelRect, new Rectangle(r.Left + margin, r.Bottom - margin - image.Height, image.Width, image.Height)));
else
g.DrawImage(image,r.Left+margin,r.Bottom-margin-image.Height,image.Width,image.Height);
}
if(this.Focused)
{
if(this.DesignMode)
{
Rectangle rFocus=r;
rFocus.Inflate(-1,-1);
if (pa.RightToLeft) rFocus = GetRtlRectangle(m_PanelRect, rFocus);
DesignTime.DrawDesignTimeSelection(g,r,pa.Colors.ItemDesignTimeBorder);
}
else
{
Rectangle rFocus=rText;
rFocus.Inflate(0,-1);
rFocus.Width-=2;
rFocus.X-=2;
if (pa.RightToLeft) rFocus = GetRtlRectangle(m_PanelRect, rFocus);
System.Windows.Forms.ControlPaint.DrawFocusRectangle(g,rFocus);
}
}
g.Dispose();
g=pa.Graphics;
g.DrawImage(bmp,this.DisplayRectangle.X,this.DisplayRectangle.Y,bmp.Width,bmp.Height);
bmp.Dispose();
if (disposeFont) font.Dispose();
if((this.Expanded || this.Parent is ExplorerBarContainerItem && ((ExplorerBarContainerItem)this.Parent)._Animating) && m_SubItems!=null) // && m_ControlHost==null)
{
r=new Rectangle(m_Rect.X,m_Rect.Y+r.Height+1,m_Rect.Width,m_Rect.Height-r.Height-1);
for(int i=0;i
/// Specifies whether item is drawn using Themes when running on OS that supports themes like Windows XP.
///
[Browsable(false),DevCoBrowsable(false),DefaultValue(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),Category("Appearance"),Description("Specifies whether item is drawn using Themes when running on OS that supports themes like Windows XP.")]
public override bool ThemeAware
{
get
{
return base.ThemeAware;
}
set
{
m_ThemeAware=value;
if(m_SubItems!=null)
{
foreach(BaseItem item in m_SubItems)
{
if(!(item is ButtonItem))
item.ThemeAware=value;
}
}
}
}
private void PaintThemeExpandButton()
{
if(!m_ExpandButtonVisible)
return;
System.Windows.Forms.Control container=this.ContainerControl as System.Windows.Forms.Control;
if(!IsHandleValid(container))
return;
Graphics g=BarFunctions.CreateGraphics(container);
try
{
ThemeExplorerBar theme=null;
bool bDisposeTheme=false;
if(container is IThemeCache)
theme=((IThemeCache)container).ThemeExplorerBar;
else
{
bDisposeTheme=true;
theme=new ThemeExplorerBar(container);
}
ThemeExplorerBarParts part=ThemeExplorerBarParts.NormalGroupCollapse;
ThemeExplorerBarStates state=ThemeExplorerBarStates.NormalGroupCollapseNormal;
Rectangle expandedRect=m_ExpandButtonRect;
expandedRect.Offset(m_Rect.X,m_Rect.Y);
if(m_XPSpecialGroup)
{
if(this.Expanded)
{
part=ThemeExplorerBarParts.SpecialGroupCollapse;
if(m_ExpandButtonHot)
state=ThemeExplorerBarStates.SpecialGroupCollapseHot;
else
state=ThemeExplorerBarStates.SpecialGroupCollapseNormal;
}
else
{
part=ThemeExplorerBarParts.SpecialGroupExpand;
if(m_ExpandButtonHot)
state=ThemeExplorerBarStates.SpecialGroupExpandHot;
else
state=ThemeExplorerBarStates.SpecialGroupExpandNormal;
}
}
else
{
if(this.Expanded)
{
part=ThemeExplorerBarParts.NormalGroupCollapse;
if(m_ExpandButtonHot)
state=ThemeExplorerBarStates.NormalGroupCollapseHot;
else
state=ThemeExplorerBarStates.NormalGroupCollapseNormal;
}
else
{
part=ThemeExplorerBarParts.NormalGroupExpand;
if(m_ExpandButtonHot)
state=ThemeExplorerBarStates.NormalGroupExpandHot;
else
state=ThemeExplorerBarStates.NormalGroupExpandNormal;
}
}
theme.DrawBackground(g,part,state,expandedRect);
if(bDisposeTheme)
theme.Dispose();
}
finally
{
if (g != null)
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault;
g.Dispose();
}
}
}
private void PaintExpandButton()
{
if(!m_ExpandButtonVisible)
return;
Rectangle r=m_ExpandButtonRect;
r.Offset(m_Rect.X,m_Rect.Y);
System.Windows.Forms.Control control=this.ContainerControl as System.Windows.Forms.Control;
if(control==null)
return;
control.Invalidate(r);
control.Update();
return;
}
private void PaintExpandButton(ItemPaintArgs pa, Rectangle r, bool bHot, bool bPressed, bool bExpanded)
{
Graphics g = pa.Graphics;
ExplorerBar bar = pa.ContainerControl as ExplorerBar;
if (bar != null && (bar.GroupButtonExpandNormal != null && !bExpanded || bar.GroupButtonCollapseNormal != null && bExpanded))
{
Image image = bar.GroupButtonExpandNormal;
if (bExpanded)
image = bar.GroupButtonCollapseNormal;
if (bPressed)
{
if (!bExpanded && bar.GroupButtonExpandPressed!=null)
image = bar.GroupButtonExpandPressed;
else if(bExpanded && bar.GroupButtonCollapsePressed!=null)
image = bar.GroupButtonCollapsePressed;
}
else if (bHot)
{
if (!bExpanded && bar.GroupButtonExpandHot != null)
image = bar.GroupButtonExpandHot;
else if(bExpanded && bar.GroupButtonCollapseHot!=null)
image = bar.GroupButtonCollapseHot;
}
Rectangle imageRect = r;
imageRect.Y += (imageRect.Height - image.Height) / 2;
g.DrawImageUnscaled(image, imageRect);
return;
}
int EXPAND_SIZE=Dpi.Width16;
using(Pen p=new Pen((bHot?m_ExpandHotBorderColor:m_ExpandBorderColor),1))
{
if(r.Width>EXPAND_SIZE)
r.Offset((r.Width-EXPAND_SIZE)/2,0);
if(r.Height>EXPAND_SIZE)
r.Offset(0,(r.Height-EXPAND_SIZE)/2);
r.Width=EXPAND_SIZE;
r.Height=EXPAND_SIZE;
Brush brush=new SolidBrush((bHot?m_ExpandHotBackColor:m_ExpandBackColor));
g.FillEllipse(brush,r);
brush.Dispose();
g.DrawEllipse(p,r);
}
using(Pen p=new Pen((bHot?m_ExpandHotForeColor:m_ExpandForeColor),Dpi.Width1))
{
if(bExpanded)
{
Point midPoint=new Point(r.X+EXPAND_SIZE/2,r.Y+Dpi.Height4);
g.DrawLine(p,midPoint.X,midPoint.Y,midPoint.X-Dpi.Width3,midPoint.Y+Dpi.Height3);
g.DrawLine(p, midPoint.X, midPoint.Y, midPoint.X + Dpi.Width3, midPoint.Y + Dpi.Height3);
g.DrawLine(p, midPoint.X, midPoint.Y + Dpi.Height1, midPoint.X - Dpi.Width3, midPoint.Y + Dpi.Height4);
g.DrawLine(p, midPoint.X, midPoint.Y + Dpi.Height1, midPoint.X + Dpi.Width3, midPoint.Y + Dpi.Height4);
midPoint.Y += Dpi.Height4;
g.DrawLine(p, midPoint.X, midPoint.Y, midPoint.X - Dpi.Width3, midPoint.Y + Dpi.Height3);
g.DrawLine(p, midPoint.X, midPoint.Y, midPoint.X + Dpi.Width3, midPoint.Y + Dpi.Height3);
g.DrawLine(p, midPoint.X, midPoint.Y + Dpi.Height1, midPoint.X - Dpi.Width3, midPoint.Y + Dpi.Height4);
g.DrawLine(p, midPoint.X, midPoint.Y + Dpi.Height1, midPoint.X + Dpi.Width3, midPoint.Y + Dpi.Height4);
}
else
{
Point midPoint = new Point(r.X + EXPAND_SIZE / 2, r.Y + Dpi.Height8);
g.DrawLine(p, midPoint.X, midPoint.Y, midPoint.X - Dpi.Width3, midPoint.Y - Dpi.Height3);
g.DrawLine(p, midPoint.X, midPoint.Y, midPoint.X + Dpi.Width3, midPoint.Y - Dpi.Height3);
g.DrawLine(p, midPoint.X, midPoint.Y - Dpi.Height1, midPoint.X - Dpi.Width3, midPoint.Y - Dpi.Height4);
g.DrawLine(p, midPoint.X, midPoint.Y - Dpi.Height1, midPoint.X + Dpi.Width3, midPoint.Y - Dpi.Height4);
midPoint.Y += Dpi.Height4;
g.DrawLine(p, midPoint.X, midPoint.Y, midPoint.X - Dpi.Width3, midPoint.Y - Dpi.Height3);
g.DrawLine(p, midPoint.X, midPoint.Y, midPoint.X + Dpi.Width3, midPoint.Y - Dpi.Height3);
g.DrawLine(p, midPoint.X, midPoint.Y - Dpi.Height1, midPoint.X - Dpi.Width3, midPoint.Y - Dpi.Height4);
g.DrawLine(p, midPoint.X, midPoint.Y - Dpi.Height1, midPoint.X + Dpi.Width3, midPoint.Y - Dpi.Height4);
}
}
}
public override void SubItemSizeChanged(BaseItem objChildItem)
{
NeedRecalcSize=true;
}
private void PaintArrow(Graphics g, Rectangle rect, Color c, bool up)
{
Point[] p=new Point[3];
if(up)
{
p[0].X=rect.Left+(rect.Width-9)/2;
p[0].Y=rect.Top+rect.Height/2+1;
p[1].X=p[0].X+8;
p[1].Y=p[0].Y;
p[2].X=p[0].X+4;
p[2].Y=p[0].Y-5;
}
else
{
p[0].X=rect.Left+(rect.Width-7)/2;
p[0].Y=rect.Top+(rect.Height-4)/2;
p[1].X=p[0].X+7;
p[1].Y=p[0].Y;
p[2].X=p[0].X+3;
p[2].Y=p[0].Y+4;
}
g.FillPolygon(new SolidBrush(c),p);
}
///
/// Returns the Font object to be used for drawing the item text.
///
/// Font object.
protected virtual Font GetFont(out bool disposeFont)
{
disposeFont=false;
if (this.TitleStyle.Font != null)
return this.TitleStyle.Font;
System.Drawing.Font font = null; // System.Windows.Forms.SystemInformation.MenuFont;
System.Windows.Forms.Control ctrl=this.ContainerControl as System.Windows.Forms.Control;
if (ctrl != null)
font = ctrl.Font;
else
{
font = SystemFonts.DefaultFont;
disposeFont = true;
}
if (!font.Bold)
{
font = new Font(font, FontStyle.Bold);
disposeFont = true;
}
return font;
}
///
/// Occurs when the mouse pointer is moved over the item. This is used by internal implementation only.
///
[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public override void InternalMouseMove(System.Windows.Forms.MouseEventArgs objArg)
{
if(objArg.Button==System.Windows.Forms.MouseButtons.Left && (Math.Abs(objArg.X-m_MouseDownPt.X)>=4 || Math.Abs(objArg.Y-m_MouseDownPt.Y)>=4))
{
ExplorerBar explorerBar=this.ContainerControl as ExplorerBar;
if(explorerBar!=null && explorerBar.AllowUserCustomize && this.CanCustomize)
{
BaseItem active=m_HotSubItem;
if(active!=null && active.CanCustomize && !active.SystemItem)
{
IOwner owner=this.GetOwner() as IOwner;
if(owner!=null && owner.DragItem==null)
{
owner.StartItemDrag(active);
return;
}
}
}
}
Rectangle r=m_PanelRect;
r.Offset(m_Rect.Location);
if(r.Contains(objArg.X,objArg.Y))
{
if(!m_MouseOver)
{
m_MouseOver=true;
if(m_HeaderExpands)
this.Cursor=System.Windows.Forms.Cursors.Hand;
this.Refresh();
}
}
else if(m_MouseOver)
{
if(m_HeaderExpands)
this.Cursor=System.Windows.Forms.Cursors.Default;
m_MouseOver=false;
this.Refresh();
}
Rectangle rExpand=m_ExpandButtonRect;
rExpand.Offset(m_Rect.Location);
if(m_ExpandButtonVisible && rExpand.Contains(objArg.X,objArg.Y))
{
if(m_HotSubItem!=null)
{
m_HotSubItem.InternalMouseLeave();
m_HotSubItem=null;
}
m_ExpandButtonHot=true;
PaintExpandButton();
return;
}
else if(m_ExpandButtonHot)
{
m_ExpandButtonHot=false;
PaintExpandButton();
}
base.InternalMouseMove(objArg);
}
[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public override void InternalMouseLeave()
{
this.Cursor=System.Windows.Forms.Cursors.Default;
base.InternalMouseLeave();
m_MouseOver=false;
m_MouseDown=false;
if(m_ExpandButtonHot)
m_ExpandButtonHot=false;
this.Refresh();
}
///
/// Occurs when the mouse pointer is over the item and a mouse button is pressed. This is used by internal implementation only.
///
[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public override void InternalMouseDown(System.Windows.Forms.MouseEventArgs objArg)
{
Rectangle r=m_PanelRect;
r.Offset(m_Rect.Location);
m_MouseDownPt=new System.Drawing.Point(objArg.X,objArg.Y);
if(this.DesignMode)
{
if(this.ItemAtLocation(objArg.X,objArg.Y)==null && !r.Contains(objArg.X,objArg.Y) && this.Expanded)
{
IOwner owner=this.GetOwner() as IOwner;
if(owner!=null)
owner.SetFocusItem(null);
}
else if(!r.Contains(objArg.X,objArg.Y))
base.InternalMouseDown(objArg);
return;
}
Rectangle rExpand=m_ExpandButtonRect;
rExpand.Offset(m_Rect.X,m_Rect.Y);
if(m_ExpandButtonVisible && objArg.Button==System.Windows.Forms.MouseButtons.Left && rExpand.Contains(objArg.X,objArg.Y))
{
ExpandButtonClick();
return;
}
base.InternalMouseDown(objArg);
if(objArg.Button == System.Windows.Forms.MouseButtons.Left && r.Contains(objArg.X,objArg.Y))
{
m_MouseDown=true;
if(m_HeaderExpands)
this.Expanded=!this.Expanded;
else
this.Refresh();
}
}
internal void ExpandButtonClick()
{
this.Expanded=!this.Expanded;
}
protected internal override void OnExpandChange()
{
base.OnExpandChange();
foreach (BaseItem item in this.SubItems)
{
if (item.Visible) item.Displayed = this.Expanded;
}
}
[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public override void InternalMouseUp(System.Windows.Forms.MouseEventArgs objArg)
{
if(objArg.Button==System.Windows.Forms.MouseButtons.Left)
{
m_MouseDown=false;
this.Refresh();
}
base.InternalMouseUp(objArg);
}
///
/// Occurs when the item is clicked. This is used by internal implementation only.
///
[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public override void InternalClick(System.Windows.Forms.MouseButtons mb, System.Drawing.Point mpos)
{
base.InternalClick(mb,mpos);
if((this.GetOwner() as IOwner)!=null && ((IOwner)this.GetOwner()).DragInProgress)
return;
}
protected internal override void OnSubItemsClear()
{
base.OnSubItemsClear();
NeedRecalcSize=true;
if(this.DesignMode)
this.Refresh();
}
protected override void OnTopLocationChanged(int oldValue)
{
int iDiff=m_Rect.Top-oldValue;
if(m_SubItems!=null)
{
foreach(BaseItem item in m_SubItems)
{
if(item.Visible)
{
// Set item position
item.TopInternal+=iDiff;
}
}
}
}
protected internal override void OnContainerChanged(object objOldContainer)
{
base.OnContainerChanged(objOldContainer);
if (this.ContainerControl is ExplorerBar)
{
ExplorerBar bar = this.ContainerControl as ExplorerBar;
m_TitleStyle.SetColorScheme(bar.ColorScheme);
m_TitleHotStyle.SetColorScheme(bar.ColorScheme);
m_BackStyle.SetColorScheme(bar.ColorScheme);
}
}
///
/// Called when Visibility of the items has changed.
///
/// New Visible state.
protected internal override void OnVisibleChanged(bool bVisible)
{
base.OnVisibleChanged(bVisible);
if(!bVisible)
{
foreach(BaseItem item in this.SubItems)
item.Displayed=false;
}
}
///
/// Gets or sets whether expand button is visible.
///
[System.ComponentModel.Browsable(true),System.ComponentModel.DefaultValue(true),DevCoBrowsable(true),System.ComponentModel.Category("Behavior"),System.ComponentModel.Description("Gets or sets whether expand button is visible.")]
public bool ExpandButtonVisible
{
get
{
return m_ExpandButtonVisible;
}
set
{
m_ExpandButtonVisible=value;
NeedRecalcSize=true;
OnAppearanceChanged();
}
}
///
/// Gets or sets a value indicating whether the item is expanded or not. For Popup items this would indicate whether the item is popped up or not.
///
[System.ComponentModel.Browsable(true),DevCoBrowsable(true),Category("Behavior"),System.ComponentModel.DefaultValue(false),Description("Gets or sets a value indicating whether group is expanded or not."),DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public override bool Expanded
{
get
{
return base.Expanded;
}
set
{
base.Expanded=value;
}
}
///
/// Gets or sets whether drop shadow is displayed when non-themed display is used.
///
[Browsable(true),Category("Appearance"),DefaultValue(true),Description("Indicates whether drop shadow is displayed when non-themed display is used.")]
public bool DropShadow
{
get {return m_DropShadow;}
set {m_DropShadow=value;}
}
///
/// Gets the reference to ElementStyle object which describes visual appearance of the explorer group item title.
///
[Browsable(true), DevCoBrowsable(true), Category("Style"), Description("Gets or sets a normal item style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ElementStyle TitleStyle
{
get { return m_TitleStyle; }
}
///
/// Gets the reference to ElementStyle object which describes visual appearance of the explorer group item title while mouse is over the title bar.
///
[Browsable(true), DevCoBrowsable(true), Category("Style"), Description("Gets or sets a mouse over item style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ElementStyle TitleHotStyle
{
get { return m_TitleHotStyle; }
}
///
/// Gets or sets the item background style.
///
[Browsable(true), DevCoBrowsable(true), Category("Style"), Description("Gets or sets group background style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ElementStyle BackStyle
{
get { return m_BackStyle; }
}
[Browsable(false),DevCoBrowsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),Obsolete("This property is obsolete. Use TitleStyle property instead"),EditorBrowsable(EditorBrowsableState.Never)]
public ItemStyleMapper HeaderStyle
{
get {return m_HeaderStyle;}
}
[Browsable(false), DevCoBrowsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Obsolete("This property is obsolete. Use TitleHotStyle property instead"), EditorBrowsable(EditorBrowsableState.Never)]
public ItemStyleMapper HeaderHotStyle
{
get {return m_HeaderHotStyle;}
}
[Browsable(false), DevCoBrowsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Obsolete("This property is obsolete. Use BackStyle property instead"), EditorBrowsable(EditorBrowsableState.Never)]
public ItemStyleMapper BackgroundStyle
{
get {return m_BackgroundStyle;}
}
///
/// Gets or sets whether clicking the header of the control expands the item.
///
[Browsable(true),DevCoBrowsable(true),DefaultValue(true),Category("Behavior"),Description("Determines whether clicking the header of the control expands the item.")]
public bool HeaderExpands
{
get {return m_HeaderExpands;}
set {m_HeaderExpands=value;}
}
///
/// Applies the stock style to the object.
///
[Browsable(true),DevCoBrowsable(true),Category("Style"),Description("Applies the stock style to the object."),DefaultValue(eExplorerBarStockStyle.Custom),DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public eExplorerBarStockStyle StockStyle
{
get {return m_StockStyle;}
set
{
m_StockStyle=value;
if(m_StockStyle==eExplorerBarStockStyle.Custom)
return;
BarFunctions.SetExplorerBarStyle(this,m_StockStyle);
foreach(BaseItem item in this.SubItems)
{
if(item is ButtonItem)
BarFunctions.SetExplorerBarStyle(item as ButtonItem,m_StockStyle);
}
if (m_StockStyle == eExplorerBarStockStyle.BlueSpecial || m_StockStyle == eExplorerBarStockStyle.OliveGreenSpecial || m_StockStyle == eExplorerBarStockStyle.SilverSpecial)
this.XPSpecialGroup = true;
else if (m_StockStyle != eExplorerBarStockStyle.SystemColors)
this.XPSpecialGroup = false;
this.Refresh();
}
}
///
/// Applies new visual style to this the item and all of its sub-items.
///
[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DefaultValue(eDotNetBarStyle.OfficeXP),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Determines the display of the item when shown.")]
public override eDotNetBarStyle Style
{
get{return base.Style;}
set{base.Style=value;}
}
///
/// Gets or sets expand button border color.
///
[Browsable(true),DevCoBrowsable(true),Category("Style"),Description("Specifies expand button border color.") ]
public Color ExpandBorderColor
{
get {return m_ExpandBorderColor;}
set
{
m_ExpandBorderColor=value;
OnAppearanceChanged();
}
}
[Browsable(false),DevCoBrowsable(false),EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeExpandBorderColor()
{
return (m_ExpandBorderColor!=Color.DarkGray && m_StockStyle==eExplorerBarStockStyle.Custom);
}
///
/// Gets or sets expand button back color.
///
[Browsable(true),DevCoBrowsable(true),Category("Style"),Description("Specifies expand button back color.") ]
public Color ExpandBackColor
{
get {return m_ExpandBackColor;}
set
{
m_ExpandBackColor=value;
OnAppearanceChanged();
}
}
[Browsable(false),DevCoBrowsable(false),EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeExpandBackColor()
{
return (m_ExpandBackColor!=Color.White && m_StockStyle==eExplorerBarStockStyle.Custom);
}
///
/// Gets or sets expand button fore color.
///
[Browsable(true),DevCoBrowsable(true),Category("Style"),Description("Specifies expand button fore color.") ]
public Color ExpandForeColor
{
get {return m_ExpandForeColor;}
set
{
m_ExpandForeColor=value;
OnAppearanceChanged();
}
}
[Browsable(false),DevCoBrowsable(false),EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeExpandForeColor()
{
return (m_ExpandForeColor!=SystemColors.ActiveCaption && m_StockStyle==eExplorerBarStockStyle.Custom);
}
///
/// Gets or sets hot expand button border color.
///
[Browsable(true),DevCoBrowsable(true),Category("Style"),Description("Specifies hot expand button border color.") ]
public Color ExpandHotBorderColor
{
get {return m_ExpandHotBorderColor;}
set
{
m_ExpandHotBorderColor=value;
OnAppearanceChanged();
}
}
[Browsable(false),DevCoBrowsable(false),EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeExpandHotBorderColor()
{
return (m_ExpandHotBorderColor!=Color.DarkGray && m_StockStyle==eExplorerBarStockStyle.Custom);
}
///
/// Gets or sets hot expand button back color.
///
[Browsable(true),DevCoBrowsable(true),Category("Style"),Description("Specifies hot expand button back color.") ]
public Color ExpandHotBackColor
{
get {return m_ExpandHotBackColor;}
set
{
m_ExpandHotBackColor=value;
OnAppearanceChanged();
}
}
[Browsable(false),DevCoBrowsable(false),EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeExpandHotBackColor()
{
return (m_ExpandHotBackColor!=Color.White && m_StockStyle==eExplorerBarStockStyle.Custom);
}
///
/// Gets or sets hot expand button fore color.
///
[Browsable(true),DevCoBrowsable(true),Category("Style"),Description("Specifies hot expand button fore color.")]
public Color ExpandHotForeColor
{
get {return m_ExpandHotForeColor;}
set
{
m_ExpandHotForeColor=value;
OnAppearanceChanged();
}
}
[Browsable(false),DevCoBrowsable(false),EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeExpandHotForeColor()
{
return (m_ExpandHotForeColor!=SystemColors.ActiveCaption && m_StockStyle==eExplorerBarStockStyle.Custom);
}
///
/// Overloaded. Serializes the item and all sub-items into the XmlElement.
///
/// XmlElement to serialize the item to.
protected internal override void Serialize(ItemSerializationContext context)
{
base.Serialize(context);
System.Xml.XmlElement groupItem = context.ItemXmlElement;
groupItem.SetAttribute("stockstyle",System.Xml.XmlConvert.ToString((int)m_StockStyle));
groupItem.SetAttribute("expvisible",System.Xml.XmlConvert.ToString(m_ExpandButtonVisible));
groupItem.SetAttribute("subitemsmargin",System.Xml.XmlConvert.ToString(m_SubItemsMargin));
groupItem.SetAttribute("xpspecial",System.Xml.XmlConvert.ToString(m_XPSpecialGroup));
groupItem.SetAttribute("expborder",BarFunctions.ColorToString(m_ExpandBorderColor));
groupItem.SetAttribute("expbc",BarFunctions.ColorToString(m_ExpandBackColor));
groupItem.SetAttribute("expfc",BarFunctions.ColorToString(m_ExpandForeColor));
groupItem.SetAttribute("exphborder",BarFunctions.ColorToString(m_ExpandHotBorderColor));
groupItem.SetAttribute("exphbc",BarFunctions.ColorToString(m_ExpandHotBackColor));
groupItem.SetAttribute("exphfc",BarFunctions.ColorToString(m_ExpandHotForeColor));
groupItem.SetAttribute("headerexp",System.Xml.XmlConvert.ToString(m_HeaderExpands));
groupItem.SetAttribute("expanded",System.Xml.XmlConvert.ToString(m_Expanded));
if(m_StockStyle==eExplorerBarStockStyle.Custom)
{
System.Xml.XmlElement style=groupItem.OwnerDocument.CreateElement("backstyle");
groupItem.AppendChild(style);
//m_BackgroundStyle.Serialize(style);
SerializeElementStyle(m_BackStyle, style);
}
if(m_StockStyle==eExplorerBarStockStyle.Custom)
{
System.Xml.XmlElement style=groupItem.OwnerDocument.CreateElement("headerhotstyle");
groupItem.AppendChild(style);
//m_HeaderHotStyle.Serialize(style);
SerializeElementStyle(m_TitleHotStyle, style);
}
if(m_StockStyle==eExplorerBarStockStyle.Custom)
{
System.Xml.XmlElement style=groupItem.OwnerDocument.CreateElement("headerstyle");
groupItem.AppendChild(style);
//m_HeaderStyle.Serialize(style);
SerializeElementStyle(m_TitleStyle, style);
}
if(m_ImageIndex!=-1)
{
groupItem.SetAttribute("imageindex",System.Xml.XmlConvert.ToString(m_ImageIndex));
}
else if(m_Image!=null)
{
System.Xml.XmlElement image=groupItem.OwnerDocument.CreateElement("image");
groupItem.AppendChild(image);
BarFunctions.SerializeImage(m_Image,image);
}
}
private void SerializeElementStyle(ElementStyle style, System.Xml.XmlElement xmlElement)
{
ElementSerializer.Serialize(style, xmlElement);
}
private void DeserializeElementStyle(ElementStyle style, System.Xml.XmlElement xmlElement)
{
ElementSerializer.Deserialize(style, xmlElement);
}
///
/// Overloaded. Deserializes the Item from the XmlElement.
///
/// Source XmlElement.
public override void Deserialize(ItemSerializationContext context)
{
base.Deserialize(context);
System.Xml.XmlElement groupItem = context.ItemXmlElement;
m_StockStyle=(eExplorerBarStockStyle)System.Xml.XmlConvert.ToInt32(groupItem.GetAttribute("stockstyle"));
m_ExpandButtonVisible=System.Xml.XmlConvert.ToBoolean(groupItem.GetAttribute("expvisible"));
m_SubItemsMargin=System.Xml.XmlConvert.ToInt32(groupItem.GetAttribute("subitemsmargin"));
m_XPSpecialGroup=System.Xml.XmlConvert.ToBoolean(groupItem.GetAttribute("xpspecial"));
m_ExpandBorderColor=BarFunctions.ColorFromString(groupItem.GetAttribute("expborder"));
m_ExpandBackColor=BarFunctions.ColorFromString(groupItem.GetAttribute("expbc"));
m_ExpandForeColor=BarFunctions.ColorFromString(groupItem.GetAttribute("expfc"));
m_ExpandHotBorderColor=BarFunctions.ColorFromString(groupItem.GetAttribute("exphborder"));
m_ExpandHotBackColor=BarFunctions.ColorFromString(groupItem.GetAttribute("exphbc"));
m_ExpandHotForeColor=BarFunctions.ColorFromString(groupItem.GetAttribute("exphfc"));
m_HeaderExpands=System.Xml.XmlConvert.ToBoolean(groupItem.GetAttribute("headerexp"));
foreach(System.Xml.XmlElement xmlElem in groupItem.ChildNodes)
{
switch(xmlElem.Name)
{
case "backstyle":
DeserializeElementStyle(m_BackStyle,xmlElem);
break;
case "headerhotstyle":
DeserializeElementStyle(m_TitleHotStyle, xmlElem);
break;
case "headerstyle":
DeserializeElementStyle(m_TitleStyle, xmlElem);
break;
case "image":
m_Image=BarFunctions.DeserializeImage(xmlElem);
break;
}
}
if(groupItem.HasAttribute("imageindex"))
{
this.ImageIndex=System.Xml.XmlConvert.ToInt32(groupItem.GetAttribute("imageindex"));
}
this.RefreshImageSize();
this.Expanded=System.Xml.XmlConvert.ToBoolean(groupItem.GetAttribute("expanded"));
}
protected internal override void OnItemAdded(BaseItem item)
{
NeedRecalcSize=true;
if(item is ButtonItem)
((ButtonItem)item)._FitContainer=m_WordWrapSubItems;
base.OnItemAdded(item);
if(!this.Expanded)
{
if(!item.Displayed)
item.Displayed=true;
item.Displayed=false;
}
if(item is ButtonItem)
{
ButtonItem btn=item as ButtonItem;
btn.ThemeAware=false;
if(btn.ForeColor.IsEmpty && btn.HotForeColor.IsEmpty)
BarFunctions.SetExplorerBarStyle(item as ButtonItem,m_StockStyle);
//btn.PopupSide=ePopupSide.Left;
}
item.NeedRecalcSize=true;
if(this.DesignMode)
this.Refresh();
}
protected internal override void OnBeforeItemRemoved(BaseItem item)
{
if(item is ButtonItem)
((ButtonItem)item)._FitContainer=false;
base.OnBeforeItemRemoved(item);
}
[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DefaultValue(eItemAlignment.Near),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Determines alignment of the item inside the container.")]
public override eItemAlignment ItemAlignment
{
get{return base.ItemAlignment;}
set{base.ItemAlignment=value;}
}
[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DefaultValue(false),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Indicates whether item will stretch to consume empty space. Items on stretchable, no-wrap Bars only.")]
public override bool Stretch
{
get {return base.Stretch;}
set {base.Stretch=value;}
}
[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.Category("Behavior"),System.ComponentModel.DefaultValue(true),System.ComponentModel.Description("Indicates whether the item will auto-collapse (fold) when clicked.")]
public override bool AutoCollapseOnClick
{
get {return base.AutoCollapseOnClick;}
set {base.AutoCollapseOnClick=value;}
}
[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DefaultValue(true),System.ComponentModel.Category("Behavior"),System.ComponentModel.Description("Determines whether sub-items are displayed.")]
public override bool ShowSubItems
{
get {return base.ShowSubItems;}
set {base.ShowSubItems=value;}
}
[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DefaultValue(""),System.ComponentModel.Category("Design"),System.ComponentModel.Description("Indicates item category used to group similar items at design-time.")]
public override string Category
{
get {return base.Category;}
set {base.Category=value;}
}
[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DefaultValue(""),System.ComponentModel.Category("Design"),System.ComponentModel.Description("Indicates description of the item that is displayed during design.")]
public override string Description
{
get {return base.Description;}
set {base.Description=value;}
}
[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DefaultValue(false),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Indicates whether this item is beginning of the group.")]
public override bool BeginGroup
{
get {return base.BeginGroup;}
set {base.BeginGroup=value;}
}
///
/// Gets or sets a value indicating whether the item is enabled.
///
[Browsable(false), DevCoBrowsable(false), DefaultValue(true), Category("Behavior"), Description("Indicates whether is item enabled.")]
public override bool Enabled
{
get { return base.Enabled; }
set { base.Enabled = value; }
}
[System.ComponentModel.Browsable(true),DevCoBrowsable(false),System.ComponentModel.Editor("DevComponents.DotNetBar.Design.ExplorerBarGroupItemEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor)),System.ComponentModel.Category("Data"),System.ComponentModel.Description("Collection of sub items."),System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
public override SubItemsCollection SubItems
{
get
{
return base.SubItems;
}
}
///
/// Gets the rectangle of the panel item Button.
///
[System.ComponentModel.Browsable(false),System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
public Rectangle PanelRect
{
get
{
return m_PanelRect;
}
}
///
/// Shows tooltip for this item.
///
public override void ShowToolTip()
{
if(this.DesignMode)
return;
if(this.Visible && this.Displayed)
{
IOwner owner=this.GetOwner() as IOwner;
if(owner!=null && !owner.ShowToolTips)
return;
System.Windows.Forms.Control ctrl=this.ContainerControl as System.Windows.Forms.Control;
if(ctrl==null)
return;
Rectangle r=m_PanelRect;
r.Offset(m_Rect.X,m_Rect.Y);
if(!r.Contains(ctrl.PointToClient(System.Windows.Forms.Control.MousePosition)))
return;
OnTooltip(true);
if(m_Tooltip!="")
{
if(m_ToolTipWnd==null)
m_ToolTipWnd=new ToolTip();
m_ToolTipWnd.Text=m_Tooltip;
if(owner!=null && owner.ShowShortcutKeysInToolTips && this.Shortcuts.Count>0)
m_ToolTipWnd.Text+=(" ("+this.ShortcutString+")");
IOwnerItemEvents ownerEvents=this.GetIOwnerItemEvents();
if(ownerEvents!=null)
ownerEvents.InvokeToolTipShowing(this,new EventArgs());
m_ToolTipWnd.ShowToolTip();
}
}
}
internal bool UseThemes
{
get {return this.IsThemed;}
}
///
/// Forces the repaint the item.
///
public override void Refresh()
{
if(this.SuspendLayout)
return;
if(!this.Expanded)
base.Refresh();
else
{
if((this.Visible || this.IsOnCustomizeMenu) && this.Displayed)
{
System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control;
if(objCtrl!=null && IsHandleValid(objCtrl) && !(objCtrl is ItemsListBox))
{
if(m_NeedRecalcSize)
{
RecalcSize();
if(m_Parent!=null)
m_Parent.SubItemSizeChanged(this);
}
Rectangle r=m_PanelRect;
r.Inflate(4,4);
objCtrl.Invalidate(m_Rect,false);
}
}
}
}
// Property Editor support for ImageIndex selection
[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public System.Windows.Forms.ImageList ImageList
{
get
{
IOwner owner=this.GetOwner() as IOwner;
if(owner!=null)
return owner.ImagesMedium;
return null;
}
}
///
/// Specifies the image.
///
[System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("The image that will be displayed on the face of the item."),System.ComponentModel.DefaultValue(null)]
public System.Drawing.Image Image
{
get
{
return m_Image;
}
set
{
NeedRecalcSize=true;
m_Image=value;
this.OnImageChanged();
this.Refresh();
}
}
///
/// Indicates whether XP themed special group colors are used for drawing.
///
[System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Indicates whether XP themed special group colors are used for drawing."),System.ComponentModel.DefaultValue(false)]
public bool XPSpecialGroup
{
get {return m_XPSpecialGroup;}
set
{
m_XPSpecialGroup=value;
this.Refresh();
}
}
///
/// Gets or sets the margin in pixels between the edge of the container and the items contained inside of it. Default value is 4.
///
[Browsable(true),DevCoBrowsable(true),Category("Appearance"),DefaultValue(4),Description("Indicates margin in pixels between the edge of the container and the items contained inside of it")]
public int SubItemsMargin
{
get {return m_SubItemsMargin;}
set {m_SubItemsMargin=value;}
}
///
/// Gets or sets whether text on sub items is wrapped on new line if it cannot fit the space available.
///
[System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Behavior"),System.ComponentModel.Description("Indicates whether text on sub items is wrapped on new line if it cannot fit the space available."),System.ComponentModel.DefaultValue(true)]
public bool WordWrapSubItems
{
get {return m_WordWrapSubItems;}
set
{
m_WordWrapSubItems=value;
foreach(BaseItem item in this.SubItems)
{
if(item is ButtonItem)
((ButtonItem)item)._FitContainer=m_WordWrapSubItems;
}
NeedRecalcSize=true;
OnAppearanceChanged();
}
}
///
/// Specifies the index of the image if ImageList is used.
///
[System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("The image list image index of the image that will be displayed on the face of the item."),System.ComponentModel.Editor("DevComponents.DotNetBar.Design.ImageIndexEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor)),System.ComponentModel.TypeConverter(typeof(System.Windows.Forms.ImageIndexConverter)),System.ComponentModel.DefaultValue(-1)]
public int ImageIndex
{
get
{
return m_ImageIndex;
}
set
{
m_ImageCachedIdx=null;
if(m_ImageIndex!=value)
{
m_ImageIndex=value;
if(ShouldSyncProperties)
BarFunctions.SyncProperty(this, "ImageIndex");
if(m_Parent!=null)
{
OnImageChanged();
NeedRecalcSize=true;
this.Refresh();
}
}
}
}
//***********************************************
// IDesignTimeProvider Implementation
//***********************************************
protected virtual InsertPosition GetContainerInsertPosition(Point pScreen, BaseItem dragItem)
{
return DesignTimeProviderContainer.GetInsertPosition(this, pScreen, dragItem);
}
InsertPosition IDesignTimeProvider.GetInsertPosition(Point pScreen, BaseItem dragItem)
{
return GetContainerInsertPosition(pScreen, dragItem);
}
void IDesignTimeProvider.DrawReversibleMarker(int iPos, bool Before)
{
DesignTimeProviderContainer.DrawReversibleMarker(this, iPos, Before);
}
void IDesignTimeProvider.InsertItemAt(BaseItem objItem, int iPos, bool Before)
{
DesignTimeProviderContainer.InsertItemAt(this, objItem, iPos, Before);
}
//InsertPosition IDesignTimeProvider.GetInsertPosition(Point pScreen, BaseItem DragItem)
//{
// InsertPosition objInsertPos=null;
// System.Windows.Forms.Control objContainer=this.ContainerControl as System.Windows.Forms.Control;
// if(objContainer==null || !this.CanCustomize)
// return null;
// Point pClient=objContainer.PointToClient(pScreen);
// Rectangle thisRect=this.DisplayRectangle;
// if(thisRect.Contains(pClient))
// {
// Rectangle r=thisRect;
// r.Size=m_PanelRect.Size;
// r.X+=m_PanelRect.Left;
// r.Y+=m_PanelRect.Top;
// if(r.Contains(pClient) && !this.Expanded)
// {
// this.Expanded=true;
// objInsertPos=new InsertPosition();
// objInsertPos.TargetProvider=this;
// if(this.SubItems.Count==0)
// objInsertPos.Position=-1;
// else
// {
// objInsertPos.Position=0;
// objInsertPos.Before=true;
// }
// return objInsertPos;
// }
// BaseItem objItem;
// // Check first inside any expanded items
// objItem=this.ExpandedItem();
// if(objItem!=null)
// {
// IDesignTimeProvider provider=objItem as IDesignTimeProvider;
// if(provider!=null)
// {
// objInsertPos=provider.GetInsertPosition(pScreen, DragItem);
// if(objInsertPos!=null)
// return objInsertPos;
// }
// }
// for(int i=0;i0 || objItem.IsOnMenuBar))
// {
// if(!objItem.Expanded)
// objItem.Expanded=true;
// }
// else
// {
// CollapseSubItems(this);
// }
// break;
// }
// }
// if(objInsertPos==null)
// {
// // Container is empty but it can contain the items
// if(this.SubItems.Count>1 && this.SubItems[this.SubItems.Count-1].SystemItem)
// objInsertPos=new InsertPosition(this.SubItems.Count-2,true,this);
// else
// objInsertPos=new InsertPosition(this.SubItems.Count-1,false,this);
// }
// }
// else
// {
// foreach(BaseItem objItem in this.SubItems)
// {
// if(objItem==DragItem)
// continue;
// IDesignTimeProvider provider=objItem as IDesignTimeProvider;
// if(provider!=null)
// {
// objInsertPos=provider.GetInsertPosition(pScreen, DragItem);
// if(objInsertPos!=null)
// break;
// }
// }
// }
// return objInsertPos;
//}
//void IDesignTimeProvider.DrawReversibleMarker(int iPos, bool Before)
//{
// System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control;
// if(objCtrl==null)
// return;
// BaseItem objItem=null;
// if(iPos>=0)
// objItem=this.SubItems[iPos];
// Rectangle r, rl,rr;
// if(objItem!=null)
// {
// if(objItem.DesignInsertMarker!=eDesignInsertPosition.None)
// objItem.DesignInsertMarker=eDesignInsertPosition.None;
// else if(Before)
// objItem.DesignInsertMarker=eDesignInsertPosition.Before;
// else
// objItem.DesignInsertMarker=eDesignInsertPosition.After;
// return;
// }
// else
// {
// Rectangle rTmp=this.DisplayRectangle;
// rTmp.Inflate(-1,-1);
// rTmp.Offset(m_PanelRect.X,m_PanelRect.Bottom);
// r=new Rectangle(rTmp.Left+2,rTmp.Top+2,rTmp.Width-4,1);
// rl=new Rectangle(rTmp.Left+1,rTmp.Top,1,5);
// rr=new Rectangle(rTmp.Right-2,rTmp.Top,1,5);
// }
// //r.Location=objCtrl.PointToScreen(r.Location);
// //rl.Location=objCtrl.PointToScreen(rl.Location);
// //rr.Location=objCtrl.PointToScreen(rr.Location);
// //System.Windows.Forms.ControlPaint.DrawReversibleFrame(r,SystemColors.Control,System.Windows.Forms.FrameStyle.Thick);
// //System.Windows.Forms.ControlPaint.DrawReversibleFrame(rl,SystemColors.Control,System.Windows.Forms.FrameStyle.Thick);
// //System.Windows.Forms.ControlPaint.DrawReversibleFrame(rr,SystemColors.Control,System.Windows.Forms.FrameStyle.Thick);
//}
//void IDesignTimeProvider.InsertItemAt(BaseItem objItem, int iPos, bool Before)
//{
// if(this.ExpandedItem()!=null)
// {
// this.ExpandedItem().Expanded=false;
// }
// if(!Before)
// {
// //objItem.BeginGroup=!objItem.BeginGroup;
// if(iPos+1>=this.SubItems.Count)
// {
// this.SubItems.Add(objItem,GetAppendPosition(this));
// }
// else
// {
// this.SubItems.Add(objItem,iPos+1);
// }
// }
// else
// {
// if(iPos>=this.SubItems.Count)
// {
// this.SubItems.Add(objItem, GetAppendPosition(this));
// }
// else
// {
// this.SubItems.Add(objItem,iPos);
// }
// }
// if(this.ContainerControl is Bar)
// ((Bar)this.ContainerControl).RecalcLayout();
// else if(this.ContainerControl is MenuPanel)
// ((MenuPanel)this.ContainerControl).RecalcSize();
// else
// {
// this.RecalcSize();
// this.Refresh();
// }
//}
private int GetAppendPosition(BaseItem objParent)
{
int iPos=-1;
for(int i=objParent.SubItems.Count-1;i>=0;i--)
{
if(objParent.SubItems[i].SystemItem)
iPos=i;
else
break;
}
return iPos;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public static void SetDesignTimeDefaults(ButtonItem button, eExplorerBarStockStyle e)
{
BarFunctions.SetExplorerBarStyle(button,e);
button.Text="New Button";
button.ButtonStyle = eButtonStyle.ImageAndText;
button.ImagePosition=eImagePosition.Left;
button.HotTrackingStyle=eHotTrackingStyle.None;
button.HotFontUnderline=true;
button.Cursor=System.Windows.Forms.Cursors.Hand;
}
///
/// Applies default appearance to ExplorerBarGroupItem.
///
public void SetDefaultAppearance()
{
this.StockStyle = eExplorerBarStockStyle.SystemColors;
this.BackStyle.BackColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.BarBackground;
this.BackStyle.BorderLeft =eStyleBorderType.Solid;
this.BackStyle.BorderRight =eStyleBorderType.Solid;
this.BackStyle.BorderTop =eStyleBorderType.Solid;
this.BackStyle.BorderBottom =eStyleBorderType.Solid;
this.BackStyle.BorderLeftColor =SystemColors.Window;
this.BackStyle.BorderRightColor =SystemColors.Window;
this.BackStyle.BorderTopColor =SystemColors.Window;
this.BackStyle.BorderBottomColor =SystemColors.Window;
this.BackStyle.BorderLeftWidth = 1;
this.BackStyle.BorderRightWidth = 1;
this.BackStyle.BorderTopWidth = 1;
this.BackStyle.BorderBottomWidth = 1;
this.ExpandBackColor=SystemColors.Window;
this.ExpandBorderColor = SystemColors.InactiveCaption;
this.ExpandForeColor = SystemColors.Highlight;
this.ExpandHotBackColor=SystemColors.Window;
this.ExpandHotForeColor = SystemColors.ActiveCaption;
this.ExpandHotBorderColor=SystemColors.ActiveCaption;
this.TitleHotStyle.BackColor = SystemColors.Window;
this.TitleHotStyle.BackColor2 = SystemColors.InactiveCaption;
this.TitleHotStyle.TextColor = SystemColors.ActiveCaption;
this.TitleStyle.BackColor = SystemColors.Window;
this.TitleStyle.BackColor2SchemePart = DevComponents.DotNetBar.eColorSchemePart.BarBackground2;
this.TitleStyle.TextColor = SystemColors.ControlText;
this.ThemeAware=true;
}
}
}