Worldwind public release 0.2.1
[worldwind-tracker.git] / gov / nasa / worldwind / WorldWindowGLAutoDrawable.java
blob7aafcb4de59d6e4497c453711d6d1cf05cc7d04b
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;
9 import gov.nasa.worldwind.geom.*;
11 import javax.media.opengl.*;
12 import javax.swing.event.*;
13 import java.beans.*;
14 import java.awt.*;
16 /**
17 * A non-platform specific {@link WorldWindow} class. This class can be aggregated into platform-specific classes to
18 * provide the core functionality of World Wind.
20 * @author Tom Gaskins
21 * @version $Id: WorldWindowGLAutoDrawable.java 2150 2007-06-26 07:40:58Z tgaskins $
23 public class WorldWindowGLAutoDrawable extends WorldWindowImpl implements GLEventListener
25 private final GLAutoDrawable drawable;
26 private final EventListenerList eventListeners = new EventListenerList();
28 /**
29 * Construct a new <code>WorldWindowGLCanvase</code> for a specified {@link GLDrawable}.
31 * @param drawable the drawable associated with the window.
32 * @throws IllegalArgumentException if <code>drawable</code> is <code>null</code>.
34 public WorldWindowGLAutoDrawable(GLAutoDrawable drawable)
36 if (drawable == null)
38 String message = WorldWind.retrieveErrMsg("WorldWindowGLCanvas.GLAutoDrawableNullToConstructor");
39 WorldWind.logger().log(java.util.logging.Level.FINE, message);
40 throw new IllegalArgumentException(message);
43 this.drawable = drawable;
44 this.drawable.setAutoSwapBufferMode(false); // to prevent buffer swapping after a pick traversal
45 drawable.addGLEventListener(this);
47 SceneController sc = this.getSceneController();
48 if (sc != null)
50 sc.addPropertyChangeListener(this);
54 @Override
55 public void propertyChange(PropertyChangeEvent propertyChangeEvent)
57 if (propertyChangeEvent == null)
59 String msg = WorldWind.retrieveErrMsg("nullValue.PropertyChangeEventIsNull");
60 WorldWind.logger().log(java.util.logging.Level.FINE, msg);
61 throw new IllegalArgumentException(msg);
63 this.drawable.repaint(); // Queue a JOGL repaint request.
66 /**
67 * See {@link GLEventListener#init(GLAutoDrawable)}.
69 * @param glAutoDrawable the drawable
71 public void init(GLAutoDrawable glAutoDrawable)
73 // This GLEventListener callback method is not used.
74 // this.drawable.setGL(new DebugGL(this.drawable.getGL()));
77 /**
78 * See {@link GLEventListener#display(GLAutoDrawable)}.
80 * @param glAutoDrawable the drawable
81 * @throws IllegalStateException if no {@link SceneController} exists for this canvas
83 public void display(GLAutoDrawable glAutoDrawable)
85 try
87 SceneController sc = this.getSceneController();
88 if (sc == null)
90 String message = WorldWind.retrieveErrMsg("WorldWindowGLCanvas.ScnCntrllerNullOnRepaint");
91 WorldWind.logger().log(java.util.logging.Level.FINE, message);
92 throw new IllegalStateException(message);
95 Position positionAtStart = this.getCurrentPosition();
96 PickedObject selectionAtStart = this.getCurrentSelection();
98 try
100 this.callRenderingListeners(new RenderingEvent(this.drawable, RenderingEvent.BEFORE_RENDERING));
102 catch (Exception e)
104 WorldWind.logger().log(java.util.logging.Level.FINE, WorldWind.retrieveErrMsg(
105 "WorldWindowGLAutoDrawable.ExceptionDuringGLEventListenerDisplay"), e);
108 sc.repaint();
111 this.callRenderingListeners(new RenderingEvent(this.drawable, RenderingEvent.BEFORE_BUFFER_SWAP));
113 catch (Exception e)
115 WorldWind.logger().log(java.util.logging.Level.FINE, WorldWind.retrieveErrMsg(
116 "WorldWindowGLAutoDrawable.ExceptionDuringGLEventListenerDisplay"), e);
119 this.drawable.swapBuffers();
121 Double frameTime = this.sceneController.getFrameTime();
122 if (frameTime != null)
123 this.setValue(AVKey.FRAME_TIME, frameTime);
125 Double frameRate = this.sceneController.getFramesPerSecond();
126 if (frameTime != null)
127 this.setValue(AVKey.FRAME_RATE, frameRate);
129 this.callRenderingListeners(new RenderingEvent(this.drawable, RenderingEvent.AFTER_BUFFER_SWAP));
131 Position positionAtEnd = this.getCurrentPosition();
132 if (positionAtStart == null || positionAtEnd == null)
134 if (positionAtStart != positionAtEnd)
135 this.callPositionListeners(new PositionEvent(this.drawable, this.sceneController.getPickPoint(),
136 positionAtStart, positionAtEnd));
138 else if (!positionAtEnd.equals(positionAtStart))
140 this.callPositionListeners(new PositionEvent(this.drawable, this.sceneController.getPickPoint(),
141 positionAtStart, positionAtEnd));
144 PickedObject selectionAtEnd = this.getCurrentSelection();
145 if (selectionAtStart == null || selectionAtEnd == null)
147 if (selectionAtStart != selectionAtEnd)
148 this.callSelectListeners(new SelectEvent(this.drawable, SelectEvent.ROLLOVER,
149 this.sceneController.getPickPoint(), this.sceneController.getPickedObjectList()));
151 else if (!selectionAtEnd.equals(selectionAtStart))
153 this.callSelectListeners(new SelectEvent(this.drawable, SelectEvent.ROLLOVER,
154 this.sceneController.getPickPoint(), this.sceneController.getPickedObjectList()));
157 catch (Exception e)
159 WorldWind.logger().log(java.util.logging.Level.FINE, WorldWind.retrieveErrMsg(
160 "WorldWindowGLCanvas.ExceptionAttemptingRepaintWorldWindow"), e);
165 * See {@link GLEventListener#reshape(GLAutoDrawable,int,int,int,int)}.
167 * @param glAutoDrawable the drawable
169 public void reshape(GLAutoDrawable glAutoDrawable, int x, int y, int w, int h)
174 * See {@link GLEventListener#displayChanged(GLAutoDrawable,boolean,boolean)}.
176 * @param glAutoDrawable the drawable
178 public void displayChanged(GLAutoDrawable glAutoDrawable, boolean b, boolean b1)
180 WorldWind.logger().log(java.util.logging.Level.FINEST, WorldWind.retrieveErrMsg(
181 "WorldWindowGLCanvas.DisplayEventListenersDisplayChangedMethodCalled"));
184 public void displayNow()
186 this.drawable.display();
189 public Position getCurrentPosition()
191 if (this.sceneController == null)
192 return null;
194 PickedObjectList pol = this.getSceneController().getPickedObjectList();
195 if (pol == null || pol.size() < 1)
196 return null;
198 Position p = null;
199 PickedObject top = pol.getTopPickedObject();
200 if (top != null && top.hasPosition())
201 p = top.getPosition();
202 else if (pol.getTerrainObject() != null)
203 p = pol.getTerrainObject().getPosition();
205 return p;
208 private PickedObject getCurrentSelection()
210 if (this.sceneController == null)
211 return null;
213 PickedObjectList pol = this.getSceneController().getPickedObjectList();
214 if (pol == null || pol.size() < 1)
215 return null;
217 PickedObject top = pol.getTopPickedObject();
218 return top.isTerrain() ? null : top;
221 public void addRenderingListener(RenderingListener listener)
223 this.eventListeners.add(RenderingListener.class, listener);
226 public void removeRenderingListener(RenderingListener listener)
228 this.eventListeners.remove(RenderingListener.class, listener);
231 private void callRenderingListeners(RenderingEvent event)
233 for (RenderingListener listener : this.eventListeners.getListeners(RenderingListener.class))
235 listener.stageChanged(event);
239 public void addPositionListener(PositionListener listener)
241 this.eventListeners.add(PositionListener.class, listener);
244 public void removePositionListener(PositionListener listener)
246 this.eventListeners.remove(PositionListener.class, listener);
249 private void callPositionListeners(final PositionEvent event)
251 EventQueue.invokeLater(new Runnable()
253 public void run()
255 for (PositionListener listener : eventListeners.getListeners(PositionListener.class))
257 listener.moved(event);
263 public void addSelectListener(SelectListener listener)
265 this.eventListeners.add(SelectListener.class, listener);
268 public void removeSelectListener(SelectListener listener)
270 this.eventListeners.remove(SelectListener.class, listener);
273 private void callSelectListeners(final SelectEvent event)
275 EventQueue.invokeLater(new Runnable()
277 public void run()
279 for (SelectListener listener : eventListeners.getListeners(SelectListener.class))
281 listener.selected(event);