]> git.argeo.org Git - lgpl/argeo-commons.git/blob - SwingMapViewer.java
32d03c19285d656e6b99a0a3fa9c119c83ed87fa
[lgpl/argeo-commons.git] / SwingMapViewer.java
1 package org.argeo.gis.ui.rcp.swing;
2
3 import java.awt.Color;
4 import java.awt.Frame;
5 import java.util.Collection;
6 import java.util.Collections;
7 import java.util.HashMap;
8 import java.util.Map;
9
10 import javax.jcr.Node;
11
12 import org.argeo.ArgeoException;
13 import org.argeo.geotools.jcr.GeoJcrMapper;
14 import org.argeo.geotools.styling.StylingUtils;
15 import org.argeo.gis.ui.AbstractMapViewer;
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.awt.SWT_AWT;
18 import org.eclipse.swt.widgets.Composite;
19 import org.geotools.data.FeatureSource;
20 import org.geotools.geometry.jts.ReferencedEnvelope;
21 import org.geotools.map.DefaultMapContext;
22 import org.geotools.map.DefaultMapLayer;
23 import org.geotools.map.MapContext;
24 import org.geotools.map.MapLayer;
25 import org.geotools.referencing.CRS;
26 import org.geotools.renderer.lite.StreamingRenderer;
27 import org.geotools.styling.Style;
28 import org.geotools.swing.JMapPane;
29 import org.opengis.feature.simple.SimpleFeature;
30 import org.opengis.feature.simple.SimpleFeatureType;
31 import org.opengis.referencing.crs.CoordinateReferenceSystem;
32
33 /** Map viewer implementation based on GeoTools Swing components. */
34 public class SwingMapViewer extends AbstractMapViewer {
35 private Composite embedded;
36 private JMapPane mapPane;
37 private VersatileZoomTool versatileZoomTool;
38
39 private Map<String, MapLayer> mapLayers = Collections
40 .synchronizedMap(new HashMap<String, MapLayer>());
41
42 public SwingMapViewer(Node context, GeoJcrMapper geoJcrMapper,
43 Composite parent) {
44 super(context, geoJcrMapper);
45
46 embedded = new Composite(parent, SWT.EMBEDDED | SWT.NO_BACKGROUND);
47 Frame frame = SWT_AWT.new_Frame(embedded);
48
49 MapContext mapContext = new DefaultMapContext();
50 // dummy call to make sure that the layers are initialized
51 mapContext.layers();
52 mapPane = new JMapPane(new StreamingRenderer(), mapContext);
53 versatileZoomTool = new VersatileZoomTool();
54 mapPane.setCursorTool(versatileZoomTool);
55 mapPane.setBackground(Color.WHITE);
56 frame.add(mapPane);
57
58 setControl(embedded);
59 }
60
61 @Override
62 protected void addFeatureSource(String layerId,
63 FeatureSource<SimpleFeatureType, SimpleFeature> featureSource,
64 Object style) {
65 if (style == null)
66 style = StylingUtils.createLineStyle("BLACK", 1);
67
68 MapLayer mapLayer = new DefaultMapLayer(featureSource, (Style) style);
69 addMapLayer(layerId, mapLayer);
70 }
71
72 protected void addMapLayer(String layerId, MapLayer mapLayer) {
73 mapLayers.put(layerId, mapLayer);
74 mapPane.getMapContext().addLayer(mapLayer);
75 }
76
77 public void addLayer(String layerId, Collection<?> collection, Object style) {
78 if (style == null)
79 style = StylingUtils.createLineStyle("BLACK", 1);
80 MapLayer mapLayer = new DefaultMapLayer(collection, (Style) style);
81 addMapLayer(layerId, mapLayer);
82 }
83
84 public void setStyle(String layerId, Object style) {
85 mapLayers.get(layerId).setStyle((Style) style);
86 }
87
88 public void setAreaOfInterest(ReferencedEnvelope areaOfInterest) {
89 // mapPane.getMapContext().setAreaOfInterest(areaOfInterest);
90 CoordinateReferenceSystem crs = mapPane.getMapContext()
91 .getCoordinateReferenceSystem();
92
93 ReferencedEnvelope toDisplay;
94 if (crs != null)
95 try {
96 toDisplay = areaOfInterest.transform(crs, true);
97 } catch (Exception e) {
98 throw new ArgeoException("Cannot reproject " + areaOfInterest,
99 e);
100 }
101 else
102 toDisplay = areaOfInterest;
103 mapPane.setDisplayArea(toDisplay);
104 }
105
106 public void setCoordinateReferenceSystem(String crs) {
107 try {
108 CoordinateReferenceSystem crsObj = CRS.decode(crs);
109 mapPane.getMapContext().setCoordinateReferenceSystem(crsObj);
110 mapPane.repaint();
111 } catch (Exception e) {
112 throw new ArgeoException("Cannot set CRS '" + crs + "'", e);
113 }
114
115 }
116
117 }