1 package fr.ifremer.dali.ui.swing.util.map;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import fr.ifremer.dali.map.Maps;
27 import fr.ifremer.dali.ui.swing.util.map.layer.DataFeatureLayer;
28 import fr.ifremer.quadrige3.ui.swing.ApplicationUIUtil;
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.geotools.data.simple.SimpleFeatureCollection;
32 import org.geotools.data.simple.SimpleFeatureIterator;
33 import org.geotools.factory.CommonFactoryFinder;
34 import org.geotools.geometry.jts.ReferencedEnvelope;
35 import org.geotools.map.Layer;
36 import org.geotools.swing.event.MapMouseEvent;
37 import org.geotools.swing.tool.CursorTool;
38 import org.opengis.feature.simple.SimpleFeature;
39 import org.opengis.filter.Filter;
40 import org.opengis.filter.FilterFactory2;
41 import org.opengis.filter.identity.FeatureId;
42
43 import java.awt.Cursor;
44 import java.awt.Point;
45 import java.awt.geom.Point2D;
46 import java.io.IOException;
47 import java.util.HashSet;
48 import java.util.Set;
49
50
51
52
53
54
55 public class MultipleCursorTool extends CursorTool {
56
57 private Cursor cursor;
58 private boolean panning;
59
60 private Point startPointInScreen;
61 private Point panningPointInScreen;
62 private Point2D startPointInWorld;
63 private ReferencedEnvelope startDisplayArea;
64
65 private static final Log log = LogFactory.getLog(MultipleCursorTool.class);
66
67 public MultipleCursorTool(DataMapPane mapPane) {
68 setMapPane(mapPane);
69 cursor = ApplicationUIUtil.getCustomCursor("select");
70 panning = false;
71 }
72
73 @Override
74 public DataMapPane getMapPane() {
75 return (DataMapPane) super.getMapPane();
76 }
77
78
79
80
81
82
83
84 @Override
85 public void onMouseClicked(MapMouseEvent ev) {
86
87
88 ReferencedEnvelope envelope = ev.getEnvelopeByPixels(10);
89
90
91
92
93
94 FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null);
95
96
97 Set<DataFeatureLayer> selectedDataLayers = new HashSet<>();
98
99 try {
100 for (Layer layer : getMapPane().getMapContent().layers()) {
101 if (layer instanceof DataFeatureLayer && layer.isVisible()) {
102 DataFeatureLayer dataLayer = (DataFeatureLayer) layer;
103 String geometryAttributeName = layer.getFeatureSource().getSchema().getGeometryDescriptor().getLocalName();
104 Filter filter = ff.intersects(
105 ff.property(geometryAttributeName),
106 ff.literal(
107 Maps.transformReferencedEnvelope(
108 envelope,
109 dataLayer.getBounds().getCoordinateReferenceSystem())
110 )
111 );
112
113
114 SimpleFeatureCollection selectedFeatureCollection = dataLayer.getSimpleFeatureSource().getFeatures(filter);
115
116 Set<FeatureId> IDs = new HashSet<>();
117
118 try (SimpleFeatureIterator iterator = selectedFeatureCollection.features()) {
119 while (iterator.hasNext()) {
120 SimpleFeature feature = iterator.next();
121 IDs.add(feature.getIdentifier());
122 if (log.isDebugEnabled()) {
123 log.debug(" feature selected: " + feature.getIdentifier());
124 }
125 }
126
127 }
128
129 if (!IDs.isEmpty()) {
130
131
132 selectedDataLayers.add(dataLayer);
133 } else {
134 if (log.isDebugEnabled()) {
135 log.debug("no feature selected");
136 }
137 }
138 }
139 }
140 } catch (IOException ex) {
141 log.error("Unable to retrieve selected features", ex);
142 }
143
144 if (!selectedDataLayers.isEmpty()) {
145
146
147 DataSelectionEvent event = new DataSelectionEvent(getMapPane(), DataSelectionEvent.Type.DATA_LAYER_SELECTED, selectedDataLayers, ev.getPoint(), ev.getWorldPos());
148 getMapPane().publishSelectionEvent(event);
149
150 } else {
151
152
153 DataSelectionEvent event = new DataSelectionEvent(getMapPane(), DataSelectionEvent.Type.EMPTY_SELECTION);
154 getMapPane().publishSelectionEvent(event);
155
156 }
157 }
158
159
160
161
162
163
164
165 @Override
166 public void onMousePressed(MapMouseEvent ev) {
167 startDisplayArea = getMapPane().getDisplayArea();
168 startPointInWorld = ev.getWorldPos();
169 startPointInScreen = panningPointInScreen = ev.getPoint();
170 }
171
172
173
174
175
176
177 @Override
178 public void onMouseDragged(MapMouseEvent ev) {
179
180
181 if (getMapPane().isBusy() || ev.getPoint().distance(startPointInScreen) < 2) return;
182
183 panning = true;
184
185
186 Point point = ev.getPoint();
187 if (!point.equals(panningPointInScreen)) {
188 getMapPane().moveImage(point.x - panningPointInScreen.x, point.y - panningPointInScreen.y);
189 panningPointInScreen = point;
190 }
191 }
192
193
194
195
196
197
198
199 @Override
200 public void onMouseReleased(MapMouseEvent ev) {
201
202 if (!panning) return;
203
204 panning = false;
205 Point2D endPointInWorld = ev.getWorldPos();
206 double transX = startPointInWorld.getX() - endPointInWorld.getX();
207 double transY = startPointInWorld.getY() - endPointInWorld.getY();
208
209 ReferencedEnvelope endDisplayArea = new ReferencedEnvelope(startDisplayArea);
210
211 endDisplayArea.translate(transX, transY);
212
213 getMapPane().setDisplayArea(endDisplayArea);
214
215 if (log.isDebugEnabled()) {
216 log.debug(String.format("Translate (x : %s, y : %s)", transX, transY));
217 }
218 }
219
220
221
222
223
224
225
226
227 @Override
228 public void onMouseWheelMoved(MapMouseEvent ev) {
229
230 int notches = ev.getWheelAmount();
231 double zoomRatio = 1 - (DataMapPane.ZOOM_STEP_RATIO * notches);
232 Point zoomCenter = ev.getPoint();
233
234 if (zoomRatio != 1) {
235
236
237 getMapPane().applyZoom(zoomRatio, zoomCenter);
238
239 }
240 }
241
242
243
244
245
246 @Override
247 public boolean drawDragBox() {
248 return false;
249 }
250
251 @Override
252 public Cursor getCursor() {
253 return cursor;
254 }
255
256 }