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
.awt
.*;
11 import gov
.nasa
.worldwind
.geom
.*;
12 import gov
.nasa
.worldwind
.layers
.Earth
.*;
13 import gov
.nasa
.worldwind
.layers
.*;
18 import javax
.xml
.parsers
.*;
20 import java
.awt
.font
.*;
23 import java
.util
.List
;
27 * @version $Id: AWT1Up.java 2150 2007-06-26 07:40:58Z tgaskins $
31 private static class AWT1UpFrame
extends javax
.swing
.JFrame
34 JLabel cursorPositionDisplay
;
35 WorldWindowGLCanvas wwd
;
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
);
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);
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)
90 // Double frameRate = (Double) ((WorldWindow) event.getSource()).getValue(AVKey.FRAME_RATE);
91 // if (frameRate != null)
92 // System.out.println(frameRate);
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());
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());
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());
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();
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.
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)
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
);
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
);
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();
306 for (Renderable shape
: shapes
)
308 layer
.addRenderable(shape
);
314 catch (ParserConfigurationException e
)
318 catch (IOException e
)
322 catch (SAXException e
)
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
);
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);