Updated to worldwind release 20070817
[worldwind-tracker.git] / gov / nasa / worldwind / awt / AWTInputHandler.java
blob568f53abf2ae10764f8f341fafee3d4ed1c23d50
1 /*
2 Copyright (C) 2001, 2006 United States Government
3 as represented by the Administrator of the
4 National Aeronautics and Space Administration.
5 All Rights Reserved.
6 */
7 package gov.nasa.worldwind.awt;
9 import gov.nasa.worldwind.WorldWindow;
10 import gov.nasa.worldwind.avlist.*;
11 import gov.nasa.worldwind.event.*;
12 import gov.nasa.worldwind.pick.*;
13 import gov.nasa.worldwind.util.Logging;
15 import javax.swing.event.*;
16 import java.awt.*;
17 import java.awt.event.*;
19 /**
20 * @author tag
21 * @version $Id: AWTInputHandler.java 2520 2007-08-07 15:39:39Z tgaskins $
23 public class AWTInputHandler extends AVListImpl
24 implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener, FocusListener, InputHandler
26 private WorldWindow wwd = null;
27 private final EventListenerList eventListeners = new EventListenerList();
28 private java.awt.Point mousePoint = new java.awt.Point();
29 private PickedObjectList hoverObjects;
30 private PickedObjectList objectsAtButtonPress;
31 private boolean isHovering = false;
32 private boolean isDragging = false;
33 private javax.swing.Timer hoverTimer = new javax.swing.Timer(600, new ActionListener()
35 public void actionPerformed(ActionEvent actionEvent)
37 if (AWTInputHandler.this.pickMatches(AWTInputHandler.this.hoverObjects))
39 AWTInputHandler.this.isHovering = true;
40 AWTInputHandler.this.callSelectListeners(new SelectEvent(AWTInputHandler.this.wwd,
41 SelectEvent.HOVER, mousePoint, AWTInputHandler.this.hoverObjects));
42 AWTInputHandler.this.hoverTimer.stop();
45 });
46 // Delegate handler for View.
47 private final OrbitViewInputBroker viewInputBroker = new OrbitViewInputBroker();
49 public void setEventSource(WorldWindow newWorldWindow)
51 if (newWorldWindow != null && !(newWorldWindow instanceof Component))
53 String message = Logging.getMessage("Awt.AWTInputHandler.EventSourceNotAComponent");
54 Logging.logger().finer(message);
55 throw new IllegalArgumentException(message);
58 if (newWorldWindow == this.wwd)
59 return;
61 if (this.wwd != null)
63 Component c = (Component) this.wwd;
64 c.removeKeyListener(this);
65 c.removeMouseMotionListener(this);
66 c.removeMouseListener(this);
67 c.removeMouseWheelListener(this);
68 c.removeFocusListener(this);
71 this.wwd = newWorldWindow;
72 this.viewInputBroker.setWorldWindow(this.wwd);
74 if (this.wwd == null)
75 return;
77 Component c = (java.awt.Component) this.wwd;
78 c.addKeyListener(this);
79 c.addMouseMotionListener(this);
80 c.addMouseListener(this);
81 c.addMouseWheelListener(this);
82 c.addFocusListener(this);
84 this.wwd.addSelectListener(new SelectListener()
86 public void selected(SelectEvent event)
88 if (event.getEventAction().equals(SelectEvent.ROLLOVER))
89 doHover(true);
91 });
94 public WorldWindow getEventSource()
96 return this.wwd;
99 public void setHoverDelay(int delay)
101 this.hoverTimer.setDelay(delay);
104 public int getHoverDelay()
106 return this.hoverTimer.getDelay();
109 public boolean isSmoothViewChanges()
111 return this.viewInputBroker.isSmoothViewChanges();
114 public void setSmoothViewChanges(boolean smoothViewChanges)
116 this.viewInputBroker.setSmoothViewChanges(smoothViewChanges);
119 public boolean isLockViewHeading()
121 return this.viewInputBroker.isLockHeading();
124 public void setLockViewHeading(boolean lockHeading)
126 this.viewInputBroker.setLockHeading(lockHeading);
129 protected WorldWindow getWorldWindow()
131 return wwd;
134 protected Point getMousePoint()
136 return mousePoint;
139 protected void setMousePoint(Point mousePoint)
141 this.mousePoint = mousePoint;
144 protected boolean isHovering()
146 return isHovering;
149 protected void setHovering(boolean hovering)
151 isHovering = hovering;
154 protected boolean isDragging()
156 return isDragging;
159 protected void setDragging(boolean dragging)
161 isDragging = dragging;
164 protected PickedObjectList getHoverObjects()
166 return hoverObjects;
169 protected void setHoverObjects(PickedObjectList hoverObjects)
171 this.hoverObjects = hoverObjects;
174 protected PickedObjectList getObjectsAtButtonPress()
176 return objectsAtButtonPress;
179 protected void setObjectsAtButtonPress(PickedObjectList objectsAtButtonPress)
181 this.objectsAtButtonPress = objectsAtButtonPress;
184 protected OrbitViewInputBroker getViewInputBroker()
186 return viewInputBroker;
189 public void keyTyped(KeyEvent keyEvent)
191 if (this.wwd == null) // include this test to ensure any derived implementation performs it
192 return;
194 if (keyEvent == null)
195 return;
197 this.viewInputBroker.keyTyped(keyEvent);
200 public void keyPressed(KeyEvent keyEvent)
202 if (this.wwd == null) // include this test to ensure any derived implementation performs it
203 return;
205 if (keyEvent == null)
206 return;
208 this.viewInputBroker.keyPressed(keyEvent);
211 public void keyReleased(KeyEvent keyEvent)
213 if (this.wwd == null) // include this test to ensure any derived implementation performs it
214 return;
216 if (keyEvent == null)
217 return;
219 this.viewInputBroker.keyReleased(keyEvent);
222 public void mouseClicked(final MouseEvent mouseEvent)
224 if (this.wwd == null) // include this test to ensure any derived implementation performs it
225 return;
227 if (this.wwd.getView() == null)
228 return;
230 if (mouseEvent == null)
231 return;
233 PickedObjectList pickedObjects = this.wwd.getObjectsAtCurrentPosition();
234 if (pickedObjects != null && pickedObjects.getTopPickedObject() != null
235 && !pickedObjects.getTopPickedObject().isTerrain())
237 // Something is under the cursor, so it's deemed "selected".
238 if (MouseEvent.BUTTON1 == mouseEvent.getButton())
240 if (mouseEvent.getClickCount() % 2 == 1)
242 this.callSelectListeners(new SelectEvent(this.wwd, SelectEvent.LEFT_CLICK,
243 mouseEvent, pickedObjects));
245 else
247 this.callSelectListeners(new SelectEvent(this.wwd, SelectEvent.LEFT_DOUBLE_CLICK,
248 mouseEvent, pickedObjects));
251 else if (MouseEvent.BUTTON3 == mouseEvent.getButton())
253 this.callSelectListeners(new SelectEvent(this.wwd, SelectEvent.RIGHT_CLICK,
254 mouseEvent, pickedObjects));
257 this.wwd.getView().firePropertyChange(AVKey.VIEW, null, this.wwd.getView());
259 else
261 this.viewInputBroker.mouseClicked(mouseEvent);
265 public void mousePressed(MouseEvent mouseEvent)
267 if (this.wwd == null) // include this test to ensure any derived implementation performs it
268 return;
270 if (mouseEvent == null)
271 return;
273 this.mousePoint = mouseEvent.getPoint();
274 this.cancelHover();
275 this.cancelDrag();
277 this.objectsAtButtonPress = this.wwd.getObjectsAtCurrentPosition();
278 if (this.objectsAtButtonPress != null && objectsAtButtonPress.getTopPickedObject() != null
279 && !this.objectsAtButtonPress.getTopPickedObject().isTerrain())
281 // Something is under the cursor, so it's deemed "selected".
282 if (MouseEvent.BUTTON1 == mouseEvent.getButton())
284 this.callSelectListeners(new SelectEvent(this.wwd, SelectEvent.LEFT_PRESS,
285 mouseEvent, this.objectsAtButtonPress));
287 else if (MouseEvent.BUTTON3 == mouseEvent.getButton())
289 this.callSelectListeners(new SelectEvent(this.wwd, SelectEvent.RIGHT_PRESS,
290 mouseEvent, this.objectsAtButtonPress));
293 this.wwd.getView().firePropertyChange(AVKey.VIEW, null, this.wwd.getView());
295 else
297 this.viewInputBroker.mousePressed(mouseEvent);
301 public void mouseReleased(MouseEvent mouseEvent)
303 if (this.wwd == null) // include this test to ensure any derived implementation performs it
304 return;
306 if (mouseEvent == null)
307 return;
309 this.mousePoint = mouseEvent.getPoint();
310 this.viewInputBroker.mouseReleased(mouseEvent);
311 this.doHover(true);
312 this.cancelDrag();
315 public void mouseEntered(MouseEvent mouseEvent)
317 if (this.wwd == null) // include this test to ensure any derived implementation performs it
318 return;
320 if (mouseEvent == null)
321 return;
323 this.viewInputBroker.mouseEntered(mouseEvent);
324 this.cancelHover();
325 this.cancelDrag();
328 public void mouseExited(MouseEvent mouseEvent)
330 if (this.wwd == null) // include this test to ensure any derived implementation performs it
331 return;
333 if (mouseEvent == null)
334 return;
336 this.viewInputBroker.mouseExited(mouseEvent);
337 this.cancelHover();
338 this.cancelDrag();
341 public void mouseDragged(MouseEvent mouseEvent)
343 if (this.wwd == null) // include this test to ensure any derived implementation performs it
344 return;
346 if (mouseEvent == null)
347 return;
349 Point prevMousePoint = this.mousePoint;
350 this.mousePoint = mouseEvent.getPoint();
352 if (MouseEvent.BUTTON1_DOWN_MASK == mouseEvent.getModifiersEx())
354 PickedObjectList pickedObjects = this.objectsAtButtonPress;
355 if (this.isDragging
356 || (pickedObjects != null && pickedObjects.getTopPickedObject() != null
357 && !pickedObjects.getTopPickedObject().isTerrain()))
359 this.isDragging = true;
360 this.callSelectListeners(new DragSelectEvent(this.wwd, SelectEvent.DRAG, mouseEvent, pickedObjects,
361 prevMousePoint));
365 if (!this.isDragging)
367 this.viewInputBroker.mouseDragged(mouseEvent);
370 // Redraw to update the current position and selection.
371 if (this.wwd.getSceneController() != null)
373 this.wwd.getSceneController().setPickPoint(mouseEvent.getPoint());
374 this.wwd.redrawNow();
378 public void mouseMoved(MouseEvent mouseEvent)
380 if (this.wwd == null) // include this test to ensure any derived implementation performs it
381 return;
383 if (mouseEvent == null)
384 return;
386 this.mousePoint = mouseEvent.getPoint();
387 this.viewInputBroker.mouseMoved(mouseEvent);
389 // Redraw to update the current position and selection.
390 if (this.wwd.getSceneController() != null)
392 this.wwd.getSceneController().setPickPoint(mouseEvent.getPoint());
393 this.wwd.redrawNow();
397 public void mouseWheelMoved(MouseWheelEvent mouseWheelEvent)
399 if (this.wwd == null) // include this test to ensure any derived implementation performs it
400 return;
402 if (mouseWheelEvent == null)
403 return;
405 this.viewInputBroker.mouseWheelMoved(mouseWheelEvent);
408 public void focusGained(FocusEvent focusEvent)
410 if (this.wwd == null) // include this test to ensure any derived implementation performs it
411 return;
413 if (focusEvent == null)
414 return;
416 this.viewInputBroker.focusGained(focusEvent);
419 public void focusLost(FocusEvent focusEvent)
421 if (this.wwd == null) // include this test to ensure any derived implementation performs it
422 return;
424 if (focusEvent == null)
425 return;
427 this.viewInputBroker.focusLost(focusEvent);
430 protected boolean isPickListEmpty(PickedObjectList pickList)
432 return pickList == null || pickList.size() < 1;
435 protected void doHover(boolean reset)
437 PickedObjectList pickedObjects = this.wwd.getObjectsAtCurrentPosition();
438 if (!(this.isPickListEmpty(this.hoverObjects) || this.isPickListEmpty(pickedObjects)))
440 PickedObject hover = this.hoverObjects.getTopPickedObject();
441 PickedObject last = pickedObjects.getTopPickedObject();
443 if (hover != null && last != null && hover.getObject().equals(last.getObject()))
445 return; // object picked is the hover object. don't do anything but wait for the timer to expire.
449 this.cancelHover();
451 if (!reset)
452 return;
454 if ((pickedObjects != null)
455 && (pickedObjects.getTopObject() != null)
456 && pickedObjects.getTopPickedObject().isTerrain())
457 return;
459 this.hoverObjects = pickedObjects;
460 this.hoverTimer.restart();
463 private void cancelHover()
465 if (this.isHovering)
467 this.callSelectListeners(new SelectEvent(this.wwd, SelectEvent.HOVER, this.mousePoint, null));
470 this.isHovering = false;
471 this.hoverObjects = null;
472 this.hoverTimer.stop();
475 protected boolean pickMatches(PickedObjectList pickedObjects)
477 if (this.isPickListEmpty(this.wwd.getObjectsAtCurrentPosition()) || this.isPickListEmpty(pickedObjects))
478 return false;
480 PickedObject lastTop = this.wwd.getObjectsAtCurrentPosition().getTopPickedObject();
482 if (null != lastTop && lastTop.isTerrain())
483 return false;
485 PickedObject newTop = pickedObjects.getTopPickedObject();
486 //noinspection SimplifiableIfStatement
487 if (lastTop == null || newTop == null || lastTop.getObject() == null || newTop.getObject() == null)
488 return false;
490 return lastTop.getObject().equals(newTop.getObject());
493 protected void cancelDrag()
495 if (this.isDragging)
497 this.callSelectListeners(new DragSelectEvent(this.wwd, SelectEvent.DRAG_END, null,
498 this.objectsAtButtonPress, this.mousePoint));
501 this.isDragging = false;
504 public void addSelectListener(SelectListener listener)
506 this.eventListeners.add(SelectListener.class, listener);
509 public void removeSelectListener(SelectListener listener)
511 this.eventListeners.remove(SelectListener.class, listener);
514 protected void callSelectListeners(SelectEvent event)
516 for (SelectListener listener : this.eventListeners.getListeners(SelectListener.class))
518 listener.selected(event);