Update to Worldwind release 0.4.1
[worldwind-tracker.git] / gov / nasa / worldwind / awt / KeyPollTimer.java
blob947d119f9703cf565cb7deb4d6455c6b8001bc26
1 /*
2 Copyright (C) 2001, 2006 United States Government as represented by
3 the Administrator of the National Aeronautics and Space Administration.
4 All Rights Reserved.
5 */
6 package gov.nasa.worldwind.awt;
8 import gov.nasa.worldwind.util.Logging;
9 import gov.nasa.worldwind.WorldWind;
11 import java.beans.*;
13 /**
14 * @author dcollins
15 * @version $Id: KeyPollTimer.java 3704 2007-12-04 17:49:12Z tgaskins $
17 class KeyPollTimer implements java.awt.event.KeyListener
19 private java.util.Timer timer;
20 private java.util.TimerTask timerTask;
21 private final int period;
22 private final java.awt.event.ActionListener listener;
23 private java.util.ArrayList<Integer> keys = new java.util.ArrayList<Integer>();
24 private java.util.Stack<Integer> keyStack = new java.util.Stack<Integer>();
25 private int modifiers;
27 public KeyPollTimer(int period, java.util.Collection<Integer> keys, java.awt.event.ActionListener listener)
29 if (period < 0)
31 String message = Logging.getMessage("Awt.KeyPollTimer.PeriodLessThanZero");
32 Logging.logger().severe(message);
33 throw new IllegalArgumentException(message);
35 if (keys == null)
37 String message = Logging.getMessage("nullValue.CollectionIsNull");
38 Logging.logger().severe(message);
39 throw new IllegalArgumentException(message);
41 this.timer = new java.util.Timer();
42 this.period = period;
43 this.listener = listener;
44 this.keys.addAll(keys);
46 WorldWind.addPropertyChangeListener(WorldWind.SHUTDOWN_EVENT, new PropertyChangeListener()
48 public void propertyChange(PropertyChangeEvent propertyChangeEvent)
50 KeyPollTimer.this.timer.cancel();
51 KeyPollTimer.this.timer = null;
53 });
56 public synchronized boolean isRunning()
58 return this.timerTask != null;
61 public void keyTyped(java.awt.event.KeyEvent e)
65 public void keyPressed(java.awt.event.KeyEvent e)
67 if (e == null)
68 return;
70 if (this.onKeyEvent(e))
72 if (this.timerTask == null)
73 this.start();
77 public void keyReleased(java.awt.event.KeyEvent e)
79 if (e == null)
80 return;
82 if (this.onKeyEvent(e))
84 if (this.timerTask != null && this.keyStack.empty())
85 this.stop();
89 private synchronized boolean onKeyEvent(java.awt.event.KeyEvent e)
91 this.modifiers = e.getModifiersEx();
93 Integer keyCode = e.getKeyCode();
94 if (this.keys.contains(keyCode))
96 if (this.keyStack.contains(keyCode))
97 this.keyStack.remove(keyCode);
98 if (e.getID() == java.awt.event.KeyEvent.KEY_PRESSED)
99 this.keyStack.push(keyCode);
100 return true;
103 return false;
106 public synchronized void start()
108 if (this.timerTask == null)
110 this.timerTask = new java.util.TimerTask()
112 public void run()
114 long time = System.currentTimeMillis();
115 if (time - this.scheduledExecutionTime() >= 2 * KeyPollTimer.this.period)
116 return;
117 KeyPollTimer.this.updateAndNotify(KeyPollTimer.this.listener);
120 this.timer.schedule(timerTask, 0, this.period);
124 public synchronized void stop()
126 if (this.timerTask != null)
128 this.timerTask.cancel();
129 this.timerTask = null;
133 private synchronized void updateAndNotify(java.awt.event.ActionListener listener)
135 if (listener == null)
136 return;
137 if (this.keyStack.empty())
138 return;
139 listener.actionPerformed(new java.awt.event.ActionEvent(keyStack.peek(), 0, null, modifiers));