]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.maps.server.ui/src/org/simantics/maps/server/ui/prefs/MapsServerPreferencePage.java
Make background map preference changes apply immediately
[simantics/district.git] / org.simantics.maps.server.ui / src / org / simantics / maps / server / ui / prefs / MapsServerPreferencePage.java
index 548daf310fe663ab277a96f2185d6a40c888d6e3..c9e01cb0e36ab575d7f80c2aab882f4ede6bab7d 100644 (file)
@@ -2,6 +2,9 @@ package org.simantics.maps.server.ui.prefs;
 
 import java.io.IOException;
 import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.List;
 
 import org.eclipse.core.runtime.preferences.InstanceScope;
@@ -13,6 +16,9 @@ import org.eclipse.jface.preference.FieldEditorPreferencePage;
 import org.eclipse.jface.preference.FileFieldEditor;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.preference.IntegerFieldEditor;
+import org.eclipse.jface.preference.StringFieldEditor;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -26,7 +32,8 @@ import org.eclipse.ui.preferences.ScopedPreferenceStore;
 import org.simantics.district.maps.server.TileserverMapnik;
 import org.simantics.district.maps.server.TileserverMapnikInstance;
 import org.simantics.district.maps.server.prefs.MapsServerPreferences;
-import org.simantics.ui.workbench.e4.E4WorkbenchUtils;
+import org.simantics.district.network.ui.DynamicComboFieldEditor;
+import org.simantics.maps.server.ui.TileserverMapnikStartJob;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,6 +43,10 @@ public class MapsServerPreferencePage extends FieldEditorPreferencePage implemen
     
     private TileserverMapnik server;
 
+    private FileFieldEditor addNew;
+
+    private DynamicComboFieldEditor currentTilesSelector;
+
     public MapsServerPreferencePage() {
         super(GRID);
         setDescription("Maps server preferences");
@@ -57,13 +68,39 @@ public class MapsServerPreferencePage extends FieldEditorPreferencePage implemen
 
     private void createServerStatusField(Composite parent) {
         Label label = new Label(parent, SWT.NONE);
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(label);
+        
+        Button b = new Button(parent, SWT.NONE);
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(b);
+        updateWidgets(label, b);
+        b.addSelectionListener(new SelectionAdapter() {
+            
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                try {
+                    if (server.isRunning()) {
+                        server.stop();
+                        updateWidgets(label, b);
+                    } else {
+                        new TileserverMapnikStartJob(status -> {
+                            parent.getDisplay().asyncExec(() -> {
+                                updateWidgets(label, b);
+                            });
+                        }).schedule();
+                    }
+                } catch (Exception ex) {
+                    LOGGER.error("Could not start/stop server", ex);
+                }
+            }
+        });
+    }
+    
+    private void updateWidgets(Label label, Button b) {
         String labelText = "";
         String buttonText = "";
         int labelColor = -1;
-        boolean running = false;
         try {
             if (server.isRunning()) {
-                running = true;
                 buttonText = "Stop";
                 labelText = "running";
                 labelColor = SWT.COLOR_DARK_GREEN;
@@ -79,24 +116,7 @@ public class MapsServerPreferencePage extends FieldEditorPreferencePage implemen
         label.setText("Tileserver is currently " + labelText);
         label.setForeground(getShell().getDisplay().getSystemColor(labelColor));
         
-        Button b = new Button(parent, SWT.NONE);
         b.setText(buttonText + " server");
-        b.addSelectionListener(new SelectionAdapter() {
-            
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                try {
-                    if (server.isRunning()) {
-                        server.stop();
-                    } else {
-                        server.start();
-                    }
-                    
-                } catch (Exception ex) {
-                    LOGGER.error("Could not start/stop server", ex);
-                }
-            }
-        });
     }
     
     private void createGeneralGroup() {
@@ -112,16 +132,10 @@ public class MapsServerPreferencePage extends FieldEditorPreferencePage implemen
         BooleanFieldEditor automatically = new BooleanFieldEditor(MapsServerPreferences.P_START_AUTOMATICALLY, "Start tileserver automatically", serverGroup);
         addField(automatically);
         
-        Button openInExplorer = new Button(serverGroup, SWT.NONE);
-        openInExplorer.setText("Open server folder");
-        openInExplorer.addSelectionListener(new SelectionAdapter() {
-            
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-//                E4WorkbenchUtils.showInSystemExplorer("");
-            }
-        });
-        
+        StringFieldEditor serverFolder = new StringFieldEditor(MapsServerPreferences.P_SERVER_FOLDER, "Server folder", serverGroup);
+        serverFolder.setEnabled(false, serverGroup);
+        addField(serverFolder);
+
         GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(serverGroup);
     }
     
@@ -157,7 +171,9 @@ public class MapsServerPreferencePage extends FieldEditorPreferencePage implemen
                 namesAndValues[i] = nameAndValue;
             }
             
-            ComboFieldEditor selector = new ComboFieldEditor("Styles", "Tile Styles", namesAndValues, parent);
+            ComboFieldEditor selector = new ComboFieldEditor(MapsServerPreferences.P_CURRENT_TM2STYLE, "Selected Style", namesAndValues, parent);
+            GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(selector.getLabelControl(parent));
+            addField(selector);
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -165,9 +181,8 @@ public class MapsServerPreferencePage extends FieldEditorPreferencePage implemen
     
     private void createTilesGroup() {
         Group tilesGroup = new Group(getFieldEditorParent(), SWT.NONE);
-        tilesGroup.setText("MBTiles");
-        GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(tilesGroup);
-        
+        tilesGroup.setText("Vector Tiles");
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(tilesGroup);
         createTilesField(tilesGroup);
         
         GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(tilesGroup);
@@ -175,26 +190,83 @@ public class MapsServerPreferencePage extends FieldEditorPreferencePage implemen
 
     private void createTilesField(Composite parent) {
         try {
-            List<String> tiles = server.availableMBTiles();
-            
-            String[][] namesAndValues = new String[tiles.size()][];
-            for (int i = 0; i < tiles.size(); i++) {
-                String style = tiles.get(i);
-                String[] nameAndValue = new String[2];
-                nameAndValue[0] = style;
-                nameAndValue[1] = style;
-                namesAndValues[i] = nameAndValue;
-            }
-            
-            ComboFieldEditor selector = new ComboFieldEditor("MBTiles", "MBTiles", namesAndValues, parent);
+
+            String[][] namesAndValues = computeNamesAndValues();
+            currentTilesSelector = new DynamicComboFieldEditor(MapsServerPreferences.P_CURRENT_MBTILES, "Current Tiles", namesAndValues, parent);
             
+            GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(currentTilesSelector.getLabelControl(parent));
+            addField(currentTilesSelector);
+
+            Composite newParent = new Composite(parent, SWT.NONE);
+            GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(newParent);
+            GridLayoutFactory.fillDefaults().numColumns(3).applyTo(newParent);
             
-            FileFieldEditor addNew = new FileFieldEditor("add new", "Add new tiles", parent);
+            addNew = new FileFieldEditor("Add new tiles", "Add new tiles", newParent);
+            //GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(addNew.getTextControl(newParent));
+            //addField(addNew);
+            addNew.setPropertyChangeListener(new IPropertyChangeListener() {
+                
+                @Override
+                public void propertyChange(PropertyChangeEvent event) {
+                    System.out.println(event);
+                }
+            });
             
         } catch (IOException e) {
             LOGGER.error("Could not create tiles field", e);
         }
     }
     
+    private String[][] computeNamesAndValues() throws IOException {
+        List<String> tiles = server.availableMBTiles();
+        String[][] namesAndValues = new String[tiles.size()][];
+        for (int i = 0; i < tiles.size(); i++) {
+            String style = tiles.get(i);
+            String[] nameAndValue = new String[2];
+            nameAndValue[0] = style;
+            nameAndValue[1] = style;
+            namesAndValues[i] = nameAndValue;
+        }
+        return namesAndValues;
+    }
+
+    @Override
+    protected void performApply() {
+        // Upload new mbtiles file
+        String fileLocation = addNew.getStringValue();
+        if (fileLocation != null && !fileLocation.isEmpty()) {
+            Path p = Paths.get(fileLocation);
+            Path target = server.getDataDirectory().resolve(p.getFileName());
+            try {
+                Files.copy(p, target);
+                addNew.setStringValue("");
+            } catch (IOException e) {
+                String message = "Could not upload " + fileLocation + " to " + target.toAbsolutePath(); 
+                LOGGER.error(message, e);
+                setErrorMessage(message);
+            }
+        }
+        try {
+            currentTilesSelector.updateCombo(computeNamesAndValues());
+            currentTilesSelector.load();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        super.performApply();
+    }
+    
+    @Override
+    public boolean performOk() {
+        boolean success = super.performOk();
+        
+        try {
+            server.stop();
+            new TileserverMapnikStartJob(status -> {}).schedule();
+        } catch (Exception e) {
+            LOGGER.error("Could not restart tileserver-mapnik", e);
+        }
+        
+        return success;
+    }
 
 }