Customisable map styling
[gpl/argeo-suite.git] / swt / org.argeo.app.geo.swt / src / org / argeo / app / geo / swt / SwtJSMapPart.java
index 16fa83edb96bd13a129f059d90ba4a351ac6bfb4..913636b3acd67d3e559654a0d5ff34935655ab8f 100644 (file)
@@ -9,7 +9,6 @@ import java.util.function.Function;
 import org.argeo.api.cms.CmsLog;
 import org.argeo.app.geo.ux.JsImplementation;
 import org.argeo.app.geo.ux.MapPart;
-import org.argeo.cms.swt.CmsSwtUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.browser.Browser;
 import org.eclipse.swt.browser.BrowserFunction;
@@ -17,12 +16,13 @@ import org.eclipse.swt.browser.ProgressEvent;
 import org.eclipse.swt.browser.ProgressListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
 
 /**
  * An SWT implementation of {@link MapPart} based on JavaScript execute in a
  * {@link Browser} control.
  */
-public class SwtJSMapPart extends Composite implements MapPart {
+public class SwtJSMapPart implements MapPart {
        static final long serialVersionUID = 2713128477504858552L;
 
        private final static CmsLog log = CmsLog.getLog(SwtJSMapPart.class);
@@ -34,15 +34,11 @@ public class SwtJSMapPart extends Composite implements MapPart {
        private final CompletableFuture<Boolean> pageLoaded = new CompletableFuture<>();
 
        private String jsImplementation = JsImplementation.OPENLAYERS_MAP_PART.getJsClass();
-       private String mapVar = "argeoMap";
+       private final String mapName;// = "argeoMap";
 
-       public SwtJSMapPart(Composite parent, int style) {
-               super(parent, style);
-               parent.setLayout(CmsSwtUtils.noSpaceGridLayout());
-               setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               setLayout(CmsSwtUtils.noSpaceGridLayout());
-
-               browser = new Browser(this, SWT.BORDER);
+       public SwtJSMapPart(String mapName, Composite parent, int style) {
+               this.mapName = mapName;
+               browser = new Browser(parent, 0);
                browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 
                browser.setUrl("/pkg/org.argeo.app.geo.js/index.html");
@@ -53,7 +49,8 @@ public class SwtJSMapPart extends Composite implements MapPart {
                        public void completed(ProgressEvent event) {
                                try {
                                        // create map
-                                       browser.execute(getJsMapVar() + " = new " + jsImplementation + "();");
+                                       browser.execute(getJsMapVar() + " = new " + jsImplementation + "('" + mapName + "');");
+                                       loadExtensions();
                                        pageLoaded.complete(true);
                                } catch (Exception e) {
                                        log.error("Cannot create map in browser", e);
@@ -67,6 +64,10 @@ public class SwtJSMapPart extends Composite implements MapPart {
                });
        }
 
+       public Control getControl() {
+               return browser;
+       }
+
        /*
         * MapPart.js METHODS
         */
@@ -77,8 +78,8 @@ public class SwtJSMapPart extends Composite implements MapPart {
        }
 
        @Override
-       public void addUrlLayer(String url, GeoFormat format) {
-               callMapMethod("addUrlLayer('%s', '%s')", url, format.name());
+       public void addUrlLayer(String url, GeoFormat format, String style) {
+               callMapMethod("addUrlLayer('%s', '%s', %s)", url, format.name(), style);
        }
 
        @Override
@@ -100,7 +101,7 @@ public class SwtJSMapPart extends Composite implements MapPart {
        }
 
        private String getJsMapVar() {
-               return GLOBAL_THIS_ + mapVar;
+               return GLOBAL_THIS_ + mapName;
        }
 
        /**
@@ -116,13 +117,28 @@ public class SwtJSMapPart extends Composite implements MapPart {
        protected CompletionStage<Object> evaluate(String js, Object... args) {
                CompletableFuture<Object> res = pageLoaded.thenApply((ready) -> {
                        if (!ready)
-                               throw new IllegalStateException("Map " + mapVar + " is not initialised.");
+                               throw new IllegalStateException("Map " + mapName + " is not initialised.");
                        Object result = browser.evaluate(String.format(Locale.ROOT, js, args));
                        return result;
                });
                return res.minimalCompletionStage();
        }
 
+       protected void loadExtension(String url) {
+//             String js = """
+//                             var script = document.createElement("script");
+//                             script.src = '%s';
+//                             document.head.appendChild(script);
+//                             """;
+//             browser.evaluate(String.format(Locale.ROOT, js, url));
+               browser.evaluate(String.format(Locale.ROOT, "import('%s')", url));
+       }
+
+       /** To be overridden with calls to {@link #loadExtension(String)}. */
+       protected void loadExtensions() {
+
+       }
+
        /*
         * CALLBACKS
         */
@@ -149,7 +165,7 @@ public class SwtJSMapPart extends Composite implements MapPart {
        protected void addCallback(String suffix, Function<Object[], Object> toDo) {
                pageLoaded.thenAccept((ready) -> {
                        // browser functions must be directly on window (RAP specific)
-                       new BrowserFunction(browser, mapVar + "__on" + suffix) {
+                       new BrowserFunction(browser, mapName + "__on" + suffix) {
 
                                @Override
                                public Object function(Object[] arguments) {
@@ -158,8 +174,8 @@ public class SwtJSMapPart extends Composite implements MapPart {
                                }
 
                        };
-                       browser.execute(getJsMapVar() + ".callbacks['on" + suffix + "']=window." + mapVar + "__on" + suffix + ";");
-                       callMethod(mapVar, "enable" + suffix + "()");
+                       browser.execute(getJsMapVar() + ".callbacks['on" + suffix + "']=window." + mapName + "__on" + suffix + ";");
+                       callMethod(mapName, "enable" + suffix + "()");
                });
        }
 }