#if FRAMEWORK20
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using DevComponents.DotNetBar;
using System.ComponentModel;
namespace DevComponents.Editors
{
    public class VisualNumericInput : VisualInputBase
    {
        #region Private Variables
        #endregion
        #region Events
        /// 
        /// Occurs when Value property has changed.
        /// 
        public event EventHandler ValueChanged;
        #endregion
        #region Constructor
        #endregion
        #region Internal Implementation
        protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
        {
            if ((e.KeyCode == System.Windows.Forms.Keys.Subtract || e.KeyCode == System.Windows.Forms.Keys.OemMinus) && AllowsNegativeValue && this.InputStack.Length>0)
            {
                if (!this.IsEmpty)
                    NegateValue();
                e.Handled = true;
            }
            base.OnKeyDown(e);
        }
        protected override bool OnCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
        {
            if (!this.IsReadOnly)
            {
                if (keyData == System.Windows.Forms.Keys.Up)
                {
                    IncreaseValue();
                    return true;
                }
                else if (keyData == System.Windows.Forms.Keys.Down)
                {
                    DecreaseValue();
                    return true;
                }
            }
            return base.OnCmdKey(ref msg, keyData);
        }
        private bool _MouseWheelValueChangeEnabled = true;
        /// 
        /// Gets or sets whether mouse wheel increases or decreases the input value when used.
        /// 
        [DefaultValue(true), Category("Behavior"), Description("Indicates whether mouse wheel increases or decreases the input value when used.")]
        public bool MouseWheelValueChangeEnabled
        {
            get { return _MouseWheelValueChangeEnabled; }
            set
            {
                _MouseWheelValueChangeEnabled = value;
            }
        }
        
        protected override void OnMouseWheel(System.Windows.Forms.MouseEventArgs e)
        {
            if (_MouseWheelValueChangeEnabled && !this.IsReadOnly)
            {
                if (e.Delta > 0)
                {
                    IncreaseValue();
                }
                else
                {
                    DecreaseValue();
                }
            }
            base.OnMouseWheel(e);
        }
        public virtual void DecreaseValue()
        {
            InputComplete(false);
            ResetInputPosition();
        }
        public virtual void IncreaseValue()
        {
            InputComplete(false);
            ResetInputPosition();
        }
        protected virtual void NegateValue()
        {
        }
        protected override bool AcceptKeyPress(System.Windows.Forms.KeyPressEventArgs e)
        {
            if (e.KeyChar >= 48 && e.KeyChar <= 57 || 
                this.AllowsNegativeValue && e.KeyChar == '-' && (this.IsEmpty || !this.IsEmpty && (this.InputStack=="" || this.InputStack=="0")))
            {
                e.Handled = true;
                return true;
            }
            return false;
        }
        public override void PerformLayout(PaintInfo p)
        {
            Size size = Size.Empty;
            Graphics g = p.Graphics;
            Font font = p.DefaultFont;
            eTextFormat textFormat = eTextFormat.Default | eTextFormat.NoPadding;
            string s = GetMeasureString();
            size = TextDrawing.MeasureString(g, s, font, 0, textFormat);
            //size.Width++;
            this.Size = size;
            base.PerformLayout(p);
        }
        protected virtual string GetMeasureString()
        {
            return "";
        }
        protected override void OnPaint(PaintInfo p)
        {
            Graphics g = p.Graphics;
            Font font = p.DefaultFont;
            Color color = p.ForeColor;
            if (!this.GetIsEnabled(p))
                color = p.DisabledForeColor;
            eTextFormat textFormat = eTextFormat.Default | eTextFormat.NoPadding;
            if (this.IsFocused)
            {
                if (p.Colors.Highlight.IsEmpty)
                    g.FillRectangle(SystemBrushes.Highlight, this.RenderBounds);
                else
                {
                    using (SolidBrush brush = new SolidBrush(p.Colors.Highlight))
                        g.FillRectangle(brush, this.RenderBounds);
                }
                color = p.Colors.HighlightText.IsEmpty ? SystemColors.HighlightText : p.Colors.HighlightText;
            }
            if (!(this.IsEmpty && this.AllowEmptyState))
            {
         
                string text = GetRenderString();
                TextDrawing.DrawString(g, text, font, color, RenderBounds, textFormat);
            }
            base.OnPaint(p);
        }
        protected virtual string GetRenderString()
        {
            return "";
        }
        private bool _AllowEmptyState = true;
        /// 
        /// Gets or sets whether control allows empty input state i.e. does not have an number entered. Default value is true. When control is empty
        /// IsEmpty property returns true and control does not display number. Set to false to always force control to have number displayed.
        /// 
        public bool AllowEmptyState
        {
            get { return _AllowEmptyState; }
            set { _AllowEmptyState = value; }
        }
        private bool _AllowsNegativeValue = true;
        public bool AllowsNegativeValue
        {
            get { return _AllowsNegativeValue; }
            set { _AllowsNegativeValue = value; }
        }
        protected override bool SetInputStack(string s)
        {
            s = ProcessNewInputStack(s);
            return base.SetInputStack(s);
        }
        private bool _LeadingZero = false;
        protected virtual string ProcessNewInputStack(string s)
        {
            if (this.InputStack == "0" && s != "0" && s.StartsWith("0"))
            {
                s = s.Substring(1);
                this.SetInputPosition(this.InputPosition - 1);
                _LeadingZero = true;
            }
            else
                _LeadingZero = false;
            return s;
        }
        protected virtual bool IsLeadingZero
        { 
            get
            {
                return _LeadingZero;
            }
        }
        protected override void ResetInputStack()
        {
            _LeadingZero = false;
            base.ResetInputStack();
        }
        protected virtual void OnValueChanged()
        {
            if (ValueChanged != null)
                ValueChanged(this, new EventArgs());
        }
        protected override void OnInputLostFocus()
        {
            if (this.InputStack == "-")
                OnClear();
            else
                ResetInputStack();
            base.OnInputLostFocus();
        }
        #endregion
    }
}
#endif