altosuilib: Remove old widget-based map UI
authorKeith Packard <keithp@keithp.com>
Thu, 12 Jun 2014 01:51:19 +0000 (18:51 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 12 Jun 2014 01:51:19 +0000 (18:51 -0700)
Signed-off-by: Keith Packard <keithp@keithp.com>
altosuilib/AltosSiteMap.java [deleted file]
altosuilib/AltosSiteMapCache.java [deleted file]
altosuilib/AltosSiteMapImage.java [deleted file]
altosuilib/AltosSiteMapPreload.java [deleted file]
altosuilib/AltosSiteMapTile.java [deleted file]

diff --git a/altosuilib/AltosSiteMap.java b/altosuilib/AltosSiteMap.java
deleted file mode 100644 (file)
index ed77bef..0000000
+++ /dev/null
@@ -1,892 +0,0 @@
-/*
- * 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);
-       }
-}
diff --git a/altosuilib/AltosSiteMapCache.java b/altosuilib/AltosSiteMapCache.java
deleted file mode 100644 (file)
index 51778ce..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * 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;
-                       }
-               }
-       }
-}
diff --git a/altosuilib/AltosSiteMapImage.java b/altosuilib/AltosSiteMapImage.java
deleted file mode 100644 (file)
index f1cfa7c..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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;
-       }
-}
-
diff --git a/altosuilib/AltosSiteMapPreload.java b/altosuilib/AltosSiteMapPreload.java
deleted file mode 100644 (file)
index ed7ecbd..0000000
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * 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);
-       }
-}
diff --git a/altosuilib/AltosSiteMapTile.java b/altosuilib/AltosSiteMapTile.java
deleted file mode 100644 (file)
index f8b924a..0000000
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * 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));
-       }
-}