using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Drawing2D;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
namespace DevComponents.DotNetBar.SuperGrid.Style
{
    ///
    /// RowHeaderVisualStyle
    ///
    public class RowHeaderVisualStyle : BaseRowHeaderVisualStyle
    {
        #region Static data
        static Image _ActiveRowImageCache;
        static Image _EditingRowImageCache;
        static Image _InfoRowImageCache;
        ///
        /// Empty
        ///
        public new static RowHeaderVisualStyle Empty
        {
            get { return (new RowHeaderVisualStyle()); }
        }
        #endregion
        #region Private variables
        private Background _ActiveRowBackground;
        private Background _DirtyMarkerBackground;
        private Color _ActiveRowIndicatorColor = Color.Empty;
        private Image _ActiveRowImage;
        private int _ActiveRowImageIndex = -1;
        private Image _EditingRowImage;
        private int _EditingRowImageIndex = -1;
        private Image _InfoRowImage;
        private int _InfoRowImageIndex = -1;
        #endregion
        #region Public properties
        #region ActiveRowBackground
        /// 
        /// Gets or sets the ActiveRow background
        /// 
        [Description("Indicates the ActiveRow background")]
        public Background ActiveRowBackground
        {
            get
            {
                if (_ActiveRowBackground == null)
                {
                    _ActiveRowBackground = Background.Empty;
                    UpdateChangeHandler(null, _ActiveRowBackground);
                }
                return (_ActiveRowBackground);
            }
            set
            {
                if (_ActiveRowBackground != value)
                {
                    UpdateChangeHandler(_ActiveRowBackground, value);
                    _ActiveRowBackground = value;
                    OnPropertyChangedEx("ActiveRowBackground", VisualChangeType.Render);
                }
            }
        }
        /// 
        /// Gets whether property should be serialized.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private bool ShouldSerializeActiveRowBackground()
        {
            return (_ActiveRowBackground != null && _ActiveRowBackground.IsEmpty == false);
        }
        /// 
        /// Resets property to its default value.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetActiveRowBackground()
        {
            ActiveRowBackground = null;
        }
        #endregion
        #region ActiveRowImage
        /// 
        /// Gets or sets the Active Row Image
        /// 
        [DefaultValue(null), Category("Appearance")]
        [Description("Indicates the Active Row image")]
        public Image ActiveRowImage
        {
            get { return (_ActiveRowImage); }
            set
            {
                if (_ActiveRowImage != value)
                {
                    _ActiveRowImage = value;
                    OnPropertyChangedEx("ActiveRowImage", VisualChangeType.Layout);
                }
            }
        }
        #endregion
        #region ActiveRowImageIndex
        /// 
        /// Gets or sets the Active Row image index
        /// 
        [Browsable(true), DefaultValue(-1)]
        [Category("Appearance"), Description("Indicates the Active Row image index")]
        [Editor("DevComponents.SuperGrid.Design.ImageIndexEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))]
        [TypeConverter(typeof(ImageIndexConverter))]
        public int ActiveRowImageIndex
        {
            get { return (_ActiveRowImageIndex); }
            set
            {
                if (_ActiveRowImageIndex != value)
                {
                    _ActiveRowImageIndex = value;
                    OnPropertyChangedEx("ActiveRowImageIndex", VisualChangeType.Layout);
                }
            }
        }
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetActiveRowImageIndex()
        {
            _ActiveRowImageIndex = -1;
        }
        #endregion
        #region ActiveRowIndicatorColor
        /// 
        /// Gets or sets the Active Row Indicator color
        /// 
        [Description("Indicates the Active Row Indicator color")]
        public Color ActiveRowIndicatorColor
        {
            get { return (_ActiveRowIndicatorColor); }
            set
            {
                if (_ActiveRowIndicatorColor != value)
                {
                    _ActiveRowIndicatorColor = value;
                    OnPropertyChangedEx("ActiveRowIndicatorColor", VisualChangeType.Render);
                }
            }
        }
        /// 
        /// Gets whether property should be serialized.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private bool ShouldSerializeActiveRowIndicatorColor()
        {
            return (_ActiveRowIndicatorColor.IsEmpty == false);
        }
        /// 
        /// Resets property to its default value.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetActiveRowIndicatorColor()
        {
            _ActiveRowIndicatorColor = Color.Empty;
        }
        #endregion
        #region DirtyMarkerBackground
        /// 
        /// Gets or sets the DirtyRow marker background
        /// 
        [Description("Indicates the DirtyRow marker background")]
        public Background DirtyMarkerBackground
        {
            get
            {
                if (_DirtyMarkerBackground == null)
                {
                    _DirtyMarkerBackground = Background.Empty;
                    UpdateChangeHandler(null, _DirtyMarkerBackground);
                }
                return (_DirtyMarkerBackground);
            }
            set
            {
                if (_DirtyMarkerBackground != value)
                {
                    UpdateChangeHandler(_DirtyMarkerBackground, value);
                    _DirtyMarkerBackground = value;
                    OnPropertyChangedEx("DirtyMarkerBackground", VisualChangeType.Render);
                }
            }
        }
        /// 
        /// Gets whether property should be serialized.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private bool ShouldSerializeDirtyMarkerBackground()
        {
            return (_DirtyMarkerBackground != null && _DirtyMarkerBackground.IsEmpty == false);
        }
        /// 
        /// Resets property to its default value.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetDirtyMarkerBackground()
        {
            DirtyMarkerBackground = null;
        }
        #endregion
        #region EditingRowImage
        /// 
        /// Gets or sets the Editing Row Image
        /// 
        [DefaultValue(null), Category("Appearance")]
        [Description("Indicates the Editing Row image")]
        public Image EditingRowImage
        {
            get { return (_EditingRowImage); }
            set
            {
                if (_EditingRowImage != value)
                {
                    _EditingRowImage = value;
                    OnPropertyChangedEx("EditingRowImage", VisualChangeType.Layout);
                }
            }
        }
        #endregion
        #region EditingRowImageIndex
        /// 
        /// Gets or sets the Editing Row image index
        /// 
        [Browsable(true), DefaultValue(-1)]
        [Category("Appearance"), Description("Indicates the Editing Row image index")]
        [Editor("DevComponents.SuperGrid.Design.ImageIndexEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))]
        [TypeConverter(typeof(ImageIndexConverter))]
        public int EditingRowImageIndex
        {
            get { return (_EditingRowImageIndex); }
            set
            {
                if (_EditingRowImageIndex != value)
                {
                    _EditingRowImageIndex = value;
                    OnPropertyChangedEx("EditingRowImageIndex", VisualChangeType.Layout);
                }
            }
        }
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetEditingRowImageIndex()
        {
            _EditingRowImageIndex = -1;
        }
        #endregion
        #region InfoRowImage
        /// 
        /// Gets or sets the Info Row Image
        /// 
        [DefaultValue(null), Category("Appearance")]
        [Description("Indicates the Info Row image")]
        public Image InfoRowImage
        {
            get { return (_InfoRowImage); }
            set
            {
                if (_InfoRowImage != value)
                {
                    _InfoRowImage = value;
                    OnPropertyChangedEx("InfoRowImage", VisualChangeType.Layout);
                }
            }
        }
        #endregion
        #region InfoRowImageIndex
        /// 
        /// Gets or sets the Info Row image index
        /// 
        [Browsable(true), DefaultValue(-1)]
        [Category("Appearance"), Description("Indicates the Info Row image index")]
        [Editor("DevComponents.SuperGrid.Design.ImageIndexEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))]
        [TypeConverter(typeof(ImageIndexConverter))]
        public int InfoRowImageIndex
        {
            get { return (_InfoRowImageIndex); }
            set
            {
                if (_InfoRowImageIndex != value)
                {
                    _InfoRowImageIndex = value;
                    OnPropertyChangedEx("InfoRowImageIndex", VisualChangeType.Layout);
                }
            }
        }
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        private void ResetInfoRowImageIndex()
        {
            _InfoRowImageIndex = -1;
        }
        #endregion
        #endregion
        #region GetActiveRowImage
        internal Image GetActiveRowImage(GridPanel panel)
        {
            if (_ActiveRowImage != null)
                return (_ActiveRowImage);
            if (_ActiveRowImageIndex >= 0 && panel != null)
            {
                ImageList imageList = panel.ImageList;
                if (imageList != null && _ActiveRowImageIndex < imageList.Images.Count)
                    return (imageList.Images[_ActiveRowImageIndex]);
            }
            return (GetActiveRowImage());
        }
        #region GetActiveRowImage
        private Image GetActiveRowImage()
        {
            if (_ActiveRowImage != null)
                return (_ActiveRowImage);
            if (_ActiveRowImageCache == null)
            {
                Rectangle r = new Rectangle(0, 0, Dpi.Width4, Dpi.Height7);
                Image image = new Bitmap(Dpi.Width4, Dpi.Height7);
                using (Graphics g = Graphics.FromImage(image))
                {
                    using (GraphicsPath path = new GraphicsPath())
                    {
                        Point pt = new Point(r.Right, r.Y + r.Height / 2);
                        Point[] pts =
                            {
                                pt,
                                new Point(pt.X - Dpi.Width4, pt.Y + Dpi.Height4),
                                new Point(pt.X - Dpi.Width4, pt.Y - Dpi.Height4),
                                pt
                            };
                        path.AddLines(pts);
                        Color color = ActiveRowIndicatorColor;
                        if (color.IsEmpty)
                            color = Color.Black;
                        using (Brush br = new SolidBrush(color))
                            g.FillPath(br, path);
                    }
                }
                _ActiveRowImageCache = image;
            }
            return (_ActiveRowImageCache);
        }
        #endregion
        #endregion
        #region GetEditingRowImage
        internal Image GetEditingRowImage(GridPanel panel)
        {
            if (_EditingRowImage != null)
                return (_EditingRowImage);
            if (_EditingRowImageIndex >= 0 && panel != null)
            {
                ImageList imageList = panel.ImageList;
                if (imageList != null && _EditingRowImageIndex < imageList.Images.Count)
                    return (imageList.Images[_EditingRowImageIndex]);
            }
            if (_EditingRowImageCache == null)
                _EditingRowImageCache = panel.GetResourceImage("Pencil");
            return (_EditingRowImageCache);
        }
        #endregion
        #region GetInfoRowImage
        internal Image GetInfoRowImage(GridPanel panel)
        {
            if (_InfoRowImage != null)
                return (_InfoRowImage);
            if (_InfoRowImageIndex >= 0 && panel != null)
            {
                ImageList imageList = panel.ImageList;
                if (imageList != null && _InfoRowImageIndex < imageList.Images.Count)
                    return (imageList.Images[_InfoRowImageIndex]);
            }
            if (_InfoRowImageCache == null)
                _InfoRowImageCache = panel.GetResourceImage("InfoImage");
            return (_InfoRowImageCache);
        }
        #endregion
        #region ApplyStyle
        /// 
        /// Applies the style to instance of this style.
        /// 
        /// Style to apply.
        public void ApplyStyle(RowHeaderVisualStyle style)
        {
            if (style != null)
            {
                base.ApplyStyle(style);
                if (style._ActiveRowIndicatorColor.IsEmpty == false)
                    _ActiveRowIndicatorColor = style._ActiveRowIndicatorColor;
                if (style._ActiveRowBackground != null && style._ActiveRowBackground.IsEmpty == false)
                    _ActiveRowBackground = style._ActiveRowBackground.Copy();
                if (style._DirtyMarkerBackground != null && style._DirtyMarkerBackground.IsEmpty == false)
                    _DirtyMarkerBackground = style._DirtyMarkerBackground.Copy();
                if (style.ActiveRowImageIndex >= 0)
                {
                    _ActiveRowImage = null;
                    _ActiveRowImageIndex = style.ActiveRowImageIndex;
                }
                if (style.ActiveRowImage != null)
                {
                    _ActiveRowImage = style.ActiveRowImage;
                    _ActiveRowImageIndex = -1;
                }
                if (style.EditingRowImageIndex >= 0)
                {
                    _EditingRowImage = null;
                    _EditingRowImageIndex = style.EditingRowImageIndex;
                }
                if (style.EditingRowImage != null)
                {
                    _EditingRowImage = style.EditingRowImage;
                    _EditingRowImageIndex = -1;
                }
                if (style.InfoRowImageIndex >= 0)
                {
                    _InfoRowImage = null;
                    _InfoRowImageIndex = style.InfoRowImageIndex;
                }
                if (style.InfoRowImage != null)
                {
                    _InfoRowImage = style.InfoRowImage;
                    _InfoRowImageIndex = -1;
                }
            }
        }
        #endregion
        #region Copy
        /// 
        /// Returns the copy of the style.
        /// 
        /// Copy of the style.
        public new RowHeaderVisualStyle Copy()
        {
            RowHeaderVisualStyle copy = new RowHeaderVisualStyle();
            CopyTo(copy);
            return (copy);
        }
        #endregion
        #region CopyTo
        /// 
        /// Returns the copy of the style.
        /// 
        /// Copy of the style.
        public void CopyTo(RowHeaderVisualStyle copy)
        {
            base.CopyTo(copy);
            if (_ActiveRowIndicatorColor.IsEmpty == false)
                copy.ActiveRowIndicatorColor = _ActiveRowIndicatorColor;
            if (_ActiveRowBackground != null)
                copy.ActiveRowBackground = _ActiveRowBackground.Copy();
            if (_DirtyMarkerBackground != null)
                copy.DirtyMarkerBackground = _DirtyMarkerBackground.Copy();
            copy.ActiveRowImage = _ActiveRowImage;
            copy.ActiveRowImageIndex = _ActiveRowImageIndex;
            copy.EditingRowImage = _EditingRowImage;
            copy.EditingRowImageIndex = _EditingRowImageIndex;
            copy.InfoRowImage = _InfoRowImage;
            copy.InfoRowImageIndex = _InfoRowImageIndex;
        }
        #endregion
        #region IDisposable
        /// 
        /// Dispose
        /// 
        public override void Dispose()
        {
            DirtyMarkerBackground = null;
            ActiveRowBackground = null;
            base.Dispose();
        }
        #endregion
    }
}