]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - gis/plugins/org.argeo.gis.ui.rcp.swing/src/main/java/org/argeo/gis/ui/rcp/swing/SwingMapViewer.java
Move Commons GIS to Connect
[lgpl/argeo-commons.git] / gis / plugins / org.argeo.gis.ui.rcp.swing / src / main / java / org / argeo / gis / ui / rcp / swing / SwingMapViewer.java
index dd272b45a695b0f7d4ac908421c8669426b76a53..32d03c19285d656e6b99a0a3fa9c119c83ed87fa 100644 (file)
@@ -2,26 +2,43 @@ package org.argeo.gis.ui.rcp.swing;
 
 import java.awt.Color;
 import java.awt.Frame;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.jcr.Node;
 
+import org.argeo.ArgeoException;
 import org.argeo.geotools.jcr.GeoJcrMapper;
+import org.argeo.geotools.styling.StylingUtils;
 import org.argeo.gis.ui.AbstractMapViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.awt.SWT_AWT;
 import org.eclipse.swt.widgets.Composite;
 import org.geotools.data.FeatureSource;
+import org.geotools.geometry.jts.ReferencedEnvelope;
 import org.geotools.map.DefaultMapContext;
+import org.geotools.map.DefaultMapLayer;
+import org.geotools.map.MapContext;
+import org.geotools.map.MapLayer;
+import org.geotools.referencing.CRS;
 import org.geotools.renderer.lite.StreamingRenderer;
+import org.geotools.styling.Style;
 import org.geotools.swing.JMapPane;
 import org.opengis.feature.simple.SimpleFeature;
 import org.opengis.feature.simple.SimpleFeatureType;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
 
+/** Map viewer implementation based on GeoTools Swing components. */
 public class SwingMapViewer extends AbstractMapViewer {
        private Composite embedded;
        private JMapPane mapPane;
        private VersatileZoomTool versatileZoomTool;
 
+       private Map<String, MapLayer> mapLayers = Collections
+                       .synchronizedMap(new HashMap<String, MapLayer>());
+
        public SwingMapViewer(Node context, GeoJcrMapper geoJcrMapper,
                        Composite parent) {
                super(context, geoJcrMapper);
@@ -29,22 +46,72 @@ public class SwingMapViewer extends AbstractMapViewer {
                embedded = new Composite(parent, SWT.EMBEDDED | SWT.NO_BACKGROUND);
                Frame frame = SWT_AWT.new_Frame(embedded);
 
-               mapPane = new JMapPane(new StreamingRenderer(), new DefaultMapContext());
+               MapContext mapContext = new DefaultMapContext();
+               // dummy call to make sure that the layers are initialized
+               mapContext.layers();
+               mapPane = new JMapPane(new StreamingRenderer(), mapContext);
                versatileZoomTool = new VersatileZoomTool();
                mapPane.setCursorTool(versatileZoomTool);
                mapPane.setBackground(Color.WHITE);
-
                frame.add(mapPane);
 
                setControl(embedded);
        }
 
        @Override
-       protected void addFeatureSource(String path,
-                       FeatureSource<SimpleFeatureType, SimpleFeature> featureSource) {
-               // TODO: deal with style and rasters
-               mapPane.getMapContext().addLayer(featureSource, null);
-               mapPane.reset();
+       protected void addFeatureSource(String layerId,
+                       FeatureSource<SimpleFeatureType, SimpleFeature> featureSource,
+                       Object style) {
+               if (style == null)
+                       style = StylingUtils.createLineStyle("BLACK", 1);
+
+               MapLayer mapLayer = new DefaultMapLayer(featureSource, (Style) style);
+               addMapLayer(layerId, mapLayer);
+       }
+
+       protected void addMapLayer(String layerId, MapLayer mapLayer) {
+               mapLayers.put(layerId, mapLayer);
+               mapPane.getMapContext().addLayer(mapLayer);
+       }
+
+       public void addLayer(String layerId, Collection<?> collection, Object style) {
+               if (style == null)
+                       style = StylingUtils.createLineStyle("BLACK", 1);
+               MapLayer mapLayer = new DefaultMapLayer(collection, (Style) style);
+               addMapLayer(layerId, mapLayer);
+       }
+
+       public void setStyle(String layerId, Object style) {
+               mapLayers.get(layerId).setStyle((Style) style);
+       }
+
+       public void setAreaOfInterest(ReferencedEnvelope areaOfInterest) {
+               // mapPane.getMapContext().setAreaOfInterest(areaOfInterest);
+               CoordinateReferenceSystem crs = mapPane.getMapContext()
+                               .getCoordinateReferenceSystem();
+
+               ReferencedEnvelope toDisplay;
+               if (crs != null)
+                       try {
+                               toDisplay = areaOfInterest.transform(crs, true);
+                       } catch (Exception e) {
+                               throw new ArgeoException("Cannot reproject " + areaOfInterest,
+                                               e);
+                       }
+               else
+                       toDisplay = areaOfInterest;
+               mapPane.setDisplayArea(toDisplay);
+       }
+
+       public void setCoordinateReferenceSystem(String crs) {
+               try {
+                       CoordinateReferenceSystem crsObj = CRS.decode(crs);
+                       mapPane.getMapContext().setCoordinateReferenceSystem(crsObj);
+                       mapPane.repaint();
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot set CRS '" + crs + "'", e);
+               }
+
        }
 
 }