Worldwind public release 0.2.1
[worldwind-tracker.git] / worldwinddemo / AWT1Up.java
blob89e62b50c0f198c50d33e6381cdb6c0dbd40b6d6
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.awt.*;
11 import gov.nasa.worldwind.geom.*;
12 import gov.nasa.worldwind.layers.Earth.*;
13 import gov.nasa.worldwind.layers.*;
14 import org.w3c.dom.*;
15 import org.xml.sax.*;
17 import javax.swing.*;
18 import javax.xml.parsers.*;
19 import java.awt.*;
20 import java.awt.font.*;
21 import java.io.*;
22 import java.util.*;
23 import java.util.List;
25 /**
26 * @author Tom Gaskins
27 * @version $Id: AWT1Up.java 2150 2007-06-26 07:40:58Z tgaskins $
29 public class AWT1Up
31 private static class AWT1UpFrame extends javax.swing.JFrame
33 StatusBar statusBar;
34 JLabel cursorPositionDisplay;
35 WorldWindowGLCanvas wwd;
37 public AWT1UpFrame()
39 try
41 System.out.println(gov.nasa.worldwind.Version.getVersion());
43 wwd = new gov.nasa.worldwind.awt.WorldWindowGLCanvas();
44 wwd.setPreferredSize(new java.awt.Dimension(800, 600));
45 this.getContentPane().add(wwd, java.awt.BorderLayout.CENTER);
47 this.statusBar = new StatusBar();
48 this.getContentPane().add(statusBar, BorderLayout.PAGE_END);
50 this.pack();
52 java.awt.Dimension prefSize = this.getPreferredSize();
53 java.awt.Dimension parentSize;
54 java.awt.Point parentLocation = new java.awt.Point(0, 0);
55 parentSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
56 int x = parentLocation.x + (parentSize.width - prefSize.width) / 2;
57 int y = parentLocation.y + (parentSize.height - prefSize.height) / 2;
58 this.setLocation(x, y);
59 this.setResizable(true);
61 Model m = (Model) WorldWind.createConfigurationComponent(AVKey.MODEL_CLASS_NAME);
62 LayerList layers = m.getLayers();
63 for (Layer layer : layers)
65 if (layer instanceof TiledImageLayer)
66 ((TiledImageLayer) layer).setShowImageTileOutlines(false);
67 if (layer instanceof LandsatI3)
68 ((TiledImageLayer) layer).setDrawBoundingVolumes(false);
69 if (layer instanceof CompassLayer)
70 ((CompassLayer) layer).setShowTilt(true);
73 m.getLayers().add(this.buildShapesLayer());
74 m.getLayers().add(this.buildIconLayer());
75 m.getLayers().add(this.buildGeoRSSLayer());
76 m.setShowWireframeExterior(false);
77 m.setShowWireframeInterior(false);
78 wwd.setModel(m);
80 // Forward events to the status bar to provide the cursor position info.
81 this.statusBar.setEventSource(wwd);
83 this.wwd.addRenderingListener(new RenderingListener()
85 public void stageChanged(RenderingEvent event)
87 // Do nothing; just showing how to use it.
88 // if (event.getSource() instanceof WorldWindow)
89 // {
90 // Double frameRate = (Double) ((WorldWindow) event.getSource()).getValue(AVKey.FRAME_RATE);
91 // if (frameRate != null)
92 // System.out.println(frameRate);
93 // }
95 });
97 this.wwd.addSelectListener(new SelectListener()
99 private WWIcon lastToolTipIcon = null;
100 private BasicDragger dragger = new BasicDragger(wwd);
102 public void selected(SelectEvent event)
104 if (event.getEventAction().equals(SelectEvent.LEFT_CLICK))
106 if (event.hasObjects())
107 System.out.println("Single clicked " + event.getTopObject());
108 else
109 System.out.println("Single clicked " + "no object");
111 else if (event.getEventAction().equals(SelectEvent.LEFT_DOUBLE_CLICK))
113 if (event.hasObjects())
114 System.out.println("Double clicked " + event.getTopObject());
115 else
116 System.out.println("Double clicked " + "no object");
118 else if (event.getEventAction().equals(SelectEvent.RIGHT_CLICK))
120 if (event.hasObjects())
121 System.out.println("Right clicked " + event.getTopObject());
122 else
123 System.out.println("Right clicked " + "no object");
125 else if (event.getEventAction().equals(SelectEvent.HOVER))
127 if (lastToolTipIcon != null)
129 lastToolTipIcon.setShowToolTip(false);
130 this.lastToolTipIcon = null;
131 AWT1UpFrame.this.wwd.repaint();
134 if (event.hasObjects() && !this.dragger.isDragging())
136 if (event.getTopObject() instanceof WWIcon)
138 this.lastToolTipIcon = (WWIcon) event.getTopObject();
139 lastToolTipIcon.setShowToolTip(true);
140 AWT1UpFrame.this.wwd.repaint();
144 else if (event.getEventAction().equals(SelectEvent.ROLLOVER) && !this.dragger.isDragging())
146 AWT1UpFrame.this.highlight(event.getTopObject());
148 else if (event.getEventAction().equals(SelectEvent.DRAG_END)
149 || event.getEventAction().equals(SelectEvent.DRAG))
151 // Delegate dragging computations to a dragger.
152 this.dragger.selected(event);
153 if (event.getEventAction().equals(SelectEvent.DRAG_END))
155 PickedObjectList pol = wwd.getObjectsAtCurrentPosition();
156 if (pol != null)
157 AWT1UpFrame.this.highlight(pol.getTopObject());
163 this.wwd.addPositionListener(new PositionListener()
165 public void moved(PositionEvent event)
167 // Do nothing; just show how to add a position listener.
171 catch (Exception e)
173 e.printStackTrace();
177 gov.nasa.worldwind.WWIcon lastPickedIcon;
179 private void highlight(Object o)
181 if (this.lastPickedIcon == o)
182 return; // same thing selected
184 if (this.lastPickedIcon != null)
186 this.lastPickedIcon.setHighlighted(false);
187 this.lastPickedIcon = null;
190 if (o != null && o instanceof gov.nasa.worldwind.WWIcon)
192 this.lastPickedIcon = (WWIcon) o;
193 this.lastPickedIcon.setHighlighted(true);
197 private IconLayer buildIconLayer()
199 IconLayer layer = new IconLayer();
201 for (double lat = 0; lat < 10; lat += 10)
203 for (double lon = -180; lon < 180; lon += 10)
205 double alt = 0;
206 if (lon % 90 == 0)
207 alt = 2000000;
208 WWIcon icon = new UserFacingIcon("images/32x32-icon-nasa.png",
209 new Position(Angle.fromDegrees(lat), Angle.fromDegrees(lon), alt));
210 icon.setHighlightScale(1.5);
211 icon.setToolTipFont(this.makeToolTipFont());
212 icon.setToolTipText(icon.getImageSource().toString());
213 icon.setToolTipTextColor(java.awt.Color.YELLOW);
214 layer.addIcon(icon);
218 return layer;
221 private RenderableLayer buildShapesLayer()
223 RenderableLayer layer = new RenderableLayer();
225 Color interiorColor = new Color(1f, 1f, 0f, 0.3f);
226 Color borderColor = new Color(1f, 1f, 0f, 0.4f);
228 SurfaceQuadrilateral quad = new SurfaceQuadrilateral(new Sector(
229 Angle.fromDegrees(41.0), Angle.fromDegrees(41.6),
230 Angle.fromDegrees(-122.5), Angle.fromDegrees(-121.7)),
231 interiorColor, borderColor);
232 layer.addRenderable(quad);
234 quad = new SurfaceQuadrilateral(new Sector(
235 Angle.fromDegrees(38.9), Angle.fromDegrees(39.3),
236 Angle.fromDegrees(-120.2), Angle.fromDegrees(-119.9)),
237 new Color(0f, 1f, 1f, 0.3f), new Color(0.5f, 1f, 1f, 0.4f));
238 layer.addRenderable(quad);
240 double originLat = 28;
241 double originLon = -82;
242 ArrayList<LatLon> positions = new ArrayList<LatLon>();
243 positions.add(new LatLon(Angle.fromDegrees(originLat + 5.0), Angle.fromDegrees(originLon + 2.5)));
244 positions.add(new LatLon(Angle.fromDegrees(originLat + 5.0), Angle.fromDegrees(originLon - 2.5)));
245 positions.add(new LatLon(Angle.fromDegrees(originLat + 2.5), Angle.fromDegrees(originLon - 5.0)));
246 positions.add(new LatLon(Angle.fromDegrees(originLat - 2.5), Angle.fromDegrees(originLon - 5.0)));
247 positions.add(new LatLon(Angle.fromDegrees(originLat - 5.0), Angle.fromDegrees(originLon - 2.5)));
248 positions.add(new LatLon(Angle.fromDegrees(originLat - 5.0), Angle.fromDegrees(originLon + 2.5)));
249 positions.add(new LatLon(Angle.fromDegrees(originLat - 2.5), Angle.fromDegrees(originLon + 5.0)));
250 positions.add(new LatLon(Angle.fromDegrees(originLat + 2.5), Angle.fromDegrees(originLon + 5.0)));
252 SurfacePolygon polygon = new SurfacePolygon(positions,
253 new Color(1f, 0.11f, 0.2f, 0.4f), new Color(1f, 0f, 0f, 0.6f));
254 polygon.setStroke(new BasicStroke(2f));
255 layer.addRenderable(polygon);
257 // Test +180/-180 lon span Polyline
258 positions = new ArrayList<LatLon>();
259 positions.add(new LatLon(Angle.fromDegrees(-10), Angle.fromDegrees(170)));
260 positions.add(new LatLon(Angle.fromDegrees(-10), Angle.fromDegrees(-170)));
261 Polyline polyline = new Polyline(positions, 1000);
262 polyline.setFollowGreatCircles(true);
263 layer.addRenderable(polyline);
264 // Test +180/-180 lon span SurfacePolyline
265 positions = new ArrayList<LatLon>();
266 positions.add(new LatLon(Angle.fromDegrees(20), Angle.fromDegrees(-170)));
267 positions.add(new LatLon(Angle.fromDegrees(15), Angle.fromDegrees(170)));
268 positions.add(new LatLon(Angle.fromDegrees(10), Angle.fromDegrees(-175)));
269 positions.add(new LatLon(Angle.fromDegrees(5), Angle.fromDegrees(170)));
270 positions.add(new LatLon(Angle.fromDegrees(0), Angle.fromDegrees(-170)));
271 positions.add(new LatLon(Angle.fromDegrees(20), Angle.fromDegrees(-170)));
272 SurfacePolygon surfacePolygon = new SurfacePolygon(positions,
273 new Color(1f, 0.11f, 0.2f, 0.4f), new Color(1f, 0f, 0f, 0.6f));
274 surfacePolygon.setStroke(new BasicStroke(4f));
275 layer.addRenderable(surfacePolygon);
277 return layer;
280 private static final String lineTestString =
281 "<gml:LineString> <gml:posList>45.256 -110.45 46.46 -109.48 43.84 -109.86</gml:posList></gml:LineString>";
282 private static final String itemTestString =
283 "<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>";
285 private RenderableLayer buildGeoRSSLayer()
289 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
290 docBuilderFactory.setNamespaceAware(true);
291 DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
292 Document doc = docBuilder.parse(new File("GeoRSSTestData.xml"));
293 List<Renderable> shapes = GeoRSSParser.parseShapes(doc);
295 // List<Renderable> shapes = GeoRSSParser.parseFragment(itemTestString, null);
297 // StringBuffer sb = new StringBuffer();
298 // FileReader fr = new FileReader("feed.xml");
299 // for (int c = fr.read(); c >=0; c = fr.read())
300 // sb.append((char) c);
301 // List<Renderable> shapes = GeoRSSParser.parseShapes(sb.toString());
303 RenderableLayer layer = new RenderableLayer();
304 if (shapes != null)
306 for (Renderable shape : shapes)
308 layer.addRenderable(shape);
312 return layer;
314 catch (ParserConfigurationException e)
316 e.printStackTrace();
318 catch (IOException e)
320 e.printStackTrace();
322 catch (SAXException e)
324 e.printStackTrace();
327 return null;
330 private Font makeToolTipFont()
332 HashMap<TextAttribute, Object> fontAttributes = new HashMap<TextAttribute, Object>();
334 fontAttributes.put(TextAttribute.BACKGROUND, new java.awt.Color(0.4f, 0.4f, 0.4f, 1f));
335 return Font.decode("Arial-BOLD-14").deriveFont(fontAttributes);
339 static
341 if (gov.nasa.worldwind.Configuration.isMacOS())
343 System.setProperty("apple.laf.useScreenMenuBar", "true");
344 System.setProperty("com.apple.mrj.application.apple.menu.about.name", "World Wind AWT Canvas App");
345 System.setProperty("com.apple.mrj.application.growbox.intrudes", "false");
349 public static void main(String[] args)
351 System.out.println("Java run-time version: " + System.getProperty("java.version"));
355 AWT1UpFrame frame = new AWT1UpFrame();
356 frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
357 frame.setVisible(true);
359 catch (Exception e)
361 e.printStackTrace();