Updated to worldwind release 20070817
[worldwind-tracker.git] / gov / nasa / worldwind / awt / KeyPollTimer.java
blob5e44fa996e6bf805e217715e4cb91b14b806bfe7
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;
10 /**
11 * @author dcollins
12 * @version $Id: KeyPollTimer.java 2471 2007-07-31 21:50:57Z tgaskins $
14 class KeyPollTimer implements java.awt.event.KeyListener
16 private java.util.Timer timer;
17 private java.util.TimerTask timerTask;
18 private final int period;
19 private final java.awt.event.ActionListener listener;
20 private java.util.ArrayList<Integer> keys = new java.util.ArrayList<Integer>();
21 private java.util.Stack<Integer> keyStack = new java.util.Stack<Integer>();
22 private int modifiers;
24 public KeyPollTimer(int period, java.util.Collection<Integer> keys, java.awt.event.ActionListener listener)
26 if (period < 0)
28 String message = Logging.getMessage("Awt.KeyPollTimer.PeriodLessThanZero");
29 Logging.logger().severe(message);
30 throw new IllegalArgumentException(message);
32 if (keys == null)
34 String message = Logging.getMessage("nullValue.CollectionIsNull");
35 Logging.logger().severe(message);
36 throw new IllegalArgumentException(message);
38 this.timer = new java.util.Timer();
39 this.period = period;
40 this.listener = listener;
41 this.keys.addAll(keys);
44 public synchronized boolean isRunning()
46 return this.timerTask != null;
49 public void keyTyped(java.awt.event.KeyEvent e)
53 public void keyPressed(java.awt.event.KeyEvent e)
55 if (e == null)
56 return;
58 if (this.onKeyEvent(e))
60 if (this.timerTask == null)
61 this.start();
65 public void keyReleased(java.awt.event.KeyEvent e)
67 if (e == null)
68 return;
70 if (this.onKeyEvent(e))
72 if (this.timerTask != null && this.keyStack.empty())
73 this.stop();
77 private synchronized boolean onKeyEvent(java.awt.event.KeyEvent e)
79 this.modifiers = e.getModifiersEx();
81 Integer keyCode = e.getKeyCode();
82 if (this.keys.contains(keyCode))
84 if (this.keyStack.contains(keyCode))
85 this.keyStack.remove(keyCode);
86 if (e.getID() == java.awt.event.KeyEvent.KEY_PRESSED)
87 this.keyStack.push(keyCode);
88 return true;
91 return false;
94 public synchronized void start()
96 if (this.timerTask == null)
98 this.timerTask = new java.util.TimerTask()
100 public void run()
102 long time = System.currentTimeMillis();
103 if (time - this.scheduledExecutionTime() >= 2 * KeyPollTimer.this.period)
104 return;
105 KeyPollTimer.this.updateAndNotify(KeyPollTimer.this.listener);
108 this.timer.schedule(timerTask, 0, this.period);
112 public synchronized void stop()
114 if (this.timerTask != null)
116 this.timerTask.cancel();
117 this.timerTask = null;
121 private synchronized void updateAndNotify(java.awt.event.ActionListener listener)
123 if (listener == null)
124 return;
125 if (this.keyStack.empty())
126 return;
127 listener.actionPerformed(new java.awt.event.ActionEvent(keyStack.peek(), 0, null, modifiers));