X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=swt%2Forg.argeo.app.geo.swt%2Fsrc%2Forg%2Fargeo%2Fapp%2Fgeo%2Fswt%2FSwtJSMapPart.java;h=913636b3acd67d3e559654a0d5ff34935655ab8f;hb=187dcc18d0f09b834774b74b32244113d6aa3daf;hp=16fa83edb96bd13a129f059d90ba4a351ac6bfb4;hpb=a12e816b586ab70361e1f448ae2564561b99a565;p=gpl%2Fargeo-suite.git diff --git a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/SwtJSMapPart.java b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/SwtJSMapPart.java index 16fa83e..913636b 100644 --- a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/SwtJSMapPart.java +++ b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/SwtJSMapPart.java @@ -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 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 evaluate(String js, Object... args) { CompletableFuture 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 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 + "()"); }); } }