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