Working integration with OpenLayers
[gpl/argeo-suite.git] / swt / org.argeo.app.geo.swt / src / org / argeo / app / geo / swt / openlayers / OLMap.java
index bd2a15d29e24e72b1e2043ef7f99f53d02fb7874..d045afd21d9aa3e6cd91ba2a359bfde54ac285e7 100644 (file)
@@ -1,78 +1,96 @@
 package org.argeo.app.geo.swt.openlayers;
 
+import java.util.concurrent.CompletableFuture;
+
 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.ProgressEvent;
+import org.eclipse.swt.browser.ProgressListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
 
 public class OLMap extends Composite implements MapPart {
        static final long serialVersionUID = 2713128477504858552L;
-       private Label div;
+       private Browser browser;
+
+       // private CompletableFuture<Boolean> renderCompleted = new
+       // CompletableFuture<>();
+       private CompletableFuture<Boolean> pageLoaded = new CompletableFuture<>();
+
+       private String mapVar = "window.argeoMap";
 
        public OLMap(Composite parent, int style) {
                super(parent, style);
                parent.setLayout(CmsSwtUtils.noSpaceGridLayout());
                setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
                setLayout(CmsSwtUtils.noSpaceGridLayout());
-//             div = new Label(this, SWT.NONE);
-//             CmsSwtUtils.markup(div);
-//             CmsSwtUtils.disableMarkupValidation(div);
-//             div.setText(html);
-//             div.setLayoutData(CmsSwtUtils.fillAll());
-               String html = """
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="UTF-8">
-    <title>Simple Map</title>
-    <link rel="stylesheet" href="/pkg/org.argeo.app.geo.ux.web/main.css">
-    <style>
-      .map {
-        width: 100%;
-        height: 100vh;
-      }
-    </style>
-  </head>
-  <body>
-    <div id="map" class="map"></div>
-    <script src="/pkg/org.argeo.app.geo.ux.web/main.bundle.js"></script>
-  </body>
-</html>                                
-                               """;
-               Browser browser = new Browser(this, SWT.BORDER);
+               browser = new Browser(this, SWT.BORDER);
                browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               //browser.setText(html);
+               // functions exposed to JavaScript
+//             new onRenderComplete();
                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) {
+
+                               // create map
+                               browser.execute(mapVar + " = Object.create(window.argeo.app.geo.ArgeoMap);");
+                               pageLoaded.complete(true);
+                       }
+
+                       @Override
+                       public void changed(ProgressEvent event) {
+                       }
+               });
        }
 
        @Override
        public void addPoint(Double lng, Double lat) {
                // TODO Auto-generated method stub
-               
+
        }
 
        @Override
        public void addUrlLayer(String layer, Format format) {
                // TODO Auto-generated method stub
-               
+
        }
 
        @Override
        public void setZoom(int zoom) {
-               // TODO Auto-generated method stub
-               
+               pageLoaded.thenAccept((b) -> {
+                       browser.evaluate(mapVar + ".setZoom(" + zoom + ")");
+               });
        }
 
        @Override
        public void setCenter(Double lng, Double lat) {
-               // TODO Auto-generated method stub
-               
+               pageLoaded.thenAccept((b) -> {
+                       browser.evaluate(mapVar + ".setCenter(" + lng + ", " + lat + ")");
+               });
+
        }
 
-       
-       
+//     private void setRenderCompleted() {
+//             renderCompleted.complete(true);
+//     }
+//
+//     private class onRenderComplete extends BrowserFunction {
+//
+//             onRenderComplete() {
+//                     super(browser, onRenderComplete.class.getSimpleName());
+//             }
+//
+//             @Override
+//             public Object function(Object[] arguments) {
+//                     setRenderCompleted();
+//                     System.out.println("Render complete (Java)");
+//                     return null;
+//             }
+//
+//     }
 }