using System;
using System.ComponentModel;
namespace DevComponents.DotNetBar.SuperGrid.Style
{
    /// 
    /// Represents the base visual style.
    /// 
    [ToolboxItem(false), DesignTimeVisible(false)]
    public class BaseVisualStyle : INotifyPropertyChanged, IDisposable
    {
        #region Private variables
        private string _Class = "";
        private object _Tag;
        #endregion
        #region Public properties
        #region Class
        /// 
        /// Gets or sets the class style belongs to. 
        /// 
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public string Class
        {
            get { return (_Class); }
            set
            {
                if (_Class != value)
                {
                    _Class = value;
                    OnPropertyChangedEx("Class", VisualChangeType.Layout);
                }
            }
        }
        #endregion
        #region IsEmpty
        /// 
        /// Gets whether the style is logically Empty.
        /// 
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Description("Gets whether the style is logically Empty.")]
        public virtual bool IsEmpty
        {
            get { return (_Tag == null); }
        }
        #endregion
        #region Tag
        /// 
        /// Gets or sets the user defined reference Tag.
        /// 
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Description("User defined reference Tag.")]
        public object Tag
        {
            get { return (_Tag); }
            set { _Tag = value; }
        }
        #endregion
        #endregion
        #region ApplyStyle
        /// 
        /// Applies the style to instance of this style.
        /// 
        /// Style to apply.
        public void ApplyStyle(BaseVisualStyle style)
        {
        }
        #endregion
        #region GetApplyStyleTypes
        internal StyleType[] GetApplyStyleTypes(StyleType e)
        {
            StyleType[] css = null;
            switch (e)
            {
                case StyleType.Default:
                    css = new StyleType[] { StyleType.Default};
                    break;
                case StyleType.Empty:
                case StyleType.MouseOver:
                case StyleType.ReadOnly:
                case StyleType.Selected:
                case StyleType.NotSelectable:
                    css = new StyleType[] { StyleType.Default, e };
                    break;
                case StyleType.SelectedMouseOver:
                    css = new StyleType[] { StyleType.Default, StyleType.Selected, e };
                    break;
                case StyleType.ReadOnlyMouseOver:
                    css = new StyleType[] { StyleType.Default, StyleType.ReadOnly, e };
                    break;
                case StyleType.ReadOnlySelected:
                    css = new StyleType[] { StyleType.Default, StyleType.Selected, StyleType.ReadOnly, e };
                    break;
                case StyleType.ReadOnlySelectedMouseOver:
                    css = new StyleType[] { StyleType.Default, StyleType.Selected, StyleType.ReadOnly, StyleType.ReadOnlySelected, e };
                    break;
            }
            return (css);
        }
        #endregion
        #region Copy
        /// 
        /// Returns the copy of the style.
        /// 
        /// Copy of the style.
        public BaseVisualStyle Copy()
        {
            BaseVisualStyle style = new BaseVisualStyle();
            CopyTo(style);
            return (style);
        }
        #endregion
        #region CopyTo
        /// 
        /// Returns the copy of the style.
        /// 
        /// Copy of the style.
        public void CopyTo(BaseVisualStyle copy)
        {
            copy.Class = _Class;
            copy.Tag = _Tag;
        }
        #endregion
        #region INotifyPropertyChanged Members
        /// 
        /// Occurs when property value has changed.
        /// 
        public event PropertyChangedEventHandler PropertyChanged;
        /// 
        /// Raises the PropertyChanged event.
        /// 
        /// Event arguments
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler eh = PropertyChanged;
            if (eh != null)
                eh(this, e);
        }
        /// 
        /// Default PropertyChanged processing
        /// 
        /// 
        protected void OnPropertyChanged(string s)
        {
            if (PropertyChanged != null)
                OnPropertyChanged(new VisualPropertyChangedEventArgs(s));
        }
        /// 
        /// Default PropertyChanged processing
        /// 
        /// 
        /// invalidate
        protected void OnPropertyChangedEx(string s, VisualChangeType changeType)
        {
            if (PropertyChanged != null)
                OnPropertyChanged(new VisualPropertyChangedEventArgs(s, changeType));
        }
        #endregion
        #region UpdateChangeHandler
        /// 
        /// UpdateChangeHandler
        /// 
        /// 
        /// 
        protected void UpdateChangeHandler(
            INotifyPropertyChanged oldValue, INotifyPropertyChanged newValue)
        {
            if (oldValue != null)
                oldValue.PropertyChanged -= ValuePropertyChanged;
            if (newValue != null)
                newValue.PropertyChanged += ValuePropertyChanged;
        }
        void ValuePropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            OnPropertyChanged(e);
        }
        #endregion
        #region IDisposable
        /// 
        /// Dispose
        /// 
        public virtual void Dispose()
        {
        }
        #endregion
    }
    #region enums
    #region Alignment
    ///
    /// Alignment of the content
    ///
    public enum Alignment
    {
        ///
        ///
        NotSet = -1,
        ///
        /// TopLeft
        ///
        TopLeft,
        ///
        /// TopCenter
        ///
        TopCenter,
        ///
        /// TopRight
        ///
        TopRight,
        ///
        /// MiddleLeft
        ///
        MiddleLeft,
        ///
        /// MiddleCenter
        ///
        MiddleCenter,
        /// 
        /// MiddleRight
        /// 
        MiddleRight,
        /// 
        /// BottomLeft
        /// 
        BottomLeft,
        /// 
        /// BottomCenter
        /// 
        BottomCenter,
        /// 
        /// BottomRight
        /// 
        BottomRight,
    }
    #endregion
    #region BorderSide
    internal enum BorderSide
    {
        Top,
        Left,
        Bottom,
        Right
    }
    #endregion
    #region CellHighlightMode
    ///
    /// Specifies the mode of cell highlighting
    /// to employ when a grid cell is selected
    ///
    public enum CellHighlightMode
    {
        ///
        /// No highlighting
        ///
        None,
        ///
        /// Entire cell will be Highlighted
        ///
        Full,
        ///
        /// Partial cell will be Highlighted
        ///
        Partial,
        ///
        /// Cell content only will be Highlighted
        ///
        Content,
    }
    #endregion
    #region ImageHighlightMode
    ///
    /// ImageHighlightMode
    ///
    public enum ImageHighlightMode
    {
        ///
        /// NotSet
        ///
        NotSet = -1,
        ///
        /// Default
        ///
        Default,
        ///
        /// Always
        ///
        Always,
        ///
        /// Never
        ///
        Never,
    }
    #endregion
    #region ImageOverlay
    ///
    /// How to Overlay the Image with
    /// respect to the content
    ///
    public enum ImageOverlay
    {
        ///
        ///
        NotSet = -1,
        ///
        /// None
        ///
        None,
        ///
        /// Top
        ///
        Top,
        ///
        /// Bottom
        ///
        Bottom,
    }
    #endregion
    #region Tbool
    ///
    /// TBool - Three state boolean
    ///
    public enum Tbool
    {
        ///
        /// NotSet
        ///
        NotSet,
        ///
        /// True
        ///
        True,
        ///
        /// False
        ///
        False
    }
    #endregion
    #region VisualChangeType
    /// 
    /// Defines visual property change type.
    /// 
    public enum VisualChangeType
    {
        /// 
        /// Visual style has changed so layout is impacted
        /// 
        Layout,
        /// 
        /// Visual style has changed so visuals are impacted, but not layout
        /// 
        Render
    }
    #endregion
    #endregion
}