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=ece95085a9b0b002bcbad9f0b832a5a2baab445e;hb=737346afd15e56f9339a7c41ed4e26d65bbcbe69;hp=09848f9757f7069008f01f578a586b8f0518aadd;hpb=69adaa7b31078cb30043b073dada14dee1a9e75d;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 09848f9..ece9508 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 @@ -1,69 +1,32 @@ package org.argeo.app.geo.swt; -import java.util.Locale; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.function.Consumer; - -import org.argeo.api.cms.CmsLog; +import java.util.function.Function; +import org.argeo.app.geo.GeoUtils; 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; -import org.eclipse.swt.browser.ProgressEvent; -import org.eclipse.swt.browser.ProgressListener; -import org.eclipse.swt.layout.GridData; +import org.argeo.app.swt.js.SwtBrowserJsPart; import org.eclipse.swt.widgets.Composite; /** - * An SWT implementation of {@link MapPart} based on JavaScript execute in a - * {@link Browser} control. + * An SWT implementation of {@link MapPart} based on JavaScript. */ -public class SwtJSMapPart extends Composite implements MapPart { +public class SwtJSMapPart extends SwtBrowserJsPart implements MapPart { static final long serialVersionUID = 2713128477504858552L; - private final static CmsLog log = CmsLog.getLog(SwtJSMapPart.class); - - private final static String GLOBAL_THIS_ = "globalThis."; - - private final Browser browser; + private String jsImplementation = JsImplementation.OPENLAYERS_MAP_PART.getJsClass(); + private final String mapName;// = "argeoMap"; - private final CompletableFuture pageLoaded = new CompletableFuture<>(); + public SwtJSMapPart(String mapName, Composite parent, int style) { + super(parent, style, "/pkg/org.argeo.app.geo.js/index.html"); + this.mapName = mapName; + } - private String jsImplementation = JsImplementation.OPENLAYERS_MAP_PART.getJsClass(); - private String mapVar = "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); - browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - - browser.setUrl("/pkg/org.argeo.app.geo.js/index.html"); - browser.addProgressListener(new ProgressListener() { - static final long serialVersionUID = 1L; - - @Override - public void completed(ProgressEvent event) { - try { - // create map - browser.execute(getJsMapVar() + " = new " + jsImplementation + "();"); - pageLoaded.complete(true); - } catch (Exception e) { - log.error("Cannot create map in browser", e); - pageLoaded.complete(false); - } - } - - @Override - public void changed(ProgressEvent event) { - } - }); + @Override + protected void init() { + // create map + doExecute(getJsMapVar() + " = new " + jsImplementation + "('" + mapName + "');"); } /* @@ -76,8 +39,13 @@ 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, false)", url, format.name(), style); + } + + public void addCssUrlLayer(String url, GeoFormat format, String css) { + String style = GeoUtils.createSldFromCss("layer", "Layer", css); + callMapMethod("addUrlLayer('%s', '%s', '%s', true)", url, format.name(), style); } @Override @@ -94,59 +62,38 @@ public class SwtJSMapPart extends Composite implements MapPart { return callMethod(getJsMapVar(), methodCall, args); } - protected CompletionStage callMethod(String jsObject, String methodCall, Object... args) { - return evaluate(jsObject + '.' + methodCall, args); - } - private String getJsMapVar() { - return GLOBAL_THIS_ + mapVar; - } - - /** - * Execute this JavaScript on the client side after making sure that the page - * has been loaded and the map object has been created. - * - * @param js the JavaScript code, possibly formatted according to - * {@link String#format}, with {@link Locale#ROOT} as locale (for - * stability of decimal separator, as expected by JavaScript. - * @param args the optional arguments of - * {@link String#format(String, Object...)} - */ - protected CompletionStage evaluate(String js, Object... args) { - CompletableFuture res = pageLoaded.thenApply((ready) -> { - if (!ready) - throw new IllegalStateException("Map " + mapVar + " is not initialised."); - Object result = browser.evaluate(String.format(Locale.ROOT, js, args)); - return result; - }); - return res.minimalCompletionStage(); + return getJsVarName(mapName); } /* * CALLBACKS */ public void onFeatureSelected(Consumer toDo) { - addCallback("FeatureSelected", (arr) -> toDo.accept(new FeatureSelectedEvent((String) arr[0]))); + addCallback("FeatureSelected", (arr) -> { + toDo.accept(new FeatureSelectedEvent((String) arr[0])); + return null; + }); } public void onFeatureSingleClick(Consumer toDo) { - addCallback("FeatureSingleClick", (arr) -> toDo.accept(new FeatureSingleClickEvent((String) arr[0]))); + addCallback("FeatureSingleClick", (arr) -> { + toDo.accept(new FeatureSingleClickEvent((String) arr[0])); + return null; + }); } - protected void addCallback(String suffix, Consumer toDo) { - pageLoaded.thenAccept((ready) -> { - // browser functions must be directly on window (RAP specific) - new BrowserFunction(browser, mapVar + "__on" + suffix) { - - @Override - public Object function(Object[] arguments) { - toDo.accept(arguments); - return null; - } + public void onFeaturePopup(Function toDo) { + addCallback("FeaturePopup", (arr) -> { + return toDo.apply(new FeaturePopupEvent((String) arr[0])); + }); + } - }; - browser.execute(getJsMapVar() + ".callbacks['on" + suffix + "']=window." + mapVar + "__on" + suffix + ";"); - callMethod(mapVar, "enable" + suffix + "()"); + protected void addCallback(String suffix, Function toDo) { + getReadyStage().thenAccept((ready) -> { + String functionName = createJsFunction(mapName + "__on" + suffix, toDo); + doExecute(getJsMapVar() + ".callbacks['on" + suffix + "']=" + functionName + ";"); + callMethod(mapName, "enable" + suffix + "()"); }); } }