using System;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
namespace DevComponents.DotNetBar.Rendering
{
    /// 
    /// Defines the colors for the SuperTabItem states
    /// 
    [TypeConverter(typeof(SuperTabItemStateColorTableConvertor))]
    public class SuperTabItemStateColorTable : ICloneable
    {
        #region Events
        /// 
        /// Event raised when the SuperTabItemStateColorTable is changed
        /// 
        [Description("Event raised when the SuperTabItemStateColorTable is changed")]
        public event EventHandler ColorTableChanged;
        #endregion
        #region Private variables
        private Color _Text = Color.Empty;
        private Color _InnerBorder = Color.Empty;
        private Color _OuterBorder = Color.Empty;
        private Color _CloseMarker = Color.Empty;
        private Color _SelectionMarker = Color.Empty;
        private SuperTabLinearGradientColorTable _Background;
        #endregion
        public SuperTabItemStateColorTable()
        {
            _Background = new SuperTabLinearGradientColorTable();
            _Background.ColorTableChanged += Background_ColorTableChanged;
        }
        #region Public properties
        #region Background
        /// 
        /// Gets or sets the background colors.
        /// 
        [Browsable(true)]
        [NotifyParentProperty(true)]
        [Description("Indicates the background colors.")]
        public SuperTabLinearGradientColorTable Background
        {
            get { return (_Background); }
            set
            {
                if (_Background.Equals(value) == false)
                {
                    if (_Background != null)
                        _Background.ColorTableChanged -= Background_ColorTableChanged;
                    _Background = value;
                    if (_Background != null)
                        _Background.ColorTableChanged += Background_ColorTableChanged;
                    OnColorTableChanged();
                }
            }
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeBackground()
        {
            return (_Background.IsEmpty == false);
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetBackground()
        {
            Background = new SuperTabLinearGradientColorTable();
        }
        #endregion
        #region OuterBorder
        /// 
        /// Gets or sets the outer border color.
        /// 
        [Browsable(true)]
        [NotifyParentProperty(true)]
        [Description("Indicates the outer border color.")]
        public Color OuterBorder
        {
            get { return (_OuterBorder); }
            set
            {
                if (_OuterBorder != value)
                {
                    _OuterBorder = value;
                    OnColorTableChanged();
                }
            }
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeOuterBorder()
        {
            return (_OuterBorder != Color.Empty);
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetOuterBorder()
        {
            OuterBorder = Color.Empty;
        }
        #endregion
        #region InnerBorder
        /// 
        /// Gets or sets the inner border color.
        /// 
        [Browsable(true)]
        [NotifyParentProperty(true)]
        [Description("Indicates the inner border color.")]
        public Color InnerBorder
        {
            get { return (_InnerBorder); }
            set
            {
                if (_InnerBorder != value)
                {
                    _InnerBorder = value;
                    OnColorTableChanged();
                }
            }
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeInnerBorder()
        {
            return (_InnerBorder != Color.Empty);
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetInnerBorder()
        {
            InnerBorder = Color.Empty;
        }
        #endregion
        #region Text
        /// 
        /// Gets or sets the text color.
        /// 
        [Browsable(true)]
        [NotifyParentProperty(true)]
        [Description("Indicates the Text color.")]
        public Color Text
        {
            get { return (_Text); }
            set
            {
                if (_Text != value)
                {
                    _Text = value;
                    OnColorTableChanged();
                }
            }
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeText()
        {
            return (_Text.IsEmpty == false);
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetText()
        {
            Text = Color.Empty;
        }
        #endregion
        #region CloseMarker
        /// 
        /// Gets or sets the Close Marker color.
        /// 
        [Browsable(true)]
        [NotifyParentProperty(true)]
        [Description("Indicates the Close Marker color.")]
        public Color CloseMarker
        {
            get { return (_CloseMarker); }
            set
            {
                if (_CloseMarker != value)
                {
                    _CloseMarker = value;
                    OnColorTableChanged();
                }
            }
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeCloseMarker()
        {
            return (_CloseMarker != Color.Empty);
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetCloseMarker()
        {
            CloseMarker = Color.Empty;
        }
        #endregion
        #region SelectionMarker
        /// 
        /// Gets or sets the Selection Marker color.
        /// 
        [Browsable(true)]
        [NotifyParentProperty(true)]
        [Description("Indicates the Selection Marker color.")]
        public Color SelectionMarker
        {
            get { return (_SelectionMarker); }
            set
            {
                if (_SelectionMarker != value)
                {
                    _SelectionMarker = value;
                    OnColorTableChanged();
                }
            }
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeSelectionMarker()
        {
            return (_SelectionMarker != Color.Empty);
        }
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetSelectionMarker()
        {
            SelectionMarker = Color.Empty;
        }
        #endregion
        #region IsEmpty
        [Browsable(false)]
        public bool IsEmpty
        {
            get
            {
                if (_Background.IsEmpty == false)
                    return (false);
                if (_OuterBorder != Color.Empty)
                    return (false);
                if (_InnerBorder != Color.Empty)
                    return (false);
                if (_Text != Color.Empty)
                    return (false);
                if (_CloseMarker != Color.Empty)
                    return (false);
                if (_SelectionMarker != Color.Empty)
                    return (false);
                return (true);
            }
        }
        #endregion
        #endregion
        #region Background_ColorTableChanged
        void Background_ColorTableChanged(object sender, EventArgs e)
        {
            OnColorTableChanged();
        }
        #endregion
        #region OnColorTableChanged
        private void OnColorTableChanged()
        {
            if (ColorTableChanged != null)
                ColorTableChanged(this, EventArgs.Empty);
        }
        #endregion
        #region ICloneable Members
        public object Clone()
        {
            SuperTabItemStateColorTable sct = new SuperTabItemStateColorTable();
            sct.Background = (SuperTabLinearGradientColorTable)Background.Clone();
            sct.Text = Text;
            sct.OuterBorder = OuterBorder;
            sct.InnerBorder = InnerBorder;
            sct.CloseMarker = CloseMarker;
            sct.SelectionMarker = SelectionMarker;
            return (sct);
        }
        #endregion
    }
    #region SuperTabItemStateColorTableConvertor
    public class SuperTabItemStateColorTableConvertor : ExpandableObjectConverter
    {
        public override object ConvertTo(
            ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                SuperTabItemStateColorTable sct = value as SuperTabItemStateColorTable;
                if (sct != null)
                {
                    ColorConverter cvt = new ColorConverter();
                    if (sct.Background.Colors != null)
                        return (cvt.ConvertToString(sct.Background.Colors[0]));
                    if (sct.InnerBorder.IsEmpty == false)
                        return (cvt.ConvertToString(sct.InnerBorder));
                    if (sct.OuterBorder.IsEmpty == false)
                        return (cvt.ConvertToString(sct.OuterBorder));
                    if (sct.Text.IsEmpty == false)
                        return (cvt.ConvertToString(sct.Text));
                    return (String.Empty);
                }
            }
            return (base.ConvertTo(context, culture, value, destinationType));
        }
    }
    #endregion
}