X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=swt%2Forg.argeo.app.geo.swt%2Fsrc%2Forg%2Fargeo%2Fapp%2Fgeo%2Fswt%2FSwtJsMapPart.java;fp=swt%2Forg.argeo.app.geo.swt%2Fsrc%2Forg%2Fargeo%2Fapp%2Fgeo%2Fswt%2FSwtJsMapPart.java;h=5e90d3991943eea49c4a091cab5b3d78ff3fd7a1;hb=f9b3af44af6897b286de0674bc9a919c689ff64e;hp=0000000000000000000000000000000000000000;hpb=711408cc603c2ebe21f8b825456bcbbe59e02f70;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 new file mode 100644 index 0000000..5e90d39 --- /dev/null +++ b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/SwtJsMapPart.java @@ -0,0 +1,99 @@ +package org.argeo.app.geo.swt; + +import java.util.concurrent.CompletionStage; +import java.util.function.Consumer; +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.app.swt.js.SwtBrowserJsPart; +import org.eclipse.swt.widgets.Composite; + +/** + * An SWT implementation of {@link MapPart} based on JavaScript. + */ +public class SwtJsMapPart extends SwtBrowserJsPart implements MapPart { + static final long serialVersionUID = 2713128477504858552L; + + private String jsImplementation = JsImplementation.OPENLAYERS_MAP_PART.getJsClass(); + private final String mapName;// = "argeoMap"; + + public SwtJsMapPart(String mapName, Composite parent, int style) { + super(parent, style, "/pkg/org.argeo.app.js/geo.html"); + this.mapName = mapName; + } + + @Override + protected void init() { + // create map + doExecute(getJsMapVar() + " = new " + jsImplementation + "('" + mapName + "');"); + } + + /* + * MapPart.js METHODS + */ + + @Override + public void addPoint(double lng, double lat, String style) { + callMapMethod("addPoint(%f, %f, %s)", lng, lat, style == null ? "'default'" : style); + } + + @Override + 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 + public void setZoom(int zoom) { + callMapMethod("setZoom(%d)", zoom); + } + + @Override + public void setCenter(double lng, double lat) { + callMapMethod("setCenter(%f, %f)", lng, lat); + } + + protected CompletionStage callMapMethod(String methodCall, Object... args) { + return callMethod(getJsMapVar(), methodCall, args); + } + + private String getJsMapVar() { + return getJsVarName(mapName); + } + + /* + * CALLBACKS + */ + public void onFeatureSelected(Consumer toDo) { + 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])); + return null; + }); + } + + public void onFeaturePopup(Function toDo) { + addCallback("FeaturePopup", (arr) -> { + return toDo.apply(new FeaturePopupEvent((String) arr[0])); + }); + } + + 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 + "()"); + }); + } +}