1 package org.simantics.maps.server.ui.prefs;
3 import java.io.IOException;
4 import java.net.URISyntaxException;
7 import org.eclipse.core.runtime.preferences.InstanceScope;
8 import org.eclipse.jface.layout.GridDataFactory;
9 import org.eclipse.jface.layout.GridLayoutFactory;
10 import org.eclipse.jface.preference.BooleanFieldEditor;
11 import org.eclipse.jface.preference.ComboFieldEditor;
12 import org.eclipse.jface.preference.FieldEditorPreferencePage;
13 import org.eclipse.jface.preference.FileFieldEditor;
14 import org.eclipse.jface.preference.IPreferenceStore;
15 import org.eclipse.jface.preference.IntegerFieldEditor;
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.events.SelectionAdapter;
18 import org.eclipse.swt.events.SelectionEvent;
19 import org.eclipse.swt.widgets.Button;
20 import org.eclipse.swt.widgets.Composite;
21 import org.eclipse.swt.widgets.Group;
22 import org.eclipse.swt.widgets.Label;
23 import org.eclipse.ui.IWorkbench;
24 import org.eclipse.ui.IWorkbenchPreferencePage;
25 import org.eclipse.ui.preferences.ScopedPreferenceStore;
26 import org.simantics.district.maps.server.TileserverMapnik;
27 import org.simantics.district.maps.server.TileserverMapnikInstance;
28 import org.simantics.district.maps.server.prefs.MapsServerPreferences;
29 import org.simantics.ui.workbench.e4.E4WorkbenchUtils;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
33 public class MapsServerPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
35 private static final Logger LOGGER = LoggerFactory.getLogger(MapsServerPreferencePage.class);
37 private TileserverMapnik server;
39 public MapsServerPreferencePage() {
41 setDescription("Maps server preferences");
45 public void init(IWorkbench workbench) {
47 server = TileserverMapnikInstance.get();
48 } catch (IOException | URISyntaxException e) {
49 LOGGER.error("Could not initialize " + getClass(), e);
54 protected IPreferenceStore doGetPreferenceStore() {
55 return new ScopedPreferenceStore(InstanceScope.INSTANCE, MapsServerPreferences.P_NODE);
58 private void createServerStatusField(Composite parent) {
59 Label label = new Label(parent, SWT.NONE);
60 String labelText = "";
61 String buttonText = "";
63 boolean running = false;
65 if (server.isRunning()) {
68 labelText = "running";
69 labelColor = SWT.COLOR_DARK_GREEN;
71 labelText = "stopped";
74 } catch (IOException | InterruptedException e) {
75 LOGGER.error("Could not create server status field!", e);
76 labelText = "unknown";
77 labelColor = SWT.COLOR_DARK_RED;
79 label.setText("Tileserver is currently " + labelText);
80 label.setForeground(getShell().getDisplay().getSystemColor(labelColor));
82 Button b = new Button(parent, SWT.NONE);
83 b.setText(buttonText + " server");
84 b.addSelectionListener(new SelectionAdapter() {
87 public void widgetSelected(SelectionEvent e) {
89 if (server.isRunning()) {
95 } catch (Exception ex) {
96 LOGGER.error("Could not start/stop server", ex);
102 private void createGeneralGroup() {
103 Group serverGroup = new Group(getFieldEditorParent(), SWT.NONE);
104 serverGroup.setText("General");
105 GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(serverGroup);
107 createServerStatusField(serverGroup);
109 IntegerFieldEditor port = new IntegerFieldEditor(MapsServerPreferences.P_DEFAULT_PORT, "Tileserver port", serverGroup);
112 BooleanFieldEditor automatically = new BooleanFieldEditor(MapsServerPreferences.P_START_AUTOMATICALLY, "Start tileserver automatically", serverGroup);
113 addField(automatically);
115 Button openInExplorer = new Button(serverGroup, SWT.NONE);
116 openInExplorer.setText("Open server folder");
117 openInExplorer.addSelectionListener(new SelectionAdapter() {
120 public void widgetSelected(SelectionEvent e) {
121 E4WorkbenchUtils.showInSystemExplorer("");
125 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(serverGroup);
129 protected void createFieldEditors() {
130 createGeneralGroup();
137 private void createStylesGroup() {
138 Group stylesGroup = new Group(getFieldEditorParent(), SWT.NONE);
139 stylesGroup.setText("Styles");
140 GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(stylesGroup);
142 createTM2StylesField(stylesGroup);
144 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(stylesGroup);
147 private void createTM2StylesField(Composite parent) {
149 List<String> styles = server.listStyles();
151 String[][] namesAndValues = new String[styles.size()][];
152 for (int i = 0; i < styles.size(); i++) {
153 String style = styles.get(i);
154 String[] nameAndValue = new String[2];
155 nameAndValue[0] = style;
156 nameAndValue[1] = style;
157 namesAndValues[i] = nameAndValue;
160 ComboFieldEditor selector = new ComboFieldEditor("Styles", "Tile Styles", namesAndValues, parent);
161 } catch (IOException e) {
166 private void createTilesGroup() {
167 Group tilesGroup = new Group(getFieldEditorParent(), SWT.NONE);
168 tilesGroup.setText("MBTiles");
169 GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(tilesGroup);
171 createTilesField(tilesGroup);
173 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(tilesGroup);
176 private void createTilesField(Composite parent) {
178 List<String> tiles = server.availableMBTiles();
180 String[][] namesAndValues = new String[tiles.size()][];
181 for (int i = 0; i < tiles.size(); i++) {
182 String style = tiles.get(i);
183 String[] nameAndValue = new String[2];
184 nameAndValue[0] = style;
185 nameAndValue[1] = style;
186 namesAndValues[i] = nameAndValue;
189 ComboFieldEditor selector = new ComboFieldEditor("MBTiles", "MBTiles", namesAndValues, parent);
192 FileFieldEditor addNew = new FileFieldEditor("add new", "Add new tiles", parent);
194 } catch (IOException e) {
195 LOGGER.error("Could not create tiles field", e);