+++ /dev/null
-/*
- * Copyright © 2010 Anthony Towns <aj@erisian.com.au>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-package org.altusmetrum.altosuilib_2;
-
-import java.awt.*;
-import java.awt.event.*;
-import javax.swing.*;
-import java.io.*;
-import java.lang.Math;
-import java.awt.geom.*;
-import java.util.*;
-import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
-
-class MapPoint {
- double lat, lon;
- int state;
-
- public MapPoint(double lat, double lon, int state) {
- this.lat = lat;
- this.lon = lon;
- this.state = state;
- }
-
- public boolean equals(MapPoint other) {
- if (other == null)
- return false;
- if (other.lat != lat)
- return false;
- if (other.lon != lon)
- return false;
- if (other.state != state)
- return false;
- return true;
- }
-}
-
-public class AltosSiteMap extends JComponent implements AltosFlightDisplay, MouseMotionListener, MouseListener, HierarchyBoundsListener {
- // preferred vertical step in a tile in naut. miles
- // will actually choose a step size between x and 2x, where this
- // is 1.5x
- static final double tile_size_nmi = 0.75;
-
- static final int px_size = 512;
-
- static final int MAX_TILE_DELTA = 100;
-
- static final int maptype_hybrid = 0;
- static final int maptype_roadmap = 1;
- static final int maptype_satellite = 2;
- static final int maptype_terrain = 3;
-
- int maptype = maptype_hybrid;
-
- static final String[] maptype_names = {
- "hybrid",
- "roadmap",
- "satellite",
- "terrain"
- };
-
- public static final String[] maptype_labels = {
- "Hybrid",
- "Roadmap",
- "Satellite",
- "Terrain"
- };
-
- LinkedList<MapPoint> points = new LinkedList<MapPoint>();
-
- private static Point2D.Double translatePoint(Point2D.Double p,
- Point2D.Double d)
- {
- return new Point2D.Double(p.x + d.x, p.y + d.y);
- }
-
- static class LatLng {
- public double lat, lng;
- public LatLng(double lat, double lng) {
- this.lat = lat;
- this.lng = lng;
- }
- }
-
- // based on google js
- // http://maps.gstatic.com/intl/en_us/mapfiles/api-3/2/10/main.js
- // search for fromLatLngToPoint and fromPointToLatLng
- /*
- private static Point2D.Double pt(LatLng latlng, int zoom) {
- double scale_x = 256/360.0 * Math.pow(2, zoom);
- double scale_y = 256/(2.0*Math.PI) * Math.pow(2, zoom);
- return pt(latlng, scale_x, scale_y);
- }
- */
-
- private static Point2D.Double pt(LatLng latlng,
- double scale_x, double scale_y)
- {
- Point2D.Double res = new Point2D.Double();
- double e;
-
- res.x = latlng.lng * scale_x;
-
- e = Math.sin(Math.toRadians(latlng.lat));
- e = Math.max(e,-(1-1.0E-15));
- e = Math.min(e, 1-1.0E-15 );
-
- res.y = 0.5*Math.log((1+e)/(1-e))*-scale_y;
- return res;
- }
-
- static private LatLng latlng(Point2D.Double pt,
- double scale_x, double scale_y)
- {
- double lat, lng;
- double rads;
-
- lng = pt.x/scale_x;
- rads = 2 * Math.atan(Math.exp(-pt.y/scale_y));
- lat = Math.toDegrees(rads - Math.PI/2);
-
- return new LatLng(lat,lng);
- }
-
- static final int default_zoom = 15;
- static final int min_zoom = 3;
- static final int max_zoom = 21;
-
- int zoom = default_zoom;
-
- double scale_x, scale_y;
-
- int radius; /* half width/height of tiles to load */
-
- private Point2D.Double pt(double lat, double lng) {
- return pt(new LatLng(lat, lng), scale_x, scale_y);
- }
-
- private LatLng latlng(double x, double y) {
- return latlng(new Point2D.Double(x,y), scale_x, scale_y);
- }
- /*
- private LatLng latlng(Point2D.Double pt) {
- return latlng(pt, scale_x, scale_y);
- }
- */
-
- private LatLng latlng(Point pt) {
- return latlng(new Point2D.Double(pt.x, pt.y), scale_x, scale_y);
- }
-
- ConcurrentHashMap<Point,AltosSiteMapTile> mapTiles = new ConcurrentHashMap<Point,AltosSiteMapTile>();
- Point2D.Double centre;
-
- private Point2D.Double tileCoordOffset(Point p) {
- return new Point2D.Double(centre.x - p.x*px_size,
- centre.y - p.y*px_size);
- }
-
- private Point tileOffset(Point2D.Double p) {
- return new Point((int)Math.floor((centre.x+p.x)/px_size),
- (int)Math.floor((centre.y+p.y)/px_size));
- }
-
- private Point2D.Double getBaseLocation(double lat, double lng) {
- Point2D.Double locn = pt(0,0), north_step;
-
- scale_x = 256/360.0 * Math.pow(2, zoom);
- scale_y = 256/(2.0*Math.PI) * Math.pow(2, zoom);
- locn = pt(lat, lng);
- locn.x = -px_size * Math.floor(locn.x/px_size);
- locn.y = -px_size * Math.floor(locn.y/px_size);
- return locn;
- }
-
- public void reset() {
- // nothing
- }
-
- public void font_size_changed(int font_size) {
- for (AltosSiteMapTile tile : mapTiles.values())
- tile.set_font(AltosUILib.value_font);
- }
-
- public void units_changed(boolean imperial_units) {
- set_line();
- }
-
- static final int load_mode_cached = 1;
- static final int load_mode_uncached = 2;
-
- private boolean load_map(final AltosSiteMapTile tile,
- final File pngfile, String pngurl,
- int load_mode)
- {
- boolean has_map = AltosSiteMapCache.has_map(pngfile, pngurl);
- if ((load_mode & load_mode_uncached) == 0 && !has_map)
- return false;
- if ((load_mode & load_mode_cached) == 0 && has_map)
- return false;
-
- tile.set_status(AltosSiteMapCache.loading);
- int status = AltosSiteMapCache.fetch_map(pngfile, pngurl);
- if (status == AltosSiteMapCache.success) {
- if (SwingUtilities.isEventDispatchThread())
- tile.load_map(pngfile);
- else {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- tile.load_map(pngfile);
- }
- });
- }
- } else {
- tile.set_status(status);
- System.out.printf("# Failed to fetch file %s (status %d)\n", pngfile, status);
- System.out.printf(" wget -O '%s' '%s'\n", pngfile, pngurl);
- System.out.printf(" sleep 1\n");
- }
- return true;
- }
-
-
- class AltosSiteMapPrefetch {
- int x;
- int y;
- int result;
- File pngfile;
- String pngurl;
- }
-
- private AltosSiteMapPrefetch prefetchMap(int x, int y) {
- AltosSiteMapPrefetch prefetch = new AltosSiteMapPrefetch();
- LatLng map_latlng = latlng(
- -centre.x + x*px_size + px_size/2,
- -centre.y + y*px_size + px_size/2);
- prefetch.pngfile = MapFile(map_latlng.lat, map_latlng.lng, zoom, maptype_hybrid);
- prefetch.pngurl = MapURL(map_latlng.lat, map_latlng.lng, zoom, maptype_hybrid);
- if (AltosSiteMapCache.has_map(prefetch.pngfile, prefetch.pngurl)) {
- prefetch.result = 1;
- } else if (AltosSiteMapCache.fetch_map(prefetch.pngfile, prefetch.pngurl) == AltosSiteMapCache.success) {
- prefetch.result = 0;
- } else {
- prefetch.result = -1;
- }
- return prefetch;
- }
-
- public static void prefetchMaps(double lat, double lng, int radius, int maptypes, int min_zoom, int max_zoom) {
- AltosSiteMap asm = new AltosSiteMap(true);
-
- for (int z = min_zoom; z <= max_zoom; z++) {
- asm.zoom = z;
- asm.set_radius(radius);
- asm.centre = asm.getBaseLocation(lat, lng);
- for (int t = maptype_hybrid; t <= maptype_terrain; t++) {
- if ((maptypes & (1 << t)) !=0) {
- asm.maptype = t;
- for (int y = -radius; y <= radius; y++) {
- for (int x = -radius; x <= radius; x++) {
- AltosSiteMapPrefetch prefetch = asm.prefetchMap(x, y);
- switch (prefetch.result) {
- case 1:
- System.out.printf("Already have %s\n", prefetch.pngfile);
- break;
- case 0:
- System.out.printf("Fetched map %s\n", prefetch.pngfile);
- break;
- case -1:
- System.out.printf("# Failed to fetch file %s\n", prefetch.pngfile);
- System.out.printf(" wget -O '%s' ''\n",
- prefetch.pngfile, prefetch.pngurl);
- break;
- }
- }
- }
- }
- }
- }
- }
-
- public static void prefetchMaps(double lat, double lon) {
- prefetchMaps(lat, lon, 2, 1 << maptype_hybrid, 0, 0);
- }
-
- public File init_map(Point offset, int load_mode) {
- AltosSiteMapTile tile = mapTiles.get(offset);
- Point2D.Double coord = tileCoordOffset(offset);
-
- LatLng map_latlng = latlng(px_size/2-coord.x, px_size/2-coord.y);
-
- File pngfile = MapFile(map_latlng.lat, map_latlng.lng, zoom, maptype);
- String pngurl = MapURL(map_latlng.lat, map_latlng.lng, zoom, maptype);
- load_map(tile, pngfile, pngurl, load_mode);
- return pngfile;
- }
-
- private void initAndFinishMapAsync (final AltosSiteMapTile tile, final Point offset) {
- Thread thread = new Thread() {
- public void run() {
- init_map(offset, load_mode_cached|load_mode_uncached);
- SwingUtilities.invokeLater( new Runnable() {
- public void run() {
- addTileAt(tile, offset);
- }
- } );
- }
- };
- thread.start();
- }
-
- double lat, lon;
- boolean base_location_set = false;
-
- public void clear_base_location() {
- base_location_set = false;
- circle_set = false;
- points = new LinkedList<MapPoint>();
- line_start = line_end = null;
- for (AltosSiteMapTile tile : mapTiles.values()) {
- tile.clearMap();
- tile.set_status(AltosSiteMapCache.loading);
- }
- }
-
- public void setBaseLocation(double lat, double lng) {
- this.lat = lat;
- this.lon = lng;
- base_location_set = true;
-
- centre = getBaseLocation(lat, lng);
- scrollRocketToVisible(pt(lat,lng));
- }
-
- private void initMaps(double lat, double lng) {
- setBaseLocation(lat, lng);
-
- for (AltosSiteMapTile tile : mapTiles.values()) {
- tile.clearMap();
- tile.set_status(AltosSiteMapCache.loading);
- }
- Thread thread = new Thread() {
- public void run() {
- for (Point k : mapTiles.keySet())
- init_map(k, load_mode_cached);
- for (Point k : mapTiles.keySet())
- init_map(k, load_mode_uncached);
- }
- };
- thread.start();
- }
-
- private static File MapFile(double lat, double lng, int zoom, int maptype) {
- char chlat = lat < 0 ? 'S' : 'N';
- char chlng = lng < 0 ? 'W' : 'E';
- if (lat < 0) lat = -lat;
- if (lng < 0) lng = -lng;
- String maptype_string = String.format("%s-", maptype_names[maptype]);
- String format_string;
- if (maptype == maptype_hybrid || maptype == maptype_satellite || maptype == maptype_terrain)
- format_string = "jpg";
- else
- format_string = "png";
- return new File(AltosUIPreferences.mapdir(),
- String.format("map-%c%.6f,%c%.6f-%s%d.%s",
- chlat, lat, chlng, lng, maptype_string, zoom, format_string));
- }
-
- private static String MapURL(double lat, double lng, int zoom, int maptype) {
- String format_string;
- if (maptype == maptype_hybrid || maptype == maptype_satellite || maptype == maptype_terrain)
- format_string = "jpg";
- else
- format_string = "png32";
-
- if (AltosUIVersion.has_google_maps_api_key())
- return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&sensor=false&maptype=%s&format=%s&key=%s",
- lat, lng, zoom, px_size, px_size, maptype_names[maptype], format_string, AltosUIVersion.google_maps_api_key);
- else
- return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&sensor=false&maptype=%s&format=%s",
- lat, lng, zoom, px_size, px_size, maptype_names[maptype], format_string);
- }
-
- boolean initialised = false;
- MapPoint last_point = null;
- int last_state = -1;
-
- private void show(double lat, double lon) {
- System.out.printf ("show %g %g\n", lat, lon);
- return;
-// initMaps(lat, lon);
-// scrollRocketToVisible(pt(lat, lon));
- }
-
- JLabel zoom_label;
-
- private void set_zoom_label() {
- zoom_label.setText(String.format("Zoom %d", zoom - default_zoom));
- }
-
- public void set_zoom(int zoom) {
- if (min_zoom <= zoom && zoom <= max_zoom) {
- this.zoom = zoom;
- if (base_location_set) {
- set_tiles();
- initMaps(lat, lon);
- }
- redraw();
- set_zoom_label();
- }
- }
-
- public int get_zoom() {
- return zoom;
- }
-
- public void set_maptype(int type) {
- maptype = type;
- maptype_combo.setSelectedIndex(type);
- if (base_location_set)
- initMaps(lat, lon);
- redraw();
- }
-
- private void draw(MapPoint last_point, MapPoint point) {
- boolean force_ensure = false;
- if (last_point == null) {
- force_ensure = true;
- last_point = point;
- }
-
- Point2D.Double pt = pt(point.lat, point.lon);
- Point2D.Double last_pt = pt(last_point.lat, last_point.lon);
-
- boolean in_any = false;
- for (Point offset : mapTiles.keySet()) {
- AltosSiteMapTile tile = mapTiles.get(offset);
- Point2D.Double ref, lref;
- ref = translatePoint(pt, tileCoordOffset(offset));
- lref = translatePoint(last_pt, tileCoordOffset(offset));
- tile.show(point.state, lref, ref);
- if (0 <= ref.x && ref.x < px_size)
- if (0 <= ref.y && ref.y < px_size)
- in_any = true;
- }
-
- Point offset = tileOffset(pt);
- if (!in_any) {
- Point2D.Double ref, lref;
- ref = translatePoint(pt, tileCoordOffset(offset));
- lref = translatePoint(last_pt, tileCoordOffset(offset));
-
- AltosSiteMapTile tile = createTile(offset);
- tile.show(point.state, lref, ref);
- initAndFinishMapAsync(tile, offset);
- }
-
- scrollRocketToVisible(pt);
-
- if (force_ensure || offset != tileOffset(last_pt)) {
- ensureTilesAround(offset);
- }
- }
-
- private void redraw() {
- MapPoint last_point = null;
-
- for (MapPoint point : points) {
- draw(last_point, point);
- last_point = point;
- }
- if (circle_set)
- draw_circle(circle_lat, circle_lon);
- if (line_start != null)
- set_line();
- }
-
- public void show(final AltosState state, final AltosListenerState listener_state) {
- // if insufficient gps data, nothing to update
- AltosGPS gps = state.gps;
-
- if (gps == null)
- return;
-
- if (!gps.locked && gps.nsat < 4)
- return;
-
- if (!initialised) {
- if (state.pad_lat != AltosLib.MISSING && state.pad_lon != AltosLib.MISSING) {
- initMaps(state.pad_lat, state.pad_lon);
- initialised = true;
- } else if (gps.lat != AltosLib.MISSING && gps.lon != AltosLib.MISSING) {
- initMaps(gps.lat, gps.lon);
- initialised = true;
- } else {
- return;
- }
- }
-
- MapPoint point = new MapPoint(gps.lat, gps.lon, state.state);
-
- if (point.equals(last_point))
- return;
-
- points.add(point);
-
- draw(last_point, point);
-
- last_point = point;
- }
-
- public void centre(Point2D.Double pt) {
- Rectangle r = comp.getVisibleRect();
- Point2D.Double copt = translatePoint(pt, tileCoordOffset(topleft));
- int dx = (int)copt.x - r.width/2 - r.x;
- int dy = (int)copt.y - r.height/2 - r.y;
- r.x += dx;
- r.y += dy;
- r.width = 1;
- r.height = 1;
- comp.scrollRectToVisible(r);
- }
-
- public void centre(AltosState state) {
- if (!state.gps.locked && state.gps.nsat < 4)
- return;
- centre(pt(state.gps.lat, state.gps.lon));
- }
-
- private double circle_lat, circle_lon;
- private boolean circle_set = false;
-
- public void draw_circle(double lat, double lon) {
- circle_lat = lat;
- circle_lon = lon;
- circle_set = true;
-
- Point2D.Double pt = pt(lat, lon);
-
- for (Point offset : mapTiles.keySet()) {
- AltosSiteMapTile tile = mapTiles.get(offset);
- Point2D.Double ref = translatePoint(pt, tileCoordOffset(offset));
- tile.set_boost(ref);
- }
- }
-
- private AltosSiteMapTile createTile(Point offset) {
- AltosSiteMapTile tile = new AltosSiteMapTile(px_size);
- tile.set_font(AltosUILib.value_font);
- mapTiles.put(offset, tile);
- return tile;
- }
-
- private void ensureTilesAround(Point base_offset) {
- for (int x = -radius; x <= radius; x++) {
- for (int y = -radius; y <= radius; y++) {
- Point offset = new Point(base_offset.x + x, base_offset.y + y);
- if (mapTiles.containsKey(offset))
- continue;
- AltosSiteMapTile tile = createTile(offset);
- initAndFinishMapAsync(tile, offset);
- }
- }
- }
-
- private void set_tiles() {
- for (int x = -radius; x <= radius; x++) {
- for (int y = -radius; y <= radius; y++) {
- Point offset = new Point(x, y);
- if (mapTiles.containsKey(offset))
- continue;
- AltosSiteMapTile t = createTile(offset);
- addTileAt(t, offset);
- }
- }
- for (Point offset : mapTiles.keySet()) {
- if (offset.x < -radius || offset.x > radius ||
- offset.y < -radius || offset.y > radius)
- {
- removeTileAt(offset);
- }
- }
- }
-
- public void set_radius(int radius) {
- if (radius != this.radius) {
- this.radius = radius;
- set_tiles();
- }
- }
-
- private Point topleft = new Point(0,0);
- private void scrollRocketToVisible(Point2D.Double pt) {
- Rectangle r = comp.getVisibleRect();
- Point2D.Double copt = translatePoint(pt, tileCoordOffset(topleft));
-
- int dx = (int)copt.x - r.width/2 - r.x;
- int dy = (int)copt.y - r.height/2 - r.y;
- if (Math.abs(dx) > r.width/4 || Math.abs(dy) > r.height/4) {
- r.x += dx;
- r.y += dy;
- comp.scrollRectToVisible(r);
- }
- }
-
- private void addTileAt(AltosSiteMapTile tile, Point offset) {
- if (Math.abs(offset.x) >= MAX_TILE_DELTA ||
- Math.abs(offset.y) >= MAX_TILE_DELTA)
- {
- System.out.printf("Rocket too far away from pad (tile %d,%d)\n",
- offset.x, offset.y);
- return;
- }
-
- if (offset.x < topleft.x)
- topleft.x = offset.x;
- if (offset.y < topleft.y)
- topleft.y = offset.y;
-
- GridBagConstraints c = new GridBagConstraints();
- c.anchor = GridBagConstraints.CENTER;
- c.fill = GridBagConstraints.BOTH;
- // put some space between the map tiles, debugging only
- // c.insets = new Insets(5, 5, 5, 5);
-
- c.gridx = offset.x + MAX_TILE_DELTA;
- c.gridy = offset.y + MAX_TILE_DELTA;
- layout.setConstraints(tile, c);
-
- comp.add(tile);
- }
-
- private AltosSiteMap(boolean knowWhatYouAreDoing) {
- if (!knowWhatYouAreDoing) {
- throw new RuntimeException("Arggh.");
- }
- }
-
- private void removeTileAt(Point offset) {
- AltosSiteMapTile tile = mapTiles.get(offset);
-
- mapTiles.remove(offset);
- comp.remove(tile);
-
- topleft = new Point(MAX_TILE_DELTA, MAX_TILE_DELTA);
- for (Point o : mapTiles.keySet()) {
- if (o.x < topleft.x)
- topleft.x = o.x;
- if (o.y < topleft.y)
- topleft.y = o.y;
- }
- }
-
- JComponent comp;
-
- private GridBagLayout layout = new GridBagLayout();
-
- LatLng line_start, line_end;
-
- private void set_line() {
- if (line_start != null && line_end != null) {
- Point2D.Double start = pt(line_start.lat, line_start.lng);
- Point2D.Double end = pt(line_end.lat, line_end.lng);
- AltosGreatCircle g = new AltosGreatCircle(line_start.lat, line_start.lng,
- line_end.lat, line_end.lng);
-
- for (Point offset : mapTiles.keySet()) {
- AltosSiteMapTile tile = mapTiles.get(offset);
- Point2D.Double s, e;
- s = translatePoint(start, tileCoordOffset(offset));
- e = translatePoint(end, tileCoordOffset(offset));
- tile.set_line(new Line2D.Double(s.x, s.y, e.x, e.y), g.distance);
- }
- } else {
- for (AltosSiteMapTile tile : mapTiles.values())
- tile.set_line(null, 0);
- }
- }
-
- static void debug_component(Component who, String where) {
-/*
- Rectangle r = who.getBounds();
- int x = r.x / px_size;
- int y = r.y / px_size;
-
- System.out.printf ("%3d, %3d: %s\n", x, y, where);
-*/
- }
-
- LatLng latlng(MouseEvent e) {
- if (!base_location_set)
- return null;
-
- Rectangle zerozero = mapTiles.get(new Point(0, 0)).getBounds();
-
- return latlng(-centre.x + e.getPoint().x - zerozero.x, -centre.y + e.getPoint().y - zerozero.y);
- }
-
- /* MouseMotionListener methods */
- public void mouseDragged(MouseEvent e) {
- if (!GrabNDrag.grab_n_drag(e)) {
- LatLng loc = latlng(e);
- line_end = loc;
- set_line();
- }
- }
-
- public void mouseMoved(MouseEvent e) {
- }
-
- /* MouseListener methods */
- public void mouseClicked(MouseEvent e) {
- }
-
- public void mouseEntered(MouseEvent e) {
- }
-
- public void mouseExited(MouseEvent e) {
- }
-
- public void mousePressed(MouseEvent e) {
- if (!GrabNDrag.grab_n_drag(e)) {
- LatLng loc = latlng(e);
- line_start = loc;
- line_end = null;
- set_line();
- }
- }
-
- public void mouseReleased(MouseEvent e) {
- }
-
- private void set_cache_size() {
- Rectangle r = comp.getVisibleRect();
-
- int width_tiles = (r.width + 2*px_size) / px_size;
- int height_tiles = (r.height + 2*px_size) / px_size;
- int tiles = width_tiles * height_tiles;
- AltosSiteMapCache.set_cache_size(tiles);
- }
-
- /* HierarchyBoundsListener methods */
- public void ancestorMoved(HierarchyEvent e) {
- set_cache_size();
- }
-
- public void ancestorResized(HierarchyEvent e) {
- set_cache_size();
- }
-
- JScrollPane pane = new JScrollPane();
-
- JComboBox<String> maptype_combo;
-
- public AltosSiteMap(int in_radius) {
- radius = in_radius;
-
- comp = new JComponent() { };
-
- comp.addMouseMotionListener(this);
- comp.addMouseListener(this);
- comp.addHierarchyBoundsListener(this);
-
- GrabNDrag scroller = new GrabNDrag(comp);
-
- comp.setLayout(layout);
-
- set_tiles();
-
- pane.setViewportView(comp);
- pane.setPreferredSize(new Dimension(500,500));
- pane.setVisible(true);
- pane.setEnabled(true);
-
- GridBagLayout my_layout = new GridBagLayout();
-
- setLayout(my_layout);
-
- GridBagConstraints c = new GridBagConstraints();
- c.anchor = GridBagConstraints.CENTER;
- c.fill = GridBagConstraints.BOTH;
- c.gridx = 0;
- c.gridy = 0;
- c.gridwidth = 1;
- c.gridheight = 10;
- c.weightx = 1;
- c.weighty = 1;
- add(pane, c);
-
- int y = 0;
-
- zoom_label = new JLabel("", JLabel.CENTER);
- set_zoom_label();
-
- c = new GridBagConstraints();
- c.anchor = GridBagConstraints.CENTER;
- c.fill = GridBagConstraints.HORIZONTAL;
- c.gridx = 1;
- c.gridy = y++;
- c.weightx = 0;
- c.weighty = 0;
- add(zoom_label, c);
-
- JButton zoom_reset = new JButton("0");
- zoom_reset.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- set_zoom(default_zoom);
- }
- });
-
- c = new GridBagConstraints();
- c.anchor = GridBagConstraints.CENTER;
- c.fill = GridBagConstraints.HORIZONTAL;
- c.gridx = 1;
- c.gridy = y++;
- c.weightx = 0;
- c.weighty = 0;
- add(zoom_reset, c);
-
- JButton zoom_in = new JButton("+");
- zoom_in.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- set_zoom(get_zoom() + 1);
- }
- });
-
- c = new GridBagConstraints();
- c.anchor = GridBagConstraints.CENTER;
- c.fill = GridBagConstraints.HORIZONTAL;
- c.gridx = 1;
- c.gridy = y++;
- c.weightx = 0;
- c.weighty = 0;
- add(zoom_in, c);
-
- JButton zoom_out = new JButton("-");
- zoom_out.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- set_zoom(get_zoom() - 1);
- }
- });
- c = new GridBagConstraints();
- c.anchor = GridBagConstraints.CENTER;
- c.fill = GridBagConstraints.HORIZONTAL;
- c.gridx = 1;
- c.gridy = y++;
- c.weightx = 0;
- c.weighty = 0;
- add(zoom_out, c);
-
- maptype_combo = new JComboBox<String>(maptype_labels);
-
- maptype_combo.setEditable(false);
- maptype_combo.setMaximumRowCount(maptype_combo.getItemCount());
- maptype_combo.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- maptype = maptype_combo.getSelectedIndex();
- if (base_location_set)
- initMaps(lat, lon);
- redraw();
- }
- });
-
- c = new GridBagConstraints();
- c.anchor = GridBagConstraints.CENTER;
- c.fill = GridBagConstraints.HORIZONTAL;
- c.gridx = 1;
- c.gridy = y++;
- c.weightx = 0;
- c.weighty = 0;
- add(maptype_combo, c);
- }
-
- public AltosSiteMap() {
- this(1);
- }
-}
+++ /dev/null
-/*
- * Copyright © 2010 Anthony Towns <aj@erisian.com.au>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-package org.altusmetrum.altosuilib_2;
-
-import javax.swing.*;
-import javax.imageio.ImageIO;
-import java.awt.image.*;
-import java.awt.*;
-import java.io.*;
-import java.net.*;
-
-public class AltosSiteMapCache {
- static final long google_maps_ratelimit_ms = 1200;
- // Google limits static map queries to 50 per minute per IP, so
- // each query should take at least 1.2 seconds.
-
- static final int success = 0;
- static final int loading = 1;
- static final int failed = 2;
- static final int bad_request = 3;
- static final int forbidden = 4;
-
- public static boolean has_map(File file, String url) {
- return file.exists();
- }
-
- static long forbidden_time;
- static boolean forbidden_set = false;
- static final long forbidden_interval = 60l * 1000l * 1000l * 1000l;
-
- static private Object fetch_lock = new Object();
-
- private static int fetch_one(File file, String url) {
- URL u;
-
- try {
- u = new URL(url);
- } catch (java.net.MalformedURLException e) {
- return bad_request;
- }
-
- byte[] data;
- URLConnection uc = null;
- try {
- uc = u.openConnection();
- String type = uc.getContentType();
- int contentLength = uc.getContentLength();
- if (uc instanceof HttpURLConnection) {
- int response = ((HttpURLConnection) uc).getResponseCode();
- switch (response) {
- case HttpURLConnection.HTTP_FORBIDDEN:
- case HttpURLConnection.HTTP_PAYMENT_REQUIRED:
- case HttpURLConnection.HTTP_UNAUTHORIZED:
- forbidden_time = System.nanoTime();
- forbidden_set = true;
- return forbidden;
- }
- }
- InputStream in = new BufferedInputStream(uc.getInputStream());
- int bytesRead = 0;
- int offset = 0;
- data = new byte[contentLength];
- while (offset < contentLength) {
- bytesRead = in.read(data, offset, data.length - offset);
- if (bytesRead == -1)
- break;
- offset += bytesRead;
- }
- in.close();
-
- if (offset != contentLength)
- return failed;
-
- } catch (IOException e) {
- return failed;
- }
-
- try {
- FileOutputStream out = new FileOutputStream(file);
- out.write(data);
- out.flush();
- out.close();
- } catch (FileNotFoundException e) {
- return bad_request;
- } catch (IOException e) {
- if (file.exists())
- file.delete();
- return bad_request;
- }
- return success;
- }
-
- public static int fetch_map(File file, String url) {
- if (file.exists())
- return success;
-
- if (forbidden_set && (System.nanoTime() - forbidden_time) < forbidden_interval)
- return forbidden;
-
- int status = bad_request;
-
- if (!AltosUIVersion.has_google_maps_api_key()) {
- synchronized (fetch_lock) {
- long startTime = System.nanoTime();
- status = fetch_one(file, url);
- if (status == success) {
- long duration_ms = (System.nanoTime() - startTime) / 1000000;
- if (duration_ms < google_maps_ratelimit_ms) {
- try {
- Thread.sleep(google_maps_ratelimit_ms - duration_ms);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- }
- }
- }
- } else {
- status = fetch_one(file, url);
- }
- return status;
- }
-
- static final int min_cache_size = 9;
- static final int max_cache_size = 24;
-
- static int cache_size = min_cache_size;
-
- static AltosSiteMapImage[] images = new AltosSiteMapImage[cache_size];
-
- static Object cache_lock = new Object();
-
- public static void set_cache_size(int new_size) {
- if (new_size < min_cache_size)
- new_size = min_cache_size;
- if (new_size > max_cache_size)
- new_size = max_cache_size;
- if (new_size == cache_size)
- return;
-
- synchronized(cache_lock) {
- AltosSiteMapImage[] new_images = new AltosSiteMapImage[new_size];
-
- for (int i = 0; i < cache_size; i++) {
- if (i < new_size)
- new_images[i] = images[i];
- else if (images[i] != null)
- images[i].flush();
- }
- images = new_images;
- cache_size = new_size;
- }
- }
-
- static long used;
-
- private static Point tile_loc(AltosSiteMapTile tile) {
- Rectangle r = tile.getBounds();
- int x = r.x / 512;
- int y = r.y / 512;
-
- return new Point (x, y);
- }
-
-/*
- private static void dump_cache() {
- int min_x = 1000, max_x = -1000, min_y = 1000, max_y = -1000;
-
- for (int i = 0; i < cache_size; i++) {
- AltosSiteMapImage image = images[i];
- if (image != null) {
- Point p = tile_loc(image.tile);
- min_x = min_x < p.x ? min_x : p.x;
- max_x = max_x > p.x ? max_x : p.x;
- min_y = min_y < p.y ? min_y : p.y;
- max_y = max_y > p.y ? max_y : p.y;
- System.out.printf ("entry %d %d,%d used %d\n", i, p.x, p.y, image.used);
- } else {
- System.out.printf ("entry %d empty\n", i);
- }
- }
-
- int[][] map = new int[max_x - min_x + 1][max_y - min_y + 1];
- for (int i = 0; i < cache_size; i++) {
- AltosSiteMapImage image = images[i];
- if (image != null) {
- Point p = tile_loc(image.tile);
- map[p.x - min_x][p.y - min_y]++;
- }
- }
-
- for (int y = min_y; y <= max_y; y++) {
- for (int x = min_x; x <= max_x; x++)
- System.out.printf (" %2d", map[x - min_x][y - min_y]);
- System.out.printf("\n");
- }
- }
-*/
-
- public static AltosSiteMapImage get_image(AltosSiteMapTile tile, File file, int width, int height) {
- int oldest = -1;
- long age = used;
-
- synchronized(cache_lock) {
- AltosSiteMapImage image = null;
- for (int i = 0; i < cache_size; i++) {
- image = images[i];
-
- if (image == null) {
- oldest = i;
- break;
- }
- if (image.tile == tile && file.equals(image.file)) {
- image.used = used++;
- return image;
- }
- if (image.used < age) {
- oldest = i;
- age = image.used;
- }
- }
-
- try {
- image = new AltosSiteMapImage(tile, file, width, height);
- image.used = used++;
- if (images[oldest] != null) {
-// dump_cache();
- AltosSiteMap.debug_component(images[oldest].tile, "replacing cache");
- AltosSiteMap.debug_component(tile, "replaced cache");
- images[oldest].flush();
- }
- images[oldest] = image;
- return image;
- } catch (IOException e) {
- return null;
- }
- }
- }
-}
+++ /dev/null
-/*
- * Copyright © 2014 Keith Packard <keithp@keithp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-package org.altusmetrum.altosuilib_2;
-
-import java.awt.*;
-import java.awt.image.*;
-import javax.imageio.ImageIO;
-import javax.swing.*;
-import java.io.*;
-import org.altusmetrum.altoslib_4.*;
-
-public class AltosSiteMapImage {
- AltosSiteMapTile tile;
- File file;
- BufferedImage image;
- int width;
- int height;
- long used;
-
- Thread load_thread;
-
- public boolean validate(final int serial) {
- if (image != null) {
- AltosSiteMap.debug_component(tile, "valid");
- return true;
- } else {
- AltosSiteMap.debug_component(tile, "loading");
- load_thread = new Thread() {
- public void run() {
- try {
- image = ImageIO.read(file);
- } catch (Exception e) {
- }
- SwingUtilities.invokeLater( new Runnable() {
- public void run() {
- AltosSiteMap.debug_component(tile, file.toString());
- Graphics2D g2d = (Graphics2D) tile.getGraphics();
- if (g2d != null)
- tile.paint_graphics(g2d, image, serial);
- load_thread = null;
- }
- });
- }
- };
- load_thread.start();
- return false;
- }
- }
-
- public void flush() {
- if (load_thread == null) {
- AltosSiteMap.debug_component(tile, "flush");
- image.flush();
- image = null;
- }
- }
-
- public AltosSiteMapImage (AltosSiteMapTile tile, File file, int w, int h) throws IOException {
- this.tile = tile;
- this.file = file;
- width = w;
- height = h;
- image = null;
- used = 0;
- }
-}
-
+++ /dev/null
-/*
- * Copyright © 2011 Keith Packard <keithp@keithp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-package org.altusmetrum.altosuilib_2;
-
-import java.awt.*;
-import java.awt.event.*;
-import javax.swing.*;
-import java.io.*;
-import java.util.*;
-import java.text.*;
-import java.lang.Math;
-import java.net.URL;
-import java.net.URLConnection;
-import org.altusmetrum.altoslib_4.*;
-
-class AltosMapPos extends Box {
- AltosUIFrame owner;
- JLabel label;
- JComboBox hemi;
- JTextField deg;
- JLabel deg_label;
- JTextField min;
- JLabel min_label;
-
- public void set_value(double new_value) {
- double d, m;
- int h;
-
- h = 0;
- if (new_value < 0) {
- h = 1;
- new_value = -new_value;
- }
- d = Math.floor(new_value);
- deg.setText(String.format("%3.0f", d));
- m = (new_value - d) * 60.0;
- min.setText(String.format("%7.4f", m));
- hemi.setSelectedIndex(h);
- }
-
- public double get_value() throws NumberFormatException {
- int h = hemi.getSelectedIndex();
- String d_t = deg.getText();
- String m_t = min.getText();
- double d, m, v;
- try {
- d = Double.parseDouble(d_t);
- } catch (NumberFormatException ne) {
- JOptionPane.showMessageDialog(owner,
- String.format("Invalid degrees \"%s\"",
- d_t),
- "Invalid number",
- JOptionPane.ERROR_MESSAGE);
- throw ne;
- }
- try {
- if (m_t.equals(""))
- m = 0;
- else
- m = Double.parseDouble(m_t);
- } catch (NumberFormatException ne) {
- JOptionPane.showMessageDialog(owner,
- String.format("Invalid minutes \"%s\"",
- m_t),
- "Invalid number",
- JOptionPane.ERROR_MESSAGE);
- throw ne;
- }
- v = d + m/60.0;
- if (h == 1)
- v = -v;
- return v;
- }
-
- public AltosMapPos(AltosUIFrame in_owner,
- String label_value,
- String[] hemi_names,
- double default_value) {
- super(BoxLayout.X_AXIS);
- owner = in_owner;
- label = new JLabel(label_value);
- hemi = new JComboBox<String>(hemi_names);
- hemi.setEditable(false);
- deg = new JTextField(5);
- deg.setMinimumSize(deg.getPreferredSize());
- deg.setHorizontalAlignment(JTextField.RIGHT);
- deg_label = new JLabel("°");
- min = new JTextField(9);
- min.setMinimumSize(min.getPreferredSize());
- min_label = new JLabel("'");
- set_value(default_value);
- add(label);
- add(Box.createRigidArea(new Dimension(5, 0)));
- add(hemi);
- add(Box.createRigidArea(new Dimension(5, 0)));
- add(deg);
- add(Box.createRigidArea(new Dimension(5, 0)));
- add(deg_label);
- add(Box.createRigidArea(new Dimension(5, 0)));
- add(min);
- add(Box.createRigidArea(new Dimension(5, 0)));
- add(min_label);
- }
-}
-
-class AltosSite {
- String name;
- double latitude;
- double longitude;
-
- public String toString() {
- return name;
- }
-
- public AltosSite(String in_name, double in_latitude, double in_longitude) {
- name = in_name;
- latitude = in_latitude;
- longitude = in_longitude;
- }
-
- public AltosSite(String line) throws ParseException {
- String[] elements = line.split(":");
-
- if (elements.length < 3)
- throw new ParseException(String.format("Invalid site line %s", line), 0);
-
- name = elements[0];
-
- try {
- latitude = Double.parseDouble(elements[1]);
- longitude = Double.parseDouble(elements[2]);
- } catch (NumberFormatException ne) {
- throw new ParseException(String.format("Invalid site line %s", line), 0);
- }
- }
-}
-
-class AltosSites extends Thread {
- AltosSiteMapPreload preload;
- URL url;
- LinkedList<AltosSite> sites;
-
- void notify_complete() {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- preload.set_sites();
- }
- });
- }
-
- void add(AltosSite site) {
- sites.add(site);
- }
-
- void add(String line) {
- try {
- add(new AltosSite(line));
- } catch (ParseException pe) {
- }
- }
-
- public void run() {
- try {
- URLConnection uc = url.openConnection();
- //int length = uc.getContentLength();
-
- InputStreamReader in_stream = new InputStreamReader(uc.getInputStream(), AltosLib.unicode_set);
- BufferedReader in = new BufferedReader(in_stream);
-
- for (;;) {
- String line = in.readLine();
- if (line == null)
- break;
- add(line);
- }
- } catch (IOException e) {
- } finally {
- notify_complete();
- }
- }
-
- public AltosSites(AltosSiteMapPreload in_preload) {
- sites = new LinkedList<AltosSite>();
- preload = in_preload;
- try {
- url = new URL(AltosLib.launch_sites_url);
- } catch (java.net.MalformedURLException e) {
- notify_complete();
- }
- start();
- }
-}
-
-public class AltosSiteMapPreload extends AltosUIFrame implements ActionListener, ItemListener {
- AltosUIFrame owner;
- AltosSiteMap map;
-
- AltosMapPos lat;
- AltosMapPos lon;
-
- JProgressBar pbar;
- int pbar_max;
-
- AltosSites sites;
- JLabel site_list_label;
- JComboBox<AltosSite> site_list;
-
- JToggleButton load_button;
- boolean loading;
- JButton close_button;
-
- JCheckBox[] maptypes = new JCheckBox[AltosSiteMap.maptype_terrain - AltosSiteMap.maptype_hybrid + 1];
-
- JComboBox<Integer> min_zoom;
- JComboBox<Integer> max_zoom;
- JComboBox<Integer> radius;
-
- Integer[] zooms = { -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6 };
- Integer[] radii = { 1, 2, 3, 4, 5 };
-
- static final String[] lat_hemi_names = { "N", "S" };
- static final String[] lon_hemi_names = { "E", "W" };
-
- class updatePbar implements Runnable {
- int n;
- String s;
-
- public updatePbar(int n, String in_s) {
- this.n = n;
- s = in_s;
- }
-
- public void run() {
- pbar.setValue(n);
- pbar.setString(s);
- if (n < pbar_max) {
- pbar.setMaximum(pbar_max);
- pbar.setValue(n);
- pbar.setString(s);
- } else {
- pbar.setValue(0);
- pbar.setString("");
- load_button.setSelected(false);
- loading = false;
- }
- }
- }
-
- class bgLoad extends Thread {
-
- AltosSiteMap map;
-
- double lat, lon;
-
- int types = 0;
- int r;
-
- int min_z = (Integer) min_zoom.getSelectedItem();
- int max_z = (Integer) max_zoom.getSelectedItem();
-
- public bgLoad(AltosSiteMap in_map, double lat, double lon) {
- map = in_map;
- this.lat = lat;
- this.lon = lon;
- if (max_z < min_z)
- max_z = min_z;
- int ntype = 0;
- for (int t = AltosSiteMap.maptype_hybrid; t <= AltosSiteMap.maptype_terrain; t++)
- if (maptypes[t].isSelected()) {
- types |= (1 << t);
- ntype++;
- }
- if (ntype == 0) {
- types |= (1 << AltosSiteMap.maptype_hybrid);
- ntype = 1;
- }
- r = (Integer) radius.getSelectedItem();
- pbar_max = (max_z - min_z + 1) * ntype * (r * 2 + 1) * (r * 2 + 1);
- }
-
- public void run() {
- int i = 0;
- for (int z = min_z; z <= max_z; z++) {
- for (int t = AltosSiteMap.maptype_hybrid; t <= AltosSiteMap.maptype_terrain; t++) {
- if ((types & (1 << t)) == 0)
- continue;
- map.clear_base_location();
- map.set_zoom(z + AltosSiteMap.default_zoom);
- map.set_maptype(t);
- map.set_radius(r);
- map.setBaseLocation(lat, lon);
- map.draw_circle(lat, lon);
- for (int y = -r; y <= r; y++) {
- for (int x = -r; x <= r; x++) {
- File pngfile;
- pngfile = map.init_map(new Point(x,y),
- AltosSiteMap.load_mode_cached|AltosSiteMap.load_mode_uncached);
- SwingUtilities.invokeLater(new updatePbar(++i, pngfile.toString()));
- }
- }
- }
- }
- }
- }
-
- public void set_sites() {
- int i = 1;
- for (AltosSite site : sites.sites) {
- site_list.insertItemAt(site, i);
- i++;
- }
- }
-
- public void itemStateChanged(ItemEvent e) {
- int state = e.getStateChange();
-
- if (state == ItemEvent.SELECTED) {
- Object o = e.getItem();
- if (o instanceof AltosSite) {
- AltosSite site = (AltosSite) o;
- lat.set_value(site.latitude);
- lon.set_value(site.longitude);
- }
- }
- }
-
- public void actionPerformed(ActionEvent e) {
- String cmd = e.getActionCommand();
-
- if (cmd.equals("close"))
- setVisible(false);
-
- if (cmd.equals("load")) {
- if (!loading) {
- try {
- final double latitude = lat.get_value();
- final double longitude = lon.get_value();
- map.clear_base_location();
- map.setBaseLocation(latitude,longitude);
- map.draw_circle(latitude,longitude);
- loading = true;
- bgLoad thread = new bgLoad(map, latitude, longitude);
- thread.start();
- } catch (NumberFormatException ne) {
- load_button.setSelected(false);
- }
- }
- }
- }
-
- public AltosSiteMapPreload(AltosUIFrame in_owner) {
- owner = in_owner;
-
- Container pane = getContentPane();
- GridBagConstraints c = new GridBagConstraints();
- Insets i = new Insets(4,4,4,4);
-
- setTitle("AltOS Load Maps");
-
- pane.setLayout(new GridBagLayout());
-
- map = new AltosSiteMap(2);
-
- c.fill = GridBagConstraints.BOTH;
- c.anchor = GridBagConstraints.CENTER;
- c.insets = i;
- c.weightx = 1;
- c.weighty = 1;
-
- c.gridx = 0;
- c.gridy = 0;
- c.gridwidth = 10;
- c.anchor = GridBagConstraints.CENTER;
-
- pane.add(map, c);
-
- pbar = new JProgressBar();
- pbar.setMinimum(0);
- pbar.setMaximum(1);
- pbar.setValue(0);
- pbar.setString("");
- pbar.setStringPainted(true);
-
- c.fill = GridBagConstraints.HORIZONTAL;
- c.anchor = GridBagConstraints.CENTER;
- c.insets = i;
- c.weightx = 1;
- c.weighty = 0;
-
- c.gridx = 0;
- c.gridy = 1;
- c.gridwidth = 10;
-
- pane.add(pbar, c);
-
- site_list_label = new JLabel ("Known Launch Sites:");
-
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.CENTER;
- c.insets = i;
- c.weightx = 1;
- c.weighty = 0;
-
- c.gridx = 0;
- c.gridy = 2;
- c.gridwidth = 1;
-
- pane.add(site_list_label, c);
-
- site_list = new JComboBox<AltosSite>(new AltosSite[] { new AltosSite("Site List", 0, 0) });
- site_list.addItemListener(this);
-
- sites = new AltosSites(this);
-
- c.fill = GridBagConstraints.HORIZONTAL;
- c.anchor = GridBagConstraints.CENTER;
- c.insets = i;
- c.weightx = 1;
- c.weighty = 0;
-
- c.gridx = 1;
- c.gridy = 2;
- c.gridwidth = 1;
-
- pane.add(site_list, c);
-
- lat = new AltosMapPos(owner,
- "Latitude:",
- lat_hemi_names,
- 37.167833333);
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.CENTER;
- c.insets = i;
- c.weightx = 0;
- c.weighty = 0;
-
- c.gridx = 0;
- c.gridy = 3;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.CENTER;
-
- pane.add(lat, c);
-
- lon = new AltosMapPos(owner,
- "Longitude:",
- lon_hemi_names,
- -97.73975);
-
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.CENTER;
- c.insets = i;
- c.weightx = 0;
- c.weighty = 0;
-
- c.gridx = 1;
- c.gridy = 3;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.CENTER;
-
- pane.add(lon, c);
-
- load_button = new JToggleButton("Load Map");
- load_button.addActionListener(this);
- load_button.setActionCommand("load");
-
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.CENTER;
- c.insets = i;
- c.weightx = 1;
- c.weighty = 0;
-
- c.gridx = 0;
- c.gridy = 4;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.CENTER;
-
- pane.add(load_button, c);
-
- close_button = new JButton("Close");
- close_button.addActionListener(this);
- close_button.setActionCommand("close");
-
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.CENTER;
- c.insets = i;
- c.weightx = 1;
- c.weighty = 0;
-
- c.gridx = 1;
- c.gridy = 4;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.CENTER;
-
- pane.add(close_button, c);
-
- JLabel types_label = new JLabel("Map Types");
- c.gridx = 2;
- c.gridwidth = 2;
- c.gridy = 2;
- pane.add(types_label, c);
-
- c.gridwidth = 1;
-
- for (int type = AltosSiteMap.maptype_hybrid; type <= AltosSiteMap.maptype_terrain; type++) {
- maptypes[type] = new JCheckBox(AltosSiteMap.maptype_labels[type],
- type == AltosSiteMap.maptype_hybrid);
- c.gridx = 2 + (type >> 1);
- c.fill = GridBagConstraints.HORIZONTAL;
- c.gridy = (type & 1) + 3;
- pane.add(maptypes[type], c);
- }
-
- JLabel min_zoom_label = new JLabel("Minimum Zoom");
- c.gridx = 4;
- c.gridy = 2;
- pane.add(min_zoom_label, c);
-
- min_zoom = new JComboBox<Integer>(zooms);
- min_zoom.setSelectedItem(zooms[10]);
- min_zoom.setEditable(false);
- c.gridx = 5;
- c.gridy = 2;
- pane.add(min_zoom, c);
-
- JLabel max_zoom_label = new JLabel("Maximum Zoom");
- c.gridx = 4;
- c.gridy = 3;
- pane.add(max_zoom_label, c);
-
- max_zoom = new JComboBox<Integer>(zooms);
- max_zoom.setSelectedItem(zooms[14]);
- max_zoom.setEditable(false);
- c.gridx = 5;
- c.gridy = 3;
- pane.add(max_zoom, c);
-
- JLabel radius_label = new JLabel("Tile Radius");
- c.gridx = 4;
- c.gridy = 4;
- pane.add(radius_label, c);
-
- radius = new JComboBox<Integer>(radii);
- radius.setSelectedItem(radii[4]);
- radius.setEditable(true);
- c.gridx = 5;
- c.gridy = 4;
- pane.add(radius, c);
-
- pack();
- setLocationRelativeTo(owner);
- setVisible(true);
- }
-}
+++ /dev/null
-/*
- * Copyright © 2010 Anthony Towns <aj@erisian.com.au>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-package org.altusmetrum.altosuilib_2;
-
-import java.awt.*;
-import java.awt.image.*;
-import javax.swing.*;
-import javax.imageio.*;
-import java.awt.geom.*;
-import java.io.*;
-import java.util.*;
-import java.awt.RenderingHints.*;
-import org.altusmetrum.altoslib_4.*;
-
-class AltosPoint {
- Point2D.Double pt;
- int state;
-
- AltosPoint(Point2D.Double pt, int state) {
- this.pt = pt;
- this.state = state;
- }
-}
-
-public class AltosSiteMapTile extends JComponent {
- int px_size;
- File file;
- int status;
-
- Point2D.Double boost;
- Point2D.Double landed;
- Line2D.Double line;
- double line_course;
- double line_dist;
-
- LinkedList<AltosPoint> points;
-
- public synchronized void queue_repaint() {
- if (SwingUtilities.isEventDispatchThread())
- repaint();
- else {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- repaint();
- }
- });
- }
- }
-
- public void load_map(File pngFile) {
- file = pngFile;
- queue_repaint();
- }
-
- private Font font = null;
-
- public void set_font(Font font) {
- this.font = font;
- this.status = AltosSiteMapCache.success;
- }
-
- public void set_status(int status) {
- if (status != this.status || file != null) {
- file = null;
- this.status = status;
- queue_repaint();
- }
- }
-
- public void clearMap() {
- boost = null;
- landed = null;
- points = null;
- file = null;
- status = AltosSiteMapCache.success;
- line = null;
- }
-
- static Color stateColors[] = {
- Color.WHITE, // startup
- Color.WHITE, // idle
- Color.WHITE, // pad
- Color.RED, // boost
- Color.PINK, // fast
- Color.YELLOW, // coast
- Color.CYAN, // drogue
- Color.BLUE, // main
- Color.BLACK // landed
- };
-
- private void draw_circle(Graphics g, Point2D.Double pt) {
- g.drawOval((int)pt.x-5, (int)pt.y-5, 10, 10);
- g.drawOval((int)pt.x-20, (int)pt.y-20, 40, 40);
- g.drawOval((int)pt.x-35, (int)pt.y-35, 70, 70);
- }
-
- public void set_boost(Point2D.Double boost) {
- this.boost = boost;
- queue_repaint();
- }
-
- public void set_line(Line2D.Double line, double distance) {
- this.line = line;
- line_dist = distance;
- queue_repaint();
- }
-
- private String line_dist() {
- String format;
- double distance = line_dist;
-
- if (AltosConvert.imperial_units) {
- distance = AltosConvert.meters_to_feet(distance);
- if (distance < 10000) {
- format = "%4.0fft";
- } else {
- distance /= 5280;
- if (distance < 10)
- format = "%5.3fmi";
- else if (distance < 100)
- format = "%5.2fmi";
- else if (distance < 1000)
- format = "%5.1fmi";
- else
- format = "%5.0fmi";
- }
- } else {
- if (distance < 10000) {
- format = "%4.0fm";
- } else {
- distance /= 1000;
- if (distance < 100)
- format = "%5.2fkm";
- else if (distance < 1000)
- format = "%5.1fkm";
- else
- format = "%5.0fkm";
- }
- }
- return String.format(format, distance);
- }
-
- int painting_serial;
- int painted_serial;
-
- public void paint_graphics(Graphics2D g2d, Image image, int serial) {
-
- if (serial < painted_serial)
- return;
-
- painted_serial = serial;
-
- if (image != null) {
- AltosSiteMap.debug_component(this, "paint_graphics");
- g2d.drawImage(image, 0, 0, null);
- } else {
- AltosSiteMap.debug_component(this, "erase_graphics");
- g2d.setColor(Color.GRAY);
- g2d.fillRect(0, 0, getWidth(), getHeight());
- String message = null;
- switch (status) {
- case AltosSiteMapCache.loading:
- message = "Loading...";
- break;
- case AltosSiteMapCache.bad_request:
- message = "Internal error";
- break;
- case AltosSiteMapCache.failed:
- message = "Network error, check connection";
- break;
- case AltosSiteMapCache.forbidden:
- message = "Too many requests, try later";
- break;
- }
- if (message != null && font != null) {
- g2d.setFont(font);
- g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
- Rectangle2D bounds;
- bounds = font.getStringBounds(message, g2d.getFontRenderContext());
-
- float x = getWidth() / 2.0f;
- float y = getHeight() / 2.0f;
- x = x - (float) bounds.getWidth() / 2.0f;
- y = y + (float) bounds.getHeight() / 2.0f;
- g2d.setColor(Color.BLACK);
- g2d.drawString(message, x, y);
- }
- }
-
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_ON);
- g2d.setStroke(new BasicStroke(6, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
-
- if (points != null) {
- AltosPoint prev = null;
- for (AltosPoint point : points) {
- if (prev != null) {
- if (0 <= point.state && point.state < stateColors.length)
- g2d.setColor(stateColors[point.state]);
- g2d.draw(new Line2D.Double(prev.pt, point.pt));
- }
- prev = point;
- }
- }
- if (boost != null) {
- g2d.setColor(Color.RED);
- draw_circle(g2d, boost);
- }
- if (landed != null) {
- g2d.setColor(Color.BLACK);
- draw_circle(g2d, landed);
- }
-
- if (line != null) {
- g2d.setColor(Color.BLUE);
- g2d.draw(line);
-
- String message = line_dist();
- g2d.setFont(font);
- g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
- Rectangle2D bounds;
- bounds = font.getStringBounds(message, g2d.getFontRenderContext());
-
- float x = (float) line.x1;
- float y = (float) line.y1 + (float) bounds.getHeight() / 2.0f;
-
- if (line.x1 < line.x2) {
- x -= (float) bounds.getWidth() + 2.0f;
- } else {
- x += 2.0f;
- }
- g2d.drawString(message, x, y);
- }
- }
-
- public void paint(Graphics g) {
- Graphics2D g2d = (Graphics2D) g;
- Image image = null;
- boolean queued = false;
-
- AltosSiteMap.debug_component(this, "paint");
-
- ++painting_serial;
-
- if (file != null) {
- AltosSiteMapImage aimage;
-
- aimage = AltosSiteMapCache.get_image(this, file, px_size, px_size);
- if (aimage != null) {
- if (aimage.validate(painting_serial))
- image = aimage.image;
- else
- queued = true;
- }
- }
- if (!queued)
- paint_graphics(g2d, image, painting_serial);
- }
-
- public void show(int state, Point2D.Double last_pt, Point2D.Double pt)
- {
- if (points == null)
- points = new LinkedList<AltosPoint>();
-
- points.add(new AltosPoint(pt, state));
-
- if (state == AltosLib.ao_flight_boost && boost == null)
- boost = pt;
- if (state == AltosLib.ao_flight_landed && landed == null)
- landed = pt;
- queue_repaint();
- }
-
- public AltosSiteMapTile(int in_px_size) {
- px_size = in_px_size;
- setPreferredSize(new Dimension(px_size, px_size));
- }
-}