From: Mathieu Baudier Date: Sat, 26 Feb 2011 20:28:05 +0000 (+0000) Subject: First working GIS X-Git-Tag: argeo-commons-2.1.30~1409 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=77eaf70d8b929dab68211d6a01f68eeb71a1dceb;p=lgpl%2Fargeo-commons.git First working GIS git-svn-id: https://svn.argeo.org/commons/trunk@4224 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/AbstractTreeContentProvider.java b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/AbstractTreeContentProvider.java new file mode 100644 index 000000000..0d5cbd23d --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/AbstractTreeContentProvider.java @@ -0,0 +1,42 @@ +package org.argeo.eclipse.ui; + +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.Viewer; + +/** + * Tree content provider dealing with tree objects and providing reasonable + * defualts. + */ +public abstract class AbstractTreeContentProvider implements + ITreeContentProvider { + + /** Does nothing */ + public void dispose() { + } + + /** Does nothing */ + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + + public Object[] getChildren(Object element) { + if (element instanceof TreeParent) { + return ((TreeParent) element).getChildren(); + } + return new Object[0]; + } + + public Object getParent(Object element) { + if (element instanceof TreeObject) { + return ((TreeObject) element).getParent(); + } + return null; + } + + public boolean hasChildren(Object element) { + if (element instanceof TreeParent) { + return ((TreeParent) element).hasChildren(); + } + return false; + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/TreeObject.java b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/TreeObject.java index 7df88570b..35732ce03 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/TreeObject.java +++ b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/TreeObject.java @@ -16,7 +16,7 @@ package org.argeo.eclipse.ui; -public class TreeObject implements Comparable { +class TreeObject implements Comparable { private String name; private TreeParent parent; diff --git a/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/MANIFEST.MF b/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/MANIFEST.MF index a34e68b80..21c08dc92 100644 --- a/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/MANIFEST.MF +++ b/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/MANIFEST.MF @@ -1,11 +1,29 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Rap -Bundle-SymbolicName: org.argeo.gis.ui.rap.openlayers +Bundle-SymbolicName: org.argeo.gis.ui.rap.openlayers;singleton:=true Bundle-Version: 1.0.0.qualifier Bundle-Activator: org.argeo.gis.ui.rap.openlayers.GisOpenlayersPlugin Bundle-Vendor: Argeo Require-Bundle: org.eclipse.rap.ui, - org.eclipse.core.runtime + org.eclipse.core.runtime, + org.polymap.openlayers.rap.widget;bundle-version="[1.0.0,2.0.0)" Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ActivationPolicy: lazy +Import-Package: com.vividsolutions.jts.geom;version="1.10.0", + org.apache.commons.logging;version="1.1.1", + org.argeo.eclipse.spring, + org.argeo.gis.ui, + org.argeo.gis.ui.editors, + org.geotools.data, + org.geotools.feature, + org.geotools.map, + org.geotools.map.event, + org.opengis.feature, + org.opengis.feature.simple, + org.opengis.feature.type, + org.polymap.openlayers.rap.widget, + org.polymap.openlayers.rap.widget.base, + org.polymap.openlayers.rap.widget.base_types, + org.polymap.openlayers.rap.widget.controls, + org.polymap.openlayers.rap.widget.layers diff --git a/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/spring/openlayers.xml b/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/spring/openlayers.xml new file mode 100644 index 000000000..73460c672 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/spring/openlayers.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/spring/osgi.xml b/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/spring/osgi.xml new file mode 100644 index 000000000..9d030d8f8 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/spring/osgi.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/gis/plugins/org.argeo.gis.ui.rap.openlayers/build.properties b/gis/plugins/org.argeo.gis.ui.rap.openlayers/build.properties index 5fc538bc8..19bfacc5f 100644 --- a/gis/plugins/org.argeo.gis.ui.rap.openlayers/build.properties +++ b/gis/plugins/org.argeo.gis.ui.rap.openlayers/build.properties @@ -1,4 +1,5 @@ source.. = src/main/java/ output.. = target/classes/ bin.includes = META-INF/,\ - . + .,\ + js_lib/ diff --git a/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/GisOpenlayersPlugin.java b/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/GisOpenlayersPlugin.java index 18bca9927..6ae728402 100644 --- a/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/GisOpenlayersPlugin.java +++ b/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/GisOpenlayersPlugin.java @@ -9,7 +9,7 @@ import org.osgi.framework.BundleContext; public class GisOpenlayersPlugin extends AbstractUIPlugin { // The plug-in ID - public static final String PLUGIN_ID = "org.argeo.gis.ui.rap"; //$NON-NLS-1$ + public static final String PLUGIN_ID = "org.argeo.gis.ui.rap.openlayers"; //$NON-NLS-1$ // The shared instance private static GisOpenlayersPlugin plugin; diff --git a/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/MapContextAdapter.java b/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/MapContextAdapter.java new file mode 100644 index 000000000..e6d34ef1d --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/MapContextAdapter.java @@ -0,0 +1,142 @@ +package org.argeo.gis.ui.rap.openlayers; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.geotools.data.FeatureSource; +import org.geotools.feature.FeatureCollection; +import org.geotools.feature.FeatureIterator; +import org.geotools.map.MapContext; +import org.geotools.map.event.MapLayerListEvent; +import org.geotools.map.event.MapLayerListListener; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import org.polymap.openlayers.rap.widget.base.OpenLayersEventListener; +import org.polymap.openlayers.rap.widget.base.OpenLayersObject; +import org.polymap.openlayers.rap.widget.base_types.OpenLayersMap; +import org.polymap.openlayers.rap.widget.features.VectorFeature; +import org.polymap.openlayers.rap.widget.geometry.LineStringGeometry; +import org.polymap.openlayers.rap.widget.geometry.PointGeometry; +import org.polymap.openlayers.rap.widget.layers.VectorLayer; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.MultiPolygon; + +public class MapContextAdapter implements MapLayerListListener, + OpenLayersEventListener { + private final static Log log = LogFactory.getLog(MapContextAdapter.class); + + private final MapContext mapContext; + private final OpenLayersMap openLayersMap; + + public MapContextAdapter(MapContext mapContext, OpenLayersMap openLayersMap) { + this.mapContext = mapContext; + this.openLayersMap = openLayersMap; + + mapContext.addMapLayerListListener(this); + + HashMap payloadMap = new HashMap(); + payloadMap.put("layername", "event.layer.name"); + this.openLayersMap.events.register(this, "changebaselayer", payloadMap); + payloadMap.put("property", "event.property"); + payloadMap.put("visibility", "event.layer.visibility"); + this.openLayersMap.events.register(this, "changelayer", payloadMap); + } + + /* + * MAP CONTEXT + */ + + @SuppressWarnings("unchecked") + public void layerAdded(MapLayerListEvent event) { + if (log.isDebugEnabled()) + log.debug("Map context layer added " + event); + + try { + FeatureSource featureSource = (FeatureSource) event + .getLayer().getFeatureSource(); + + VectorLayer vectorLayer = new VectorLayer(featureSource.getName() + .toString()); + FeatureCollection featureCollection = featureSource + .getFeatures(); + FeatureIterator fit = featureCollection.features(); + while (fit.hasNext()) { + SimpleFeature feature = fit.next(); + Geometry geom = (Geometry) feature.getDefaultGeometry(); + log.debug("Feature " + feature.getID()); +// log.debug(" Geom: " + geom.getClass() + ", centroid=" +// + geom.getCentroid()); + if (geom instanceof MultiPolygon) { + MultiPolygon mp = (MultiPolygon) geom; + List points = new ArrayList(); + for (Coordinate coo : mp.getCoordinates()) { + points.add(new PointGeometry(coo.x, coo.y)); + } + VectorFeature vf = new VectorFeature( + new LineStringGeometry( + points.toArray(new PointGeometry[points + .size()]))); + vectorLayer.addFeatures(vf); + } + } + openLayersMap.addLayer(vectorLayer); + } catch (IOException e) { + log.error("Cannot add layer " + event.getLayer(), e); + } + } + + public void layerRemoved(MapLayerListEvent event) { + if (log.isDebugEnabled()) + log.debug("Map context layer removed " + event); + } + + public void layerChanged(MapLayerListEvent event) { + if (log.isDebugEnabled()) + log.debug("Map context layer changed " + event); + } + + public void layerMoved(MapLayerListEvent event) { + if (log.isDebugEnabled()) + log.debug("Map context layer moved " + event); + } + + /* + * OPENLAYERS MAP + */ + + public void process_event(OpenLayersObject source, String eventName, + HashMap payload) { + if (log.isDebugEnabled()) + log.debug("openlayers event from" + source); + if (eventName.equals("changebaselayer")) { + if (log.isDebugEnabled()) + log.debug("client changed baselayer to '" + + payload.get("layername") + "' " + + payload.get("property")); + } else if (eventName.equals("changelayer")) { + if (log.isDebugEnabled()) + log.debug("client changed layer '" + payload.get("layername") + + "' " + payload.get("property") + "' " + + payload.get("visibility")); + if (payload.get("property").equals("visibility")) { + Boolean visible = payload.get("visibility").equals("true"); + VectorLayer edit_layer = new VectorLayer("edit layer"); + if (payload.get("layername").equals(edit_layer.getName())) { + if (visible) { + + } else { + } + } + } + } else if (log.isDebugEnabled()) + log.debug("unknown event " + eventName); + + } + +} diff --git a/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/OpenLayersMapControlCreator.java b/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/OpenLayersMapControlCreator.java new file mode 100644 index 000000000..f3972a9f9 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/OpenLayersMapControlCreator.java @@ -0,0 +1,51 @@ +package org.argeo.gis.ui.rap.openlayers; + +import org.argeo.gis.ui.MapContextProvider; +import org.argeo.gis.ui.MapControlCreator; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.polymap.openlayers.rap.widget.OpenLayersWidget; +import org.polymap.openlayers.rap.widget.base_types.OpenLayersMap; +import org.polymap.openlayers.rap.widget.controls.KeyboardDefaultsControl; +import org.polymap.openlayers.rap.widget.controls.LayerSwitcherControl; +import org.polymap.openlayers.rap.widget.controls.MouseDefaultsControl; +import org.polymap.openlayers.rap.widget.controls.PanZoomBarControl; +import org.polymap.openlayers.rap.widget.controls.ScaleControl; +import org.polymap.openlayers.rap.widget.layers.OSMLayer; +import org.polymap.openlayers.rap.widget.layers.WMSLayer; + +public class OpenLayersMapControlCreator implements MapControlCreator { + public Composite createMapControl(Composite parent, + MapContextProvider mapContextProvider) { + + // OpenLayersWidget openLayersWidget = new OpenLayersWidget(parent, + // SWT.MULTI | SWT.WRAP, "/js_lib/OpenLayers/OpenLayers.js"); + OpenLayersWidget openLayersWidget = new OpenLayersWidget(parent, + SWT.MULTI | SWT.WRAP); + openLayersWidget.setLayoutData(new GridData(GridData.FILL_BOTH)); + + OpenLayersMap map = openLayersWidget.getMap(); + + map.addControl(new LayerSwitcherControl()); + map.addControl(new MouseDefaultsControl()); + map.addControl(new KeyboardDefaultsControl()); + map.addControl(new PanZoomBarControl()); + map.addControl(new ScaleControl()); + +// WMSLayer baseLayer = new WMSLayer("argeo_dev", +// "https://dev.argeo.org/geoserver/wms?", +// "naturalearth:10m_admin_0_countries"); + + OSMLayer baseLayer = new OSMLayer("OSM", + "http://tile.openstreetmap.org/${z}/${x}/${y}.png", 19); + map.addLayer(baseLayer); + + MapContextAdapter mapContextAdapter = new MapContextAdapter( + mapContextProvider.getMapContext(), map); + // FIXME: find a better way to register it + openLayersWidget.setData(mapContextAdapter); + return openLayersWidget; + } + +} diff --git a/gis/plugins/org.argeo.gis.ui/META-INF/MANIFEST.MF b/gis/plugins/org.argeo.gis.ui/META-INF/MANIFEST.MF index c184e8e32..7805b6a02 100644 --- a/gis/plugins/org.argeo.gis.ui/META-INF/MANIFEST.MF +++ b/gis/plugins/org.argeo.gis.ui/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Ui -Bundle-SymbolicName: org.argeo.gis.ui +Bundle-SymbolicName: org.argeo.gis.ui;singleton:=true Bundle-Version: 1.0.0.qualifier Bundle-Activator: org.argeo.gis.ui.GisUiPlugin Bundle-Vendor: Argeo @@ -10,3 +10,17 @@ Require-Bundle: org.eclipse.ui;resolution:=optional, org.eclipse.core.runtime Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ActivationPolicy: lazy +Import-Package: org.apache.commons.logging;version="1.1.1", + org.argeo, + org.argeo.eclipse.spring, + org.argeo.eclipse.ui, + org.argeo.eclipse.ui.dialogs, + org.geotools.data, + org.geotools.map, + org.geotools.map.event, + org.opengis.feature.simple, + org.opengis.feature.type +Export-Package: org.argeo.gis.ui, + org.argeo.gis.ui.commands, + org.argeo.gis.ui.editors, + org.argeo.gis.ui.views diff --git a/gis/plugins/org.argeo.gis.ui/META-INF/spring/commands.xml b/gis/plugins/org.argeo.gis.ui/META-INF/spring/commands.xml new file mode 100644 index 000000000..5a6cc7fcb --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/META-INF/spring/commands.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/gis/plugins/org.argeo.gis.ui/META-INF/spring/editors.xml b/gis/plugins/org.argeo.gis.ui/META-INF/spring/editors.xml new file mode 100644 index 000000000..ced2f0619 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/META-INF/spring/editors.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/gis/plugins/org.argeo.gis.ui/META-INF/spring/osgi.xml b/gis/plugins/org.argeo.gis.ui/META-INF/spring/osgi.xml new file mode 100644 index 000000000..faf565ddd --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/META-INF/spring/osgi.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/gis/plugins/org.argeo.gis.ui/META-INF/spring/views.xml b/gis/plugins/org.argeo.gis.ui/META-INF/spring/views.xml new file mode 100644 index 000000000..fd995a13b --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/META-INF/spring/views.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/gis/plugins/org.argeo.gis.ui/build.properties b/gis/plugins/org.argeo.gis.ui/build.properties index 5fc538bc8..6a11945e8 100644 --- a/gis/plugins/org.argeo.gis.ui/build.properties +++ b/gis/plugins/org.argeo.gis.ui/build.properties @@ -1,4 +1,7 @@ source.. = src/main/java/ output.. = target/classes/ bin.includes = META-INF/,\ - . + .,\ + plugin.xml,\ + js_lib/,\ + icons/ diff --git a/gis/plugins/org.argeo.gis.ui/gis_rap.properties b/gis/plugins/org.argeo.gis.ui/gis_rap.properties new file mode 100644 index 000000000..9c03106c6 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/gis_rap.properties @@ -0,0 +1,26 @@ +argeo.osgi.start=\ +org.springframework.osgi.extender,\ +com.springsource.javax.servlet,\ +org.eclipse.core.runtime,\ +org.eclipse.equinox.common,\ +org.eclipse.equinox.http.jetty,\ +org.eclipse.equinox.http.registry,\ +org.eclipse.equinox.launcher,\ +org.mortbay.jetty.server,\ +org.argeo.security.equinox,\ +org.argeo.security.manager.ldap,\ +org.argeo.security.services,\ +org.argeo.server.ads.server,\ +org.argeo.node.repo.jackrabbit,\ +org.argeo.gis.ui.rap.openlayers,\ +org.argeo.slc.gis.position.backend,\ + +eclipse.ignoreApp=true +osgi.noShutdown=true + +org.argeo.security.ui.initialPerspective=org.argeo.gis.ui.perspective + +log4j.configuration=file:../../log4j.properties + +org.eclipse.equinox.http.jetty.log.stderr.threshold=debug +org.osgi.service.http.port=9090 diff --git a/gis/plugins/org.argeo.gis.ui/icons/earth.gif b/gis/plugins/org.argeo.gis.ui/icons/earth.gif new file mode 100644 index 000000000..229c391c4 Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/earth.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/icons/earth_edit.gif b/gis/plugins/org.argeo.gis.ui/icons/earth_edit.gif new file mode 100644 index 000000000..c7b32787f Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/earth_edit.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/icons/gis.gif b/gis/plugins/org.argeo.gis.ui/icons/gis.gif new file mode 100644 index 000000000..05a2053e5 Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/gis.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/icons/gis_add_data.gif b/gis/plugins/org.argeo.gis.ui/icons/gis_add_data.gif new file mode 100644 index 000000000..8956b3d1c Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/gis_add_data.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/icons/gis_add_note.gif b/gis/plugins/org.argeo.gis.ui/icons/gis_add_note.gif new file mode 100644 index 000000000..43e86dbfd Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/gis_add_note.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/icons/gis_bookmark.gif b/gis/plugins/org.argeo.gis.ui/icons/gis_bookmark.gif new file mode 100644 index 000000000..cdbc5287d Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/gis_bookmark.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/icons/gis_globe.gif b/gis/plugins/org.argeo.gis.ui/icons/gis_globe.gif new file mode 100644 index 000000000..e6517f3d5 Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/gis_globe.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/icons/gis_map.gif b/gis/plugins/org.argeo.gis.ui/icons/gis_map.gif new file mode 100644 index 000000000..de1f948ae Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/gis_map.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/icons/gis_process.gif b/gis/plugins/org.argeo.gis.ui/icons/gis_process.gif new file mode 100644 index 000000000..80531e39b Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/gis_process.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/icons/layer_folder.gif b/gis/plugins/org.argeo.gis.ui/icons/layer_folder.gif new file mode 100644 index 000000000..274d361ca Binary files /dev/null and b/gis/plugins/org.argeo.gis.ui/icons/layer_folder.gif differ diff --git a/gis/plugins/org.argeo.gis.ui/log4j.properties b/gis/plugins/org.argeo.gis.ui/log4j.properties new file mode 100644 index 000000000..f230ee0d8 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/log4j.properties @@ -0,0 +1,23 @@ +log4j.rootLogger=INFO, console + +## Levels +log4j.logger.org.argeo=DEBUG + +log4j.logger.org.apache.catalina=INFO +log4j.logger.org.apache.coyote=INFO +log4j.logger.org.apache.tomcat=INFO + +log4j.logger.org.apache.directory.server=INFO +log4j.logger.org.apache.directory.server.core.partition=ERROR +log4j.logger.org.apache.directory.server.core.schema.bootstrap.BootstrapAttributeTypeRegistry=ERROR + +log4j.logger.org.apache.jackrabbit=INFO +log4j.logger.org.apache.jackrabbit.core.query.lucene=ERROR + +## Appenders +# console is set to be a ConsoleAppender. +log4j.appender.console=org.apache.log4j.ConsoleAppender + +# console uses PatternLayout. +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c - [%t]%n diff --git a/gis/plugins/org.argeo.gis.ui/plugin.xml b/gis/plugins/org.argeo.gis.ui/plugin.xml new file mode 100644 index 000000000..2a712424e --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/plugin.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/GisPerspective.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/GisPerspective.java new file mode 100644 index 000000000..142856dde --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/GisPerspective.java @@ -0,0 +1,22 @@ +package org.argeo.gis.ui; + +import org.argeo.gis.ui.views.DataStoresView; +import org.argeo.gis.ui.views.LayersView; +import org.eclipse.ui.IFolderLayout; +import org.eclipse.ui.IPageLayout; +import org.eclipse.ui.IPerspectiveFactory; + +public class GisPerspective implements IPerspectiveFactory { + + public void createInitialLayout(IPageLayout layout) { + String editorArea = layout.getEditorArea(); + layout.setEditorAreaVisible(true); + layout.setFixed(false); + + IFolderLayout topLeft = layout.createFolder("topLeft", + IPageLayout.LEFT, 0.3f, editorArea); + topLeft.addView(LayersView.ID); + topLeft.addView(DataStoresView.ID); + } + +} diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/MapContextProvider.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/MapContextProvider.java new file mode 100644 index 000000000..1c7e2a5f2 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/MapContextProvider.java @@ -0,0 +1,7 @@ +package org.argeo.gis.ui; + +import org.geotools.map.MapContext; + +public interface MapContextProvider { + public MapContext getMapContext(); +} diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/MapControlCreator.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/MapControlCreator.java new file mode 100644 index 000000000..21af4b136 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/MapControlCreator.java @@ -0,0 +1,9 @@ +package org.argeo.gis.ui; + +import org.eclipse.swt.widgets.Composite; + +public interface MapControlCreator { + /** Creates a map control based on this parent and this map context */ + public Composite createMapControl(Composite parent, + MapContextProvider mapContextProvider); +} diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/AddLayer.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/AddLayer.java new file mode 100644 index 000000000..2af873988 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/AddLayer.java @@ -0,0 +1,33 @@ +package org.argeo.gis.ui.commands; + +import org.argeo.eclipse.ui.dialogs.Error; +import org.argeo.gis.ui.editors.DefaultMapEditor; +import org.argeo.gis.ui.editors.MapEditorInput; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.handlers.HandlerUtil; +import org.geotools.map.DefaultMapContext; + +/** Opens a new map editor */ +public class AddLayer extends AbstractHandler { + private String editorId = DefaultMapEditor.ID; + + public Object execute(ExecutionEvent event) throws ExecutionException { + try { + HandlerUtil + .getActiveWorkbenchWindow(event) + .getActivePage() + .openEditor(new MapEditorInput(new DefaultMapContext()), + editorId); + } catch (Exception e) { + Error.show("Cannot open editor", e); + } + return null; + } + + public void setEditorId(String editorId) { + this.editorId = editorId; + } + +} diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/NewMap.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/NewMap.java new file mode 100644 index 000000000..1a7a5cdf8 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/NewMap.java @@ -0,0 +1,33 @@ +package org.argeo.gis.ui.commands; + +import org.argeo.eclipse.ui.dialogs.Error; +import org.argeo.gis.ui.editors.DefaultMapEditor; +import org.argeo.gis.ui.editors.MapEditorInput; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.handlers.HandlerUtil; +import org.geotools.map.DefaultMapContext; + +/** Opens a new map editor */ +public class NewMap extends AbstractHandler { + private String editorId = DefaultMapEditor.ID; + + public Object execute(ExecutionEvent event) throws ExecutionException { + try { + HandlerUtil + .getActiveWorkbenchWindow(event) + .getActivePage() + .openEditor(new MapEditorInput(new DefaultMapContext()), + editorId); + } catch (Exception e) { + Error.show("Cannot open editor", e); + } + return null; + } + + public void setEditorId(String editorId) { + this.editorId = editorId; + } + +} diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/data/DataStoreNode.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/data/DataStoreNode.java new file mode 100644 index 000000000..92851d753 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/data/DataStoreNode.java @@ -0,0 +1,30 @@ +package org.argeo.gis.ui.data; + +import java.io.IOException; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.TreeParent; +import org.geotools.data.DataStore; +import org.opengis.feature.type.Name; + +public class DataStoreNode extends TreeParent { + private DataStore dataStore; + + public DataStoreNode(DataStore dataStore) { + super(dataStore.getInfo().getTitle() != null ? dataStore.getInfo() + .getTitle() : dataStore.toString()); + this.dataStore = dataStore; + try { + for (Name name : dataStore.getNames()) { + addChild(new FeatureNode(dataStore, name)); + } + } catch (IOException e) { + throw new ArgeoException("Cannot scan data store", e); + } + } + + public DataStore getDataStore() { + return dataStore; + } + +} \ No newline at end of file diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/data/FeatureNode.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/data/FeatureNode.java new file mode 100644 index 000000000..3a0577384 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/data/FeatureNode.java @@ -0,0 +1,40 @@ +package org.argeo.gis.ui.data; + +import java.io.IOException; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.TreeParent; +import org.geotools.data.DataStore; +import org.geotools.data.FeatureSource; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import org.opengis.feature.type.Name; + +public class FeatureNode extends TreeParent { + private final DataStore dataStore; + private final Name featureName; + + public FeatureNode(DataStore dataStore, Name name) { + super(name.toString()); + this.dataStore = dataStore; + this.featureName = name; + } + + public FeatureSource getFeatureSource() { + try { + return dataStore.getFeatureSource(featureName); + } catch (IOException e) { + throw new ArgeoException("Cannot get feature " + featureName + + " of " + dataStore, e); + } + } + + public DataStore getDataStore() { + return dataStore; + } + + public Name getFeatureName() { + return featureName; + } + +} \ No newline at end of file diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/editors/DefaultMapEditor.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/editors/DefaultMapEditor.java new file mode 100644 index 000000000..e9311b9db --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/editors/DefaultMapEditor.java @@ -0,0 +1,91 @@ +package org.argeo.gis.ui.editors; + +import org.argeo.gis.ui.MapContextProvider; +import org.argeo.gis.ui.MapControlCreator; +import org.argeo.gis.ui.views.LayersView; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.part.EditorPart; +import org.geotools.data.FeatureSource; +import org.geotools.map.MapContext; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; + +/** A generic map editor */ +public class DefaultMapEditor extends EditorPart implements MapContextProvider { + public final static String ID = "org.argeo.gis.ui.defaultMapEditor"; + + private MapContext mapContext; + private Composite map; + private MapControlCreator mapControlCreator; + + @Override + public void init(IEditorSite site, IEditorInput input) + throws PartInitException { + if (input instanceof MapContextProvider) { + mapContext = ((MapContextProvider) input).getMapContext(); + setSite(site); + setInput(input); + setPartName(input.getName()); + } else { + throw new PartInitException("Support only " + + MapContextProvider.class + " inputs"); + } + } + + @Override + public void createPartControl(Composite parent) { + Composite mapArea = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.marginHeight = 0; + layout.marginWidth = 0; + mapArea.setLayout(layout); + map = mapControlCreator.createMapControl(mapArea, this); + } + + public void addLayer( + FeatureSource featureSource) { + // TODO: deal with style + mapContext.addLayer(featureSource, null); + } + + @Override + public void doSave(IProgressMonitor monitor) { + } + + @Override + public void doSaveAs() { + } + + @Override + public boolean isDirty() { + return false; + } + + @Override + public boolean isSaveAsAllowed() { + return false; + } + + @Override + public void setFocus() { + LayersView layersView = (LayersView) getEditorSite() + .getWorkbenchWindow().getActivePage().findView(LayersView.ID); + layersView.setMapContext(getMapContext()); + map.setFocus(); + } + + public MapContext getMapContext() { + return mapContext; + } + + public void setMapControlCreator(MapControlCreator mapControlCreator) { + this.mapControlCreator = mapControlCreator; + } + +} diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/editors/MapEditorInput.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/editors/MapEditorInput.java new file mode 100644 index 000000000..7deb74c8e --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/editors/MapEditorInput.java @@ -0,0 +1,48 @@ +package org.argeo.gis.ui.editors; + +import org.argeo.gis.ui.MapContextProvider; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IPersistableElement; +import org.geotools.map.MapContext; + +public class MapEditorInput implements IEditorInput, MapContextProvider { + private final MapContext mapContext; + + public MapEditorInput(MapContext mapContext) { + this.mapContext = mapContext; + } + + public MapContext getMapContext() { + return mapContext; + } + + public String getName() { + return mapContext.getTitle() != null ? mapContext.getTitle() : ""; + } + + public String getToolTipText() { + return mapContext.getAbstract() != null ? mapContext.getAbstract() + : mapContext.getTitle() != null ? mapContext.getTitle() : ""; + } + + @SuppressWarnings("rawtypes") + public Object getAdapter(Class adapter) { + if (MapContext.class.isAssignableFrom(adapter)) + return mapContext; + return null; + } + + public boolean exists() { + return false; + } + + public ImageDescriptor getImageDescriptor() { + return null; + } + + public IPersistableElement getPersistable() { + return null; + } + +} diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/views/DataStoresView.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/views/DataStoresView.java new file mode 100644 index 000000000..7bb008d6f --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/views/DataStoresView.java @@ -0,0 +1,95 @@ +package org.argeo.gis.ui.views; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.argeo.eclipse.ui.AbstractTreeContentProvider; +import org.argeo.gis.ui.data.DataStoreNode; +import org.argeo.gis.ui.data.FeatureNode; +import org.argeo.gis.ui.editors.DefaultMapEditor; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.part.ViewPart; +import org.geotools.data.DataStore; +import org.geotools.data.FeatureSource; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; + +public class DataStoresView extends ViewPart implements IDoubleClickListener { + public final static String ID = "org.argeo.gis.ui.dataStoresView"; + + private TreeViewer viewer; + + private List dataStores; + + @Override + public void createPartControl(Composite parent) { + viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + viewer.setContentProvider(new DataStoreContentProvider()); + viewer.setLabelProvider(new DataStoreLabelProvider()); + viewer.setInput(getViewSite()); + viewer.addDoubleClickListener(this); + } + + public void doubleClick(DoubleClickEvent event) { + if (!event.getSelection().isEmpty()) { + Iterator it = ((IStructuredSelection) event.getSelection()) + .iterator(); + while (it.hasNext()) { + Object obj = it.next(); + if (obj instanceof FeatureNode) { + FeatureNode featureNode = (FeatureNode) obj; + FeatureSource featureSource = featureNode + .getFeatureSource(); + IEditorPart ed = getSite().getWorkbenchWindow().getActivePage().getActiveEditor(); + if(ed instanceof DefaultMapEditor){ + ((DefaultMapEditor)ed).addLayer(featureSource); + } + } + } + } + + } + + @Override + public void setFocus() { + viewer.getTree().setFocus(); + } + + public void refresh() { + viewer.refresh(); + } + + public void setDataStores(List dataStores) { + this.dataStores = dataStores; + } + + private class DataStoreContentProvider extends AbstractTreeContentProvider { + + public Object[] getElements(Object inputElement) { + List dataStoreNodes = new ArrayList(); + // it is better to deal with OSGi reference using and iterator + Iterator it = dataStores.iterator(); + while (it.hasNext()) + dataStoreNodes.add(new DataStoreNode(it.next())); + return dataStoreNodes.toArray(); + } + + } + + private class DataStoreLabelProvider extends LabelProvider { + + @Override + public String getText(Object element) { + return super.getText(element); + } + + } +} diff --git a/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/views/LayersView.java b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/views/LayersView.java new file mode 100644 index 000000000..56fb03fe1 --- /dev/null +++ b/gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/views/LayersView.java @@ -0,0 +1,152 @@ +package org.argeo.gis.ui.views; + +import org.argeo.eclipse.ui.TreeParent; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IViewSite; +import org.eclipse.ui.part.ViewPart; +import org.geotools.map.MapContext; +import org.geotools.map.MapLayer; +import org.geotools.map.event.MapLayerListEvent; +import org.geotools.map.event.MapLayerListListener; + +public class LayersView extends ViewPart implements MapLayerListListener { + public final static String ID = "org.argeo.gis.ui.layersView"; + + private TreeViewer viewer; + + private MapContext mapContext; + + @Override + public void createPartControl(Composite parent) { + viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + viewer.setContentProvider(new MapContextContentProvider()); + viewer.setLabelProvider(new MapContextLabelProvider()); + viewer.setInput(getViewSite()); + } + + public void setMapContext(MapContext mapContext) { + viewer.setInput(mapContext); + if (this.mapContext != null) { + this.mapContext.removeMapLayerListListener(this); + } + this.mapContext = mapContext; + this.mapContext.addMapLayerListListener(this); + } + + /* + * MAP LAYER LIST LISTENER + */ + public void layerAdded(MapLayerListEvent event) { + viewer.refresh(); + } + + public void layerRemoved(MapLayerListEvent event) { + viewer.refresh(); + } + + public void layerChanged(MapLayerListEvent event) { + viewer.refresh(); + } + + public void layerMoved(MapLayerListEvent event) { + viewer.refresh(); + } + + /* + * VIEW + */ + @Override + public void setFocus() { + viewer.getTree().setFocus(); + } + + public void refresh() { + viewer.refresh(); + } + + private class MapContextContentProvider implements ITreeContentProvider { + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + + public Object[] getElements(Object inputElement) { + if (inputElement instanceof MapContext) + return new Object[] { new MapContextNode( + (MapContext) inputElement) }; + else if (inputElement instanceof IViewSite) + return new Object[] {}; + else + return getChildren(inputElement); + } + + public Object[] getChildren(Object element) { + if (element instanceof MapContextNode) { + MapContextNode mapContextNode = (MapContextNode) element; + return mapContextNode.getMapContext().getLayers(); + } else if (element instanceof MapLayer) { + // MapLayer mapLayer = (MapLayer) element; + + } else if (element instanceof TreeParent) { + return ((TreeParent) element).getChildren(); + } + return new Object[0]; + } + + public Object getParent(Object element) { + if (element instanceof TreeParent) { + return ((TreeParent) element).getParent(); + } + return null; + } + + public boolean hasChildren(Object element) { + if (element instanceof MapContextNode) { + return true; + } else if (element instanceof TreeParent) { + return ((TreeParent) element).hasChildren(); + } else if (element instanceof MapLayer) { + return false; + } + return false; + } + + } + + private class MapContextLabelProvider extends LabelProvider { + + @Override + public String getText(Object element) { + if (element instanceof MapLayer) { + MapLayer mapLayer = (MapLayer) element; + String title = mapLayer.getTitle(); + if (title == null || title.trim().equals("")) + title = mapLayer.toString(); + return title; + } + return super.getText(element); + } + + } + + private class MapContextNode extends TreeParent { + private MapContext mapContext; + + public MapContextNode(MapContext mapContext) { + super("Map Context"); + this.mapContext = mapContext; + } + + public MapContext getMapContext() { + return mapContext; + } + + } +}