]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.maps.server.ui/src/org/simantics/maps/server/ui/prefs/MapsServerPreferencePage.java
Some cleaning and fixing of district functionalities
[simantics/district.git] / org.simantics.maps.server.ui / src / org / simantics / maps / server / ui / prefs / MapsServerPreferencePage.java
1 package org.simantics.maps.server.ui.prefs;
2
3 import java.io.IOException;
4 import java.net.URISyntaxException;
5 import java.nio.file.Files;
6 import java.nio.file.Path;
7 import java.nio.file.Paths;
8 import java.util.List;
9
10 import org.eclipse.core.runtime.preferences.InstanceScope;
11 import org.eclipse.jface.layout.GridDataFactory;
12 import org.eclipse.jface.layout.GridLayoutFactory;
13 import org.eclipse.jface.preference.BooleanFieldEditor;
14 import org.eclipse.jface.preference.ComboFieldEditor;
15 import org.eclipse.jface.preference.FieldEditorPreferencePage;
16 import org.eclipse.jface.preference.FileFieldEditor;
17 import org.eclipse.jface.preference.IPreferenceStore;
18 import org.eclipse.jface.preference.IntegerFieldEditor;
19 import org.eclipse.jface.util.IPropertyChangeListener;
20 import org.eclipse.jface.util.PropertyChangeEvent;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.events.SelectionAdapter;
23 import org.eclipse.swt.events.SelectionEvent;
24 import org.eclipse.swt.widgets.Button;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Group;
27 import org.eclipse.swt.widgets.Label;
28 import org.eclipse.ui.IWorkbench;
29 import org.eclipse.ui.IWorkbenchPreferencePage;
30 import org.eclipse.ui.preferences.ScopedPreferenceStore;
31 import org.simantics.district.maps.server.TileserverMapnik;
32 import org.simantics.district.maps.server.TileserverMapnikInstance;
33 import org.simantics.district.maps.server.prefs.MapsServerPreferences;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 public class MapsServerPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
38
39     private static final Logger LOGGER = LoggerFactory.getLogger(MapsServerPreferencePage.class);
40     
41     private TileserverMapnik server;
42
43     private FileFieldEditor addNew;
44
45     public MapsServerPreferencePage() {
46         super(GRID);
47         setDescription("Maps server preferences");
48     }
49     
50     @Override
51     public void init(IWorkbench workbench) {
52         try {
53             server = TileserverMapnikInstance.get();
54         } catch (IOException | URISyntaxException e) {
55             LOGGER.error("Could not initialize " + getClass(), e);
56         }
57     }
58
59     @Override
60     protected IPreferenceStore doGetPreferenceStore() {
61         return new ScopedPreferenceStore(InstanceScope.INSTANCE, MapsServerPreferences.P_NODE);
62     }
63
64     private void createServerStatusField(Composite parent) {
65         Label label = new Label(parent, SWT.NONE);
66         String labelText = "";
67         String buttonText = "";
68         int labelColor = -1;
69         boolean running = false;
70         try {
71             if (server.isRunning()) {
72                 running = true;
73                 buttonText = "Stop";
74                 labelText = "running";
75                 labelColor = SWT.COLOR_DARK_GREEN;
76             } else {
77                 labelText = "stopped";
78                 buttonText = "Start";
79             }
80         } catch (IOException | InterruptedException e) {
81             LOGGER.error("Could not create server status field!", e);
82             labelText = "unknown";
83             labelColor = SWT.COLOR_DARK_RED;
84         }
85         label.setText("Tileserver is currently " + labelText);
86         label.setForeground(getShell().getDisplay().getSystemColor(labelColor));
87         
88         Button b = new Button(parent, SWT.NONE);
89         b.setText(buttonText + " server");
90         b.addSelectionListener(new SelectionAdapter() {
91             
92             @Override
93             public void widgetSelected(SelectionEvent e) {
94                 try {
95                     if (server.isRunning()) {
96                         server.stop();
97                     } else {
98                         server.start();
99                     }
100                     
101                 } catch (Exception ex) {
102                     LOGGER.error("Could not start/stop server", ex);
103                 }
104             }
105         });
106     }
107     
108     private void createGeneralGroup() {
109         Group serverGroup = new Group(getFieldEditorParent(), SWT.NONE);
110         serverGroup.setText("General");
111         GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(serverGroup);
112         
113         createServerStatusField(serverGroup);
114
115         IntegerFieldEditor port = new IntegerFieldEditor(MapsServerPreferences.P_DEFAULT_PORT, "Tileserver port", serverGroup);
116         addField(port);
117
118         BooleanFieldEditor automatically = new BooleanFieldEditor(MapsServerPreferences.P_START_AUTOMATICALLY, "Start tileserver automatically", serverGroup);
119         addField(automatically);
120         
121         Button openInExplorer = new Button(serverGroup, SWT.NONE);
122         openInExplorer.setText("Open server folder");
123         openInExplorer.addSelectionListener(new SelectionAdapter() {
124             
125             @Override
126             public void widgetSelected(SelectionEvent e) {
127 //                E4WorkbenchUtils.showInSystemExplorer("");
128             }
129         });
130         
131         GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(serverGroup);
132     }
133     
134     @Override
135     protected void createFieldEditors() {
136         createGeneralGroup();
137         
138         createStylesGroup();
139         
140         createTilesGroup();
141     }
142
143     private void createStylesGroup() {
144         Group stylesGroup = new Group(getFieldEditorParent(), SWT.NONE);
145         stylesGroup.setText("Styles");
146         GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(stylesGroup);
147         
148         createTM2StylesField(stylesGroup);
149         
150         GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(stylesGroup);
151     }
152     
153     private void createTM2StylesField(Composite parent) {
154         try {
155             List<String> styles = server.listStyles();
156             
157             String[][] namesAndValues = new String[styles.size()][];
158             for (int i = 0; i < styles.size(); i++) {
159                 String style = styles.get(i);
160                 String[] nameAndValue = new String[2];
161                 nameAndValue[0] = style;
162                 nameAndValue[1] = style;
163                 namesAndValues[i] = nameAndValue;
164             }
165             
166             ComboFieldEditor selector = new ComboFieldEditor(MapsServerPreferences.P_CURRENT_TM2STYLE, "Tile Styles", namesAndValues, parent);
167             addField(selector);
168         } catch (IOException e) {
169             e.printStackTrace();
170         }
171     }
172     
173     private void createTilesGroup() {
174         Group tilesGroup = new Group(getFieldEditorParent(), SWT.NONE);
175         tilesGroup.setText("MBTiles");
176         GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(tilesGroup);
177         
178         createTilesField(tilesGroup);
179         
180         GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(tilesGroup);
181     }
182
183     private void createTilesField(Composite parent) {
184         try {
185             List<String> tiles = server.availableMBTiles();
186             
187             String[][] namesAndValues = new String[tiles.size()][];
188             for (int i = 0; i < tiles.size(); i++) {
189                 String style = tiles.get(i);
190                 String[] nameAndValue = new String[2];
191                 nameAndValue[0] = style;
192                 nameAndValue[1] = style;
193                 namesAndValues[i] = nameAndValue;
194             }
195             
196             ComboFieldEditor selector = new ComboFieldEditor(MapsServerPreferences.P_CURRENT_MBTILES, "MBTiles", namesAndValues, parent);
197             addField(selector);
198             
199             addNew = new FileFieldEditor("Add new tiles", "Add new tiles", parent);
200             addNew.setPropertyChangeListener(new IPropertyChangeListener() {
201                 
202                 @Override
203                 public void propertyChange(PropertyChangeEvent event) {
204                     System.out.println(event);
205                 }
206             });
207             
208         } catch (IOException e) {
209             LOGGER.error("Could not create tiles field", e);
210         }
211     }
212     
213     @Override
214     protected void performApply() {
215         // Upload new mbtiles file
216         String fileLocation = addNew.getStringValue();
217         if (fileLocation != null && !fileLocation.isEmpty()) {
218             Path p = Paths.get(fileLocation);
219             Path target = server.getDataDirectory().resolve(p.getFileName());
220             try {
221                 Files.copy(p, target);
222             } catch (IOException e) {
223                 String message = "Could not upload " + fileLocation + " to " + target.toAbsolutePath(); 
224                 LOGGER.error(message, e);
225                 setErrorMessage(message);
226             }
227         }
228         super.performApply();
229     }
230     
231     @Override
232     public boolean performOk() {
233         boolean success = super.performOk();
234         
235         try {
236             server.restart();
237         } catch (Exception e) {
238             e.printStackTrace();
239         }
240         
241         return success;
242     }
243
244 }