using System;
using System.Collections.Generic;
using System.Text;
using DevComponents.Editors;
using System.Drawing;
namespace DevComponents.DotNetBar
{
    /// 
    /// Defines a attribute which applies an integer type numeric editor to a property when used with AdvPropertyGrid control. Applies to int property types only.
    /// 
    public class PropertyIntegerEditor : PropertyValueEditor
    {
        #region Implementation
        /// 
        /// Gets or sets whether up/down button is shown.
        /// 
        public bool ShowUpDownButton = true;
        /// 
        /// Gets or sets the display format for the control when control does not have input focus.
        /// 
        public string DisplayFormat = "";
        /// 
        /// Gets or sets the minimum value that can be entered.
        /// 
        public int MinValue = int.MinValue;
        /// 
        /// Gets or sets the maximum value that can be entered.
        /// 
        public int MaxValue = int.MaxValue;
        /// 
        /// Gets or sets whether empty state i.e. null/nothing value is allowed when editor is used with nullable types.
        /// 
        public bool AllowEmptyState = false;
        /// 
        /// Initializes a new instance of the PropertyIntegerEditor class.
        /// 
        public PropertyIntegerEditor()
        {
        }
        /// 
        /// Initializes a new instance of the PropertyIntegerEditor class.
        /// 
        /// 
        public PropertyIntegerEditor(bool showUpDownButton)
        {
            ShowUpDownButton = showUpDownButton;
        }
        /// 
        /// Initializes a new instance of the PropertyIntegerEditor class.
        /// 
        /// 
        /// 
        public PropertyIntegerEditor(int minValue, int maxValue)
        {
            MinValue = minValue;
            MaxValue = maxValue;
        }
        /// 
        /// Initializes a new instance of the PropertyIntegerEditor class.
        /// 
        /// 
        /// 
        /// 
        public PropertyIntegerEditor(bool showUpDownButton, int minValue, int maxValue)
        {
            ShowUpDownButton = showUpDownButton;
            MinValue = minValue;
            MaxValue = maxValue;
        }
        /// 
        /// Initializes a new instance of the PropertyIntegerEditor class.
        /// 
        /// 
        /// 
        /// 
        /// 
        public PropertyIntegerEditor(bool showUpDownButton, string displayFormat, int minValue, int maxValue)
        {
            ShowUpDownButton = showUpDownButton;
            DisplayFormat = displayFormat;
            MinValue = minValue;
            MaxValue = maxValue;
        }
        /// 
        /// Initializes a new instance of the PropertyIntegerEditor class.
        /// 
        /// 
        /// 
        public PropertyIntegerEditor(bool showUpDownButton, string displayFormat)
        {
            ShowUpDownButton = showUpDownButton;
            DisplayFormat = displayFormat;
        }
        public override IPropertyValueEditor CreateEditor(System.ComponentModel.PropertyDescriptor propertyDescriptor, object targetObject)
        {
            if (propertyDescriptor.PropertyType != typeof(int) && propertyDescriptor.PropertyType != typeof(int?) &&
                propertyDescriptor.PropertyType != typeof(byte) && propertyDescriptor.PropertyType != typeof(byte?))
                throw new InvalidOperationException("PropertyIntegerEditor works only with int or byte type properties");
            IntegerValueEditor editor = new IntegerValueEditor();
            editor.AutoBorderSize = 1;
            if (!string.IsNullOrEmpty(DisplayFormat))
            {
                editor.DisplayFormat = DisplayFormat;
            }
            editor.ShowUpDown = ShowUpDownButton;
            editor.Height = Dpi.Height14;
            editor.BackgroundStyle.Class = "";
            editor.BackgroundStyle.BackColor = Color.White;
            editor.AllowEmptyState = this.AllowEmptyState;
            if (propertyDescriptor.PropertyType == typeof(byte) || propertyDescriptor.PropertyType == typeof(byte?))
            {
                editor.MinValue = Math.Max(byte.MinValue, MinValue);
                editor.MaxValue = Math.Min(byte.MaxValue, MaxValue);
            }
            else
            {
                editor.MinValue = MinValue;
                editor.MaxValue = MaxValue;
            }
            return editor;
        }
        #endregion
        private class IntegerValueEditor : IntegerInput, IPropertyValueEditor
        {
            #region IPropertyValueEditor Members
            public System.Drawing.Font EditorFont
            {
                get
                {
                    return this.Font;
                }
                set
                {
                    this.Font = value;
                }
            }
            public bool IsEditorFocused
            {
                get { return this.Focused; }
            }
            public void FocusEditor()
            {
                this.Focus();
            }
            public object EditValue
            {
                get
                {
                    return this.ValueObject;
                }
                set
                {
                    if (value == null)
                        this.ValueObject = null;
                    else
                        this.Value = (int)value;
                }
            }
            protected override void OnValueChanged(EventArgs e)
            {
                OnEditValueChanged(e);
                base.OnValueChanged(e);
            }
            private void OnEditValueChanged(EventArgs e)
            {
                EventHandler ev = EditValueChanged;
                if (ev != null) ev(this, e);
            }
            public event EventHandler EditValueChanged;
            #endregion
        }
    }
}