#if FRAMEWORK20
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
namespace DevComponents.Editors
{
    public class VisualButtonBase : VisualItem
    {
        #region Private Variables
        #endregion
        #region Events
        #endregion
        #region Constructor
        #endregion
        #region Internal Implementation
        private bool _ClickAutoRepeat = false;
        /// 
        /// Gets or sets whether button automatically gets Click events repeated when mouse is kept pressed on the button. Default value is false.
        /// 
        [DefaultValue(false)]
        public bool ClickAutoRepeat
        {
            get { return _ClickAutoRepeat; }
            set
            {
                _ClickAutoRepeat = value;
            }
        }
        private Timer _ClickTimer = null;
        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && this.GetIsEnabled() && _ClickAutoRepeat)
            {
                if (_ClickTimer == null)
                    _ClickTimer = new Timer();
                _ClickTimer.Interval = ClickRepeatInterval;
                _ClickTimer.Tick += new EventHandler(this.ClickTimerTick);
                _ClickTimer.Start();
            }
            base.OnMouseDown(e);
        }
        protected override void OnMouseUp(MouseEventArgs e)
        {
            DisposeAutoClickTimer();
            base.OnMouseUp(e);
        }
        protected override void OnMouseLeave()
        {
            HideTooltip();
            DisposeAutoClickTimer();
            base.OnMouseLeave();
        }
        private void DisposeAutoClickTimer()
        {
            if (_ClickTimer != null)
            {
                Timer t = _ClickTimer;
                _ClickTimer = null;
                t.Stop();
                t.Tick -= new EventHandler(this.ClickTimerTick);
                t.Dispose();
            }
        }
        private void ClickTimerTick(object sender, EventArgs e)
        {
            this.ProcessClick();
            this.OnClickAutoRepeat();
        }
        protected virtual void OnClickAutoRepeat()
        {
        }
        private int _ClickRepeatInterval = 300;
        /// 
        /// Gets or sets the auto-repeat interval for the click event when mouse button is kept pressed over the item.
        /// 
        [Browsable(true), DefaultValue(300), Category("Behavior"), Description("Gets or sets the auto-repeat interval for the click event when mouse button is kept pressed over the item.")]
        public virtual int ClickRepeatInterval
        {
            get
            {
                return _ClickRepeatInterval;
            }
            set
            {
                _ClickRepeatInterval = value;
            }
        }
        private bool _RenderDefaultBackground = true;
        /// 
        /// Gets or sets whether default button background is rendered when mouse is not over the host control. Default value is true.
        /// 
        public bool RenderDefaultBackground
        {
            get { return _RenderDefaultBackground; }
            set
            {
                if (_RenderDefaultBackground != value)
                {
                    _RenderDefaultBackground = value;
                    this.InvalidateRender();
                }
            }
        }
        private DevComponents.DotNetBar.eShortcut _Shortcut = DevComponents.DotNetBar.eShortcut.None;
        /// 
        /// Gets or sets the shortcut key which when pressed triggers button click event or its default function.
        /// 
        [DefaultValue(DevComponents.DotNetBar.eShortcut.None), Description("Indicates shortcut key which when pressed triggers button click event or its default function.")]
        public DevComponents.DotNetBar.eShortcut Shortcut
        {
            get { return _Shortcut; }
            set
            {
                _Shortcut = value;
            }
        }
        protected override bool OnCmdKey(ref Message msg, Keys keyData)
        {
            if (_Shortcut != DevComponents.DotNetBar.eShortcut.None)
            {
                if (keyData == (Keys)_Shortcut)
                {
                    OnClick(new KeyEventArgs(keyData));
                    return true;
                }
            }
            return base.OnCmdKey(ref msg, keyData);
        }
        private string _Tooltip = "";
        /// 
        /// Gets or sets the button tooltip.
        /// 
        public string Tooltip
        {
            get { return _Tooltip; }
            set
            {
                _Tooltip = value;
            }
        }
        private DevComponents.DotNetBar.ToolTip _TooltipWnd = null;
        protected override void OnMouseHover(EventArgs e)
        {
            ShowTooltip();
            base.OnMouseHover(e);
        }
        private void ShowTooltip()
        {
            if (!string.IsNullOrEmpty(_Tooltip))
            {
                if (_TooltipWnd == null)
                    _TooltipWnd = new DevComponents.DotNetBar.ToolTip();
                _TooltipWnd.Style = DevComponents.DotNetBar.StyleManager.GetEffectiveStyle();
                _TooltipWnd.Text = _Tooltip;
                _TooltipWnd.ShowToolTip();
            }
        }
        private void HideTooltip()
        {
            if (_TooltipWnd != null)
            {
                try
                {
                    if (_TooltipWnd != null)
                    {
                        _TooltipWnd.Hide();
                        _TooltipWnd.Dispose();
                        _TooltipWnd = null;
                        ResetHover();
                    }
                }
                catch { }
            }
        }
        #endregion
    }
}
#endif