altosuilib: Serialize access to async tile notify function in preload
[fw/altos] / altosuilib / AltosUIMapView.java
index edae3e1e906e2bc72201ffbdd39e2102110e06cd..a14fde6583e42cb64b938a49168dce22c751897f 100644 (file)
@@ -28,12 +28,14 @@ import java.util.*;
 import java.util.concurrent.*;
 import org.altusmetrum.altoslib_4.*;
 
-public class AltosUIMapView extends Canvas implements MouseMotionListener, MouseListener, MouseWheelListener, ComponentListener, AltosUIMapTileListener, AltosUIMapStoreListener {
+public class AltosUIMapView extends Component implements MouseMotionListener, MouseListener, MouseWheelListener, ComponentListener, AltosUIMapTileListener, AltosUIMapStoreListener {
 
        AltosUIMapPath  path = new AltosUIMapPath();
 
        AltosUIMapLine  line = new AltosUIMapLine();
 
+       AltosUIMapCache cache = new AltosUIMapCache();
+
        LinkedList<AltosUIMapMark> marks = new LinkedList<AltosUIMapMark>();
 
        LinkedList<AltosUIMapZoomListener> zoom_listeners = new LinkedList<AltosUIMapZoomListener>();
@@ -134,8 +136,10 @@ public class AltosUIMapView extends Canvas implements MouseMotionListener, Mouse
                notice_user_input();
                if (is_drag_event(e))
                        drag_start(e);
-               else
+               else {
                        line.pressed(e, transform);
+                       repaint();
+               }
        }
 
        public void mouseReleased(MouseEvent e) {
@@ -366,7 +370,7 @@ public class AltosUIMapView extends Canvas implements MouseMotionListener, Mouse
                for (Point point : to_remove)
                        tiles.remove(point);
 
-               AltosUIMapCache.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(((lower_right.y - upper_left.y) / px_size + 1) * ((lower_right.x - upper_left.x) / px_size + 1));
                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);
@@ -383,7 +387,7 @@ public class AltosUIMapView extends Canvas implements MouseMotionListener, Mouse
        }
 
        /* AltosUIMapTileListener methods */
-       public void notify_tile(AltosUIMapTile tile, int status) {
+       public synchronized void notify_tile(AltosUIMapTile tile, int status) {
                for (Point point : tiles.keySet()) {
                        if (tile == tiles.get(point)) {
                                Point   screen = transform.screen(point);
@@ -392,8 +396,10 @@ public class AltosUIMapView extends Canvas implements MouseMotionListener, Mouse
                }
        }
 
+       public AltosUIMapCache cache() { return cache; }
+
        /* AltosUIMapStoreListener methods */
-       public void notify_store(AltosUIMapStore store, int status) {
+       public synchronized void notify_store(AltosUIMapStore store, int status) {
                if (load_listener != null) {
                        for (AltosUIMapTile tile : tiles.values())
                                if (store.equals(tile.store))
@@ -420,7 +426,6 @@ public class AltosUIMapView extends Canvas implements MouseMotionListener, Mouse
        }
 
        public void paint(Graphics g) {
-
                VolatileImage   back_buffer = create_back_buffer();
                do {
                        GraphicsConfiguration gc = getGraphicsConfiguration();