Updated to worldwind release 20070817
[worldwind-tracker.git] / worldwinddemo / AWT1Up.java
blob7d4103cb67cda8267b995fcbb7ae7efd30c91379
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 worldwinddemo;
9 import gov.nasa.worldwind.*;
10 import gov.nasa.worldwind.avlist.AVKey;
11 import gov.nasa.worldwind.awt.WorldWindowGLCanvas;
12 import gov.nasa.worldwind.event.*;
13 import gov.nasa.worldwind.examples.*;
14 import gov.nasa.worldwind.formats.georss.GeoRSSParser;
15 import gov.nasa.worldwind.geom.*;
16 import gov.nasa.worldwind.globes.Globe;
17 import gov.nasa.worldwind.layers.*;
18 import gov.nasa.worldwind.layers.Earth.*;
19 import gov.nasa.worldwind.pick.PickedObjectList;
20 import gov.nasa.worldwind.render.*;
21 import gov.nasa.worldwind.view.*;
22 import org.w3c.dom.Document;
23 import org.xml.sax.SAXException;
25 import javax.swing.*;
26 import javax.xml.parsers.*;
27 import java.awt.*;
28 import java.awt.font.*;
29 import java.io.*;
30 import java.util.*;
31 import java.util.List;
33 /**
34 * @author Tom Gaskins
35 * @version $Id: AWT1Up.java 2570 2007-08-16 22:31:33Z tgaskins $
37 public class AWT1Up
39 private static class AWT1UpFrame extends javax.swing.JFrame
41 StatusBar statusBar;
42 JLabel cursorPositionDisplay;
43 WorldWindowGLCanvas wwd;
45 public AWT1UpFrame()
47 try
49 System.out.println(gov.nasa.worldwind.Version.getVersion());
51 wwd = new gov.nasa.worldwind.awt.WorldWindowGLCanvas();
52 wwd.setPreferredSize(new java.awt.Dimension(800, 600));
53 this.getContentPane().add(wwd, java.awt.BorderLayout.CENTER);
55 this.statusBar = new StatusBar();
56 this.getContentPane().add(statusBar, BorderLayout.PAGE_END);
58 this.pack();
60 java.awt.Dimension prefSize = this.getPreferredSize();
61 java.awt.Dimension parentSize;
62 java.awt.Point parentLocation = new java.awt.Point(0, 0);
63 parentSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
64 int x = parentLocation.x + (parentSize.width - prefSize.width) / 2;
65 int y = parentLocation.y + (parentSize.height - prefSize.height) / 2;
66 this.setLocation(x, y);
67 this.setResizable(true);
69 Model m = (Model) WorldWind.createConfigurationComponent(AVKey.MODEL_CLASS_NAME);
70 LayerList layers = m.getLayers();
71 for (Layer layer : layers)
73 if (layer instanceof TiledImageLayer)
74 ((TiledImageLayer) layer).setShowImageTileOutlines(false);
75 if (layer instanceof LandsatI3)
76 ((TiledImageLayer) layer).setDrawBoundingVolumes(false);
77 if (layer instanceof CompassLayer)
78 ((CompassLayer) layer).setShowTilt(true);
81 m.getLayers().add(this.buildShapesLayer());
82 m.getLayers().add(this.buildIconLayer());
83 m.getLayers().add(this.buildGeoRSSLayer());
84 m.setShowWireframeExterior(false);
85 m.setShowWireframeInterior(false);
86 wwd.setModel(m);
88 // Forward events to the status bar to provide the cursor position info.
89 this.statusBar.setEventSource(wwd);
91 this.wwd.addRenderingListener(new RenderingListener()
93 public void stageChanged(RenderingEvent event)
95 // Do nothing; just showing how to use it.
96 // if (event.getSource() instanceof WorldWindow)
97 // {
98 // Double frameRate = (Double) ((WorldWindow) event.getSource()).getValue(AVKey.FRAME_RATE);
99 // if (frameRate != null)
100 // System.out.println(frameRate);
101 // }
105 this.wwd.addSelectListener(new SelectListener()
107 private WWIcon lastToolTipIcon = null;
108 private BasicDragger dragger = new BasicDragger(wwd);
110 public void selected(SelectEvent event)
112 if (event.getEventAction().equals(SelectEvent.LEFT_CLICK))
114 if (event.hasObjects())
116 System.out.println("Single clicked " + event.getTopObject());
117 if (event.getTopObject() instanceof WorldMapLayer)
119 // Left click on World Map : iterate view to target position
120 Position targetPos = event.getTopPickedObject().getPosition();
121 OrbitView view = (OrbitView)AWT1UpFrame.this.wwd.getView();
122 Globe globe = AWT1UpFrame.this.wwd.getModel().getGlobe();
123 // Use a PanToIterator
124 view.applyStateIterator(FlyToOrbitViewStateIterator.createPanToIterator(
125 view, globe, new LatLon(targetPos.getLatitude(), targetPos.getLongitude()),
126 Angle.ZERO, Angle.ZERO, targetPos.getElevation()));
130 else
131 System.out.println("Single clicked " + "no object");
133 else if (event.getEventAction().equals(SelectEvent.LEFT_DOUBLE_CLICK))
135 if (event.hasObjects())
136 System.out.println("Double clicked " + event.getTopObject());
137 else
138 System.out.println("Double clicked " + "no object");
140 else if (event.getEventAction().equals(SelectEvent.RIGHT_CLICK))
142 if (event.hasObjects())
143 System.out.println("Right clicked " + event.getTopObject());
144 else
145 System.out.println("Right clicked " + "no object");
147 else if (event.getEventAction().equals(SelectEvent.HOVER))
149 if (lastToolTipIcon != null)
151 lastToolTipIcon.setShowToolTip(false);
152 this.lastToolTipIcon = null;
153 AWT1UpFrame.this.wwd.repaint();
156 if (event.hasObjects() && !this.dragger.isDragging())
158 if (event.getTopObject() instanceof WWIcon)
160 this.lastToolTipIcon = (WWIcon) event.getTopObject();
161 lastToolTipIcon.setShowToolTip(true);
162 AWT1UpFrame.this.wwd.repaint();
166 else if (event.getEventAction().equals(SelectEvent.ROLLOVER) && !this.dragger.isDragging())
168 AWT1UpFrame.this.highlight(event.getTopObject());
170 else if (event.getEventAction().equals(SelectEvent.DRAG_END)
171 || event.getEventAction().equals(SelectEvent.DRAG))
173 // Delegate dragging computations to a dragger.
174 this.dragger.selected(event);
175 if (event.getEventAction().equals(SelectEvent.DRAG_END))
177 PickedObjectList pol = wwd.getObjectsAtCurrentPosition();
178 if (pol != null)
179 AWT1UpFrame.this.highlight(pol.getTopObject());
185 this.wwd.addPositionListener(new PositionListener()
187 public void moved(PositionEvent event)
189 // Do nothing; just show how to add a position listener.
193 catch (Exception e)
195 e.printStackTrace();
199 WWIcon lastPickedIcon;
201 private void highlight(Object o)
203 if (this.lastPickedIcon == o)
204 return; // same thing selected
206 if (this.lastPickedIcon != null)
208 this.lastPickedIcon.setHighlighted(false);
209 this.lastPickedIcon = null;
212 if (o != null && o instanceof WWIcon)
214 this.lastPickedIcon = (WWIcon) o;
215 this.lastPickedIcon.setHighlighted(true);
219 private IconLayer buildIconLayer()
221 IconLayer layer = new IconLayer();
223 for (double lat = 0; lat < 10; lat += 10)
225 for (double lon = -180; lon < 180; lon += 10)
227 double alt = 0;
228 if (lon % 90 == 0)
229 alt = 2000000;
230 WWIcon icon = new UserFacingIcon("images/32x32-icon-nasa.png",
231 new Position(Angle.fromDegrees(lat), Angle.fromDegrees(lon), alt));
232 icon.setHighlightScale(1.5);
233 icon.setToolTipFont(this.makeToolTipFont());
234 icon.setToolTipText(icon.getImageSource().toString());
235 icon.setToolTipTextColor(java.awt.Color.YELLOW);
236 layer.addIcon(icon);
240 return layer;
243 private RenderableLayer buildShapesLayer()
245 RenderableLayer layer = new RenderableLayer();
247 Color interiorColor = new Color(1f, 1f, 0f, 0.3f);
248 Color borderColor = new Color(1f, 1f, 0f, 0.4f);
250 SurfaceSector quad = new SurfaceSector(new Sector(
251 Angle.fromDegrees(41.0), Angle.fromDegrees(41.6),
252 Angle.fromDegrees(-122.5), Angle.fromDegrees(-121.7)),
253 interiorColor, borderColor);
254 layer.addRenderable(quad);
256 quad = new SurfaceSector(new Sector(
257 Angle.fromDegrees(38.9), Angle.fromDegrees(39.3),
258 Angle.fromDegrees(-120.2), Angle.fromDegrees(-119.9)),
259 new Color(0f, 1f, 1f, 0.3f), new Color(0.5f, 1f, 1f, 0.4f));
260 layer.addRenderable(quad);
262 double originLat = 28;
263 double originLon = -82;
264 ArrayList<LatLon> positions = new ArrayList<LatLon>();
265 positions.add(new LatLon(Angle.fromDegrees(originLat + 5.0), Angle.fromDegrees(originLon + 2.5)));
266 positions.add(new LatLon(Angle.fromDegrees(originLat + 5.0), Angle.fromDegrees(originLon - 2.5)));
267 positions.add(new LatLon(Angle.fromDegrees(originLat + 2.5), Angle.fromDegrees(originLon - 5.0)));
268 positions.add(new LatLon(Angle.fromDegrees(originLat - 2.5), Angle.fromDegrees(originLon - 5.0)));
269 positions.add(new LatLon(Angle.fromDegrees(originLat - 5.0), Angle.fromDegrees(originLon - 2.5)));
270 positions.add(new LatLon(Angle.fromDegrees(originLat - 5.0), Angle.fromDegrees(originLon + 2.5)));
271 positions.add(new LatLon(Angle.fromDegrees(originLat - 2.5), Angle.fromDegrees(originLon + 5.0)));
272 positions.add(new LatLon(Angle.fromDegrees(originLat + 2.5), Angle.fromDegrees(originLon + 5.0)));
274 SurfacePolygon polygon = new SurfacePolygon(positions,
275 new Color(1f, 0.11f, 0.2f, 0.4f), new Color(1f, 0f, 0f, 0.6f));
276 polygon.setStroke(new BasicStroke(2f));
277 layer.addRenderable(polygon);
279 // Test +180/-180 lon span Polyline
280 positions = new ArrayList<LatLon>();
281 positions.add(new LatLon(Angle.fromDegrees(-10), Angle.fromDegrees(170)));
282 positions.add(new LatLon(Angle.fromDegrees(-10), Angle.fromDegrees(-170)));
283 Polyline polyline = new Polyline(positions, 1000);
284 polyline.setFollowGreatCircles(true);
285 layer.addRenderable(polyline);
286 // Test +180/-180 lon span SurfacePolyline
287 positions = new ArrayList<LatLon>();
288 positions.add(new LatLon(Angle.fromDegrees(20), Angle.fromDegrees(-170)));
289 positions.add(new LatLon(Angle.fromDegrees(15), Angle.fromDegrees(170)));
290 positions.add(new LatLon(Angle.fromDegrees(10), Angle.fromDegrees(-175)));
291 positions.add(new LatLon(Angle.fromDegrees(5), Angle.fromDegrees(170)));
292 positions.add(new LatLon(Angle.fromDegrees(0), Angle.fromDegrees(-170)));
293 positions.add(new LatLon(Angle.fromDegrees(20), Angle.fromDegrees(-170)));
294 SurfacePolygon surfacePolygon = new SurfacePolygon(positions,
295 new Color(1f, 0.11f, 0.2f, 0.4f), new Color(1f, 0f, 0f, 0.6f));
296 surfacePolygon.setStroke(new BasicStroke(4f));
297 layer.addRenderable(surfacePolygon);
299 return layer;
302 private static final String lineTestString =
303 "<gml:LineString> <gml:posList>45.256 -110.45 46.46 -109.48 43.84 -109.86</gml:posList></gml:LineString>";
304 private static final String itemTestString =
305 "<item> <title>M 3.2, Mona Passage</title> <link>http://example.org/2005/09/09/atom01</link> <pubDate>Wed, 17 Aug 2005 07:02:32 GMT</pubDate> <georss:where> <gml:Polygon> <gml:exterior> <gml:LinearRing> <gml:posList> 45.256 -110.45 46.46 -109.48 43.84 -109.86 45.256 -110.45 </gml:posList> </gml:LinearRing> </gml:exterior> </gml:Polygon> </georss:where> </item>";
307 private RenderableLayer buildGeoRSSLayer()
311 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
312 docBuilderFactory.setNamespaceAware(true);
313 DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
314 Document doc = docBuilder.parse(new File("GeoRSSTestData.xml"));
315 List<Renderable> shapes = GeoRSSParser.parseShapes(doc);
317 // List<Renderable> shapes = GeoRSSParser.parseFragment(itemTestString, null);
319 // StringBuffer sb = new StringBuffer();
320 // FileReader fr = new FileReader("feed.xml");
321 // for (int c = fr.read(); c >=0; c = fr.read())
322 // sb.append((char) c);
323 // List<Renderable> shapes = GeoRSSParser.parseShapes(sb.toString());
325 RenderableLayer layer = new RenderableLayer();
326 if (shapes != null)
328 for (Renderable shape : shapes)
330 layer.addRenderable(shape);
334 return layer;
336 catch (ParserConfigurationException e)
338 e.printStackTrace();
340 catch (IOException e)
342 e.printStackTrace();
344 catch (SAXException e)
346 e.printStackTrace();
349 return null;
352 private Font makeToolTipFont()
354 HashMap<TextAttribute, Object> fontAttributes = new HashMap<TextAttribute, Object>();
356 fontAttributes.put(TextAttribute.BACKGROUND, new java.awt.Color(0.4f, 0.4f, 0.4f, 1f));
357 return Font.decode("Arial-BOLD-14").deriveFont(fontAttributes);
361 static
363 if (gov.nasa.worldwind.Configuration.isMacOS())
365 System.setProperty("apple.laf.useScreenMenuBar", "true");
366 System.setProperty("com.apple.mrj.application.apple.menu.about.name", "World Wind AWT Canvas App");
367 System.setProperty("com.apple.mrj.application.growbox.intrudes", "false");
371 public static void main(String[] args)
373 System.out.println("Java run-time version: " + System.getProperty("java.version"));
377 AWT1UpFrame frame = new AWT1UpFrame();
378 frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
379 frame.setVisible(true);
381 catch (Exception e)
383 e.printStackTrace();