Improve open layers
[gpl/argeo-suite.git] / org.argeo.app.geo / src / org / argeo / app / geo / ux / OpenLayersMapPart.java
index a856bccd188fd1b9ed8d4fe5893aee5a6cf6e53f..512a473c080f5bc906397757a0478209211cf138 100644 (file)
@@ -1,7 +1,12 @@
 package org.argeo.app.geo.ux;
 
 import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Function;
 
+import org.argeo.app.geo.ux.MapPart.FeaturePopupEvent;
+import org.argeo.app.geo.ux.MapPart.FeatureSelectedEvent;
+import org.argeo.app.geo.ux.MapPart.FeatureSingleClickEvent;
 import org.argeo.app.ol.AbstractOlObject;
 import org.argeo.app.ol.Layer;
 import org.argeo.app.ol.OlMap;
@@ -63,4 +68,39 @@ public class OpenLayersMapPart extends AbstractGeoJsObject {
                return mapPartName;
        }
 
+       public void selectFeatures(String layerName, Object... ids) {
+               executeMethod(getMethodName(), layerName, (Object[]) ids);
+       }
+
+       /*
+        * CALLBACKS
+        */
+       public void onFeatureSelected(Consumer<FeatureSelectedEvent> toDo) {
+               addCallback("FeatureSelected", (arr) -> {
+                       toDo.accept(new FeatureSelectedEvent((String) arr[0]));
+                       return null;
+               });
+       }
+
+       public void onFeatureSingleClick(Consumer<FeatureSingleClickEvent> toDo) {
+               addCallback("FeatureSingleClick", (arr) -> {
+                       toDo.accept(new FeatureSingleClickEvent((String) arr[0]));
+                       return null;
+               });
+       }
+
+       public void onFeaturePopup(Function<FeaturePopupEvent, String> toDo) {
+               addCallback("FeaturePopup", (arr) -> {
+                       return toDo.apply(new FeaturePopupEvent((String) arr[0]));
+               });
+       }
+
+       protected void addCallback(String suffix, Function<Object[], Object> toDo) {
+               getJsClient().getReadyStage().thenAccept((ready) -> {
+                       String functionName = getJsClient().createJsFunction(getMapPartName() + "__on" + suffix, toDo);
+                       getJsClient().execute(getJsReference() + ".callbacks['on" + suffix + "']=" + functionName + ";");
+                       executeMethod("enable" + suffix);
+               });
+       }
+
 }