]> git.argeo.org Git - lgpl/argeo-commons.git/blob - AbstractMapViewer.java
d767f22772fb1317431bebfce92696ea8390b3b0
[lgpl/argeo-commons.git] / AbstractMapViewer.java
1 package org.argeo.gis.ui;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Set;
10
11 import javax.jcr.Node;
12 import javax.jcr.NodeIterator;
13 import javax.jcr.RepositoryException;
14
15 import org.argeo.ArgeoException;
16 import org.argeo.geotools.jcr.GeoJcrMapper;
17 import org.argeo.jcr.CollectionNodeIterator;
18 import org.argeo.jcr.gis.GisTypes;
19 import org.eclipse.swt.widgets.Composite;
20 import org.geotools.data.FeatureSource;
21 import org.opengis.feature.simple.SimpleFeature;
22 import org.opengis.feature.simple.SimpleFeatureType;
23
24 /**
25 * Logic of a map viewer which is independent from a particular map display
26 * implementation.
27 */
28 public abstract class AbstractMapViewer implements MapViewer {
29 private final Node context;
30 private final GeoJcrMapper geoJcrMapper;
31
32 private Composite control;
33 private Map<String, Set<String>> selected = new HashMap<String, Set<String>>();
34
35 private Set<MapViewerListener> listeners = Collections
36 .synchronizedSet(new HashSet<MapViewerListener>());
37
38 protected abstract void addFeatureSource(String path,
39 FeatureSource<SimpleFeatureType, SimpleFeature> featureSource);
40
41 public AbstractMapViewer(Node context, GeoJcrMapper geoJcrMapper) {
42 super();
43 this.context = context;
44 this.geoJcrMapper = geoJcrMapper;
45 }
46
47 public void addLayer(Node layer) {
48 try {
49 if (layer.isNodeType(GisTypes.GIS_FEATURE_SOURCE)) {
50 addFeatureSource(layer.getPath(),
51 geoJcrMapper.getFeatureSource(layer));
52 }
53 } catch (Exception e) {
54 throw new ArgeoException("Cannot add layer " + layer, e);
55 }
56
57 }
58
59 public NodeIterator getSelectedFeatures() {
60 try {
61 List<Node> nodes = new ArrayList<Node>();
62 for (String layerId : selected.keySet()) {
63 Set<String> featureIds = selected.get(layerId);
64 Node featureSource = context.getSession().getNode(layerId);
65 for (String featureId : featureIds) {
66 Node featureNode = geoJcrMapper.getFeatureNode(
67 featureSource, featureId);
68 nodes.add(featureNode);
69 }
70 }
71 return new CollectionNodeIterator(nodes);
72 } catch (RepositoryException e) {
73 throw new ArgeoException("Cannot get selected features from "
74 + context, e);
75 }
76 }
77
78 public void addMapViewerListener(MapViewerListener listener) {
79 listeners.add(listener);
80 }
81
82 public void removeMapViewerListener(MapViewerListener listener) {
83 listeners.remove(listener);
84 }
85
86 protected Node getContext() {
87 return context;
88 }
89
90 protected Map<String, Set<String>> getSelected() {
91 return selected;
92 }
93
94 protected Set<MapViewerListener> getListeners() {
95 return listeners;
96 }
97
98 protected void setControl(Composite control) {
99 this.control = control;
100 }
101
102 public Composite getControl() {
103 return control;
104 }
105
106 }