]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.maps/src/org/simantics/maps/sg/MapNode.java
Make background map preference changes apply immediately
[simantics/district.git] / org.simantics.district.maps / src / org / simantics / maps / sg / MapNode.java
index ae418de477f61d55daedf9f9af1bdcef755c7452..fe83bd10999c07a24d54b4b0b0678772799f2eac 100644 (file)
@@ -25,6 +25,8 @@ import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.ImageObserver;
 import java.awt.image.VolatileImage;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -36,6 +38,7 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
 import org.simantics.maps.MapScalingTransform;
 import org.simantics.maps.WebService;
 import org.simantics.maps.osm.OSMTileProvider;
@@ -170,18 +173,26 @@ public class MapNode extends G2DNode implements ITileListener  {
         }
     };
 
+    private IPreferenceChangeListener listener;
+
     public void init() {
-        // Construct WebService from client properties
-        String url;
-        if (MapsClientPreferences.useBuiltinServer())
-            url = MapsClientPreferences.possibleBuiltinServerURL();
-        else 
-            url = MapsClientPreferences.tileserverURL();
-        if (!url.endsWith("/"))
-            url = url + "/";
-        
         try {
-            ITileProvider provider = new OSMTileProvider(new WebService(url), TILE_PIXEL_SIZE);
+            OSMTileProvider provider = new OSMTileProvider(new WebService(computeUrl()), TILE_PIXEL_SIZE);
+
+            listener = event -> {
+                // if tiles or style change we want to flush the tile cache
+                if (MapsClientPreferences.P_CURRENT_MBTILES.equals(event.getKey()) || MapsClientPreferences.P_CURRENT_TM2STYLE.equals(event.getKey())) {
+                    if (tileCache != null) {
+                        tileCache.clear();
+                    }
+                    try {
+                        provider.setWebService(new WebService(computeUrl()));
+                    } catch (MalformedURLException | URISyntaxException e) {
+                        LOGGER.error("Unable to update WebService with new url", e);
+                    }
+                }
+            };
+            MapsClientPreferences.addPreferenceChangeListenerMapsServer(listener);
 
             // Try to load eclipse specific implementation of TileJobQueue, if it doesn't exist, fall back to pojo implementation 
             try {
@@ -219,6 +230,25 @@ public class MapNode extends G2DNode implements ITileListener  {
         }
     }
 
+    private static String computeUrl() {
+     // Construct WebService from client properties
+        String url;
+        if (MapsClientPreferences.useBuiltinServer())
+            url = MapsClientPreferences.possibleBuiltinServerURL();
+        else 
+            url = MapsClientPreferences.tileserverURL();
+        if (!url.endsWith("/"))
+            url = url + "/";
+        return url;
+    }
+
+    @Override
+    public void cleanup() {
+        MapsClientPreferences.removePreferenceChangeListenerMapsServer(listener);
+        tileCache.clear();
+        job.clear();
+    }
+
     @SyncField("enabled")
     public void setEnabled(Boolean enabled) {
         this.enabled = enabled;