altos/telefireone-v2.0: Remove build of ao_product.h from Makefile
[fw/altos] / altoslib / AltosMapTile.java
index 923b7c6bf7127611c24d28dbb086ebf144eac29e..6318c40d0c46a66ed0078859ae26818a0b348585 100644 (file)
@@ -3,7 +3,8 @@
  *
  * 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.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_6;
+package org.altusmetrum.altoslib_13;
 
 import java.io.*;
 import java.util.*;
 
-public abstract class AltosMapTile implements AltosFontListener {
-       AltosMapTileListener    listener;
-       AltosLatLon     upper_left, center;
-       int             px_size;
+public class AltosMapTile implements AltosFontListener, AltosMapStoreListener {
+       LinkedList<AltosMapTileListener>        listeners = new LinkedList<AltosMapTileListener>();
+       public AltosLatLon      upper_left, center;
+       public int              px_size;
        int             zoom;
        int             maptype;
-       AltosMapStore   store;
-       AltosMapCache   cache;
-       int             status;
-
-       static public final int success = 0;
-       static public final int loading = 1;
-       static public final int failed = 2;
-       static public final int bad_request = 3;
-       static public final int forbidden = 4;
-
-       private File map_file() {
-               double lat = center.lat;
-               double lon = center.lon;
-               char chlat = lat < 0 ? 'S' : 'N';
-               char chlon = lon < 0 ? 'W' : 'E';
-
-               if (lat < 0) lat = -lat;
-               if (lon < 0) lon = -lon;
-               String maptype_string = String.format("%s-", AltosMap.maptype_names[maptype]);
-               String format_string;
-               if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain)
-                       format_string = "jpg";
-               else
-                       format_string = "png";
-               return new File(AltosPreferences.mapdir(),
-                               String.format("map-%c%.6f,%c%.6f-%s%d.%s",
-                                             chlat, lat, chlon, lon, maptype_string, zoom, format_string));
-       }
-
-       private String map_url() {
-               String format_string;
-               if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain)
-                       format_string = "jpg";
-               else
-                       format_string = "png32";
-
-               if (AltosVersion.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",
-                                            center.lat, center.lon, zoom, px_size, px_size, AltosMap.maptype_names[maptype], format_string, AltosVersion.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",
-                                            center.lat, center.lon, zoom, px_size, px_size, AltosMap.maptype_names[maptype], format_string);
+       int             scale;
+       private AltosMapCache   cache;
+       public AltosMapStore    store;
+       public int      status;
+
+       static public final int loaded = 0;     /* loaded from file */
+       static public final int fetched = 1;    /* downloaded to file */
+       static public final int fetching = 2;   /* downloading from net */
+       static public final int failed = 3;     /* loading from file failed */
+       static public final int bad_request = 4;/* downloading failed */
+       static public final int forbidden = 5;  /* downloading failed */
+
+       static public String status_name(int status) {
+               switch (status) {
+               case loaded:
+                       return "loaded";
+               case fetched:
+                       return "fetched";
+               case fetching:
+                       return "fetching";
+               case failed:
+                       return "failed";
+               case bad_request:
+                       return "bad_request";
+               case forbidden:
+                       return "forbidden";
+               default:
+                       return "unknown";
+               }
        }
 
        public void font_size_changed(int font_size) {
        }
 
-       public void set_status(int status) {
+       private synchronized void notify_listeners(int status) {
                this.status = status;
-               listener.notify_tile(this, status);
+               for (AltosMapTileListener listener : listeners)
+                       listener.notify_tile(this, status);
+       }
+
+       public void notify_store(AltosMapStore store, int status) {
+               notify_listeners(status);
        }
 
        public void notify_image(AltosImage image) {
-               listener.notify_tile(this, status);
+               if (image == null)
+                       status = failed;
+               else
+                       status = loaded;
+               notify_listeners(status);
        }
 
-       public int store_status() {
-               return store.status();
+       public void paint(AltosMapTransform t) {
        }
 
-       public void add_store_listener(AltosMapStoreListener listener) {
-               store.add_listener(listener);
+       public AltosImage get_image() {
+               if (cache == null)
+                       return null;
+               return cache.get(this);
        }
 
-       public void remove_store_listener(AltosMapStoreListener listener) {
-               store.remove_listener(listener);
+       public synchronized void add_listener(AltosMapTileListener listener) {
+               if (!listeners.contains(listener))
+                       listeners.add(listener);
+               listener.notify_tile(this, status);
        }
 
-       public abstract void paint(AltosMapTransform t);
+       public synchronized void remove_listener(AltosMapTileListener listener) {
+               listeners.remove(listener);
+       }
 
-       public AltosMapTile(AltosMapTileListener listener, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) {
-               this.listener = listener;
+       public AltosMapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale) {
+               this.cache = cache;
                this.upper_left = upper_left;
 
                while (center.lon < -180.0)
@@ -109,8 +111,9 @@ public abstract class AltosMapTile implements AltosFontListener {
                this.zoom = zoom;
                this.maptype = maptype;
                this.px_size = px_size;
+               this.scale = scale;
 
-               status = AltosMapTile.loading;
-               store = AltosMapStore.get(map_url(), map_file());
+               store = AltosMapStore.get(center, zoom, maptype, px_size, scale);
+               store.add_listener(this);
        }
 }