summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--altosuilib/AltosUIConfigure.java26
-rw-r--r--altosuilib/AltosUIMapCache.java45
-rw-r--r--altosuilib/AltosUIMapCacheListener.java22
-rw-r--r--altosuilib/AltosUIMapView.java2
-rw-r--r--altosuilib/AltosUIPreferences.java38
-rw-r--r--altosuilib/Makefile.am1
6 files changed, 125 insertions, 9 deletions
diff --git a/altosuilib/AltosUIConfigure.java b/altosuilib/AltosUIConfigure.java
index 9d54cfe5..5ab615e8 100644
--- a/altosuilib/AltosUIConfigure.java
+++ b/altosuilib/AltosUIConfigure.java
@@ -223,6 +223,31 @@ public class AltosUIConfigure
row++;
}
+ static final Integer map_caches[] = { 9, 25, 100 };
+
+ public void add_map_cache() {
+ pane.add(new JLabel("Map Cache Size"), constraints(0, 1));
+
+ final JComboBox<Integer> map_cache = new JComboBox<Integer>(map_caches);
+
+ map_cache.setEditable(true);
+ map_cache.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ try {
+ int size = (Integer) (map_cache.getSelectedItem());
+
+ AltosUIPreferences.set_map_cache(size);
+ } catch (ClassCastException ce) {
+ map_cache.setSelectedItem(new Integer(AltosUIPreferences.map_cache()));
+ }
+ }
+ });
+
+ map_cache.setSelectedItem (new Integer(AltosUIPreferences.map_cache()));
+ pane.add(map_cache, constraints(1, 2, GridBagConstraints.BOTH));
+ row++;
+ }
+
public void add_bluetooth() {
}
@@ -255,6 +280,7 @@ public class AltosUIConfigure
add_font_size();
add_look_and_feel();
add_position();
+ add_map_cache();
add_bluetooth();
add_frequencies();
diff --git a/altosuilib/AltosUIMapCache.java b/altosuilib/AltosUIMapCache.java
index 3f1512df..9cc32e24 100644
--- a/altosuilib/AltosUIMapCache.java
+++ b/altosuilib/AltosUIMapCache.java
@@ -24,33 +24,36 @@ import java.awt.*;
import java.io.*;
import java.net.*;
-public class AltosUIMapCache {
+public class AltosUIMapCache implements AltosUIMapCacheListener {
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;
- static final int min_cache_size = 9;
- static final int max_cache_size = 24;
+ int min_cache_size; /* configured minimum cache size */
+ int cache_size; /* current cache size */
+ int requested_cache_size; /* cache size computed by application */
private Object fetch_lock = new Object();
private Object cache_lock = new Object();
- int cache_size = min_cache_size;
-
AltosUIMapImage[] images = new AltosUIMapImage[cache_size];
long used;
public void set_cache_size(int new_size) {
+
+ requested_cache_size = 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;
+ System.out.printf("cache size now %d\n", new_size);
+
synchronized(cache_lock) {
AltosUIMapImage[] new_images = new AltosUIMapImage[new_size];
@@ -91,8 +94,12 @@ public class AltosUIMapCache {
try {
image = new AltosUIMapImage(tile, store);
image.used = used++;
- if (images[oldest] != null)
+ if (images[oldest] != null) {
+ System.out.printf("drop %s\n", images[oldest].store.file.toString());
images[oldest].flush();
+ }
+
+ System.out.printf("load %s\n", store.file.toString());
images[oldest] = image;
@@ -109,6 +116,28 @@ public class AltosUIMapCache {
}
}
+ public void map_cache_changed(int map_cache) {
+ min_cache_size = map_cache;
+
+ set_cache_size(requested_cache_size);
+ }
+
+ public void dispose() {
+ AltosUIPreferences.unregister_map_cache_listener(this);
+
+ for (int i = 0; i < cache_size; i++) {
+ AltosUIMapImage image = images[i];
+
+ if (image != null)
+ image.flush();
+ }
+ }
+
public AltosUIMapCache() {
+ min_cache_size = AltosUIPreferences.map_cache();
+
+ set_cache_size(0);
+
+ AltosUIPreferences.register_map_cache_listener(this);
}
}
diff --git a/altosuilib/AltosUIMapCacheListener.java b/altosuilib/AltosUIMapCacheListener.java
new file mode 100644
index 00000000..680d123e
--- /dev/null
+++ b/altosuilib/AltosUIMapCacheListener.java
@@ -0,0 +1,22 @@
+/*
+ * 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_3;
+
+public interface AltosUIMapCacheListener {
+ public void map_cache_changed(int map_cache);
+}
diff --git a/altosuilib/AltosUIMapView.java b/altosuilib/AltosUIMapView.java
index 1abd1731..34a85f52 100644
--- a/altosuilib/AltosUIMapView.java
+++ b/altosuilib/AltosUIMapView.java
@@ -370,7 +370,7 @@ public class AltosUIMapView extends Component implements MouseMotionListener, Mo
for (Point point : to_remove)
tiles.remove(point);
- cache.set_cache_size(((lower_right.y - upper_left.y) / px_size + 1) * ((lower_right.x - upper_left.x) / px_size + 1));
+ cache.set_cache_size((getWidth() / px_size + 2) * (getHeight() / px_size + 2));
for (int y = upper_left.y; y <= lower_right.y; y += px_size) {
for (int x = upper_left.x; x <= lower_right.x; x += px_size) {
Point point = new Point(x, y);
diff --git a/altosuilib/AltosUIPreferences.java b/altosuilib/AltosUIPreferences.java
index 509faaff..ecab20d4 100644
--- a/altosuilib/AltosUIPreferences.java
+++ b/altosuilib/AltosUIPreferences.java
@@ -34,6 +34,9 @@ public class AltosUIPreferences extends AltosPreferences {
/* Window position preference name */
final static String positionPreference = "POSITION";
+ /* Maps cache size preference name */
+ final static String mapCachePreference = "MAP-CACHE";
+
/* UI Component to pop dialogs up */
static Component component;
@@ -52,6 +55,10 @@ public class AltosUIPreferences extends AltosPreferences {
public static int position = AltosUILib.position_top_left;
+ static LinkedList<AltosUIMapCacheListener> map_cache_listeners;
+
+ public static int map_cache = 9;
+
public static void init() {
AltosPreferences.init(new AltosUIPreferencesBackend());
@@ -68,6 +75,9 @@ public class AltosUIPreferences extends AltosPreferences {
position = backend.getInt(positionPreference, AltosUILib.position_top_left);
position_listeners = new LinkedList<AltosPositionListener>();
+
+ map_cache = backend.getInt(mapCachePreference, 9);
+ map_cache_listeners = new LinkedList<AltosUIMapCacheListener>();
}
static { init(); }
@@ -215,4 +225,32 @@ public class AltosUIPreferences extends AltosPreferences {
return position;
}
}
+
+ public static void register_map_cache_listener(AltosUIMapCacheListener l) {
+ synchronized(backend) {
+ map_cache_listeners.add(l);
+ }
+ }
+
+ public static void unregister_map_cache_listener(AltosUIMapCacheListener l) {
+ synchronized (backend) {
+ map_cache_listeners.remove(l);
+ }
+ }
+
+ public static void set_map_cache(int new_map_cache) {
+ synchronized(backend) {
+ map_cache = new_map_cache;
+ backend.putInt(mapCachePreference, map_cache);
+ flush_preferences();
+ for (AltosUIMapCacheListener l: map_cache_listeners)
+ l.map_cache_changed(map_cache);
+ }
+ }
+
+ public static int map_cache() {
+ synchronized(backend) {
+ return map_cache;
+ }
+ }
}
diff --git a/altosuilib/Makefile.am b/altosuilib/Makefile.am
index bbee6a45..56b01ec5 100644
--- a/altosuilib/Makefile.am
+++ b/altosuilib/Makefile.am
@@ -68,6 +68,7 @@ altosuilib_JAVA = \
AltosUIMapPath.java \
AltosUIMapTile.java \
AltosUIMapCache.java \
+ AltosUIMapCacheListener.java \
AltosUIMapImage.java \
AltosUIMapTransform.java \
AltosUIMapRectangle.java \