From 096e9828998febd0faffe0c369b897d4826a2bc1 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 26 Jan 2021 10:37:59 +0100 Subject: [PATCH] Introduce People and Environment functional areas. --- core/.gitignore | 1 + dep/org.argeo.suite.dep.ui.rap/pom.xml | 14 + environment/.gitignore | 1 + environment/org.argeo.geo.ui/.classpath | 7 + environment/org.argeo.geo.ui/.gitignore | 2 + environment/org.argeo.geo.ui/.project | 28 ++ .../org.argeo.geo.ui/META-INF/.gitignore | 1 + environment/org.argeo.geo.ui/bnd.bnd | 9 + environment/org.argeo.geo.ui/build.properties | 4 + environment/org.argeo.geo.ui/pom.xml | 37 +++ .../src/org/argeo/geo/GeoJsonToSvg.java | 5 + .../support/openlayers/OpenLayersMap.java | 250 ++++++++++++++++++ environment/pom.xml | 16 ++ lib/pom.xml | 4 +- people/.gitignore | 1 + people/org.argeo.people.ui/.classpath | 7 + people/org.argeo.people.ui/.gitignore | 2 + people/org.argeo.people.ui/.project | 28 ++ .../org.argeo.people.ui/META-INF/.gitignore | 1 + people/org.argeo.people.ui/bnd.bnd | 10 + people/org.argeo.people.ui/build.properties | 4 + people/org.argeo.people.ui/pom.xml | 37 +++ .../argeo/people}/ui/SuiteUserUiProvider.java | 4 +- .../argeo/people/ui/SuiteUsersEntryArea.java | 6 +- people/pom.xml | 16 ++ pom.xml | 2 + 26 files changed, 491 insertions(+), 6 deletions(-) create mode 100644 core/.gitignore create mode 100644 environment/.gitignore create mode 100644 environment/org.argeo.geo.ui/.classpath create mode 100644 environment/org.argeo.geo.ui/.gitignore create mode 100644 environment/org.argeo.geo.ui/.project create mode 100644 environment/org.argeo.geo.ui/META-INF/.gitignore create mode 100644 environment/org.argeo.geo.ui/bnd.bnd create mode 100644 environment/org.argeo.geo.ui/build.properties create mode 100644 environment/org.argeo.geo.ui/pom.xml create mode 100644 environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java create mode 100644 environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java create mode 100644 environment/pom.xml create mode 100644 people/.gitignore create mode 100644 people/org.argeo.people.ui/.classpath create mode 100644 people/org.argeo.people.ui/.gitignore create mode 100644 people/org.argeo.people.ui/.project create mode 100644 people/org.argeo.people.ui/META-INF/.gitignore create mode 100644 people/org.argeo.people.ui/bnd.bnd create mode 100644 people/org.argeo.people.ui/build.properties create mode 100644 people/org.argeo.people.ui/pom.xml rename {core/org.argeo.suite.ui/src/org/argeo/suite => people/org.argeo.people.ui/src/org/argeo/people}/ui/SuiteUserUiProvider.java (96%) rename core/org.argeo.suite.ui/src/org/argeo/suite/ui/AdminEntryArea.java => people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java (97%) create mode 100644 people/pom.xml diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/core/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/dep/org.argeo.suite.dep.ui.rap/pom.xml b/dep/org.argeo.suite.dep.ui.rap/pom.xml index 53342ee..ad52013 100644 --- a/dep/org.argeo.suite.dep.ui.rap/pom.xml +++ b/dep/org.argeo.suite.dep.ui.rap/pom.xml @@ -50,6 +50,13 @@ 2.1.18-SNAPSHOT + + + org.argeo.suite + org.argeo.people.ui + 2.1.18-SNAPSHOT + + org.argeo.suite @@ -57,6 +64,13 @@ 2.1.18-SNAPSHOT + + + org.argeo.suite + org.argeo.geo.ui + 2.1.18-SNAPSHOT + + org.argeo.suite diff --git a/environment/.gitignore b/environment/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/environment/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/environment/org.argeo.geo.ui/.classpath b/environment/org.argeo.geo.ui/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/environment/org.argeo.geo.ui/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/environment/org.argeo.geo.ui/.gitignore b/environment/org.argeo.geo.ui/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/environment/org.argeo.geo.ui/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/environment/org.argeo.geo.ui/.project b/environment/org.argeo.geo.ui/.project new file mode 100644 index 0000000..7956c34 --- /dev/null +++ b/environment/org.argeo.geo.ui/.project @@ -0,0 +1,28 @@ + + + org.argeo.geo.ui + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/environment/org.argeo.geo.ui/META-INF/.gitignore b/environment/org.argeo.geo.ui/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/environment/org.argeo.geo.ui/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/environment/org.argeo.geo.ui/bnd.bnd b/environment/org.argeo.geo.ui/bnd.bnd new file mode 100644 index 0000000..30cf566 --- /dev/null +++ b/environment/org.argeo.geo.ui/bnd.bnd @@ -0,0 +1,9 @@ +Import-Package:\ +javax.jcr.nodetype,\ +org.osgi.service.event,\ +org.argeo.suite.ui,\ +org.argeo.api,\ +org.eclipse.swt,\ +org.eclipse.jface.viewers,\ +org.osgi.framework,\ +* diff --git a/environment/org.argeo.geo.ui/build.properties b/environment/org.argeo.geo.ui/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/environment/org.argeo.geo.ui/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/environment/org.argeo.geo.ui/pom.xml b/environment/org.argeo.geo.ui/pom.xml new file mode 100644 index 0000000..f7d6d2b --- /dev/null +++ b/environment/org.argeo.geo.ui/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + org.argeo.suite + environment + 2.1.18-SNAPSHOT + .. + + org.argeo.geo.ui + Geography UI + jar + + + org.argeo.suite + org.argeo.suite.ui + 2.1.18-SNAPSHOT + + + + + org.argeo.tp + argeo-tp-rap-e4 + ${version.argeo-tp} + pom + provided + + + + org.argeo.commons + org.argeo.eclipse.ui.rap + ${version.argeo-commons} + provided + + + + diff --git a/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java b/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java new file mode 100644 index 0000000..6a45c0d --- /dev/null +++ b/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoJsonToSvg.java @@ -0,0 +1,5 @@ +package org.argeo.geo; + +public class GeoJsonToSvg { + +} diff --git a/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java b/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java new file mode 100644 index 0000000..622f5a4 --- /dev/null +++ b/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java @@ -0,0 +1,250 @@ +package org.argeo.support.openlayers; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.api.NodeConstants; +import org.argeo.cms.ui.CmsView; +import org.argeo.cms.ui.util.CmsUiUtils; +import org.argeo.entity.EntityNames; +import org.argeo.entity.EntityType; +import org.argeo.suite.ui.SuiteEvent; +import org.eclipse.swt.SWT; +import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.browser.BrowserFunction; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; + +/** Display a map. */ +public class OpenLayersMap extends Composite { + private static final long serialVersionUID = 1055893020490283622L; + + private final static Log log = LogFactory.getLog(OpenLayersMap.class); + + private Browser browser; + private boolean renderCompleted = false; + + private Double centerLng = null, centerLat = null; + private Integer zoom = null; + private String vectorSource = null; + private String gpxSource = null; + + private List geoJsonSources = new ArrayList<>(); + + private CmsView cmsView; + + public OpenLayersMap(Composite parent, int style, URL mapHtml) { + super(parent, style); + cmsView = CmsView.getCmsView(parent); + setLayout(new GridLayout()); + + browser = new Browser(this, SWT.BORDER); + browser.setLayoutData(CmsUiUtils.fillAll()); + String html; + try (InputStream in = mapHtml.openStream()) { + html = IOUtils.toString(in, StandardCharsets.UTF_8); + } catch (IOException e) { + throw new RuntimeException(e); + } + new RenderCompleted(browser, "renderCompleted"); + new OnFeatureSelect(browser, "onFeatureSelect"); + new OnFeatureUnselect(browser, "onFeatureUnselect"); + new OnFeatureClick(browser, "onFeatureClick"); + browser.setText(html); + } + + public void setCenter(Double lng, Double lat) { + if (isRenderCompleted()) + browser.evaluate("map.getView().setCenter(ol.proj.fromLonLat([" + lng + ", " + lat + "]))"); + this.centerLat = lat; + this.centerLng = lng; + } + + public synchronized void setRenderCompleted(boolean renderCompleted) { + this.renderCompleted = renderCompleted; + notifyAll(); + } + + public synchronized boolean isRenderCompleted() { + return renderCompleted; + } + + @Override + public synchronized void dispose() { + long timeout = 500; + long begin = System.currentTimeMillis(); + while (!isRenderCompleted() && ((System.currentTimeMillis() - begin) < timeout)) { + try { + wait(50); + } catch (InterruptedException e) { + // silent + } + } + super.dispose(); + } + + public void setZoom(int zoom) { + if (isRenderCompleted()) + browser.evaluate("map.getView().setZoom(" + zoom + ")"); + this.zoom = zoom; + } + + public void addPoints(List geoPoints) throws RepositoryException { + boolean first = true; + StringBuffer sb = new StringBuffer("new ol.source.Vector({ features: ["); + for (int i = 0; i < geoPoints.size(); i++) { + Node node = geoPoints.get(i); + if (node.isNodeType(EntityType.geopoint.get()) && !node.isCheckedOut()) { + if (first) + first = false; + else + sb.append(","); + Double lng = node.getProperty(EntityNames.GEO_LONG).getDouble(); + Double lat = node.getProperty(EntityNames.GEO_LAT).getDouble(); + sb.append("new ol.Feature({ geometry:"); + sb.append("new ol.geom.Point(ol.proj.fromLonLat(["); + sb.append(lng).append(',').append(lat); + sb.append("]))"); + sb.append(",path:'").append(node.getPath()).append("'"); + sb.append("})"); + } + } + sb.append("] })"); + this.vectorSource = sb.toString(); + if (log.isTraceEnabled()) + log.trace("Vector source: " + vectorSource); + renderVectorSource(); + } + + protected void renderVectorSource() { + if (vectorSource == null) + return; + if (isRenderCompleted()) + browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + vectorSource + "}));"); + } + + public void addPoint(Double lng, Double lat) { + this.vectorSource = "new ol.source.Vector({ features: [ new ol.Feature({ geometry:" + + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] })"; +// if (renderCompleted) { +// browser.evaluate( +// "map.addLayer(new ol.layer.Vector({ source: new ol.source.Vector({ features: [ new ol.Feature({ geometry:" +// + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] }) }));"); +// } + renderVectorSource(); + } + + public void addGpx(String path) { + this.gpxSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GPX() })"; + renderGpxSource(); + } + + protected void renderGpxSource() { + if (gpxSource == null) + return; + if (isRenderCompleted()) + browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + gpxSource + "}));"); + } + + public void addGeoJson(String path) { + String geoJsonSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GeoJSON() })"; + geoJsonSources.add(geoJsonSource); + renderGeoJsonSources(); + } + + protected void renderGeoJsonSources() { + if (geoJsonSources.isEmpty()) + return; + if (isRenderCompleted()) { + for (String geoJson : geoJsonSources) { + browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + geoJson + "}));"); + } + } + } + + private class RenderCompleted extends BrowserFunction { + + RenderCompleted(Browser browser, String name) { + super(browser, name); + } + + @Override + public Object function(Object[] arguments) { + try { + if (!isRenderCompleted()) { + setRenderCompleted(true); + if (zoom != null) + setZoom(zoom); + if (centerLat != null && centerLng != null) { + setCenter(centerLng, centerLat); + } + if (vectorSource != null) + renderVectorSource(); + if (gpxSource != null) + renderGpxSource(); + if (!geoJsonSources.isEmpty()) + renderGeoJsonSources(); + } + return null; + } catch (Exception e) { + log.error("Cannot render map", e); + return null; + } + } + } + + private class OnFeatureSelect extends BrowserFunction { + + OnFeatureSelect(Browser browser, String name) { + super(browser, name); + } + + @Override + public Object function(Object[] arguments) { + if (arguments.length == 0) + return null; + String path = arguments[0].toString(); + Map properties = new HashMap<>(); + properties.put(SuiteEvent.NODE_PATH, path); + properties.put(SuiteEvent.WORKSPACE, NodeConstants.SYS_WORKSPACE); + cmsView.sendEvent(SuiteEvent.refreshPart.topic(), properties); + return null; + } + } + + private class OnFeatureUnselect extends BrowserFunction { + + OnFeatureUnselect(Browser browser, String name) { + super(browser, name); + } + + @Override + public Object function(Object[] arguments) { + return null; + } + } + + private class OnFeatureClick extends BrowserFunction { + + OnFeatureClick(Browser browser, String name) { + super(browser, name); + } + + @Override + public Object function(Object[] arguments) { + return null; + } + } +} diff --git a/environment/pom.xml b/environment/pom.xml new file mode 100644 index 0000000..a8ede8b --- /dev/null +++ b/environment/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.1.18-SNAPSHOT + .. + + environment + Argeo Environment Components + pom + + org.argeo.geo.ui + + diff --git a/lib/pom.xml b/lib/pom.xml index df4af65..987c0c4 100644 --- a/lib/pom.xml +++ b/lib/pom.xml @@ -15,9 +15,7 @@ 2.1.27 2.1.13 - 2.1.89 - - + 2.1.91-SNAPSHOT /srv/rpmfactory/argeo-osgi-2-gpl/el7 diff --git a/people/.gitignore b/people/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/people/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/people/org.argeo.people.ui/.classpath b/people/org.argeo.people.ui/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/people/org.argeo.people.ui/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/people/org.argeo.people.ui/.gitignore b/people/org.argeo.people.ui/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/people/org.argeo.people.ui/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/people/org.argeo.people.ui/.project b/people/org.argeo.people.ui/.project new file mode 100644 index 0000000..1df2bce --- /dev/null +++ b/people/org.argeo.people.ui/.project @@ -0,0 +1,28 @@ + + + org.argeo.people.ui + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/people/org.argeo.people.ui/META-INF/.gitignore b/people/org.argeo.people.ui/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/people/org.argeo.people.ui/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/people/org.argeo.people.ui/bnd.bnd b/people/org.argeo.people.ui/bnd.bnd new file mode 100644 index 0000000..50f4364 --- /dev/null +++ b/people/org.argeo.people.ui/bnd.bnd @@ -0,0 +1,10 @@ +Import-Package:\ +javax.jcr.nodetype,\ +org.osgi.service.event,\ +org.argeo.suite.ui,\ +org.argeo.api,\ +org.eclipse.swt,\ +org.eclipse.jface.viewers,\ +org.eclipse.jface.window,\ +org.osgi.framework,\ +* diff --git a/people/org.argeo.people.ui/build.properties b/people/org.argeo.people.ui/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/people/org.argeo.people.ui/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/people/org.argeo.people.ui/pom.xml b/people/org.argeo.people.ui/pom.xml new file mode 100644 index 0000000..2167104 --- /dev/null +++ b/people/org.argeo.people.ui/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + org.argeo.suite + people + 2.1.18-SNAPSHOT + .. + + org.argeo.people.ui + People UI + jar + + + org.argeo.suite + org.argeo.suite.ui + 2.1.18-SNAPSHOT + + + + + org.argeo.tp + argeo-tp-rap-e4 + ${version.argeo-tp} + pom + provided + + + + org.argeo.commons + org.argeo.eclipse.ui.rap + ${version.argeo-commons} + provided + + + + diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUserUiProvider.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java similarity index 96% rename from core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUserUiProvider.java rename to people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java index 04d7a7b..aa83cd2 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUserUiProvider.java +++ b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java @@ -1,4 +1,4 @@ -package org.argeo.suite.ui; +package org.argeo.people.ui; import java.util.Arrays; import java.util.List; @@ -12,6 +12,8 @@ import org.argeo.cms.ui.CmsUiProvider; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.cms.ui.viewers.Section; import org.argeo.naming.LdapAttrs; +import org.argeo.suite.ui.SuiteMsg; +import org.argeo.suite.ui.SuiteUiUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/AdminEntryArea.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java similarity index 97% rename from core/org.argeo.suite.ui/src/org/argeo/suite/ui/AdminEntryArea.java rename to people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java index 8c75f22..66f3eda 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/AdminEntryArea.java +++ b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java @@ -1,4 +1,4 @@ -package org.argeo.suite.ui; +package org.argeo.people.ui; import java.util.Set; @@ -14,6 +14,8 @@ import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.eclipse.ui.Selected; import org.argeo.naming.LdapAttrs; import org.argeo.suite.SuiteRole; +import org.argeo.suite.ui.SuiteEvent; +import org.argeo.suite.ui.SuiteIcon; import org.argeo.suite.ui.dialogs.NewUserWizard; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; @@ -36,7 +38,7 @@ import org.eclipse.swt.widgets.ToolItem; import org.osgi.service.useradmin.User; /** Entry to the admin area. */ -public class AdminEntryArea implements CmsUiProvider { +public class SuiteUsersEntryArea implements CmsUiProvider { private CmsUserManager cmsUserManager; diff --git a/people/pom.xml b/people/pom.xml new file mode 100644 index 0000000..cd9716e --- /dev/null +++ b/people/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.1.18-SNAPSHOT + .. + + people + Argeo People Components + pom + + org.argeo.people.ui + + diff --git a/pom.xml b/pom.xml index 36bd192..a43adf1 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,9 @@ core + people library + environment publishing knowledge -- 2.30.2