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;
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);
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");
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);
});
}
+ public Control getControl() {
+ return browser;
+ }
+
/*
* MapPart.js METHODS
*/
}
@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
}
private String getJsMapVar() {
- return GLOBAL_THIS_ + mapVar;
+ return GLOBAL_THIS_ + mapName;
}
/**
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
*/
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) {
}
};
- 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 + "()");
});
}
}