]>
git.argeo.org Git - gpl/argeo-suite.git/blob - swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OpenLayersMap.java
1 package org
.argeo
.app
.ui
.openlayers
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStream
;
6 import java
.nio
.charset
.StandardCharsets
;
7 import java
.util
.ArrayList
;
8 import java
.util
.HashMap
;
12 import javax
.jcr
.Node
;
13 import javax
.jcr
.RepositoryException
;
15 import org
.apache
.commons
.io
.IOUtils
;
16 import org
.argeo
.app
.api
.EntityNames
;
17 import org
.argeo
.app
.api
.EntityType
;
18 import org
.argeo
.app
.ui
.SuiteUxEvent
;
19 import org
.argeo
.api
.cms
.CmsLog
;
20 import org
.argeo
.api
.cms
.ux
.CmsView
;
21 import org
.argeo
.api
.cms
.CmsConstants
;
22 import org
.argeo
.cms
.swt
.CmsSwtUtils
;
23 import org
.eclipse
.swt
.SWT
;
24 import org
.eclipse
.swt
.browser
.Browser
;
25 import org
.eclipse
.swt
.browser
.BrowserFunction
;
26 import org
.eclipse
.swt
.layout
.GridLayout
;
27 import org
.eclipse
.swt
.widgets
.Composite
;
30 public class OpenLayersMap
extends Composite
{
31 private static final long serialVersionUID
= 1055893020490283622L;
33 private final static CmsLog log
= CmsLog
.getLog(OpenLayersMap
.class);
35 private Browser browser
;
36 private boolean renderCompleted
= false;
38 private Double centerLng
= null, centerLat
= null;
39 private Integer zoom
= null;
40 private String vectorSource
= null;
41 private String gpxSource
= null;
43 private String vectorSourceStyle
;
45 private List
<String
> geoJsonSources
= new ArrayList
<>();
46 private Map
<String
, String
> vectorSources
= new HashMap
<>();
47 private Map
<String
, String
> layerStyles
= new HashMap
<>();
49 private CmsView cmsView
;
51 public OpenLayersMap(Composite parent
, int style
, URL mapHtml
) {
53 cmsView
= CmsSwtUtils
.getCmsView(parent
);
54 setLayout(new GridLayout());
56 browser
= new Browser(this, SWT
.BORDER
);
57 browser
.setLayoutData(CmsSwtUtils
.fillAll());
59 try (InputStream in
= mapHtml
.openStream()) {
60 html
= IOUtils
.toString(in
, StandardCharsets
.UTF_8
);
61 } catch (IOException e
) {
62 throw new RuntimeException(e
);
64 new RenderCompleted(browser
, "renderCompleted");
65 new OnFeatureSelect(browser
, "onFeatureSelect");
66 new OnFeatureUnselect(browser
, "onFeatureUnselect");
67 new OnFeatureClick(browser
, "onFeatureClick");
68 browser
.setText(html
);
71 public void setCenter(Double lng
, Double lat
) {
72 if (isRenderCompleted())
73 browser
.evaluate("map.getView().setCenter(ol.proj.fromLonLat([" + lng
+ ", " + lat
+ "]))");
78 public synchronized void setRenderCompleted(boolean renderCompleted
) {
79 this.renderCompleted
= renderCompleted
;
83 public synchronized boolean isRenderCompleted() {
84 return renderCompleted
;
88 public synchronized void dispose() {
90 long begin
= System
.currentTimeMillis();
91 while (!isRenderCompleted() && ((System
.currentTimeMillis() - begin
) < timeout
)) {
94 } catch (InterruptedException e
) {
101 public void setZoom(int zoom
) {
102 if (isRenderCompleted())
103 browser
.evaluate("map.getView().setZoom(" + zoom
+ ")");
107 protected String
asVectorSource(List
<Node
> geoPoints
) throws RepositoryException
{
108 boolean first
= true;
109 StringBuffer sb
= new StringBuffer("new ol.source.Vector({ features: [");
110 for (int i
= 0; i
< geoPoints
.size(); i
++) {
111 Node node
= geoPoints
.get(i
);
112 if (node
.isNodeType(EntityType
.geopoint
.get())) {
117 Double lng
= node
.getProperty(EntityNames
.GEO_LONG
).getDouble();
118 Double lat
= node
.getProperty(EntityNames
.GEO_LAT
).getDouble();
119 sb
.append("new ol.Feature({ geometry:");
120 sb
.append("new ol.geom.Point(ol.proj.fromLonLat([");
121 sb
.append(lng
).append(',').append(lat
);
123 sb
.append(",path:\"").append(node
.getPath()).append("\"");
124 sb
.append(",name:\"").append(node
.getName()).append("\"");
125 String entityType
= null;
126 if (node
.isNodeType(EntityType
.local
.get())) {
127 entityType
= node
.getProperty(EntityNames
.ENTITY_TYPE
).getString();
128 sb
.append(", type:'").append(entityType
).append("'");
130 enrichFeature(node
, sb
);
136 return sb
.toString();
139 protected void enrichFeature(Node node
, StringBuffer sb
) throws RepositoryException
{
143 public void addPoints(List
<Node
> geoPoints
) throws RepositoryException
{
144 this.vectorSource
= asVectorSource(geoPoints
);
145 if (log
.isTraceEnabled())
146 log
.trace("Vector source: " + vectorSource
);
147 renderVectorSource();
150 public void addPoints(String layerName
, List
<Node
> geoPoints
, String style
) throws RepositoryException
{
151 this.vectorSources
.put(layerName
, asVectorSource(geoPoints
));
153 layerStyles
.put(layerName
, style
);
155 renderVectorSources();
158 protected void renderVectorSource() {
159 if (vectorSource
== null)
161 if (isRenderCompleted()) {
162 // String style = ", style: new ol.style.Style({ image: new ol.style.Icon({ src: '/pkg/org.djapps.on.openheritage.ui/map_oc.png' }) })";
163 String style
= vectorSourceStyle
!= null ?
", style: " + vectorSourceStyle
: "";
164 // String style = "";
165 String toEvaluate
= "map.addLayer(new ol.layer.Vector({ source: " + vectorSource
+ style
+ "}));";
166 // System.out.println(toEvaluate);
167 browser
.execute(toEvaluate
);
171 protected void renderVectorSources() {
172 if (vectorSources
.isEmpty())
174 if (isRenderCompleted()) {
175 StringBuilder toExecute
= new StringBuilder();
176 for (String name
: vectorSources
.keySet()) {
177 String style
= layerStyles
.containsKey(name
) ?
", style: " + layerStyles
.get(name
) : "";
178 String toEvaluate
= "map.addLayer(new ol.layer.Vector({ source: " + vectorSources
.get(name
) + style
179 + ",name: '" + name
+ "'}));";
180 toExecute
.append(toEvaluate
);
182 if (log
.isTraceEnabled())
183 log
.trace(toExecute
);
184 browser
.execute(toExecute
.toString());
188 public void addPoint(Double lng
, Double lat
) {
189 this.vectorSource
= "new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
190 + " new ol.geom.Point(ol.proj.fromLonLat([" + lng
+ ", " + lat
+ "])) }) ] })";
191 // if (renderCompleted) {
193 // "map.addLayer(new ol.layer.Vector({ source: new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
194 // + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] }) }));");
196 renderVectorSource();
199 public void addGpx(String path
) {
200 this.gpxSource
= "new ol.source.Vector({ url: '" + path
+ "', format: new ol.format.GPX() })";
204 protected void renderGpxSource() {
205 if (gpxSource
== null)
207 if (isRenderCompleted())
208 browser
.evaluate("map.addLayer(new ol.layer.Vector({ source: " + gpxSource
+ "}));");
211 public void addGeoJson(String path
) {
212 String geoJsonSource
= "new ol.source.Vector({ url: '" + path
+ "', format: new ol.format.GeoJSON() })";
213 geoJsonSources
.add(geoJsonSource
);
214 renderGeoJsonSources();
217 protected void renderGeoJsonSources() {
218 if (geoJsonSources
.isEmpty())
220 if (isRenderCompleted()) {
221 for (String geoJson
: geoJsonSources
) {
222 browser
.evaluate("map.addLayer(new ol.layer.Vector({ source: " + geoJson
+ "}));");
227 public void setVectorSourceStyle(String vectorSourceStyle
) {
228 this.vectorSourceStyle
= vectorSourceStyle
;
231 private class RenderCompleted
extends BrowserFunction
{
233 RenderCompleted(Browser browser
, String name
) {
234 super(browser
, name
);
238 public Object
function(Object
[] arguments
) {
240 if (!isRenderCompleted()) {
241 setRenderCompleted(true);
244 if (centerLat
!= null && centerLng
!= null) {
245 setCenter(centerLng
, centerLat
);
247 if (!geoJsonSources
.isEmpty())
248 renderGeoJsonSources();
249 if (gpxSource
!= null)
251 if (vectorSource
!= null)
252 renderVectorSource();
253 if (!vectorSources
.isEmpty())
254 renderVectorSources();
257 } catch (Exception e
) {
258 log
.error("Cannot render map", e
);
264 private class OnFeatureSelect
extends BrowserFunction
{
266 OnFeatureSelect(Browser browser
, String name
) {
267 super(browser
, name
);
271 public Object
function(Object
[] arguments
) {
272 if (arguments
.length
== 0)
274 String path
= arguments
[0].toString();
275 Map
<String
, Object
> properties
= new HashMap
<>();
276 // properties.put(SuiteEvent.NODE_PATH, path);
277 // properties.put(SuiteEvent.WORKSPACE, CmsConstants.SYS_WORKSPACE);
278 properties
.put(SuiteUxEvent
.CONTENT_PATH
, '/' + CmsConstants
.SYS_WORKSPACE
+ path
);
279 cmsView
.sendEvent(SuiteUxEvent
.refreshPart
.topic(), properties
);
284 private class OnFeatureUnselect
extends BrowserFunction
{
286 OnFeatureUnselect(Browser browser
, String name
) {
287 super(browser
, name
);
291 public Object
function(Object
[] arguments
) {
296 private class OnFeatureClick
extends BrowserFunction
{
298 OnFeatureClick(Browser browser
, String name
) {
299 super(browser
, name
);
303 public Object
function(Object
[] arguments
) {