2 Copyright (C) 2001, 2006 United States Government
3 as represented by the Administrator of the
4 National Aeronautics and Space Administration.
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
;
26 import javax
.xml
.parsers
.*;
28 import java
.awt
.font
.*;
31 import java
.util
.List
;
35 * @version $Id: AWT1Up.java 2570 2007-08-16 22:31:33Z tgaskins $
39 private static class AWT1UpFrame
extends javax
.swing
.JFrame
42 JLabel cursorPositionDisplay
;
43 WorldWindowGLCanvas wwd
;
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
);
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);
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)
98 // Double frameRate = (Double) ((WorldWindow) event.getSource()).getValue(AVKey.FRAME_RATE);
99 // if (frameRate != null)
100 // System.out.println(frameRate);
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()));
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());
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());
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();
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.
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)
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
);
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
);
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();
328 for (Renderable shape
: shapes
)
330 layer
.addRenderable(shape
);
336 catch (ParserConfigurationException e
)
340 catch (IOException e
)
344 catch (SAXException e
)
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
);
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);