package codechicken.core.gui;

import com.google.common.base.Objects;

import java.util.Map;
import java.util.TreeMap;

public class ClickCounter<T>
{
    public class ClickCount
    {
        public T clicked;
        public long time;
        public int count;

        public boolean update(T clicked) {
            if(Objects.equal(this.clicked, clicked)) {
                this.clicked = clicked;
                count = 0;
                time = Long.MIN_VALUE;
                return false;
            }
            return true;
        }
    }

    public Map<Integer, ClickCount> buttons = new TreeMap<Integer, ClickCount>();

    public ClickCount getCount(int button) {
        ClickCount c = buttons.get(button);
        if(c == null)
            buttons.put(button, c = new ClickCount());
        return c;
    }

    public void mouseDown(T clicked, int button) {
        ClickCount c = getCount(button);
        c.update(clicked);
    }

    public int mouseUp(T clicked, int button) {
        ClickCount c = getCount(button);
        if(!c.update(clicked))
            return 0;

        long time = System.currentTimeMillis();
        if(time-c.time < 500)
            c.count++;
        else
            c.count = 1;
        c.time = time;
        return c.count;
    }
}

package codechicken.core.gui;

import com.google.common.base.Objects;

import java.util.Map;
import java.util.TreeMap;

public class ClickCounter<T>
{
    public class ClickCount
    {
        public T clicked;
        public long time;
        public int count;

        public boolean update(T clicked) {
            if(!Objects.equal(this.clicked, clicked)) {
                this.clicked = clicked;
                count = 0;
                time = Long.MIN_VALUE;
                return false;
            }
            return true;
        }
    }

    public Map<Integer, ClickCount> buttons = new TreeMap<Integer, ClickCount>();

    public ClickCount getCount(int button) {
        ClickCount c = buttons.get(button);
        if(c == null)
            buttons.put(button, c = new ClickCount());
        return c;
    }

    public void mouseDown(T clicked, int button) {
        ClickCount c = getCount(button);
        c.update(clicked);
    }

    public int mouseUp(T clicked, int button) {
        ClickCount c = getCount(button);
        if(!c.update(clicked))
            return 0;

        long time = System.currentTimeMillis();
        if(time-c.time < 500)
            c.count++;
        else
            c.count = 1;
        c.time = time;
        return c.count;
    }
}

Fix click counter