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