2 Copyright (C) 2001, 2006 United States Government
3 as represented by the Administrator of the
4 National Aeronautics and Space Administration.
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
.*;
17 import java
.awt
.event
.*;
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();
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
)
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
);
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
))
94 public WorldWindow
getEventSource()
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()
134 protected Point
getMousePoint()
139 protected void setMousePoint(Point mousePoint
)
141 this.mousePoint
= mousePoint
;
144 protected boolean isHovering()
149 protected void setHovering(boolean hovering
)
151 isHovering
= hovering
;
154 protected boolean isDragging()
159 protected void setDragging(boolean dragging
)
161 isDragging
= dragging
;
164 protected PickedObjectList
getHoverObjects()
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
194 if (keyEvent
== null)
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
205 if (keyEvent
== null)
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
216 if (keyEvent
== null)
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
227 if (this.wwd
.getView() == null)
230 if (mouseEvent
== null)
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
));
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());
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
270 if (mouseEvent
== null)
273 this.mousePoint
= mouseEvent
.getPoint();
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());
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
306 if (mouseEvent
== null)
309 this.mousePoint
= mouseEvent
.getPoint();
310 this.viewInputBroker
.mouseReleased(mouseEvent
);
315 public void mouseEntered(MouseEvent mouseEvent
)
317 if (this.wwd
== null) // include this test to ensure any derived implementation performs it
320 if (mouseEvent
== null)
323 this.viewInputBroker
.mouseEntered(mouseEvent
);
328 public void mouseExited(MouseEvent mouseEvent
)
330 if (this.wwd
== null) // include this test to ensure any derived implementation performs it
333 if (mouseEvent
== null)
336 this.viewInputBroker
.mouseExited(mouseEvent
);
341 public void mouseDragged(MouseEvent mouseEvent
)
343 if (this.wwd
== null) // include this test to ensure any derived implementation performs it
346 if (mouseEvent
== null)
349 Point prevMousePoint
= this.mousePoint
;
350 this.mousePoint
= mouseEvent
.getPoint();
352 if (MouseEvent
.BUTTON1_DOWN_MASK
== mouseEvent
.getModifiersEx())
354 PickedObjectList pickedObjects
= this.objectsAtButtonPress
;
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
,
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
383 if (mouseEvent
== null)
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
402 if (mouseWheelEvent
== null)
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
413 if (focusEvent
== null)
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
424 if (focusEvent
== null)
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.
454 if ((pickedObjects
!= null)
455 && (pickedObjects
.getTopObject() != null)
456 && pickedObjects
.getTopPickedObject().isTerrain())
459 this.hoverObjects
= pickedObjects
;
460 this.hoverTimer
.restart();
463 private void cancelHover()
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
))
480 PickedObject lastTop
= this.wwd
.getObjectsAtCurrentPosition().getTopPickedObject();
482 if (null != lastTop
&& lastTop
.isTerrain())
485 PickedObject newTop
= pickedObjects
.getTopPickedObject();
486 //noinspection SimplifiableIfStatement
487 if (lastTop
== null || newTop
== null || lastTop
.getObject() == null || newTop
.getObject() == null)
490 return lastTop
.getObject().equals(newTop
.getObject());
493 protected void cancelDrag()
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
);