Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extEditing / src / org / gvsig / editing / layers / VectorialLayerEdited.java @ 36005

History | View | Annotate | Download (16.5 KB)

1
package org.gvsig.editing.layers;
2

    
3
import java.awt.Image;
4
import java.awt.geom.Point2D;
5
import java.util.ArrayList;
6
import java.util.ConcurrentModificationException;
7
import java.util.EmptyStackException;
8

    
9
import org.slf4j.Logger;
10
import org.slf4j.LoggerFactory;
11

    
12
import org.gvsig.andami.PluginServices;
13
import org.gvsig.andami.messages.NotificationManager;
14
import org.gvsig.andami.ui.mdiManager.IWindow;
15
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
16
import org.gvsig.editing.CADExtension;
17
import org.gvsig.editing.EditionChangeManager;
18
import org.gvsig.editing.StartEditing;
19
import org.gvsig.editing.ViewCommandStackExtension;
20
import org.gvsig.editing.gui.cad.CADTool;
21
import org.gvsig.editing.gui.cad.tools.SelectionCADTool;
22
import org.gvsig.editing.gui.cad.tools.select.SelectRowPanel;
23
import org.gvsig.fmap.dal.exception.DataException;
24
import org.gvsig.fmap.dal.exception.ReadException;
25
import org.gvsig.fmap.dal.feature.Feature;
26
import org.gvsig.fmap.dal.feature.FeatureQuery;
27
import org.gvsig.fmap.dal.feature.FeatureSelection;
28
import org.gvsig.fmap.dal.feature.FeatureSet;
29
import org.gvsig.fmap.dal.feature.FeatureStore;
30
import org.gvsig.fmap.geom.Geometry;
31
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
32
import org.gvsig.fmap.geom.Geometry.TYPES;
33
import org.gvsig.fmap.geom.GeometryLocator;
34
import org.gvsig.fmap.geom.GeometryManager;
35
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
36
import org.gvsig.fmap.geom.exception.CreateGeometryException;
37
import org.gvsig.fmap.geom.handler.Handler;
38
import org.gvsig.fmap.geom.operation.GeometryOperationException;
39
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
40
import org.gvsig.fmap.geom.primitive.Circle;
41
import org.gvsig.fmap.geom.primitive.Envelope;
42
import org.gvsig.fmap.geom.primitive.Point;
43
import org.gvsig.fmap.mapcontext.ViewPort;
44
import org.gvsig.fmap.mapcontext.layers.CancelationException;
45
import org.gvsig.fmap.mapcontext.layers.FLayer;
46
import org.gvsig.fmap.mapcontext.layers.LayerDrawEvent;
47
import org.gvsig.fmap.mapcontext.layers.LayerDrawingListener;
48
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
49
import org.gvsig.fmap.mapcontext.layers.vectorial.ContainsGeometryEvaluator;
50
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
51
import org.gvsig.fmap.mapcontext.layers.vectorial.IntersectsGeometryEvaluator;
52
import org.gvsig.fmap.mapcontext.layers.vectorial.OutGeometryEvaluator;
53
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
54
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
55
import org.gvsig.fmap.mapcontrol.MapControl;
56
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
57
import org.gvsig.fmap.mapcontrol.MapControlLocator;
58
import org.gvsig.fmap.mapcontrol.MapControlManager;
59
import org.gvsig.tools.dispose.DisposableIterator;
60
import org.gvsig.tools.dispose.DisposeUtils;
61
import org.gvsig.tools.evaluator.Evaluator;
62
import org.gvsig.tools.observer.Observable;
63
import org.gvsig.tools.observer.Observer;
64

    
65
public class VectorialLayerEdited extends DefaultLayerEdited implements
66
LayerDrawingListener, Observer {
67
        private static final GeometryManager geomManager = GeometryLocator.getGeometryManager();
68
        private static final Logger LOG = LoggerFactory.getLogger(VectorialLayerEdited.class);
69
        private static final MapControlManager MAP_CONTROL_MANAGER = MapControlLocator.getMapControlManager();
70
        private ArrayList selectedHandler = new ArrayList();
71
        private Point2D lastPoint;
72
        private Point2D firstPoint;
73
        private CADTool cadtool = null;
74

    
75
        private ILegend legend;
76
        private Image imageSelection;
77
        private Image imageHandlers;
78
        private EditionChangeManager echm=null;
79
        private MapControl mapControl = null;
80

    
81
        public VectorialLayerEdited(FLayer lyr, MapControl mapControl) {
82
                super(lyr);
83
                this.mapControl = mapControl;
84
                lyr.getMapContext().addLayerDrawingListener(this);
85
                // Por defecto, siempre hacemos snapping sobre la capa en edici?n.
86
                lyr.getMapContext().getLayersToSnap().add(lyr);
87
                ((FLyrVect) lyr).getFeatureStore().addObserver(this);                
88
        }
89

    
90
        public ArrayList getSelectedHandler() {
91
                return selectedHandler;
92
        }
93

    
94
        public void clearSelection() throws DataException {
95
                if (getFeatureStore() == null) {
96
                        return;
97
                }
98
                FeatureSelection selection = getFeatureStore().getFeatureSelection();
99
                selectedHandler.clear();
100
                selection.deselectAll();
101
        }
102

    
103
        public void selectWithPoint(double x, double y, boolean multipleSelection) {
104
                FeatureSet set = null;
105
                try {
106
                        firstPoint = new Point2D.Double(x, y);
107
                        FeatureStore featureStore = getFeatureStore();
108
                        // Se comprueba si se pincha en una gemometr?a
109
                        ViewPort viewPort = getLayer().getMapContext().getViewPort();
110
                        double tol = viewPort.toMapDistance(MAP_CONTROL_MANAGER.getTolerance());
111

    
112
                        GeometryManager manager = GeometryLocator.getGeometryManager();
113
                        Point center = (org.gvsig.fmap.geom.primitive.Point)manager.create(TYPES.POINT, SUBTYPES.GEOM2D);
114
                        center.setX(x);
115
                        center.setY(y);
116
                        Circle circle = (Circle)geomManager.create(TYPES.CIRCLE, SUBTYPES.GEOM2D);
117
                        circle.setPoints(center, tol);
118

    
119
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
120
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
121
                        Evaluator evaluator = new IntersectsGeometryEvaluator(circle, viewPort.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
122
                        featureQuery.setFilter(evaluator);
123
                        set = featureStore.getFeatureSet(featureQuery);
124
                        if (!multipleSelection && set.getSize()>1){
125
                                SelectRowPanel selectionPanel = new SelectRowPanel(set, this);
126
                                PluginServices.getMDIManager().addCentredWindow(selectionPanel);
127
                        }
128
                        selectGeometries(featureStore, set, viewPort, multipleSelection);
129
                } catch (ReadException e) {
130
                        NotificationManager.addError(e.getMessage(), e);
131
                } catch (GeometryOperationNotSupportedException e) {
132
                        NotificationManager.addError(e.getMessage(), e);
133
                } catch (GeometryOperationException e) {
134
                        NotificationManager.addError(e.getMessage(), e);
135
                } catch (DataException e) {
136
                        NotificationManager.addError(e.getMessage(), e);
137
                } catch (CreateGeometryException e) {
138
                        NotificationManager.addError(e.getMessage(), e);
139
                } finally {
140
                        set.dispose();
141
                }
142
        }
143

    
144
        public void selectWithSecondPoint(double x, double y) {
145
                FeatureSet set = null;
146
                try {
147
                        FeatureStore featureStore = getFeatureStore();
148
                        lastPoint = new Point2D.Double(x, y);
149
                        ViewPort viewPort = getLayer().getMapContext().getViewPort();
150
                        double x1;
151
                        double y1;
152
                        double w1;
153
                        double h1;
154

    
155
                        if (firstPoint.getX() < lastPoint.getX()) {
156
                                x1 = firstPoint.getX();
157
                                w1 = lastPoint.getX() - firstPoint.getX();
158
                        } else {
159
                                x1 = lastPoint.getX();
160
                                w1 = firstPoint.getX() - lastPoint.getX();
161
                        }
162

    
163
                        if (firstPoint.getY() < lastPoint.getY()) {
164
                                y1 = firstPoint.getY();
165
                                h1 = lastPoint.getY() - firstPoint.getY();
166
                        } else {
167
                                y1 = lastPoint.getY();
168
                                h1 = firstPoint.getY() - lastPoint.getY();
169
                        }
170

    
171
                        Envelope envelope = geomManager.createEnvelope(x1, y1, x1 + w1, y1 + h1, SUBTYPES.GEOM2D);
172

    
173
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
174
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
175
                        Evaluator evaluator=null;
176
                        if (firstPoint.getX() < lastPoint.getX()) {
177
                                evaluator = new IntersectsGeometryEvaluator(envelope.getGeometry(), viewPort.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
178
                        }else{
179
                                evaluator = new IntersectsGeometryEvaluator(envelope.getGeometry(), viewPort.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
180
                        }
181
                        featureQuery.setFilter(evaluator);
182
                        set = featureStore.getFeatureSet(featureQuery);
183
                        selectGeometries(featureStore, set, viewPort, false);
184
                } catch (ReadException e) {
185
                        NotificationManager.addError(e.getMessage(), e);
186
                } catch (GeometryOperationNotSupportedException e) {
187
                        NotificationManager.addError(e.getMessage(), e);
188
                } catch (GeometryOperationException e) {
189
                        NotificationManager.addError(e.getMessage(), e);
190
                } catch (DataException e) {
191
                        NotificationManager.addError(e.getMessage(), e);
192
                } catch (CreateEnvelopeException e) {
193
                        NotificationManager.addError(e.getMessage(), e);
194
                } finally {
195
                        DisposeUtils.dispose(set);
196
                }
197
        }
198

    
199
        public void selectContainsSurface(org.gvsig.fmap.geom.Geometry polygon) {
200
                FeatureSet set = null;
201
                try {
202
                        FeatureStore featureStore = getFeatureStore();
203
                        ViewPort viewPort = getLayer().getMapContext().getViewPort();
204
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
205
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
206
                        Evaluator evaluator = new ContainsGeometryEvaluator(polygon, viewPort.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
207
                        featureQuery.setFilter(evaluator);
208
                        set = featureStore.getFeatureSet(featureQuery);
209
                        selectGeometries(featureStore, set, viewPort, false);
210
                } catch (ReadException e) {
211
                        NotificationManager.addError(e.getMessage(), e);
212
                } catch (DataException e) {
213
                        NotificationManager.addError(e.getMessage(), e);
214
                } catch (GeometryOperationNotSupportedException e) {
215
                        NotificationManager.addError(e.getMessage(), e);
216
                } catch (GeometryOperationException e) {
217
                        NotificationManager.addError(e.getMessage(), e);
218
                } finally {
219
                        DisposeUtils.dispose(set);
220
                }
221
        }
222
        
223
        private void selectGeometries(FeatureStore featureStore, FeatureSet set, ViewPort vp, boolean multipleSelection) throws DataException, GeometryOperationNotSupportedException, GeometryOperationException{
224
                FeatureSelection featureSelection = null;
225
                if (multipleSelection) {
226
                        featureSelection = (FeatureSelection) featureStore.getSelection();
227
                        featureSelection.select(set);
228
                } else {
229
                        featureSelection = featureStore.createFeatureSelection();
230
                        featureSelection.select(set);
231
                        featureStore.setSelection(featureSelection);
232
                }
233
                //Draw the geometries with the edition symbology
234
                
235
        }
236
        
237
        public void selectIntersectsSurface(org.gvsig.fmap.geom.Geometry polygon) {
238
                FeatureSet set = null;
239
                try {
240
                        FeatureStore featureStore = getFeatureStore();
241
                        ViewPort vp = getLayer().getMapContext().getViewPort();
242
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
243
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
244
                        Evaluator evaluator = new IntersectsGeometryEvaluator(polygon, vp.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
245
                        featureQuery.setFilter(evaluator);
246
                        set = featureStore.getFeatureSet(featureQuery);
247
                        selectGeometries(featureStore,set,vp,false);
248
                } catch (ReadException e) {
249
                        NotificationManager.addError(e.getMessage(), e);
250
                } catch (DataException e) {
251
                        NotificationManager.addError(e.getMessage(), e);
252
                } catch (GeometryOperationNotSupportedException e) {
253
                        NotificationManager.addError(e.getMessage(), e);
254
                } catch (GeometryOperationException e) {
255
                        NotificationManager.addError(e.getMessage(), e);
256
                } finally {
257
                        DisposeUtils.dispose(set);
258
                }
259
        }
260

    
261
        public void selectOutPolygon(org.gvsig.fmap.geom.Geometry polygon) {
262
                FeatureSet set = null;
263
                try {
264
                        FeatureStore featureStore = getFeatureStore();
265
                        ViewPort vp = getLayer().getMapContext().getViewPort();
266
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
267
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
268
                        Evaluator evaluator=new OutGeometryEvaluator(polygon, vp.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
269
                        featureQuery.setFilter(evaluator);
270
                        set = featureStore.getFeatureSet(featureQuery);
271
                        selectGeometries(featureStore, set, vp, false);
272

    
273
                } catch (ReadException e) {
274
                        NotificationManager.addError(e.getMessage(), e);
275
                } catch (DataException e) {
276
                        NotificationManager.addError(e.getMessage(), e);
277
                } catch (GeometryOperationNotSupportedException e) {
278
                        NotificationManager.addError(e.getMessage(), e);
279
                } catch (GeometryOperationException e) {
280
                        NotificationManager.addError(e.getMessage(), e);
281
                } finally {
282
                        DisposeUtils.dispose(set);
283
                }
284
        }
285

    
286
        public void selectAll() {
287
                FeatureSet set = null;
288
                try {
289
                        FeatureStore featureStore = getFeatureStore();
290
                        ViewPort viewPort = getLayer().getMapContext().getViewPort();
291
                        set = featureStore.getFeatureSet();
292
                        selectGeometries(featureStore, set, viewPort, false);
293
                } catch (ReadException e) {
294
                        NotificationManager.addError(e.getMessage(), e);
295
                } catch (DataException e) {
296
                        NotificationManager.addError(e.getMessage(), e);
297
                } catch (GeometryOperationNotSupportedException e) {
298
                        NotificationManager.addError(e.getMessage(), e);
299
                } catch (GeometryOperationException e) {
300
                        NotificationManager.addError(e.getMessage(), e);
301
                } finally {
302
                        DisposeUtils.dispose(set);
303
                }
304
        }
305

    
306
        public void drawHandlers(org.gvsig.fmap.geom.Geometry geom, 
307
                        ViewPort vp) {
308
                Handler[] handlers = geom.getHandlers(org.gvsig.fmap.geom.Geometry.SELECTHANDLER);
309
                mapControl.getMapControlDrawer().drawHandlers(handlers, vp.getAffineTransform(), 
310
                                MAP_CONTROL_MANAGER.getHandlerSymbol());
311
        }
312

    
313
        public Image getSelectionImage() {
314
                return imageSelection;
315
        }
316

    
317
        public void setSelectionImage(Image image) {
318
                imageSelection = image;
319
        }
320

    
321
        public Image getHandlersImage() {
322
                return imageHandlers;
323
        }
324

    
325
        public void setHandlersImage(Image image) {
326
                imageHandlers = image;
327
        }
328

    
329
        public void beforeLayerDraw(LayerDrawEvent e) throws CancelationException {
330

    
331
        }
332

    
333
        public void afterLayerDraw(LayerDrawEvent e) throws CancelationException {
334
                //Draw the selected geometries...
335
                FeatureStore featureStore = null;
336
                DisposableIterator iterator = null;
337
                try {
338
                        featureStore = getFeatureStore();
339
                        if (featureStore.isEditing()) {
340
                                ViewPort viewPort = getLayer().getMapContext().getViewPort();                                
341
                                iterator = featureStore.getFeatureSelection().fastIterator();                                
342
                                MapControlDrawer mapControlDrawer = mapControl.getMapControlDrawer();
343
                                try {
344
                                        while (iterator.hasNext()) {
345
                                                Feature feature = (Feature) iterator.next();
346
                                                Geometry geometry = feature.getDefaultGeometry();
347
                                                mapControlDrawer.startDrawing(this);
348
                                                mapControlDrawer.setGraphics(e.getGraphics());                                                
349
                                            drawHandlers(geometry.cloneGeometry(), viewPort);                                                                                                                  
350
                                                mapControlDrawer.stopDrawing(this);
351
                                        }
352
                                } catch (ConcurrentModificationException e1) {
353
                                        // throw new CancelationException(e1);
354
                                        // A mitad de pintado se cambia la selecci?n y por tanto no
355
                                        // se puede seguir recorriendo la anterior.
356
                                        return;
357
                                }
358
                        }
359
                } catch (Exception e2) {
360
                        LOG.error("Error drawing the selected geometry", e2);
361
                } finally {
362
                        if (iterator != null) {
363
                                iterator.dispose();
364
                        }
365
                }
366
        }
367

    
368
    public void beforeGraphicLayerDraw(LayerDrawEvent e)
369
        throws CancelationException {
370
        }
371

    
372
        public void afterLayerGraphicDraw(LayerDrawEvent e)
373
        throws CancelationException {
374
        }
375

    
376
        public void activationGained(LayerEvent e) {
377
                if (ViewCommandStackExtension.csd != null) {
378
                        ViewCommandStackExtension.csd.setModel(((FLyrVect) getLayer())
379
                                        .getFeatureStore());
380

    
381
                }
382
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
383
                if (window instanceof DefaultViewPanel) {
384
                        DefaultViewPanel view = (DefaultViewPanel) window;
385
                        if (e.getSource().isEditing()) {
386
                                view.showConsole();
387
                        }
388
                }
389
                if (cadtool != null) {
390
                        CADExtension.getCADToolAdapter().setCadTool(cadtool);
391
                        PluginServices.getMainFrame().setSelectedTool(cadtool.toString());
392
                        StartEditing.startCommandsApplicable(null, (FLyrVect) getLayer());
393
                        CADExtension.initFocus();
394
                }
395

    
396
        }
397

    
398
        public void activationLost(LayerEvent e) {
399
                try {
400
                        cadtool = CADExtension.getCADTool();
401
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
402
                        if (window instanceof DefaultViewPanel) {
403
                                DefaultViewPanel view = (DefaultViewPanel) window;
404
                                view.hideConsole();
405
                        }
406
                } catch (EmptyStackException e1) {
407
                        cadtool = new SelectionCADTool();
408
                        cadtool.init();
409
                }
410

    
411
        }
412

    
413
        public void setLegend(ILegend legend) {
414
                this.legend = legend;
415
        }
416

    
417
        public ILegend getLegend() {
418
                return legend;
419
        }
420

    
421
        public FeatureStore getFeatureStore() throws ReadException {
422
                return ((FLyrVect) getLayer()).getFeatureStore();
423
        }
424

    
425
        public void update(Observable observable, Object notification) {
426
                echm.update(observable, notification);
427
        }
428

    
429
        public EditionChangeManager getEditionChangeManager() {
430
                return echm;
431
        }
432

    
433
        public void setEditionChangeManager(EditionChangeManager echm) {
434
                this.echm = echm;
435
        }
436
}