Worldwind public release 0.2
[worldwind-tracker.git] / worldwinddemo / AWT1Up.java
blob67c33e0d3f237a6b84bf57d9206a33b21f68fe93
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 1772 2007-05-07 23:05:47Z 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.
89 });
91 this.wwd.addSelectListener(new SelectListener()
93 private WWIcon lastToolTipIcon = null;
95 public void selected(SelectEvent event)
97 if (event.getEventAction().equals(SelectEvent.LEFT_CLICK))
99 if (event.hasObjects())
100 System.out.println("Single clicked " + event.getTopObject());
101 else
102 System.out.println("Single clicked " + "no object");
104 else if (event.getEventAction().equals(SelectEvent.LEFT_DOUBLE_CLICK))
106 if (event.hasObjects())
107 System.out.println("Double clicked " + event.getTopObject());
108 else
109 System.out.println("Double clicked " + "no object");
111 else if (event.getEventAction().equals(SelectEvent.RIGHT_CLICK))
113 if (event.hasObjects())
114 System.out.println("Right clicked " + event.getTopObject());
115 else
116 System.out.println("Right clicked " + "no object");
118 else if (event.getEventAction().equals(SelectEvent.HOVER))
120 if (lastToolTipIcon != null)
122 lastToolTipIcon.setShowToolTip(false);
123 this.lastToolTipIcon = null;
124 AWT1UpFrame.this.wwd.repaint();
127 if (event.hasObjects())
129 if (event.getTopObject() instanceof WWIcon)
131 this.lastToolTipIcon = (WWIcon) event.getTopObject();
132 lastToolTipIcon.setShowToolTip(true);
133 AWT1UpFrame.this.wwd.repaint();
137 else if (event.getEventAction().equals(SelectEvent.ROLLOVER))
139 AWT1UpFrame.this.highlight(event.getTopObject());
144 catch (Exception e)
146 e.printStackTrace();
150 gov.nasa.worldwind.WWIcon lastPickedIcon;
152 private void highlight(Object o)
154 if (this.lastPickedIcon == o)
155 return; // same thing selected
157 if (this.lastPickedIcon != null)
159 this.lastPickedIcon.setHighlighted(false);
160 this.lastPickedIcon = null;
163 if (o != null && o instanceof gov.nasa.worldwind.WWIcon)
165 this.lastPickedIcon = (WWIcon) o;
166 this.lastPickedIcon.setHighlighted(true);
170 private IconLayer buildIconLayer()
172 IconLayer layer = new IconLayer();
174 for (double lat = 0; lat < 10; lat += 10)
176 for (double lon = -180; lon < 180; lon += 10)
178 double alt = 0;
179 if (lon % 90 == 0)
180 alt = 2000000;
181 WWIcon icon = new UserFacingIcon("images/32x32-icon-nasa.png",
182 new Position(Angle.fromDegrees(lat), Angle.fromDegrees(lon), alt));
183 icon.setHighlightScale(1.5);
184 icon.setToolTipFont(this.makeToolTipFont());
185 icon.setToolTipText(icon.getPath());
186 icon.setToolTipTextColor(java.awt.Color.YELLOW);
187 layer.addIcon(icon);
191 return layer;
194 private RenderableLayer buildShapesLayer()
196 RenderableLayer layer = new RenderableLayer();
198 Color interiorColor = new Color(1f, 1f, 0f, 0.3f);
199 Color borderColor = new Color(1f, 1f, 0f, 0.4f);
201 SurfaceQuadrilateral quad = new SurfaceQuadrilateral(new Sector(
202 Angle.fromDegrees(41.0), Angle.fromDegrees(41.6),
203 Angle.fromDegrees(-122.5), Angle.fromDegrees(-121.7)),
204 interiorColor, borderColor);
205 layer.addRenderable(quad);
207 quad = new SurfaceQuadrilateral(new Sector(
208 Angle.fromDegrees(38.9), Angle.fromDegrees(39.3),
209 Angle.fromDegrees(-120.2), Angle.fromDegrees(-119.9)),
210 new Color(0f, 1f, 1f, 0.3f), new Color(0.5f, 1f, 1f, 0.4f));
211 layer.addRenderable(quad);
213 double originLat = 28;
214 double originLon = -82;
215 ArrayList<LatLon> positions = new ArrayList<LatLon>();
216 positions.add(new LatLon(Angle.fromDegrees(originLat + 5.0), Angle.fromDegrees(originLon + 2.5)));
217 positions.add(new LatLon(Angle.fromDegrees(originLat + 5.0), Angle.fromDegrees(originLon - 2.5)));
218 positions.add(new LatLon(Angle.fromDegrees(originLat + 2.5), Angle.fromDegrees(originLon - 5.0)));
219 positions.add(new LatLon(Angle.fromDegrees(originLat - 2.5), Angle.fromDegrees(originLon - 5.0)));
220 positions.add(new LatLon(Angle.fromDegrees(originLat - 5.0), Angle.fromDegrees(originLon - 2.5)));
221 positions.add(new LatLon(Angle.fromDegrees(originLat - 5.0), Angle.fromDegrees(originLon + 2.5)));
222 positions.add(new LatLon(Angle.fromDegrees(originLat - 2.5), Angle.fromDegrees(originLon + 5.0)));
223 positions.add(new LatLon(Angle.fromDegrees(originLat + 2.5), Angle.fromDegrees(originLon + 5.0)));
225 SurfacePolygon polygon = new SurfacePolygon(positions,
226 new Color(1f, 0.11f, 0.2f, 0.4f), new Color(1f, 0f, 0f, 0.6f));
227 polygon.setStroke(new BasicStroke(2f));
228 layer.addRenderable(polygon);
230 return layer;
233 private static final String lineTestString =
234 "<gml:LineString> <gml:posList>45.256 -110.45 46.46 -109.48 43.84 -109.86</gml:posList></gml:LineString>";
235 private static final String itemTestString =
236 "<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>";
238 private RenderableLayer buildGeoRSSLayer()
242 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
243 docBuilderFactory.setNamespaceAware(true);
244 DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
245 Document doc = docBuilder.parse(new File("GeoRSSTestData.xml"));
246 List<Renderable> shapes = GeoRSSParser.parseShapes(doc);
248 // List<Renderable> shapes = GeoRSSParser.parseFragment(itemTestString, null);
250 // StringBuffer sb = new StringBuffer();
251 // FileReader fr = new FileReader("feed.xml");
252 // for (int c = fr.read(); c >=0; c = fr.read())
253 // sb.append((char) c);
254 // List<Renderable> shapes = GeoRSSParser.parseShapes(sb.toString());
256 RenderableLayer layer = new RenderableLayer();
257 if (shapes != null)
259 for (Renderable shape : shapes)
261 layer.addRenderable(shape);
265 return layer;
267 catch (ParserConfigurationException e)
269 e.printStackTrace();
271 catch (IOException e)
273 e.printStackTrace();
275 catch (SAXException e)
277 e.printStackTrace();
280 return null;
283 private Font makeToolTipFont()
285 HashMap<TextAttribute, Object> fontAttributes = new HashMap<TextAttribute, Object>();
287 fontAttributes.put(TextAttribute.BACKGROUND, new java.awt.Color(0.4f, 0.4f, 0.4f, 1f));
288 return Font.decode("Arial-BOLD-14").deriveFont(fontAttributes);
292 static
294 if (gov.nasa.worldwind.Configuration.isMacOS())
296 System.setProperty("apple.laf.useScreenMenuBar", "true");
297 System.setProperty("com.apple.mrj.application.apple.menu.about.name", "World Wind AWT Canvas App");
298 System.setProperty("com.apple.mrj.application.growbox.intrudes", "false");
302 public static void main(String[] args)
304 System.out.println("Java run-time version: " + System.getProperty("java.version"));
308 AWT1UpFrame frame = new AWT1UpFrame();
309 frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
310 frame.setVisible(true);
312 catch (Exception e)
314 e.printStackTrace();