// License: GPL. For details, see LICENSE file.
package touchscreenhelper;
// Thanks to http://www.arco.in-berlin.de/keyevent.html
// (code simplified here)
import java.awt.AWTEvent;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.TreeSet;
import javax.swing.Timer;
import org.openstreetmap.josm.Main;
public class TimedKeyReleaseListener implements AWTEventListener {
private final TreeSet<Integer> set = new TreeSet<Integer>();
private Timer timer;
protected KeyEvent releaseEvent;
public TimedKeyReleaseListener() {
timer = new Timer(0, new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
timer.stop();
if (set.remove(releaseEvent.getKeyCode())) {
doKeyReleaseEvent(releaseEvent);
}
}
});
try {
Toolkit.getDefaultToolkit().addAWTEventListener(this,
AWTEvent.KEY_EVENT_MASK);
} catch (SecurityException ex) {
Main.error(ex);
}
}
@Override
public void eventDispatched(AWTEvent event) {
if (!(event instanceof KeyEvent)) return;
KeyEvent e = (KeyEvent) event;
if (event.getID() == KeyEvent.KEY_PRESSED) {
if (timer.isRunning()) {
timer.stop();
} else {
if (set.add((e.getKeyCode()))) doKeyPressEvent((KeyEvent) event);
}
}
if (event.getID() == KeyEvent.KEY_RELEASED) {
if (timer.isRunning()) {
timer.stop();
if (set.remove(e.getKeyCode())) doKeyReleaseEvent(e);
} else {
releaseEvent = e;
timer.restart();
}
}
}
public void stop() {
try {
Toolkit.getDefaultToolkit().removeAWTEventListener(this);
} catch (SecurityException ex) {
Main.error(ex);
}
}
protected void doKeyReleaseEvent(KeyEvent evt) {
}
protected void doKeyPressEvent(KeyEvent evt) {
}
}