/*
Copyright (C) 2001, 2006 United States Government as represented by
the Administrator of the National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.awt;
import gov.nasa.worldwind.util.Logging;
import gov.nasa.worldwind.WorldWind;
import java.beans.*;
/**
* @author dcollins
* @version $Id: KeyPollTimer.java 5113 2008-04-21 23:46:50Z tgaskins $
*/
class KeyPollTimer implements java.awt.event.KeyListener
{
private java.util.Timer timer;
private java.util.TimerTask timerTask;
private final int period;
private final java.awt.event.ActionListener listener;
private java.util.ArrayList<Integer> keys = new java.util.ArrayList<Integer>();
private java.util.Stack<Integer> keyStack = new java.util.Stack<Integer>();
private int modifiers;
public KeyPollTimer(int period, java.util.Collection<Integer> keys, java.awt.event.ActionListener listener)
{
if (period < 0)
{
String message = Logging.getMessage("Awt.KeyPollTimer.PeriodLessThanZero");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (keys == null)
{
String message = Logging.getMessage("nullValue.CollectionIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
this.timer = new java.util.Timer();
this.period = period;
this.listener = listener;
this.keys.addAll(keys);
WorldWind.addPropertyChangeListener(WorldWind.SHUTDOWN_EVENT, new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent propertyChangeEvent)
{
KeyPollTimer.this.timer.cancel();
KeyPollTimer.this.timer = null;
}
});
}
public synchronized boolean isRunning()
{
return this.timerTask != null;
}
public void keyTyped(java.awt.event.KeyEvent e)
{
}
public void keyPressed(java.awt.event.KeyEvent e)
{
if (e == null)
return;
if (this.onKeyEvent(e))
{
if (this.timerTask == null)
this.start();
}
}
public void keyReleased(java.awt.event.KeyEvent e)
{
if (e == null)
return;
if (this.onKeyEvent(e))
{
if (this.timerTask != null && this.keyStack.empty())
this.stop();
}
}
private synchronized boolean onKeyEvent(java.awt.event.KeyEvent e)
{
this.modifiers = e.getModifiersEx();
Integer keyCode = e.getKeyCode();
if (this.keys.contains(keyCode))
{
if (this.keyStack.contains(keyCode))
this.keyStack.remove(keyCode);
if (e.getID() == java.awt.event.KeyEvent.KEY_PRESSED)
this.keyStack.push(keyCode);
return true;
}
return false;
}
public synchronized void start()
{
if (this.timerTask == null)
{
this.timerTask = new java.util.TimerTask()
{
public void run()
{
long time = System.currentTimeMillis();
if (time - this.scheduledExecutionTime() >= 2 * KeyPollTimer.this.period)
return;
KeyPollTimer.this.updateAndNotify(KeyPollTimer.this.listener);
}
};
if (this.timer == null)
this.timer = new java.util.Timer();
this.timer.schedule(timerTask, 0, this.period);
}
}
public synchronized void stop()
{
if (this.timerTask != null)
{
this.timerTask.cancel();
this.timerTask = null;
}
}
private synchronized void updateAndNotify(java.awt.event.ActionListener listener)
{
if (listener == null)
return;
if (this.keyStack.empty())
return;
listener.actionPerformed(new java.awt.event.ActionEvent(keyStack.peek(), 0, null, modifiers));
}
}