using System;
using System.ComponentModel;
using System.Drawing;
namespace DevComponents.DotNetBar.SuperGrid.Style
{
    ///
    /// GroupHeaderVisualStyles
    ///
    public class GroupHeaderVisualStyles : VisualStyles
    {
    }
    ///
    /// RowHeaderVisualStyle
    ///
    public class GroupHeaderVisualStyle : BaseVisualStyle
    {
        #region Static data
        ///
        /// Empty
        ///
        public static GroupHeaderVisualStyle Empty
        {
            get { return (new GroupHeaderVisualStyle()); }
        }
        #endregion
        #region Private variables
        private Font _Font;
        private Alignment _Alignment = Alignment.NotSet;
        private Tbool _AllowWrap = Tbool.NotSet;
        private Color _TextColor = Color.Empty;
        private Color _UnderlineColor = Color.Empty;
        private Background _Background;
        private Padding _Padding;
        private RowHeaderVisualStyle _RowHeaderStyle;
        #endregion
        #region Public properties
        #region Alignment
        /// 
        /// Gets or sets the alignment of the content within the cell
        /// 
        [DefaultValue(Alignment.NotSet), Category("Appearance")]
        [Description("Indicates the alignment of the content.")]
        public Alignment Alignment
        {
            get { return (_Alignment); }
            set
            {
                if (_Alignment != value)
                {
                    _Alignment = value;
                    OnPropertyChangedEx("Alignment", VisualChangeType.Layout);
                }
            }
        }
        #endregion
        #region AllowWrap
        /// 
        /// Gets or sets whether text wrapping is permitted
        /// 
        [DefaultValue(Tbool.NotSet), Category("Appearance")]
        [Description("Indicates whether text wrapping is permitted")]
        public Tbool AllowWrap
        {
            get { return (_AllowWrap); }
            set
            {
                if (_AllowWrap != value)
                {
                    _AllowWrap = value;
                    OnPropertyChangedEx("AllowWrap", VisualChangeType.Layout);
                }
            }
        }
        #endregion
        #region Background
        /// 
        /// Gets or sets the style background.
        /// 
        [Description("Indicates the style background")]
        public Background Background
        {
            get
            {
                if (_Background == null)
                {
                    _Background = Background.Empty;
                    UpdateChangeHandler(null, _Background);
                }
                return (_Background);
            }
            set
            {
                if (_Background != value)
                {
                    UpdateChangeHandler(_Background, value);
                    _Background = value;
                    OnPropertyChangedEx("Background", VisualChangeType.Render);
                }
            }
        }
        /// 
        /// Gets whether property should be serialized.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private bool ShouldSerializeBackground()
        {
            return (_Background != null && _Background.IsEmpty == false);
        }
        /// 
        /// Resets property to its default value.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetBackground()
        {
            Background = null;
        }
        #endregion
        #region Font
        /// 
        /// Gets or sets the style Font.
        /// 
        [DefaultValue(null)]
        [Description("Indicates the style Font")]
        public Font Font
        {
            get { return (_Font); }
            set
            {
                if (_Font != value)
                {
                    _Font = value;
                    OnPropertyChangedEx("Font", VisualChangeType.Layout);
                }
            }
        }
        #endregion
        #region Padding
        /// 
        /// Gets or sets the spacing between the content and edges of the element
        /// 
        [Description("Indicates the spacing between the content and edges of the element")]
        public Padding Padding
        {
            get
            {
                if (_Padding == null)
                {
                    _Padding = Padding.Empty;
                    UpdateChangeHandler(null, _Padding);
                }
                return (_Padding);
            }
            set
            {
                if (_Padding != value)
                {
                    UpdateChangeHandler(_Padding, value);
                    
                    _Padding = value;
                    OnPropertyChangedEx("Padding", VisualChangeType.Layout);
                }
            }
        }
        /// 
        /// Gets whether property should be serialized.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private bool ShouldSerializePadding()
        {
            return (_Padding != null && _Padding.IsEmpty == false);
        }
        /// 
        /// Resets property to its default value.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetPadding()
        {
            Padding = null;
        }
        #endregion
        #region RowHeaderStyle
        /// 
        /// Gets or sets the GroupHeader RowHeader Style
        /// 
        [Category("Appearance")]
        [Description("Indicates the GroupHeader RowHeader Style")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public RowHeaderVisualStyle RowHeaderStyle
        {
            get
            {
                if (_RowHeaderStyle == null)
                {
                    _RowHeaderStyle = RowHeaderVisualStyle.Empty;
                    UpdateChangeHandler(null, _RowHeaderStyle);
                }
                return (_RowHeaderStyle);
            }
            set
            {
                if (_RowHeaderStyle != value)
                {
                    UpdateChangeHandler(_RowHeaderStyle, value);
                    _RowHeaderStyle = value;
                    OnPropertyChangedEx("RowHeaderStyle", VisualChangeType.Render);
                }
            }
        }
        #endregion
        #region TextColor
        /// 
        /// Gets or sets the Text color
        /// 
        [Category("Appearance"), Description("Indicates the Text color")]
        public Color TextColor
        {
            get { return (_TextColor); }
            set
            {
                if (_TextColor != value)
                {
                    _TextColor = value;
                    OnPropertyChangedEx("TextColor", VisualChangeType.Render);
                }
            }
        }
        /// 
        /// Gets whether property should be serialized.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private bool ShouldSerializeTextColor()
        {
            return (_TextColor.IsEmpty == false);
        }
        /// 
        /// Resets property to its default value.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetTextColor()
        {
            _TextColor = Color.Empty;
        }
        #endregion
        #region UnderlineColor
        /// 
        /// Gets or sets the text Underline Color
        /// 
        [Description("Indicates the text Underline Color")]
        public Color UnderlineColor
        {
            get { return (_UnderlineColor); }
            set
            {
                if (_UnderlineColor != value)
                {
                    _UnderlineColor = value;
                    OnPropertyChangedEx("UnderlineColor", VisualChangeType.Render);
                }
            }
        }
        /// 
        /// Gets whether property should be serialized.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private bool ShouldSerializeUnderlineColor()
        {
            return (_UnderlineColor.IsEmpty == false);
        }
        /// 
        /// Resets property to its default value.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetUnderlineColor()
        {
            _UnderlineColor = Color.Empty;
        }
        #endregion
        #endregion
        #region ApplyStyle
        /// 
        /// Applies the style to instance of this style.
        /// 
        /// Style to apply.
        public void ApplyStyle(GroupHeaderVisualStyle style)
        {
            base.ApplyStyle(style);
            if (style.Alignment != Alignment.NotSet)
                Alignment = style.Alignment;
            if (style.AllowWrap != Tbool.NotSet)
                AllowWrap = style.AllowWrap;
            if (style._Background != null && style._Background.IsEmpty == false)
                Background = style._Background.Copy();
            if (style.Font != null)
                Font = style.Font;
            if (style._Padding != null && style._Padding.IsEmpty == false)
                Padding = style._Padding.Copy();
            if (style.TextColor.IsEmpty == false)
                TextColor = style.TextColor;
            if (style.UnderlineColor.IsEmpty == false)
                UnderlineColor = style.UnderlineColor;
            if (style._RowHeaderStyle != null)
                RowHeaderStyle.ApplyStyle(style._RowHeaderStyle);
        }
        #endregion
        #region GetTextFormatFlags
        internal eTextFormat GetTextFormatFlags()
        {
            eTextFormat tf = eTextFormat.WordEllipsis |
                eTextFormat.NoPadding | eTextFormat.NoPrefix;
            if (AllowWrap == Tbool.True)
                tf |= eTextFormat.WordBreak;
            switch (Alignment)
            {
                case Alignment.TopCenter:
                    tf |= eTextFormat.HorizontalCenter;
                    break;
                case Alignment.TopRight:
                    tf |= eTextFormat.Right;
                    break;
                case Alignment.MiddleLeft:
                    tf |= eTextFormat.VerticalCenter;
                    break;
                case Alignment.MiddleCenter:
                    tf |= eTextFormat.HorizontalCenter;
                    tf |= eTextFormat.VerticalCenter;
                    break;
                case Alignment.MiddleRight:
                    tf |= eTextFormat.Right;
                    tf |= eTextFormat.VerticalCenter;
                    break;
                case Alignment.BottomLeft:
                    tf |= eTextFormat.Bottom;
                    break;
                case Alignment.BottomCenter:
                    tf |= eTextFormat.Bottom;
                    tf |= eTextFormat.HorizontalCenter;
                    break;
                case Alignment.BottomRight:
                    tf |= eTextFormat.Bottom;
                    tf |= eTextFormat.Right;
                    break;
            }
            return (tf);
        }
        #endregion
        #region Copy
        /// 
        /// Returns the copy of the style.
        /// 
        /// Copy of the style.
        public new GroupHeaderVisualStyle Copy()
        {
            GroupHeaderVisualStyle copy = new GroupHeaderVisualStyle();
            CopyTo(copy);
            return (copy);
        }
        #endregion
        #region CopyTo
        /// 
        /// Returns the copy of the style.
        /// 
        /// Copy of the style.
        public void CopyTo(GroupHeaderVisualStyle copy)
        {
            base.CopyTo(copy);
            copy.Alignment = _Alignment;
            copy.AllowWrap = _AllowWrap;
            if (_Background != null)
                copy.Background = _Background.Copy();
            if (_Font != null)
                copy.Font = (Font)_Font.Clone();
            if (_Padding != null)
                copy.Padding = _Padding.Copy();
            copy.TextColor = _TextColor;
            copy.UnderlineColor = _UnderlineColor;
            if (_RowHeaderStyle != null)
                copy.RowHeaderStyle = _RowHeaderStyle.Copy();
        }
        #endregion
        #region IDisposable
        /// 
        /// Dispose
        /// 
        public override void Dispose()
        {
            Background = null;
            Padding = null;
            RowHeaderStyle = null;
            base.Dispose();
        }
        #endregion
    }
}