using System; using System.Drawing; using System.Drawing.Drawing2D; using System.ComponentModel; using DevComponents.DotNetBar.Rendering; using System.Windows.Forms; using DevComponents.UI.ContentManager; namespace DevComponents.DotNetBar { /// /// Summary description for LabelItem. /// [ToolboxItem(false), DesignTimeVisible(false), DefaultEvent("Click"), Designer("DevComponents.DotNetBar.Design.SimpleBaseItemDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")] public class LabelItem : BaseItem, IBlockExtended { #region Private Variables internal const eBorderSide DEFAULT_BORDERSIDE = eBorderSide.Top | eBorderSide.Bottom | eBorderSide.Left | eBorderSide.Right; private eBorderType m_BorderType=eBorderType.None; private Color m_BackColor=Color.Empty; private Color m_ForeColor=Color.Empty; private Color m_SingleLineColor=SystemColors.ControlDark; private bool m_SingleLineColorCustom=false; private System.Drawing.StringAlignment m_TextAlignment=System.Drawing.StringAlignment.Near; private System.Drawing.StringAlignment m_TextLineAlignment=System.Drawing.StringAlignment.Center; private System.Drawing.Font m_Font=null; private bool m_DividerStyle=false; private int m_PaddingLeft=0, m_PaddingRight=0, m_PaddingTop=0, m_PaddingBottom=0; private int m_Width=0, m_Height=0; private bool m_WordWrap=false; private eImagePosition m_ImagePosition; private System.Drawing.Image m_Image; private System.Drawing.Image m_ImageCachedIdx=null; private System.Drawing.Image m_DisabledImage = null; private System.Drawing.Icon m_DisabledIcon = null; System.Drawing.Icon m_Icon=null; private int m_ImageIndex=-1; private ItemPaintArgs _ItemPaintArgs=null; //private const int ImageTextSpacing=2; private eBorderSide m_BorderSide = DEFAULT_BORDERSIDE; private bool m_ShowPrefix = false; internal bool SuspendPaint = false; #endregion #region Events /// /// Occurs when text markup link is clicked. Markup links can be created using "a" tag, for example: /// Markup link /// [Description("Occurs when text markup link is clicked. Markup links can be created using a tag.")] public event MarkupLinkClickEventHandler MarkupLinkClick; #endregion #region Internal Implementation private int _ImageTextSpacing = 2; /// /// Specifies spacing between label image and text. /// [DefaultValue(2), Category("Appearance"), Description("Specifies spacing between label image and text.")] public int ImageTextSpacing { get { return _ImageTextSpacing; } set { if (value != _ImageTextSpacing) { int oldValue = _ImageTextSpacing; _ImageTextSpacing = value; OnImageTextSpacingChanged(oldValue, value); } } } /// /// Called when ImageTextSpacing property has changed. /// /// Old property value /// New property value protected virtual void OnImageTextSpacingChanged(int oldValue, int newValue) { //OnPropertyChanged(new PropertyChangedEventArgs("ImageTextSpacing")); NeedRecalcSize = true; this.Invalidate(); } public LabelItem():this("","") {} public LabelItem(string sName):this(sName,""){} public LabelItem(string sName, string ItemText):base(sName,ItemText) { //this.CanCustomize=false; this.IsAccessible=false; } protected override void Dispose(bool disposing) { if (BarUtilities.DisposeItemImages && !this.DesignMode) { BarUtilities.DisposeImage(ref m_Image); BarUtilities.DisposeImage(ref m_ImageCachedIdx); BarUtilities.DisposeImage(ref m_Icon); } base.Dispose(disposing); } public override BaseItem Copy() { LabelItem copy=new LabelItem(m_Name); this.CopyToItem(copy); return copy; } internal void InternalCopyToItem(LabelItem copy) { CopyToItem(copy); } protected override void CopyToItem(BaseItem copy) { LabelItem objCopy=copy as LabelItem; base.CopyToItem(objCopy); objCopy.BorderType=m_BorderType; objCopy.BorderSide = m_BorderSide; objCopy.BackColor=m_BackColor; objCopy.ForeColor=m_ForeColor; if(m_SingleLineColorCustom) objCopy.SingleLineColor=m_SingleLineColor; objCopy.WidthInternal=this.WidthInternal; objCopy.HeightInternal=this.HeightInternal; objCopy.TextAlignment=this.TextAlignment; objCopy.TextLineAlignment=this.TextLineAlignment; objCopy.Font=m_Font; objCopy.PaddingBottom=m_PaddingBottom; objCopy.PaddingLeft=m_PaddingLeft; objCopy.PaddingRight=m_PaddingRight; objCopy.PaddingTop=m_PaddingTop; if (this.Image != null) objCopy.Image = (Image) this.Image.Clone(); objCopy.ImageIndex = this.ImageIndex; objCopy.ImagePosition = this.ImagePosition; objCopy.WordWrap = this.WordWrap; objCopy.DividerStyle = this.DividerStyle; objCopy.EnableMarkup = this.EnableMarkup; objCopy.Width = this.Width; objCopy.Height = this.Height; objCopy.Symbol = _Symbol; objCopy.SymbolSet = _SymbolSet; objCopy.SymbolSize = _SymbolSize; objCopy.SymbolColor = _SymbolColor; } public override void Paint(ItemPaintArgs pa) { if (this.SuspendLayout || !IsRendered) return; _ItemPaintArgs = pa; System.Drawing.Graphics g = pa.Graphics; CompositeImage image = null; Size imageSize = Size.Empty; bool isSymbolImage = false; if (string.IsNullOrEmpty(this.SymbolRealized)) { image = this.GetImage(); if (image != null) imageSize = image.Size; } else { isSymbolImage = true; Font symFont = Symbols.GetFont(this.SymbolSize, this.SymbolSet); imageSize = TextDrawing.MeasureString(g, this.SymbolRealized, symFont); int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) * symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style))); imageSize.Height -= descent; } Rectangle thisRect = this.DisplayRectangle; Rectangle rClip = Rectangle.Empty; System.Windows.Forms.Border3DSide borderside; if (m_DividerStyle) { borderside = System.Windows.Forms.Border3DSide.Top; } else { if (m_BorderSide == eBorderSide.All) borderside = (System.Windows.Forms.Border3DSide.Left | System.Windows.Forms.Border3DSide.Right | System.Windows.Forms.Border3DSide.Top | System.Windows.Forms.Border3DSide.Bottom); else borderside = (((m_BorderSide & eBorderSide.Left) != 0) ? System.Windows.Forms.Border3DSide.Left : 0) | (((m_BorderSide & eBorderSide.Right) != 0) ? System.Windows.Forms.Border3DSide.Right : 0) | (((m_BorderSide & eBorderSide.Top) != 0) ? System.Windows.Forms.Border3DSide.Top : 0) | (((m_BorderSide & eBorderSide.Bottom) != 0) ? System.Windows.Forms.Border3DSide.Bottom : 0); } if (!(pa.ContainerControl is LabelX)) DisplayHelp.FillRectangle(g, this.DisplayRectangle, m_BackColor, Color.Empty); if (m_DividerStyle) { System.Windows.Forms.Control ctrl = this.ContainerControl as System.Windows.Forms.Control; System.Windows.Forms.RightToLeft rtl = System.Windows.Forms.RightToLeft.No; if (ctrl != null && ctrl.RightToLeft == System.Windows.Forms.RightToLeft.Yes) rtl = System.Windows.Forms.RightToLeft.Yes; bool disposeFont = false; Font font = GetFont(out disposeFont); Size sz = TextDrawing.MeasureString(g, m_Text, font, m_Rect.Width, this.GetStringFormat()); if (disposeFont) font.Dispose(); sz.Width += 4; if (sz.Width > thisRect.Width) sz.Width = thisRect.Width; rClip = new Rectangle(thisRect.X, thisRect.Y, (int)sz.Width, (int)sz.Height); if (m_TextAlignment == StringAlignment.Center) rClip.Offset((thisRect.Width - (int)sz.Width) / 2, 0); else if (m_TextAlignment == StringAlignment.Far && rtl == System.Windows.Forms.RightToLeft.No || m_TextAlignment == StringAlignment.Near && rtl == System.Windows.Forms.RightToLeft.Yes) rClip.Offset(thisRect.Width - rClip.Width, 0); if (m_TextLineAlignment == StringAlignment.Center) rClip.Offset(0, (thisRect.Height - rClip.Height) / 2); else if (m_TextLineAlignment == StringAlignment.Far && rtl == System.Windows.Forms.RightToLeft.No || m_TextLineAlignment == StringAlignment.Near && rtl == System.Windows.Forms.RightToLeft.Yes) rClip.Offset(0, thisRect.Height - rClip.Height); } switch (m_BorderType) { case eBorderType.Bump: if (m_DividerStyle) { System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect.X, m_Rect.Y + m_Rect.Height / 2, m_Rect.Width, 2, System.Windows.Forms.Border3DStyle.Bump, borderside); } else { System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.Bump, borderside); thisRect.Inflate(-2, -2); } break; case eBorderType.Etched: if (m_DividerStyle) { System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect.X, m_Rect.Y + m_Rect.Height / 2, m_Rect.Width, 2, System.Windows.Forms.Border3DStyle.Etched, borderside); } else { System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.Etched, borderside); thisRect.Inflate(-2, -2); } break; case eBorderType.Raised: case eBorderType.RaisedInner: if (m_DividerStyle) { System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect.X, m_Rect.Y + m_Rect.Height / 2, m_Rect.Width, 2, System.Windows.Forms.Border3DStyle.RaisedInner, borderside); } else { System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.RaisedInner, borderside); thisRect.Inflate(-2, -2); } break; case eBorderType.Sunken: if (m_DividerStyle) { System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect.X, m_Rect.Y + m_Rect.Height / 2, m_Rect.Width, 2, System.Windows.Forms.Border3DStyle.SunkenOuter, borderside); } else { System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.SunkenOuter, borderside); thisRect.Inflate(-2, -2); } break; case eBorderType.SingleLine: if (m_DividerStyle) { g.DrawLine(new Pen(GetSingleLineColor(), 1), m_Rect.X, m_Rect.Y + m_Rect.Height / 2, m_Rect.Right, m_Rect.Y + m_Rect.Height / 2); } else { BarFunctions.DrawBorder(g, eBorderType.SingleLine, m_Rect, GetSingleLineColor(), m_BorderSide, DashStyle.Solid, 1); thisRect.Inflate(-1, -1); } break; case eBorderType.DoubleLine: { BarFunctions.DrawBorder(g, eBorderType.DoubleLine, m_Rect, GetSingleLineColor()); thisRect.Inflate(-2, -2); break; } default: break; } if (m_DividerStyle) g.FillRectangle(new SolidBrush(m_BackColor), rClip); eOrientation orientation = this.Orientation; if (_TextOrientation == eOrientation.Vertical) orientation = _TextOrientation; if (orientation == eOrientation.Horizontal) thisRect.X += m_PaddingLeft; else thisRect.Y += m_PaddingLeft; if (orientation == eOrientation.Horizontal) thisRect.Width -= (m_PaddingLeft + m_PaddingRight); else thisRect.Width -= (m_PaddingTop + m_PaddingBottom); thisRect.Y += m_PaddingTop; if (orientation == eOrientation.Horizontal) thisRect.Height -= (m_PaddingTop + m_PaddingBottom); else thisRect.Height -= (m_PaddingLeft + m_PaddingRight); Color textColor = GetTextColor(pa); Color symbolColor = textColor; if (!this.SymbolColor.IsEmpty) symbolColor = this.SymbolColor; if (image != null || isSymbolImage) { switch (m_ImagePosition) { case eImagePosition.Left: { if (orientation == eOrientation.Horizontal) { if (isSymbolImage) TextDrawing.DrawStringLegacy(g, this.SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet), symbolColor, new Rectangle(thisRect.X + ImageTextSpacing, (thisRect.Y + (thisRect.Height - imageSize.Height) / 2),0,0), eTextFormat.Default); else image.DrawImage(g, new Rectangle(thisRect.X + ImageTextSpacing, (thisRect.Y + (thisRect.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height)); thisRect.X += (imageSize.Width + ImageTextSpacing * 2); thisRect.Width -= (imageSize.Width + ImageTextSpacing * 2); } else { if (isSymbolImage) TextDrawing.DrawStringLegacy(g, this.SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet), symbolColor, new Rectangle(thisRect.X + (thisRect.Width - imageSize.Height) / 2, thisRect.Y + ImageTextSpacing, 0, 0), eTextFormat.Default); else image.DrawImage(g, new Rectangle(thisRect.X + (thisRect.Width - imageSize.Height) / 2, thisRect.Y + ImageTextSpacing, imageSize.Width, imageSize.Height)); thisRect.Y += (imageSize.Height + ImageTextSpacing * 2); thisRect.Height -= (imageSize.Height + ImageTextSpacing * 2); } break; } case eImagePosition.Right: { if (orientation == eOrientation.Horizontal) { if (isSymbolImage) TextDrawing.DrawStringLegacy(g, this.SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet), symbolColor, new Rectangle(thisRect.Right - imageSize.Width - ImageTextSpacing, (thisRect.Y + (thisRect.Height - imageSize.Height) / 2), 0, 0), eTextFormat.Default); else image.DrawImage(g, new Rectangle(thisRect.Right - imageSize.Width - ImageTextSpacing, (thisRect.Y + (thisRect.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height)); thisRect.Width -= (imageSize.Width + ImageTextSpacing * 2); } else { if (isSymbolImage) TextDrawing.DrawStringLegacy(g, this.SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet), symbolColor, new Rectangle(thisRect.X, thisRect.Bottom - imageSize.Height - ImageTextSpacing, 0, 0), eTextFormat.Default); else image.DrawImage(g, new Rectangle(thisRect.X, thisRect.Bottom - imageSize.Height - ImageTextSpacing, imageSize.Width, imageSize.Height)); thisRect.Height -= (imageSize.Height + ImageTextSpacing * 2); } break; } case eImagePosition.Top: { if (orientation == eOrientation.Horizontal) { if (isSymbolImage) TextDrawing.DrawStringLegacy(g, this.SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet), symbolColor, new Rectangle(thisRect.X + (thisRect.Width - imageSize.Width) / 2, thisRect.Y, 0, 0), eTextFormat.Default); else image.DrawImage(g, new Rectangle(thisRect.X + (thisRect.Width - imageSize.Width) / 2, thisRect.Y, imageSize.Width, imageSize.Height)); thisRect.Y += (imageSize.Height + ImageTextSpacing); thisRect.Height -= (imageSize.Height + ImageTextSpacing); } else { if (isSymbolImage) TextDrawing.DrawStringLegacy(g, this.SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet), symbolColor, new Rectangle(thisRect.X, thisRect.Y + (thisRect.Height - imageSize.Height) / 2, 0, 0), eTextFormat.Default); else image.DrawImage(g, new Rectangle(thisRect.X, thisRect.Y + (thisRect.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height)); thisRect.X += (imageSize.Width + ImageTextSpacing); thisRect.Width -= (imageSize.Width + ImageTextSpacing); } break; } case eImagePosition.Bottom: { if (orientation == eOrientation.Horizontal) { if (isSymbolImage) TextDrawing.DrawStringLegacy(g, this.SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet), symbolColor, new Rectangle(thisRect.X + (thisRect.Width - imageSize.Width) / 2, thisRect.Bottom - imageSize.Height, 0, 0), eTextFormat.Default); else image.DrawImage(g, new Rectangle(thisRect.X + (thisRect.Width - imageSize.Width) / 2, thisRect.Bottom - imageSize.Height, imageSize.Width, imageSize.Height)); thisRect.Height -= (imageSize.Height + ImageTextSpacing); } else { if (isSymbolImage) TextDrawing.DrawStringLegacy(g, this.SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet), symbolColor, new Rectangle(thisRect.Right - imageSize.Width, thisRect.Y + (thisRect.Height - imageSize.Height) / 2, 0, 0), eTextFormat.Default); else image.DrawImage(g, new Rectangle(thisRect.Right - imageSize.Width, thisRect.Y + (thisRect.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height)); thisRect.Width -= (imageSize.Width + ImageTextSpacing); } break; } } } if (thisRect.Height > 0 && thisRect.Width > 0) { if (orientation == eOrientation.Horizontal) { if (m_TextAlignment == StringAlignment.Far) thisRect.Width--; if (this.TextMarkupBody != null) { bool disposeFont = false; Font font = GetFont(out disposeFont); TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, pa.RightToLeft); d.HotKeyPrefixVisible = !((GetStringFormat() & eTextFormat.NoPrefix) == eTextFormat.NoPrefix); if (m_TextLineAlignment == StringAlignment.Near) this.TextMarkupBody.Bounds = new Rectangle(thisRect.Location, this.TextMarkupBody.Bounds.Size); else if (m_TextLineAlignment == StringAlignment.Center) this.TextMarkupBody.Bounds = new Rectangle(new Point(thisRect.X, thisRect.Y + (thisRect.Height - this.TextMarkupBody.Bounds.Height) / 2), this.TextMarkupBody.Bounds.Size); else if (m_TextLineAlignment == StringAlignment.Far) this.TextMarkupBody.Bounds = new Rectangle(new Point(thisRect.X, thisRect.Bottom - this.TextMarkupBody.Bounds.Height), this.TextMarkupBody.Bounds.Size); Region oldClip = g.Clip; Rectangle clipRect = thisRect; clipRect.Inflate(2, 2); g.SetClip(clipRect, CombineMode.Replace); this.TextMarkupBody.Render(d); if (disposeFont) font.Dispose(); if (oldClip != null) g.Clip = oldClip; else g.ResetClip(); } else { eTextFormat format = GetStringFormat(); if (pa.RightToLeft) format |= eTextFormat.RightToLeft; bool disposeFont = false; Font font = GetFont(out disposeFont); if (pa.GlassEnabled && this.Parent is CaptionItemContainer && !(this.ContainerControl is Ribbon.QatToolbar)) { if (!pa.CachedPaint) Office2007RibbonControlPainter.PaintTextOnGlass(g, m_Text, font, thisRect, TextDrawing.GetTextFormat(format), textColor, true, true, 7); } else { if ((format & eTextFormat.VerticalCenter) == eTextFormat.VerticalCenter) thisRect.Inflate(0, 2); // Height can be safely increased when vertically centered so the text is not clipped and not displayed TextDrawing.DrawString(g, m_Text, font, textColor, thisRect, format); } if(disposeFont) font.Dispose(); } } else { if(_VerticalTextTopUp) g.RotateTransform(90); else g.RotateTransform(-90); bool disposeFont = false; Font font = GetFont(out disposeFont); if (this.TextMarkupBody != null) { this.TextMarkupBody.Bounds = (_VerticalTextTopUp ? new Rectangle(thisRect.Top, -thisRect.Right, this.TextMarkupBody.Bounds.Width + 2, this.TextMarkupBody.Bounds.Height) : new Rectangle(-thisRect.Bottom, thisRect.X, thisRect.Height + 1, thisRect.Width + 1)); TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, pa.RightToLeft); d.HotKeyPrefixVisible = !((GetStringFormat() & eTextFormat.HidePrefix) == eTextFormat.HidePrefix); this.TextMarkupBody.Render(d); } else { TextDrawing.DrawStringLegacy(g, m_Text, font, textColor, (_VerticalTextTopUp ? new Rectangle(thisRect.Top, -thisRect.Right, thisRect.Height + 1, thisRect.Width + 1) : new Rectangle(-thisRect.Bottom, thisRect.X, thisRect.Height + 1, thisRect.Width + 1)), GetStringFormat()); } if(disposeFont) font.Dispose(); g.ResetTransform(); } } //if(this.DesignMode) this.DrawInsertMarker(g); if (this.DesignMode && this.Focused) { Rectangle r = m_Rect; r.Width--; r.Height--; //r.Inflate(-1,-1); DesignTime.DrawDesignTimeSelection(g, r, pa.Colors.ItemDesignTimeBorder); } _ItemPaintArgs = null; } private Color GetTextColor(ItemPaintArgs pa) { Color foreColor = m_ForeColor; if(_ForeColorColorSchemePart!= eColorSchemePart.None) foreColor = (Color)pa.Colors.GetType().GetProperty(_ForeColorColorSchemePart.ToString()).GetValue(pa.Colors, null); return GetTextColor(pa, this.EffectiveStyle, this.Enabled && GetEnabled(pa.ContainerControl), foreColor); } internal static Color GetTextColor(ItemPaintArgs pa, eDotNetBarStyle effectiveStyle, bool isEnabled, Color defaultColor) { Office2007ColorTable table = null; if (pa.Renderer is Rendering.Office2007Renderer) table = ((Rendering.Office2007Renderer)pa.Renderer).ColorTable; if (defaultColor.IsEmpty && table != null) { if (pa.ContainerControl != null && table.LabelItemColors.Count > 0) { // First lookup contextual colors LabelColors lc; if (pa.ContainerControl is Bar && ((Bar)pa.ContainerControl).BarType == eBarType.StatusBar && table.LabelItemColors.TryGetValue(Office2007ColorTable.GetContextualKey(pa.ContainerControl.GetType(), "StatusBar"), out lc)) return isEnabled ? lc.Text : lc.DisabledText; if (table.LabelItemColors.TryGetValue(Office2007ColorTable.GetContextualKey(pa.ContainerControl.GetType()), out lc)) return isEnabled ? lc.Text : lc.DisabledText; if (table.LabelItemColors.TryGetValue(string.Empty, out lc)) return isEnabled ? lc.Text : lc.DisabledText; } } if (BarFunctions.IsOffice2007Style(effectiveStyle) && defaultColor.IsEmpty && table!=null) { if ((pa.IsOnMenu || pa.IsOnPopupBar) && table.ButtonItemColors.Count>0) { return isEnabled ? table.ButtonItemColors[0].Default.Text : pa.Colors.ItemDisabledText; } else { if((pa.ContainerControl is RibbonStrip /*|| pa.ContainerControl is Bar*/)&& table.RibbonTabItemColors.Count>0) return table.RibbonTabItemColors[0].Default.Text; Rendering.Office2007ButtonItemColorTable ct = table.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.Orange)]; if (ct != null && !ct.Default.Text.IsEmpty) return isEnabled ? ct.Default.Text : pa.Colors.ItemDisabledText; } } else if (!isEnabled) { return pa.Colors.ItemDisabledText; } if (defaultColor.IsEmpty) return pa.Colors.ItemText; return defaultColor; } private Graphics CreateGraphics() { System.Windows.Forms.Control objCtrl = this.ContainerControl as System.Windows.Forms.Control; if (!IsHandleValid(objCtrl)) return null; return BarFunctions.CreateGraphics(objCtrl); } public override void RecalcSize() { if (this.SuspendLayout) return; if (this.TextMarkupBody != null) { RecalcSizeMarkup(); } else { Size imageSize = Size.Empty; if (string.IsNullOrEmpty(this.SymbolRealized)) { CompositeImage image = this.GetImage(); if (image != null) imageSize = image.Size; } eOrientation orientation = this.Orientation; if (_TextOrientation == eOrientation.Vertical) orientation = _TextOrientation; if (orientation == eOrientation.Horizontal || m_Width == 0) { if (m_Width == 0) { // Auto-size label Graphics g = this.CreateGraphics(); if (g == null) return; try { if (!string.IsNullOrEmpty(this.SymbolRealized)) { Font symFont = Symbols.GetFont(this.SymbolSize, this.SymbolSet); imageSize = TextDrawing.MeasureString(g, "\uF00A", symFont); // Need to do this to get consistent size for the symbol since they are not all the same width we pick widest //imageSize = TextDrawing.MeasureString(g, button.Symbol, symFont); int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) * symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style))); imageSize.Height -= descent; } // Measure string Font objCurrentFont = null; bool disposeFont = false; if (m_Font != null) objCurrentFont = m_Font; else objCurrentFont = GetFont(out disposeFont); Size objStringSize = Size.Empty; eTextFormat objStringFormat = GetStringFormat(); if (m_Text != "") { string text = m_Text; if (text.EndsWith(" ")) text += "."; int stringAreaWidth = 0; if (m_WordWrap && this.Stretch && this.WidthInternal > 16) stringAreaWidth = this.WidthInternal; if (orientation == eOrientation.Vertical && !this.IsOnMenu) objStringSize = TextDrawing.MeasureStringLegacy(g, text, objCurrentFont, new Size(stringAreaWidth, 0), objStringFormat); else objStringSize = TextDrawing.MeasureString(g, text, objCurrentFont, stringAreaWidth, objStringFormat); objStringSize.Width += Dpi.Width2; if (objCurrentFont.Italic) objStringSize.Width += objCurrentFont.Height / 3; } else { if (orientation == eOrientation.Vertical && !this.IsOnMenu) objStringSize = TextDrawing.MeasureStringLegacy(g, " ", objCurrentFont, Size.Empty, objStringFormat); else objStringSize = TextDrawing.MeasureString(g, " ", objCurrentFont, 0, objStringFormat); objStringSize.Width += 2; } if (this.Parent is CaptionItemContainer) objStringSize.Width += 2; if (m_BorderType != eBorderType.None) { objStringSize.Width += 4; objStringSize.Height += 2; if (m_BorderType != eBorderType.SingleLine) objStringSize.Height += 2; } if (orientation == eOrientation.Horizontal) { if (this.Stretch && !(this.Parent is ItemContainer)) this.WidthInternal = 8; else this.WidthInternal = objStringSize.Width + m_PaddingLeft + m_PaddingRight; this.HeightInternal = objStringSize.Height + m_PaddingTop + m_PaddingBottom; // +1; if (!imageSize.IsEmpty) { if (m_ImagePosition == eImagePosition.Left || m_ImagePosition == eImagePosition.Right) { this.WidthInternal += imageSize.Width + ImageTextSpacing * 2; this.HeightInternal = Math.Max(this.HeightInternal, imageSize.Height + ImageTextSpacing); } else { this.HeightInternal += imageSize.Height + ImageTextSpacing * 2; } } } else { if (this.Stretch && !(this.Parent is ItemContainer)) this.HeightInternal = 8; else this.HeightInternal = objStringSize.Width + m_PaddingLeft + m_PaddingRight; this.WidthInternal = objStringSize.Height + m_PaddingTop + m_PaddingBottom; if (!imageSize.IsEmpty) { if (m_ImagePosition == eImagePosition.Left || m_ImagePosition == eImagePosition.Right) { this.HeightInternal += imageSize.Width + ImageTextSpacing * 2; this.WidthInternal = Math.Max(this.WidthInternal, imageSize.Width + ImageTextSpacing); } else { this.WidthInternal += imageSize.Height + ImageTextSpacing * 2; this.HeightInternal = Math.Max(imageSize.Height + ImageTextSpacing, this.HeightInternal); } } } if (disposeFont) { objCurrentFont.Dispose(); objCurrentFont = null; } } finally { g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault; g.SmoothingMode = SmoothingMode.Default; g.Dispose(); } } else { this.WidthInternal = Dpi.Width(m_Width); if (m_Height == 0) { // Measure string System.Drawing.Font objCurrentFont = null; bool disposeFont = false; if (m_Font != null) objCurrentFont = m_Font; else objCurrentFont = GetFont(out disposeFont); Graphics g = this.CreateGraphics(); if (g!=null && !string.IsNullOrEmpty(this.SymbolRealized)) { Font symFont = Symbols.GetFont(this.SymbolSize, this.SymbolSet); imageSize = TextDrawing.MeasureString(g, "\uF00A", symFont); // Need to do this to get consistent size for the symbol since they are not all the same width we pick widest //imageSize = TextDrawing.MeasureString(g, button.Symbol, symFont); int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) * symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style))); imageSize.Height -= descent; } if (this.WordWrap) { if (g != null) { int availableWidth = this.WidthInternal - (m_PaddingLeft + m_PaddingRight); if (!imageSize.IsEmpty && orientation == eOrientation.Horizontal && (m_ImagePosition == eImagePosition.Left || m_ImagePosition == eImagePosition.Right)) availableWidth -= imageSize.Width + 4; Size textSize = TextDrawing.MeasureString(g, this.Text, objCurrentFont, availableWidth); this.HeightInternal = textSize.Height + 2; } else this.HeightInternal = (int)Math.Ceiling(objCurrentFont.GetHeight()); } else this.HeightInternal = (int)Math.Ceiling(objCurrentFont.GetHeight()); if (g != null) { g.Dispose(); g = null; } this.HeightInternal += m_PaddingTop + m_PaddingBottom + (this.IsRightToLeft ? 2 : 0); if (m_BorderType != eBorderType.None) { this.HeightInternal += 2; if (m_BorderType != eBorderType.SingleLine) this.HeightInternal += 2; } if (!imageSize.IsEmpty) { if (orientation == eOrientation.Horizontal) { if (m_ImagePosition == eImagePosition.Left || m_ImagePosition == eImagePosition.Right) this.HeightInternal = Math.Max(this.HeightInternal, imageSize.Height/*+2*/); else this.HeightInternal += imageSize.Height + 4; } else { if (m_ImagePosition == eImagePosition.Left || m_ImagePosition == eImagePosition.Right) this.WidthInternal = Math.Max(this.HeightInternal, imageSize.Height + 2); else this.WidthInternal += imageSize.Height + 4; } } if (disposeFont) { objCurrentFont.Dispose(); objCurrentFont = null; } } else this.HeightInternal = Dpi.Height(m_Height); } } else { this.WidthInternal = Dpi.Width(m_Width); this.HeightInternal = Dpi.Height(m_Height); } } base.RecalcSize(); } #region Markup Implementation protected override void OnExternalSizeChange() { if (this.TextMarkupBody != null) { if(_TextOrientation == eOrientation.Horizontal) ArrangeMarkup(this.WidthInternal); else ArrangeMarkup(this.HeightInternal + 1); } base.OnExternalSizeChange(); } private void ArrangeMarkup(int specifiedWidth) { System.Windows.Forms.Control objCtrl = this.ContainerControl as System.Windows.Forms.Control; if (!IsHandleValid(objCtrl)) return; using (Graphics g = BarFunctions.CreateGraphics(objCtrl)) { Font objCurrentFont = null; bool disposeFont = false; if (m_Font != null) objCurrentFont = m_Font; else objCurrentFont = GetFont(out disposeFont); CompositeImage image = this.GetImage(); Size availableSize = GetMarkupAvailableSize(g, specifiedWidth); TextMarkup.MarkupDrawContext d = new DevComponents.DotNetBar.TextMarkup.MarkupDrawContext(g, objCurrentFont, this.ForeColor, false); d.HotKeyPrefixVisible = !((GetStringFormat() & eTextFormat.HidePrefix) == eTextFormat.HidePrefix); TextMarkupBody.Measure(availableSize, d); d.RightToLeft = (objCtrl.RightToLeft == System.Windows.Forms.RightToLeft.Yes); if (specifiedWidth == 0 && m_Width == 0) availableSize = TextMarkupBody.Bounds.Size; TextMarkupBody.Arrange(new Rectangle(Point.Empty, availableSize), d); if(disposeFont) objCurrentFont.Dispose(); } } private Size GetMarkupAvailableSize(Graphics g, int specifiedWidth) { Size availableSize = new Size((specifiedWidth==0?Dpi.Width(m_Width):specifiedWidth), 1); if(_TextOrientation == eOrientation.Vertical) availableSize = new Size((specifiedWidth == 0 ? Dpi.Height(m_Height): specifiedWidth), 1); Size imageSize = Size.Empty; if (!string.IsNullOrEmpty(_Symbol)) imageSize = GetSymbolSize(g); else { CompositeImage image = this.GetImage(); if (image != null) imageSize = image.Size; } if (availableSize.Width == 0) availableSize.Width = 1600; else { availableSize.Width -= (m_PaddingLeft + m_PaddingRight); if (!imageSize.IsEmpty && (m_ImagePosition == eImagePosition.Left || m_ImagePosition == eImagePosition.Right)) availableSize.Width -= (imageSize.Width + ImageTextSpacing * 2); if (m_BorderType != eBorderType.None) availableSize.Width -= 4; } return availableSize; } private void RecalcSizeMarkup() { RecalcSizeMarkup(0); } private Size GetSymbolSize(Graphics g) { Size symbolSize = Size.Empty; if (g == null || string.IsNullOrEmpty(_Symbol)) return symbolSize; Font symFont = Symbols.GetFont(this.SymbolSize, this.SymbolSet); symbolSize = TextDrawing.MeasureString(g, "\uF00A", symFont); // Need to do this to get consistent size for the symbol since they are not all the same width we pick widest int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) * symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style))); symbolSize.Height -= descent; return symbolSize; } internal void RecalcSizeMarkup(int proposedWidth) { eOrientation orientation = this.Orientation; if (_TextOrientation == eOrientation.Vertical) orientation = _TextOrientation; ArrangeMarkup(proposedWidth); int width = TextMarkupBody.Bounds.Width; int height = TextMarkupBody.Bounds.Height; if (m_BorderType != eBorderType.None) { width += 4; height += 4; } Size imageSize = Size.Empty; //if (m_Width != 0) { if (!string.IsNullOrEmpty(this.SymbolRealized)) { using (Graphics g = this.CreateGraphics()) { imageSize = GetSymbolSize(g); } } else { CompositeImage image = this.GetImage(); if (image != null) imageSize = image.Size; } } if (!imageSize.IsEmpty) { if (m_Width == 0) { if (m_ImagePosition == eImagePosition.Left || m_ImagePosition == eImagePosition.Right) { width += (imageSize.Width + ImageTextSpacing * 2); height = Math.Max(height, imageSize.Height + ImageTextSpacing); } else { height += (imageSize.Height + ImageTextSpacing * 2); width = Math.Max(width, imageSize.Width + ImageTextSpacing); } } } if(m_Width==0) { width+=(m_PaddingLeft + m_PaddingRight); height+=(m_PaddingTop + m_PaddingBottom); if (this.Stretch && !(this.Parent is ItemContainer)) width = 8; } if (orientation == eOrientation.Vertical) { width += 2; int old = width; width = height; height = old; } if (m_Width == 0) { m_Rect.Width = width; } else m_Rect.Width = Dpi.Width(m_Width); if (m_Height == 0) m_Rect.Height = height; else m_Rect.Height = Dpi.Height(m_Height); } /// /// Gets whether item supports text markup. Default is false. /// protected override bool IsMarkupSupported { get { return _EnableMarkup; } } private bool _EnableMarkup = true; /// /// Gets or sets whether text-markup support is enabled for items Text property. Default value is true. /// Set this property to false to display HTML or other markup in the item instead of it being parsed as text-markup. /// [DefaultValue(true), Category("Appearance"), Description("Indicates whether text-markup support is enabled for items Text property.")] public bool EnableMarkup { get { return _EnableMarkup; } set { if (_EnableMarkup != value) { _EnableMarkup = value; NeedRecalcSize = true; OnTextChanged(); } } } #endregion /// /// Gets or sets the type of the border drawn around the label. /// [System.ComponentModel.Browsable(true),DefaultValue(eBorderType.None),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Indicates the type of the border drawn around the label.")] public eBorderType BorderType { get { return m_BorderType; } set { if(m_BorderType==value) return; m_BorderType=value; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets or sets the border sides that are displayed. Default value specifies border on all 4 sides. /// [Browsable(true), DevCoBrowsable(true), Category("Appearance"), DefaultValue(DEFAULT_BORDERSIDE), Description("Specifies border sides that are displayed.")] public eBorderSide BorderSide { get { return m_BorderSide; } set { if (m_BorderSide != value) { m_BorderSide = value; this.Refresh(); } } } /// /// Gets or sets the background color of the label. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Determines the background color of the label.")] public Color BackColor { get { return m_BackColor; } set { if(m_BackColor==value) return; m_BackColor=value; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets whether property should be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeBackColor() { return !m_BackColor.IsEmpty; } private eColorSchemePart _ForeColorColorSchemePart = eColorSchemePart.None; internal eColorSchemePart ForeColorColorSchemePart { get { return _ForeColorColorSchemePart; } set { _ForeColorColorSchemePart = value; } } /// /// Gets or sets the text color. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Indicates text color.")] public Color ForeColor { get { return m_ForeColor; } set { if(m_ForeColor==value) return; m_ForeColor=value; this.Refresh(); OnAppearanceChanged(); } } /// /// Reset property to its default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetForeColor() { this.ForeColor = Color.Empty; } /// /// Gets whether property should be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeForeColor() { return !m_ForeColor.IsEmpty; } /// /// Gets or sets the border line color when border is single line. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Indicates border line color when border is single line.")] public Color SingleLineColor { get { return m_SingleLineColor; } set { if(m_SingleLineColor==value) return; m_SingleLineColor=value; if (m_SingleLineColor != SystemColors.ControlDark) m_SingleLineColorCustom = true; else m_SingleLineColorCustom = false; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets whether property should be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeSingleLineColor() { return (m_SingleLineColor != SystemColors.ControlDark); } /// /// Resets the SingleLineColor property to its default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetSingleLineColor() { SingleLineColor = SystemColors.ControlDark; } private Color GetSingleLineColor() { if (m_SingleLineColorCustom) return m_SingleLineColor; Color c = m_SingleLineColor; eDotNetBarStyle effectiveStyle = EffectiveStyle; if (effectiveStyle == eDotNetBarStyle.Office2003 || effectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(this.EffectiveStyle)) { if (BarFunctions.IsOffice2007Style(effectiveStyle)) { if (this.ContainerControl is IRenderingSupport) { Office2007Renderer renderer = ((IRenderingSupport)this.ContainerControl).GetRenderer() as Office2007Renderer; if (renderer == null) renderer = GlobalManager.Renderer as Office2007Renderer; if (renderer != null) c = renderer.ColorTable.Bar.ToolbarBottomBorder; } } else { ColorScheme scheme = null; if (this.ContainerControl is Bar) scheme = ((Bar)this.ContainerControl).ColorScheme; else if (this.ContainerControl is MenuPanel) scheme = ((MenuPanel)this.ContainerControl).ColorScheme; else scheme = new ColorScheme(this.EffectiveStyle); if (scheme != null) m_SingleLineColor = scheme.BarDockedBorder; else m_SingleLineColor = SystemColors.ControlDark; } } return c; } /// /// Gets or sets the horizontal text alignment. /// [Browsable(true), DefaultValue(System.Drawing.StringAlignment.Near), DevCoBrowsable(true), Category("Layout"), Description("Indicates text alignment.")] public System.Drawing.StringAlignment TextAlignment { get { return m_TextAlignment; } set { if(m_TextAlignment==value) return; m_TextAlignment=value; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets or sets the text vertical alignment. /// [Browsable(true),DefaultValue(System.Drawing.StringAlignment.Center),DevCoBrowsable(true),Category("Layout"),Description("Indicates text line alignment.")] public System.Drawing.StringAlignment TextLineAlignment { get { return m_TextLineAlignment; } set { if(m_TextLineAlignment==value) return; m_TextLineAlignment=value; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets or sets the label font. /// [Browsable(true),DefaultValue(null), DevCoBrowsable(true),Category("Appearance"),Description("Indicates label font.")] public System.Drawing.Font Font { get { return m_Font; } set { if(m_Font!=value) { m_Font=value; this.Refresh(); } OnAppearanceChanged(); } } /// /// Gets or sets the left padding in pixels. /// [System.ComponentModel.Browsable(true), DefaultValue(0), DevCoBrowsable(true), System.ComponentModel.Category("Layout"), System.ComponentModel.Description("Indicates left padding in pixels.")] public int PaddingLeft { get { return m_PaddingLeft; } set { if(m_PaddingLeft==value) return; m_PaddingLeft=value; NeedRecalcSize=true; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets or sets the right padding in pixels. /// [System.ComponentModel.Browsable(true), DefaultValue(0), DevCoBrowsable(true), System.ComponentModel.Category("Layout"), System.ComponentModel.Description("Indicates right padding in pixels.")] public int PaddingRight { get { return m_PaddingRight; } set { if(m_PaddingRight==value) return; m_PaddingRight=value; NeedRecalcSize=true; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets or sets the top padding in pixels. /// [System.ComponentModel.Browsable(true), DefaultValue(0), DevCoBrowsable(true), System.ComponentModel.Category("Layout"), System.ComponentModel.Description("Indicates top padding in pixels.")] public int PaddingTop { get { return m_PaddingTop; } set { if(m_PaddingTop==value) return; m_PaddingTop=value; NeedRecalcSize=true; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets or sets the bottom padding in pixels. /// [Browsable(true),DefaultValue(0),DevCoBrowsable(true),Category("Layout"),Description("Indicates bottom padding in pixels.")] public int PaddingBottom { get { return m_PaddingBottom; } set { if(m_PaddingBottom==value) return; m_PaddingBottom=value; NeedRecalcSize=true; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets or sets the width of the label in pixels. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.DefaultValue(0),System.ComponentModel.Category("Layout"),System.ComponentModel.Description("Indicates the width of the label in pixels.")] public int Width { get { return m_Width; } set { if(m_Width==value) return; m_Width=value; NeedRecalcSize=true; if (!SuspendPaint) { this.Refresh(); OnAppearanceChanged(); } } } /// /// Gets or sets the height of the label. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.DefaultValue(0),System.ComponentModel.Category("Layout"),System.ComponentModel.Description("Indicates height of the label in pixels.")] public int Height { get { return m_Height; } set { if(m_Height==value) return; m_Height=value; NeedRecalcSize=true; if (!SuspendPaint) { this.Refresh(); OnAppearanceChanged(); } } } /// /// Gets or sets whether the label is drawn as a divider label. /// [Browsable(true),DefaultValue(false),DevCoBrowsable(true),Category("Appearance"),Description("Indicates whether label has divider style.")] public bool DividerStyle { get { return m_DividerStyle; } set { if(m_DividerStyle==value) return; m_DividerStyle=value; this.Refresh(); OnAppearanceChanged(); } } /// /// Gets or sets a value that determines whether text is displayed in multiple lines or one long line. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Style"),System.ComponentModel.DefaultValue(false),System.ComponentModel.Description("Gets or sets a value that determines whether text is displayed in multiple lines or one long line.")] public bool WordWrap { get {return m_WordWrap;} set { if (m_WordWrap != value) { m_WordWrap = value; m_NeedRecalcSize = true; } OnAppearanceChanged(); } } private bool _FontBold = false; /// /// Indicates whether label text is rendered using bold font unless the Font property is specifically set to different font. /// [DefaultValue(false), Category("Appearance"), Description("Indicates whether label text is rendered using bold font unless the Font property is specifically set to different font.")] public bool FontBold { get { return _FontBold; } set { if (_FontBold != value) { bool oldValue = _FontBold; _FontBold = value; OnFontBoldChanged(value, oldValue); } } } protected virtual void OnFontBoldChanged(bool newValue, bool oldValue) { NeedRecalcSize = true; OnAppearanceChanged(); } protected virtual Font GetFont(out bool disposeFont) { disposeFont = false; if(m_Font!=null) return m_Font; Font font = null; System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control; if(objCtrl!=null) font = (Font)objCtrl.Font; else font = SystemFonts.DefaultFont; // (Font)System.Windows.Forms.SystemInformation.MenuFont; if (font != null && _FontBold) { font = new Font(font, FontStyle.Bold); disposeFont = true; } return font; } internal bool ShowPrefix { get { return m_ShowPrefix; } set { m_ShowPrefix = value; } } private eTextFormat GetStringFormat() { eTextFormat format = eTextFormat.Default | eTextFormat.ExpandTabs | eTextFormat.EndEllipsis; if (!m_ShowPrefix) format |= eTextFormat.NoPrefix; if (!m_WordWrap) format |= eTextFormat.SingleLine; else format |= eTextFormat.WordBreak; if (m_TextAlignment == StringAlignment.Center) format |= eTextFormat.HorizontalCenter; else if (m_TextAlignment == StringAlignment.Far) format |= eTextFormat.Right; if (m_TextLineAlignment == StringAlignment.Center) format |= eTextFormat.VerticalCenter; else if (m_TextLineAlignment == StringAlignment.Far) format |= eTextFormat.Bottom; if (this.IsRightToLeft) format |= eTextFormat.RightToLeft; return format; } protected internal override void Serialize(ItemSerializationContext context) { base.Serialize(context); System.Xml.XmlElement ThisItem = context.ItemXmlElement; ThisItem.SetAttribute("bt",System.Xml.XmlConvert.ToString(((int)m_BorderType))); if(m_BorderSide!=DEFAULT_BORDERSIDE) ThisItem.SetAttribute("BorderSide", System.Xml.XmlConvert.ToString(((int)m_BorderSide))); if(!m_BackColor.IsEmpty) ThisItem.SetAttribute("bc",BarFunctions.ColorToString(m_BackColor)); ThisItem.SetAttribute("fc",BarFunctions.ColorToString(m_ForeColor)); if(m_SingleLineColorCustom) ThisItem.SetAttribute("sc",BarFunctions.ColorToString(m_SingleLineColor)); ThisItem.SetAttribute("ta",System.Xml.XmlConvert.ToString(((int)m_TextAlignment))); ThisItem.SetAttribute("tla",System.Xml.XmlConvert.ToString(((int)m_TextLineAlignment))); ThisItem.SetAttribute("ds",System.Xml.XmlConvert.ToString(m_DividerStyle)); ThisItem.SetAttribute("pl",System.Xml.XmlConvert.ToString(m_PaddingLeft)); ThisItem.SetAttribute("pr",System.Xml.XmlConvert.ToString(m_PaddingRight)); ThisItem.SetAttribute("pt",System.Xml.XmlConvert.ToString(m_PaddingTop)); ThisItem.SetAttribute("pb",System.Xml.XmlConvert.ToString(m_PaddingBottom)); ThisItem.SetAttribute("w",System.Xml.XmlConvert.ToString(m_Width)); ThisItem.SetAttribute("h",System.Xml.XmlConvert.ToString(m_Height)); // Save Font information if needed if(this.Font!=null) { if(this.Font.Name!=System.Windows.Forms.SystemInformation.MenuFont.Name || this.Font.Size!=System.Windows.Forms.SystemInformation.MenuFont.Size || this.Font.Style!=System.Windows.Forms.SystemInformation.MenuFont.Style) { ThisItem.SetAttribute("fontname",this.Font.Name); ThisItem.SetAttribute("fontemsize",System.Xml.XmlConvert.ToString(this.Font.Size)); ThisItem.SetAttribute("fontstyle",System.Xml.XmlConvert.ToString((int)this.Font.Style)); } } System.Xml.XmlElement xmlElem=null, xmlElem2=null; // Serialize Images if(m_Image!=null || m_ImageIndex>=0 || m_Icon!=null) { xmlElem=ThisItem.OwnerDocument.CreateElement("images"); ThisItem.AppendChild(xmlElem); if(m_ImageIndex>=0) xmlElem.SetAttribute("imageindex",System.Xml.XmlConvert.ToString(m_ImageIndex)); if(m_Image!=null) { xmlElem2=ThisItem.OwnerDocument.CreateElement("image"); xmlElem2.SetAttribute("type","default"); xmlElem.AppendChild(xmlElem2); BarFunctions.SerializeImage(m_Image,xmlElem2); } if(m_Icon!=null) { xmlElem2=ThisItem.OwnerDocument.CreateElement("image"); xmlElem2.SetAttribute("type","icon"); xmlElem.AppendChild(xmlElem2); BarFunctions.SerializeIcon(m_Icon,xmlElem2); } } } public override void Deserialize(ItemSerializationContext context) { base.Deserialize(context); System.Xml.XmlElement ItemXmlSource = context.ItemXmlElement; m_BorderType=(eBorderType)System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("bt")); if (ItemXmlSource.HasAttribute("BorderSide")) m_BorderSide = (eBorderSide)System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("BorderSide")); else m_BorderSide = DEFAULT_BORDERSIDE; if(ItemXmlSource.HasAttribute("bc")) m_BackColor=BarFunctions.ColorFromString(ItemXmlSource.GetAttribute("bc")); else m_BackColor=Color.Empty; m_ForeColor=BarFunctions.ColorFromString(ItemXmlSource.GetAttribute("fc")); if (ItemXmlSource.HasAttribute("sc")) { m_SingleLineColor = BarFunctions.ColorFromString(ItemXmlSource.GetAttribute("sc")); if (m_SingleLineColor != SystemColors.ControlDark) m_SingleLineColorCustom = true; } else { m_SingleLineColorCustom = false; m_SingleLineColor = SystemColors.ControlDark; } m_TextAlignment=(StringAlignment)System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("ta")); m_TextLineAlignment=(StringAlignment)System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("tla")); m_DividerStyle=System.Xml.XmlConvert.ToBoolean(ItemXmlSource.GetAttribute("ds")); m_PaddingLeft=System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("pl")); m_PaddingRight=System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("pr")); m_PaddingTop=System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("pt")); m_PaddingBottom=System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("pb")); m_Width=System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("w")); m_Height=System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("h")); // Load font information if it exists if(ItemXmlSource.HasAttribute("fontname")) { string FontName=ItemXmlSource.GetAttribute("fontname"); float FontSize=System.Xml.XmlConvert.ToSingle(ItemXmlSource.GetAttribute("fontemsize")); System.Drawing.FontStyle FontStyle=(System.Drawing.FontStyle)System.Xml.XmlConvert.ToInt32(ItemXmlSource.GetAttribute("fontstyle")); try { this.Font=new Font(FontName,FontSize,FontStyle); } catch(Exception) { this.Font = SystemFonts.DefaultFont; // System.Windows.Forms.SystemInformation.MenuFont.Clone() as Font; } } // Load Images foreach(System.Xml.XmlElement xmlElem in ItemXmlSource.ChildNodes) { if(xmlElem.Name=="images") { if(xmlElem.HasAttribute("imageindex")) m_ImageIndex=System.Xml.XmlConvert.ToInt32(xmlElem.GetAttribute("imageindex")); foreach(System.Xml.XmlElement xmlElem2 in xmlElem.ChildNodes) { switch(xmlElem2.GetAttribute("type")) { case "default": { m_Image=BarFunctions.DeserializeImage(xmlElem2); m_ImageIndex=-1; break; } case "icon": { m_Icon=BarFunctions.DeserializeIcon(xmlElem2); m_ImageIndex=-1; break; } } } break; } } } /// /// Gets or sets the text associated with this item. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),Editor("DevComponents.DotNetBar.Design.TextMarkupUIEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf",typeof(System.Drawing.Design.UITypeEditor)),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("The text contained in the item.")] public override string Text { get { return base.Text; } set { if(m_Text==value) return; if(value==null) m_Text=""; else m_Text=value; m_AccessKey=NativeFunctions.GetAccessKey(m_Text); if(ShouldSyncProperties) BarFunctions.SyncProperty(this, "Text"); this.OnTextChanged(); if(this.Displayed && m_Parent!=null && !this.SuspendLayout) { if(m_Width == 0 || this.ContainerControl is BaseItemControl) NeedRecalcSize=true; if(!(this.ContainerControl is LabelX)) this.Refresh(); // No need for this Labels are always fixed in size //RecalcSize(); //m_Parent.SubItemSizeChanged(this); } } } /// /// Specifies the label icon. Icons support alpha blending. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Specifies the label icon."),System.ComponentModel.DefaultValue(null)] public System.Drawing.Icon Icon { get { return m_Icon; } set { m_Icon=value; this.OnImageChanged(); OnAppearanceChanged(); } } /// /// Specifies label image. /// [Browsable(true),DevCoBrowsable(true),Category("Appearance"),Description("The image that will be displayed on the face of the item."),DefaultValue(null)] public System.Drawing.Image Image { get { return m_Image; } set { m_Image=value; this.OnImageChanged(); OnAppearanceChanged(); } } // 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.Images; return null; } } /// /// Specifies the index of the image for the label 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"); OnImageChanged(); } OnAppearanceChanged(); } } /// /// Gets/Sets the image position inside the label. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("The alignment of the image in relation to text displayed by this item."),System.ComponentModel.DefaultValue(eImagePosition.Left)] public eImagePosition ImagePosition { get { return m_ImagePosition; } set { if(m_ImagePosition!=value) { m_ImagePosition=value; if(ShouldSyncProperties) BarFunctions.SyncProperty(this, "ImagePosition"); NeedRecalcSize=true; this.Refresh(); } OnAppearanceChanged(); } } private void OnImageChanged() { if (m_DisabledImage != null) { m_DisabledImage.Dispose(); m_DisabledImage = null; } if (m_DisabledIcon != null) { m_DisabledIcon.Dispose(); m_DisabledIcon = null; } NeedRecalcSize=true; this.Refresh(); } private CompositeImage GetImage() { if (this.GetEnabled()) return GetImage(ImageState.Default); else return GetImage(ImageState.Disabled); } private CompositeImage GetImage(ImageState state) { Image image=null; if (state == ImageState.Disabled) { if (m_DisabledImage == null && m_DisabledIcon == null && (m_Icon != null || m_Image != null || m_ImageIndex >= 0)) CreateDisabledImage(); if(m_DisabledIcon!=null) return new CompositeImage(new System.Drawing.Icon(m_DisabledIcon, IconSize), true); if(m_DisabledImage!=null) return new CompositeImage(m_DisabledImage, false); } if(m_Icon!=null) { System.Drawing.Size iconSize=this.IconSize; return new CompositeImage(new System.Drawing.Icon(m_Icon,iconSize),true); } if(m_Image!=null) { return new CompositeImage(m_Image,false); } if(m_ImageIndex>=0) { image=GetImageFromImageList(m_ImageIndex); if(image!=null) return new CompositeImage(image,false); } return null; } private void CreateDisabledImage() { if (m_Image == null && m_ImageIndex < 0 && m_Icon == null) return; if (m_DisabledImage != null) m_DisabledImage.Dispose(); m_DisabledImage = null; if (m_DisabledIcon != null) m_DisabledIcon.Dispose(); m_DisabledIcon = null; CompositeImage defaultImage = GetImage(ImageState.Default); if (defaultImage == null) return; if (this.GetOwner() is IOwner && ((IOwner)this.GetOwner()).DisabledImagesGrayScale) { if (defaultImage.IsIcon) { m_DisabledIcon = BarFunctions.CreateDisabledIcon(defaultImage.Icon); } else { m_DisabledImage = ImageHelper.CreateGrayScaleImage(defaultImage.Image as Bitmap); } } if (m_DisabledIcon != null || m_DisabledImage != null) return; // Use old algorithm if first one failed... System.Drawing.Imaging.PixelFormat pixelFormat = System.Drawing.Imaging.PixelFormat.Format32bppArgb; if (!defaultImage.IsIcon && defaultImage.Image != null) pixelFormat = defaultImage.Image.PixelFormat; if (pixelFormat == System.Drawing.Imaging.PixelFormat.Format1bppIndexed || pixelFormat == System.Drawing.Imaging.PixelFormat.Format4bppIndexed || pixelFormat == System.Drawing.Imaging.PixelFormat.Format8bppIndexed) pixelFormat = System.Drawing.Imaging.PixelFormat.Format32bppArgb; Bitmap bmp = new Bitmap(defaultImage.Width, defaultImage.Height, pixelFormat); m_DisabledImage = new Bitmap(defaultImage.Width, defaultImage.Height, pixelFormat); Graphics g2 = Graphics.FromImage(bmp); using (SolidBrush brush = new SolidBrush(System.Drawing.Color.White)) g2.FillRectangle(brush, 0, 0, defaultImage.Width, defaultImage.Height); //g2.DrawImage(defaultImage,0,0,defaultImage.Width,defaultImage.Height); defaultImage.DrawImage(g2, new Rectangle(0, 0, defaultImage.Width, defaultImage.Height)); g2.Dispose(); g2 = Graphics.FromImage(m_DisabledImage); bmp.MakeTransparent(System.Drawing.Color.White); eDotNetBarStyle effectiveStyle = EffectiveStyle; if ((effectiveStyle == eDotNetBarStyle.OfficeXP || effectiveStyle == eDotNetBarStyle.Office2003 || effectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(effectiveStyle)) && NativeFunctions.ColorDepth >= 8) { float[][] array = new float[5][]; array[0] = new float[5] { 0, 0, 0, 0, 0 }; array[1] = new float[5] { 0, 0, 0, 0, 0 }; array[2] = new float[5] { 0, 0, 0, 0, 0 }; array[3] = new float[5] { .5f, .5f, .5f, .5f, 0 }; array[4] = new float[5] { 0, 0, 0, 0, 0 }; System.Drawing.Imaging.ColorMatrix grayMatrix = new System.Drawing.Imaging.ColorMatrix(array); System.Drawing.Imaging.ImageAttributes disabledImageAttr = new System.Drawing.Imaging.ImageAttributes(); disabledImageAttr.ClearColorKey(); disabledImageAttr.SetColorMatrix(grayMatrix); g2.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, disabledImageAttr); } else System.Windows.Forms.ControlPaint.DrawImageDisabled(g2, bmp, 0, 0, ColorFunctions.MenuBackColor(g2)); // Clean up g2.Dispose(); g2 = null; bmp.Dispose(); bmp = null; defaultImage.Dispose(); } private Image GetImageFromImageList(int ImageIndex) { if(ImageIndex>=0) { IOwner owner=null; IBarImageSize iImageSize=null; if(_ItemPaintArgs!=null) { owner=_ItemPaintArgs.Owner; iImageSize=_ItemPaintArgs.ContainerControl as IBarImageSize; } if(owner==null) owner=this.GetOwner() as IOwner; if(iImageSize==null) iImageSize=this.ContainerControl as IBarImageSize; if(owner!=null) { try { if(iImageSize!=null && iImageSize.ImageSize!=eBarImageSize.Default) { if(iImageSize.ImageSize==eBarImageSize.Medium && owner.ImagesMedium!=null) return owner.ImagesMedium.Images[ImageIndex]; else if(iImageSize.ImageSize==eBarImageSize.Large && owner.ImagesLarge!=null) return owner.ImagesLarge.Images[ImageIndex]; else if(owner.Images!=null) { if(ImageIndex==m_ImageIndex) { if(m_ImageCachedIdx==null) m_ImageCachedIdx=owner.Images.Images[ImageIndex]; return m_ImageCachedIdx; } else return owner.Images.Images[ImageIndex]; } } else if(m_Parent is SideBarPanelItem && ((SideBarPanelItem)m_Parent).ItemImageSize!=eBarImageSize.Default) { eBarImageSize imgSize=((SideBarPanelItem)m_Parent).ItemImageSize; if(imgSize==eBarImageSize.Medium && owner.ImagesMedium!=null) return owner.ImagesMedium.Images[ImageIndex]; else if(imgSize==eBarImageSize.Large && owner.ImagesLarge!=null) return owner.ImagesLarge.Images[ImageIndex]; else if(owner.Images!=null) return owner.Images.Images[ImageIndex]; } else if(owner.Images!=null) { if(ImageIndex==m_ImageIndex) { if(m_ImageCachedIdx==null) m_ImageCachedIdx=owner.Images.Images[ImageIndex]; return m_ImageCachedIdx; } else return owner.Images.Images[ImageIndex]; } } catch(Exception) { return null; } } } return null; } private System.Drawing.Size IconSize { get { // Default Icon Size System.Drawing.Size size=new Size(16,16); IBarImageSize iImageSize=null; if(_ItemPaintArgs!=null) { iImageSize=_ItemPaintArgs.ContainerControl as IBarImageSize; } if(iImageSize==null) iImageSize=this.ContainerControl as IBarImageSize; try { if(iImageSize!=null && iImageSize.ImageSize!=eBarImageSize.Default) { if(iImageSize.ImageSize==eBarImageSize.Medium) size=new Size(24,24); else if(iImageSize.ImageSize==eBarImageSize.Large) size=new Size(32,32); } else if(m_Parent is SideBarPanelItem && ((SideBarPanelItem)m_Parent).ItemImageSize!=eBarImageSize.Default) { eBarImageSize imgSize=((SideBarPanelItem)m_Parent).ItemImageSize; if(imgSize==eBarImageSize.Medium) size=new Size(24,24); else if(imgSize==eBarImageSize.Large) size=new Size(32,32); } } catch(Exception) { } return size; } } protected override void OnCommandChanged() { if (!this.DesignMode && this.Command == null) this.Text = ""; base.OnCommandChanged(); } private eOrientation _TextOrientation = eOrientation.Horizontal; /// /// Gets or sets text-orientation. Default is horizontal. /// [DefaultValue(eOrientation.Horizontal), Category("Appearance"), Description("Indicates text-orientation")] public eOrientation TextOrientation { get { return _TextOrientation; } set { _TextOrientation = value; NeedRecalcSize = true; this.Refresh(); } } private bool _VerticalTextTopUp = true; /// /// Gets or sets how vertical text is rotated when TextOrientation = Vertical. /// [DefaultValue(true), Category("Appearance"), Description("Indicates how vertical text is rotated when TextOrientation = Vertical.")] public bool VerticalTextTopUp { get { return _VerticalTextTopUp; } set { _VerticalTextTopUp = value; if (_TextOrientation == eOrientation.Vertical) { this.Refresh(); } } } /// /// Gets the realized symbol string. /// [Browsable(false)] public string SymbolRealized { get { return _SymbolRealized; } } private string _Symbol = "", _SymbolRealized = ""; /// /// Indicates the symbol displayed on label instead of the image. Setting the symbol overrides the image setting. /// [DefaultValue(""), Category("Appearance"), Description("Indicates the symbol displayed on face of the tile instead of the image. Setting the symbol overrides the image setting.")] [Editor("DevComponents.DotNetBar.Design.SymbolTypeEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor))] public string Symbol { get { return _Symbol; } set { if (value != _Symbol) { string oldValue = _Symbol; _Symbol = value; OnSymbolChanged(oldValue, value); } } } /// /// Called when Symbol property has changed. /// /// Old property value /// New property value protected virtual void OnSymbolChanged(string oldValue, string newValue) { if (string.IsNullOrEmpty(newValue)) _SymbolRealized = ""; else _SymbolRealized = Symbols.GetSymbol(newValue); //OnPropertyChanged(new PropertyChangedEventArgs("Symbol")); NeedRecalcSize = true; OnAppearanceChanged(); this.Refresh(); } private eSymbolSet _SymbolSet = eSymbolSet.Awesome; /// /// Gets or sets the symbol set used to represent the Symbol. /// [Browsable(false), DefaultValue(eSymbolSet.Awesome)] public eSymbolSet SymbolSet { get { return _SymbolSet; } set { if (_SymbolSet != value) { eSymbolSet oldValue = _SymbolSet; _SymbolSet = value; OnSymbolSetChanged(oldValue, value); } } } /// /// Called when SymbolSet property value changes. /// /// Indciates old value /// Indicates new value protected virtual void OnSymbolSetChanged(eSymbolSet oldValue, eSymbolSet newValue) { NeedRecalcSize = true; OnAppearanceChanged(); this.Refresh(); } private float _SymbolSize = 0f; /// /// Indicates the size of the symbol in points. /// [DefaultValue(0f), Category("Appearance"), Description("Indicates the size of the symbol in points.")] public float SymbolSize { get { return _SymbolSize; } set { if (value != _SymbolSize) { float oldValue = _SymbolSize; _SymbolSize = value; OnSymbolSizeChanged(oldValue, value); } } } /// /// Called when SymbolSize property has changed. /// /// Old property value /// New property value protected virtual void OnSymbolSizeChanged(float oldValue, float newValue) { //OnPropertyChanged(new PropertyChangedEventArgs("SymbolSize")); NeedRecalcSize = true; OnAppearanceChanged(); this.Refresh(); } private Color _SymbolColor = Color.Empty; /// /// Gets or sets the color of the symbol. /// [Category("Columns"), Description("Indicates color of the symbol.")] public Color SymbolColor { get { return _SymbolColor; } set { _SymbolColor = value; this.Refresh(); } } /// /// Gets whether property should be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeSymbolColor() { return !_SymbolColor.IsEmpty; } /// /// Resets property to its default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetSymbolColor() { this.SymbolColor = Color.Empty; } #endregion #region Markup Support protected override void TextMarkupLinkClick(object sender, EventArgs e) { TextMarkup.HyperLink link = sender as TextMarkup.HyperLink; if(link!=null) OnMarkupLinkClick(new MarkupLinkClickEventArgs(link.Name, link.HRef)); base.TextMarkupLinkClick(sender, e); } protected virtual void OnMarkupLinkClick(MarkupLinkClickEventArgs e) { if (this.MarkupLinkClick != null) MarkupLinkClick(this, e); } #endregion #region IBlockExtended Members private bool _ContainerNewLineAfter = false; /// /// Gets or sets whether label hosted in multi-line ItemContainer triggers new line switch after label is processed. /// [DefaultValue(false), Category("Layout"), Description("Indicates whether label hosted in multi-line ItemContainer triggers new line switch after label is processed.")] public bool ContainerNewLineAfter { get { return _ContainerNewLineAfter; } set { _ContainerNewLineAfter = value; } } bool IBlockExtended.IsBlockElement { get { return false; } } bool IBlockExtended.IsNewLineAfterElement { get { return _ContainerNewLineAfter; } } bool IBlockExtended.CanStartNewLine { get { return true; } } bool IBlockExtended.IsBlockContainer { get { return false; } } #endregion } }