#if FRAMEWORK20
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Collections;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Rendering;
namespace DevComponents.Editors
{
    public class VisualButton : VisualButtonBase
    {
        #region Private Variables
        #endregion
        #region Events
        #endregion
        #region Constructor
        #endregion
        #region Internal Implementation
        public override void PerformLayout(PaintInfo pi)
        {
            Size size = new Size(0, (_Height > 0 ? Dpi.Height(_Height) : pi.AvailableSize.Height));
            Graphics g = pi.Graphics;
            size.Width += Dpi.Width6; // Border 2 pixels on each side and 1 pixels of padding between border and content
            if (_Text.Length > 0)
            {
                Size textSize = TextDrawing.MeasureString(g, _Text, pi.DefaultFont);
                size.Width += textSize.Width;
                if (_Image != null)
                    size.Width += Dpi.Width4; // Padding between text and image
            }
            if (!string.IsNullOrEmpty(_SymbolRealized))
            {
                size.Width += size.Height;
            }
            else if (_Image != null)
            {
                size.Width += Dpi.Width(_Image.Width);
            }
            if (_Text.Length == 0 && _Image == null && string.IsNullOrEmpty(_SymbolRealized))
                size.Width += Dpi.Width9;
            this.Size = size;
            this.CalculatedSize = size;
            base.PerformLayout(pi);
        }
        private int _Height = 0;
        /// 
        /// Gets or sets the fixed button height.
        /// 
        public int Height
        {
            get { return _Height; }
            set { _Height = value; }
        }
        protected override void OnPaint(PaintInfo p)
        {
            Graphics g = p.Graphics;
            Rectangle r = this.RenderBounds;
            PaintButtonBackground(p);
            Rectangle contentRect = r;
            contentRect.Inflate(-3, -3); // Two pixels border + 1 pixels padding for content
            if (!string.IsNullOrEmpty(_Text))
            {
                TextDrawing.DrawString(g, _Text, p.DefaultFont, GetIsEnabled(p) ? p.ForeColor : p.DisabledForeColor, contentRect, eTextFormat.Default | eTextFormat.VerticalCenter);
            }
            if (!string.IsNullOrEmpty(_SymbolRealized))
            {
                Office2007ButtonItemStateColorTable ct = GetOffice2007StateColorTable(p);
                Color symbolColor=(GetIsEnabled(p) ? p.ForeColor : p.DisabledForeColor);
                if (!_SymbolColor.IsEmpty)
                    symbolColor = _SymbolColor;
                else if (!ct.Text.IsEmpty)
                    symbolColor = ct.Text;
                float symbolSize = Math.Max(1, Math.Min(r.Width, r.Height) * 72 / g.DpiX - 1.5f);
                Rectangle sr = contentRect;
                if (!string.IsNullOrEmpty(_Text))
                    sr = new Rectangle(contentRect.Right - contentRect.Height, contentRect.Y, contentRect.Height, contentRect.Height);
                sr.Inflate(3, 3);
                TextDrawing.DrawStringLegacy(g, _SymbolRealized, Symbols.GetFont(symbolSize, _SymbolSet),
                    symbolColor, sr, eTextFormat.HorizontalCenter | eTextFormat.VerticalCenter);
            }
            else if (_Image != null)
            {
                Image image = GetIsEnabled(p) ? _Image : GetDisabledImage();
                Size imageSize = Dpi.ImageSize(image.Size);
                g.DrawImage(image, new Rectangle(contentRect.Right - (imageSize.Width + (string.IsNullOrEmpty(_Text)?(contentRect.Width - imageSize.Width) / 2:0)), 
                    contentRect.Y + (contentRect.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height));
            }
            base.OnPaint(p);
        }
        protected virtual void PaintButtonBackground(PaintInfo p)
        {
            PaintButtonBackground(p, GetOffice2007StateColorTable(p));
        }
        protected virtual void PaintButtonBackground(PaintInfo p, Office2007ButtonItemStateColorTable ct)
        {
            Graphics g = p.Graphics;
            Rectangle r = this.RenderBounds;
            if (RenderBackground(p))
                Office2007ButtonItemPainter.PaintBackground(g, ct, r, RoundRectangleShapeDescriptor.RectangleShape);
        }
        private bool RenderBackground(PaintInfo p)
        {
            if (RenderDefaultBackground) return true;
            if (!p.MouseOver && !this.IsMouseDown && !this.IsMouseOver && !this.Checked || !this.GetIsEnabled())
                return false;
            return true;
        }
        protected Office2007ButtonItemStateColorTable GetOffice2007StateColorTable(PaintInfo p)
        {
            if (GlobalManager.Renderer is Office2007Renderer)
            {
                Office2007ColorTable ct = ((Office2007Renderer)GlobalManager.Renderer).ColorTable;
                Office2007ButtonItemColorTable buttonColorTable = ct.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.OrangeWithBackground)];
                if (!this.GetIsEnabled(p))
                    return buttonColorTable.Disabled;
                else if (this.IsMouseDown)
                    return buttonColorTable.Pressed;
                else if (this.IsMouseOver)
                    return buttonColorTable.MouseOver;
                else if (this.Checked)
                    return buttonColorTable.Checked;
                else
                    return buttonColorTable.Default;
            }
            return null;
        }
        protected override void OnMouseEnter()
        {
            if (this.GetIsEnabled())
                this.IsMouseOver = true;
            base.OnMouseEnter();
        }
        protected override void OnMouseLeave()
        {
            this.IsMouseOver = false;
            base.OnMouseLeave();
        }
        protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                this.IsMouseDown = true;
            }
            base.OnMouseDown(e);
        }
        protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
                this.IsMouseDown = false;
            base.OnMouseUp(e);
        }
        private bool _IsMouseOver = false;
        /// 
        /// Gets whether mouse is over the control.
        /// 
        public bool IsMouseOver
        {
            get { return _IsMouseOver; }
            internal set
            {
                if (_IsMouseOver != value)
                {
                    _IsMouseOver = value;
                    this.InvalidateRender();
                }
            }
        }
        private bool _IsMouseDown = false;
        /// 
        /// Gets whether mouse is pressed on the control.
        /// 
        public bool IsMouseDown
        {
            get { return _IsMouseDown; }
            internal set
            {
                if (_IsMouseDown != value)
                {
                    _IsMouseDown = value;
                    this.InvalidateRender();
                }
            }
        }
        private bool _Checked;
        public bool Checked
        {
            get { return _Checked; }
            set
            {
                if (_Checked != value)
                {
                    _Checked = value;
                    this.InvalidateRender();
                }
            }
        }
        private string _Text = "";
        /// 
        /// Gets or sets the text displayed on the face of the button.
        /// 
        [DefaultValue("")]
        public string Text
        {
            get { return _Text; }
            set
            {
                if (value == null) value = "";
                if (_Text != value)
                {
                    _Text = value;
                    this.InvalidateArrange();
                }
            }
        }
        private Image GetDisabledImage()
        {
            if (_DisabledImage == null && _Image != null)
            {
                _DisabledImage = ImageHelper.CreateGrayScaleImage(_Image as Bitmap);
            }
            return _DisabledImage;
        }
        private Image _DisabledImage = null;
        private Image _Image = null;
        /// 
        /// Gets or sets the image displayed on the face of the button.
        /// 
        [DefaultValue(null)]
        public Image Image
        {
            get { return _Image; }
            set
            {
                if (_Image != value)
                {
                    _Image = value;
                    if (_DisabledImage != null)
                    {
                        _DisabledImage.Dispose();
                        _DisabledImage = null;
                    }
                    this.InvalidateArrange();
                }
            }
        }
        /// 
        /// Gets the realized symbol string.
        /// 
        [Browsable(false)]
        public string SymbolRealized
        {
            get { return _SymbolRealized; }
        }
        private string _Symbol = "", _SymbolRealized = "";
        /// 
        /// Indicates the symbol displayed on face of the button instead of the image. Setting the symbol overrides the image setting.
        /// 
        [DefaultValue(""), Category("Appearance"), Description("Indicates the symbol displayed on face of the button 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"));
            this.InvalidateArrange();
        }
        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)
        {
            this.InvalidateArrange();
        }
        private Color _SymbolColor = Color.Empty;
        /// 
        /// Gets or sets the color of the Symbol.
        /// 
        [Category("Appearance"), Description("Indicates color of the Symbol.")]
        public Color SymbolColor
        {
            get { return _SymbolColor; }
            set { _SymbolColor = value; this.InvalidateRender(); }
        }
        #endregion
    }
}
#endif