From 77eaf70d8b929dab68211d6a01f68eeb71a1dceb Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 26 Feb 2011 20:28:05 +0000 Subject: [PATCH] First working GIS git-svn-id: https://svn.argeo.org/commons/trunk@4224 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../ui/AbstractTreeContentProvider.java | 42 +++++ .../java/org/argeo/eclipse/ui/TreeObject.java | 2 +- .../META-INF/MANIFEST.MF | 22 ++- .../META-INF/spring/openlayers.xml | 11 ++ .../META-INF/spring/osgi.xml | 11 ++ .../build.properties | 3 +- .../rap/openlayers/GisOpenlayersPlugin.java | 2 +- .../ui/rap/openlayers/MapContextAdapter.java | 142 ++++++++++++++++ .../OpenLayersMapControlCreator.java | 51 ++++++ .../org.argeo.gis.ui/META-INF/MANIFEST.MF | 16 +- .../META-INF/spring/commands.xml | 11 ++ .../META-INF/spring/editors.xml | 13 ++ .../org.argeo.gis.ui/META-INF/spring/osgi.xml | 12 ++ .../META-INF/spring/views.xml | 17 ++ gis/plugins/org.argeo.gis.ui/build.properties | 5 +- .../org.argeo.gis.ui/gis_rap.properties | 26 +++ gis/plugins/org.argeo.gis.ui/icons/earth.gif | Bin 0 -> 587 bytes .../org.argeo.gis.ui/icons/earth_edit.gif | Bin 0 -> 1000 bytes gis/plugins/org.argeo.gis.ui/icons/gis.gif | Bin 0 -> 596 bytes .../org.argeo.gis.ui/icons/gis_add_data.gif | Bin 0 -> 607 bytes .../org.argeo.gis.ui/icons/gis_add_note.gif | Bin 0 -> 609 bytes .../org.argeo.gis.ui/icons/gis_bookmark.gif | Bin 0 -> 578 bytes .../org.argeo.gis.ui/icons/gis_globe.gif | Bin 0 -> 573 bytes .../org.argeo.gis.ui/icons/gis_map.gif | Bin 0 -> 1012 bytes .../org.argeo.gis.ui/icons/gis_process.gif | Bin 0 -> 364 bytes .../org.argeo.gis.ui/icons/layer_folder.gif | Bin 0 -> 573 bytes gis/plugins/org.argeo.gis.ui/log4j.properties | 23 +++ gis/plugins/org.argeo.gis.ui/plugin.xml | 73 +++++++++ .../java/org/argeo/gis/ui/GisPerspective.java | 22 +++ .../org/argeo/gis/ui/MapContextProvider.java | 7 + .../org/argeo/gis/ui/MapControlCreator.java | 9 ++ .../org/argeo/gis/ui/commands/AddLayer.java | 33 ++++ .../org/argeo/gis/ui/commands/NewMap.java | 33 ++++ .../org/argeo/gis/ui/data/DataStoreNode.java | 30 ++++ .../org/argeo/gis/ui/data/FeatureNode.java | 40 +++++ .../gis/ui/editors/DefaultMapEditor.java | 91 +++++++++++ .../argeo/gis/ui/editors/MapEditorInput.java | 48 ++++++ .../argeo/gis/ui/views/DataStoresView.java | 95 +++++++++++ .../org/argeo/gis/ui/views/LayersView.java | 152 ++++++++++++++++++ 39 files changed, 1035 insertions(+), 7 deletions(-) create mode 100644 eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/AbstractTreeContentProvider.java create mode 100644 gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/spring/openlayers.xml create mode 100644 gis/plugins/org.argeo.gis.ui.rap.openlayers/META-INF/spring/osgi.xml create mode 100644 gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/MapContextAdapter.java create mode 100644 gis/plugins/org.argeo.gis.ui.rap.openlayers/src/main/java/org/argeo/gis/ui/rap/openlayers/OpenLayersMapControlCreator.java create mode 100644 gis/plugins/org.argeo.gis.ui/META-INF/spring/commands.xml create mode 100644 gis/plugins/org.argeo.gis.ui/META-INF/spring/editors.xml create mode 100644 gis/plugins/org.argeo.gis.ui/META-INF/spring/osgi.xml create mode 100644 gis/plugins/org.argeo.gis.ui/META-INF/spring/views.xml create mode 100644 gis/plugins/org.argeo.gis.ui/gis_rap.properties create mode 100644 gis/plugins/org.argeo.gis.ui/icons/earth.gif create mode 100644 gis/plugins/org.argeo.gis.ui/icons/earth_edit.gif create mode 100644 gis/plugins/org.argeo.gis.ui/icons/gis.gif create mode 100644 gis/plugins/org.argeo.gis.ui/icons/gis_add_data.gif create mode 100644 gis/plugins/org.argeo.gis.ui/icons/gis_add_note.gif create mode 100644 gis/plugins/org.argeo.gis.ui/icons/gis_bookmark.gif create mode 100644 gis/plugins/org.argeo.gis.ui/icons/gis_globe.gif create mode 100644 gis/plugins/org.argeo.gis.ui/icons/gis_map.gif create mode 100644 gis/plugins/org.argeo.gis.ui/icons/gis_process.gif create mode 100644 gis/plugins/org.argeo.gis.ui/icons/layer_folder.gif create mode 100644 gis/plugins/org.argeo.gis.ui/log4j.properties create mode 100644 gis/plugins/org.argeo.gis.ui/plugin.xml create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/GisPerspective.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/MapContextProvider.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/MapControlCreator.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/AddLayer.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/commands/NewMap.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/data/DataStoreNode.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/data/FeatureNode.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/editors/DefaultMapEditor.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/editors/MapEditorInput.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/views/DataStoresView.java create mode 100644 gis/plugins/org.argeo.gis.ui/src/main/java/org/argeo/gis/ui/views/LayersView.java 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 0000000000000000000000000000000000000000..229c391c49357ce457ec3581d289ac4adde48e27 GIT binary patch literal 587 zcmV-R0<`@{Nk%w1VGsZi0OkMyS5$INOmI(4a8OQgP;AmybGBG;uT^laS#`2mbg@@> zxL9|#S9i5ncC=V_wODtxSa!5oc(hq}vsiVpS$48nc(YcG(^`st_v4+LRl+4Xj&dij| z%ah8c>@VN7d`c zrpS)j?8%O;QmV>uu+Mj}&U2cpbpQYT|Ns7!l2&$gRF#x*rKEy@e`V?D%{Ow5wy3j8U$pYjtr^(8{QHZ%*>-(f07#$GVevb#Hif za(H!ccXV%gb#Zuga_z^c>cppcb#m{>u%8VF|NsC0|Nj6000000A^8LW004aeEC2ui z01yBW000N5fPI34goTEOh=L|4G&L!SGbM0XOhrB(AcinRY-fB|J5fC%AB7}XcU@n2 zd`3YXAzXtoO?+NxP-1R5Ef)r6gDg)+e0oV!Z&pqi33Y=nKTAkzRa8=CN*WXZgDxvT zJUVG$S!)Fd4R(VcDnmjRZDU$_4iI!73+3>-F8i11*}09geI Z9GD=10UZGl50RMzK+cv#AO!^i06RfJ8tVW6 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c7b32787fef1b21ce48bb45ff19bfcf655a41dce GIT binary patch literal 1000 zcmXw2Z%7+w82?>OY#di(Z)SB+TpS(fCPPO+%Q_le{4*P@8!y>DB#>=4C?o4KcSPn6 z7kjQ|Ymn=4h#&lrmEZ>##K~c|R#qv_mFx&i&az29bX3njb5cfzu1Ifh()Hox;d!3- z_xzsU!^_+CMrZ5kcdJl^ePFWErj8M9I+@NUNly3AX#QT|@R7~PX0$n?Wp!;PNfeFr zXOdHb@7j`Z(XX3J#*VHpCq*S<+||fMLx@Gl;6i?HcVRwB#`NHz=AYJ8C6dpj)vQit zbTKB7eoY-B`L%`MxS=Wn2?!(E$Zl5Crg{IAF2qQ|)OVNDg|*Dc5P$fvpv|jf%m~gI zB&MBe=T(I)$s{w6w$-B6oB}45d%*j_`h5dS8A|e{eNU21QgX!Td*T+hJgYwzEmKY#!Jy&KBcFKe7MDQ3~Uu9)(er%xX~IMKiM$&))sqva&YjBoIvc z@$>hgjiujy{J#7A`_awC?>_yqudo04``?T;HBa9BtesuPfYpR<68@3)|~wR|3AaP0mYvzj0_B63_2hu zfZ~LKePcsdQ*%peQ%FZ=M_YSPU%z2UkG&+D^;9+?eVsN_GhPul4_kGi0Gn1t?Lgf? z*}x5f(yi_?d_0^BoEX%!S}iy@95@UZm_kpmwkVlw=VW0HW#-oq_G$Jq7Z5lW$}ca) zY$<#y%-Cf+OQ;b)yOo}^Sa6dH_cw-61u1b)S8>(PYji3ndB>XYD+eWT2yO6e<+AH> kU6FK{P*wk<0UY-tb0@(OrR+2-y|{t?{qO(kF8}K|{_IBn>_`6Y zSpM!>{_ku4@N4hmb^h^w{_=kP@qYdCkNxwH^y-VexQ_q()c*V2|K%|K=}-Rhng9CM z=Ht!(+7ABTA%%TO|NQB}wS2+0f1jCq>gnYD^v~V08JdGC!LoV%^UuqqC$*6ywUQ&c zmnOrWEy1sK{O6;dc^0OD8m598rGgr+iXXa|H2d9y!K`ub>Difd6S9#ytBgOvs&1=` zK&FR8!K7uurDwsXYN3Qj=h3bF_wV!N(fH-nbWctH|Nj6000000A^8LW004aeEC2ui z01yBW000NRfPI34goT707Ze#AgkgmhCvABu9}$9KIgWxFBzQJ^DSzTROX?++hGBGbVFbM-_Xk=$*P<;~}9w=K=2nQ)tWou!8`GG-7PB?x^eT-Zbkn?Z4S vNSxT?hZZq#?hLZCqoc4VZ`k4l$6s#*WKYR&WdP4Akvek@u3sBGnv$~Dhx z*1u}p_OX8R+m@YQnznsx-~GLP&-d1yU%C(c?%MaWYyVFsw;pECeiqMuR-cJ6lTNbu zPGk?7#u+}FGkg|z^gN!JdA#upc@q}#B`vY5of|!2P0X5;_Vf40oIGh?Umvq}?WB_@ z=kMRY_T4QFlO~n#-#`EU z{r&&{e0p+n?PN8z^78Wk|Nk=#S)llng^_{5kwFLK15lhWu+MLBY_e8swQO=!?&@mN zR@1iCRaI|N7M`x`*kWsDr>&vdK5d4hn!c@-xs9O|L#K#{=u9;oJ5wWLQ@wSHf`S4{ zOZ&7;3@kL)$@2*bDa=w)ld`vPU}%?R=i!%YQoF$Lz@bTojh9WP!`jNhs=Y~)g_~Qt y+1uDvpIbevf98zd>2oH{UNU>hipte17p`h7 z>pZmgSang$>EjoUA3oDqHgUs>{dHyi7tUVGj+vSkJL%rtX9XoklQXA>Mpq@2?h4CY z83*?ix*$aTXMF1?Tw<9r(-9qJ8|#T z>HDuVCZFoxb;e=$^P0UEoHm?UwCljM{m18Q-kxyyV(OuD$vY24U%r0!(W98T)93Eq znA6>G;Nit9U!ER*aB1K5Evv6)S2bm?Iaq)F?x{2Prv3TIzy`_E4=&Y3ak$J47DS1m8`_x=C>Kf?e4#h)yU3=H86 zIw1Q&al*hpt0BCJm8q$%yy$T*tuLKhV}(yn~THT+uSX zBgD=^m$RL@NzX0F-POTLS*V?%N!{MX+0oNUUZlNO&D6}s&qq#{x1D3TprO82n1q6) zcl)d+6BQ*XX_?^Ar4z$_1w^^M!kO4RC-jB$F^PTWTHYk5!C{~%&&#u+JT7KWZbw%Oqt#vb2sx)tR>fEsT{N1-d|9|@Z-)+%x&t+$Pm!I}uan^6y z$$*t-f>xXkTy`>W`N`0=7lK!u3R!XT>gWI0KL3C9^S}496MoB11g<^rzv5KD@)JQT zPKK>M6S?lp%b)+>{`w!a>B8IJ|Gk#4@msU8?db6-XU+znJ2U0X>B*-~PCa!hD95zua0lox9;le(KxIfB*mg*HEAO^2M1~FVCMk)-!E#?v1OPW=zR{_xkLX)yeCY zWp7>Iy<^ja3#V3GIJ5cifsI>McV0cS^3&^!Q>xADbIi-qtP&#~kMEj%@8YW8Ki*HP z)Spyt)LCfUS!mLbZC0LUb@$xzBZm&WJ-*`Ak>&4CY&df0;D0b+7zMNs0mYvz%nS@2 z3_2jIKzV|J<069~r;NvjgoDmn5pNz`d^Ewa(JJTxXYo@`Aps?xdj*fw&MF$X?vPOw zY^@nz(dwkY|~pm_MYfZi;Fi45vYEKE_NDh40E zUg(muYnpPydGUrsscM#ECmjzSVzo1^^O)z8t{~08#P((3$HQ&uC+mD>34UpB6Hr+0 aJ7dLX0fAoO4av7FE0%A|z0JtTU=09o^=aM! literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..80531e39b0248e788d40a889e89aeb26903d8250 GIT binary patch literal 364 zcmZ?wbhEHb6krfwxXQp_Z$IDOKK{trhxYOF?d$hjRn0wo{h|H*{YM_Yw%@Y|9%g%LnyNg zgywyX&3hXsA8oJSA3uM8ecQa$`uPyUfMk3;Q04ym`}gP1pAR&9{(YdX*ALe&i{84i z@BaSz4Gawb|NjRn0+I}bfZ|UUMg|5G1|5(>ke?XXIvr*eSd>_Fcr1DRxI<+!U;pyQ z4L02(r&EF~xgxdOc0ApYpvQM|f@bl z2xvc7T-)v0c+{=uV(f%<8k0{ISJtGjJDs)iu*2@>O$*l)AH43g;Y|F-W956!xd(Z<@P%V@`L& zfrl5be0h5K!KF!ar|dqzW8d{HtFLBPHD#|kSbzQQsWbPc{rUfTzP^2THo$Z`~UIK|JR$}zr6Y8V)y^2Oa9;L{0|hoSo-*2?f;M0 zW=`$9xvB8^#kGIFzdzh*_W9|>9XZcAIfSDAE+}arCIHil1eauCkzh zY^eL?%c|yq7G{R(eB7~No)0~}CG|{AjI4|~nVQ1hheZg>DQG*`a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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; + } + + } +} -- 2.30.2