using System;
using System.ComponentModel;
using System.Windows.Forms;

public partial class RepeatButton : Button
{
    #region メンバフィールド
    private bool mouseDown = false;
    private ulong count = 0;
    private Timer timer = new Timer();
    private IContainer components = null;
    #endregion

    #region プロパティ
    [Category("動作"), Description("リピートクリックイベント発生の間隔(ミリ秒単位)を設定または取得します。")]
    public int Interval
    {
        get
        {
            return timer.Interval;
        }
        set
        {
            timer.Interval = value;
        }
    }

    [Category("その他"), Description("リピートクリックが連続で発生した回数を取得します。")]
    public ulong Count
    {
        get
        {
            return count;
        }
    }
    #endregion

    #region コンストラクタ
    public RepeatButton()
    {
        InitializeComponent();
    }

    public RepeatButton(IContainer container)
    {
        container.Add(this);
        InitializeComponent();
    }
    #endregion

    #region オーバーライドメソッド
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null)) components.Dispose();
        base.Dispose(disposing);
    }
    #endregion

    #region プライベートメソッド
    private void InitializeComponent()
    {
        components = new System.ComponentModel.Container();
        MouseUp += new MouseEventHandler(RepeatButton_MouseUp);
        MouseDown += new MouseEventHandler(RepeatButton_MouseDown);
        timer.Tick += new EventHandler(RepeatButtonTimer_Tick);
        timer.Start();
    }
    #endregion

    #region イベントハンドラ
    void RepeatButton_MouseUp(object sender, MouseEventArgs e)
    {
        mouseDown = false;
        count = 0;
    }

    void RepeatButton_MouseDown(object sender, MouseEventArgs e)
    {
        mouseDown = true;
    }

    void RepeatButtonTimer_Tick(object sender, EventArgs e)
    {
        if (mouseDown == true)
        {
            if (count < ulong.MaxValue) ++count;
            PerformClick();
        }
    }
    #endregion
}