package org.freeplane.core.ui;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import javax.swing.Timer;
public class DelayedMouseListener implements IMouseListener {
final private IMouseListener delegate;
public IMouseListener getDelegate() {
return delegate;
}
public void mouseDragged(MouseEvent e) {
delegate.mouseDragged(e);
}
public void mouseMoved(MouseEvent e) {
delegate.mouseMoved(e);
}
final private int button;
private int clickCounter = 0;
private Timer timer = null;
static final private int MAX_TIME_BETWEEN_CLICKS;
static{
final Object p = Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
MAX_TIME_BETWEEN_CLICKS = p instanceof Integer ? (Integer) p : 250;
}
private int maxClickNumber;
public int getMaxClickNumber() {
return maxClickNumber;
}
public void setMaxClickNumber(int maxClickNumber) {
this.maxClickNumber = maxClickNumber;
}
public void mouseClicked(final MouseEvent me) {
if(me.getButton() != button){
delegate.mouseClicked(me);
return;
}
if(timer != null){
timer.stop();
timer = null;
clickCounter++;
}
else{
clickCounter = 1;
}
if(clickCounter == maxClickNumber){
delegate.mouseClicked(me);
delegate.mouseReleased(me);
return;
}
timer = new Timer(MAX_TIME_BETWEEN_CLICKS, new ActionListener() {
public void actionPerformed(ActionEvent e) {
final MouseEvent newMouseEvent = new MouseEvent(me.getComponent(),me.getID(), e.getWhen(), me.getModifiers(), me.getX(), me.getY(), clickCounter, me.isPopupTrigger(), button);
delegate.mouseClicked(newMouseEvent);
timer = null;
}
});
timer.setRepeats(false);
timer.start();
// me.consume();
}
public void mouseEntered(MouseEvent e) {
delegate.mouseEntered(e);
}
public void mouseExited(MouseEvent e) {
delegate.mouseExited(e);
}
public void mousePressed(MouseEvent e) {
delegate.mousePressed(e);
}
public void mouseReleased(MouseEvent e) {
delegate.mouseReleased(e);
}
public DelayedMouseListener(IMouseListener delegate, int maxClickNumber, int button) {
super();
this.delegate = delegate;
this.maxClickNumber = maxClickNumber;
this.button = button;
}
}