Statistics
| Revision:

root / tags / v2_0_0_Build_2047 / extensions / extEditing / src / org / gvsig / editing / layers / VectorialLayerEdited.java @ 38269

History | View | Annotate | Download (17.1 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 javax.swing.JOptionPane;
10

    
11
import org.slf4j.Logger;
12
import org.slf4j.LoggerFactory;
13

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

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

    
78
        private ILegend legend;
79
        private Image imageSelection;
80
        private Image imageHandlers;
81
        private EditionChangeManager echm=null;
82
        private MapControl mapControl = null;
83

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

    
93
        public ArrayList getSelectedHandler() {
94
                return selectedHandler;
95
        }
96

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

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

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

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

    
149
        public void selectWithSecondPoint(double x, double y) {
150
                FeatureSet set = null;
151
                try {
152
                        FeatureStore featureStore = getFeatureStore();
153
                        lastPoint = new Point2D.Double(x, y);
154
                        ViewPort viewPort = getLayer().getMapContext().getViewPort();
155
                        double x1;
156
                        double y1;
157
                        double w1;
158
                        double h1;
159

    
160
                        if (firstPoint.getX() < lastPoint.getX()) {
161
                                x1 = firstPoint.getX();
162
                                w1 = lastPoint.getX() - firstPoint.getX();
163
                        } else {
164
                                x1 = lastPoint.getX();
165
                                w1 = firstPoint.getX() - lastPoint.getX();
166
                        }
167

    
168
                        if (firstPoint.getY() < lastPoint.getY()) {
169
                                y1 = firstPoint.getY();
170
                                h1 = lastPoint.getY() - firstPoint.getY();
171
                        } else {
172
                                y1 = lastPoint.getY();
173
                                h1 = firstPoint.getY() - lastPoint.getY();
174
                        }
175

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

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

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

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

    
278
                } catch (ReadException e) {
279
                        NotificationManager.addError(e.getMessage(), e);
280
                } catch (DataException e) {
281
                        NotificationManager.addError(e.getMessage(), e);
282
                } catch (GeometryOperationNotSupportedException e) {
283
                        NotificationManager.addError(e.getMessage(), e);
284
                } catch (GeometryOperationException e) {
285
                        NotificationManager.addError(e.getMessage(), e);
286
                } finally {
287
                        DisposeUtils.dispose(set);
288
                }
289
        }
290

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

    
311
        public void drawHandlers(org.gvsig.fmap.geom.Geometry geom, 
312
                        ViewPort vp) {
313
            Geometry drawnGeometry = geom;
314
            //If the layer is reprojected, reproject the geometry to draw its handlers in the fine position
315
            if (getLayer().getCoordTrans() != null){
316
                drawnGeometry = drawnGeometry.cloneGeometry();
317
                drawnGeometry.reProject(getLayer().getCoordTrans());
318
        }
319
                Handler[] handlers = drawnGeometry.getHandlers(org.gvsig.fmap.geom.Geometry.SELECTHANDLER);                
320
                mapControl.getMapControlDrawer().drawHandlers(handlers, vp.getAffineTransform(), 
321
                                MAP_CONTROL_MANAGER.getHandlerSymbol());
322
        }
323

    
324
        public Image getSelectionImage() {
325
                return imageSelection;
326
        }
327

    
328
        public void setSelectionImage(Image image) {
329
                imageSelection = image;
330
        }
331

    
332
        public Image getHandlersImage() {
333
                return imageHandlers;
334
        }
335

    
336
        public void setHandlersImage(Image image) {
337
                imageHandlers = image;
338
        }
339

    
340
        public void beforeLayerDraw(LayerDrawEvent e) throws CancelationException {
341

    
342
        }
343

    
344
        public void afterLayerDraw(LayerDrawEvent e) throws CancelationException {
345
                //Draw the selected geometries...
346
                FeatureStore featureStore = null;
347
                DisposableIterator iterator = null;
348
                try {
349
                        featureStore = getFeatureStore();
350
                        if (featureStore.isEditing()) {
351
                                ViewPort viewPort = getLayer().getMapContext().getViewPort();                                
352
                                iterator = featureStore.getFeatureSelection().fastIterator();                                
353
                                MapControlDrawer mapControlDrawer = mapControl.getMapControlDrawer();
354
                                try {
355
                                        while (iterator.hasNext()) {
356
                                                Feature feature = (Feature) iterator.next();
357
                                                Geometry geometry = feature.getDefaultGeometry();
358
                                                mapControlDrawer.startDrawing(this);
359
                                                mapControlDrawer.setGraphics(e.getGraphics());                                                
360
                                            drawHandlers(geometry.cloneGeometry(), viewPort);                                                                                                                  
361
                                                mapControlDrawer.stopDrawing(this);
362
                                        }
363
                                } catch (ConcurrentModificationException e1) {
364
                                        // throw new CancelationException(e1);
365
                                        // A mitad de pintado se cambia la selecci?n y por tanto no
366
                                        // se puede seguir recorriendo la anterior.
367
                                        return;
368
                                }
369
                        }
370
                } catch (Exception e2) {
371
                  LOG.info("afterLayerDraw error. ", e2);
372
                  ApplicationLocator.getManager().message(
373
                      "_Unable_to_draw_geometry_handlers",
374
                        JOptionPane.ERROR_MESSAGE);
375
                        // LOG.error("Error drawing the selected geometry", e2);
376
                } finally {
377
                        if (iterator != null) {
378
                                iterator.dispose();
379
                        }
380
                }
381
        }
382

    
383
    public void beforeGraphicLayerDraw(LayerDrawEvent e)
384
        throws CancelationException {
385
        }
386

    
387
        public void afterLayerGraphicDraw(LayerDrawEvent e)
388
        throws CancelationException {
389
        }
390

    
391
        public void activationGained(LayerEvent e) {
392
                if (ViewCommandStackExtension.csd != null) {
393
                        ViewCommandStackExtension.csd.setModel(((FLyrVect) getLayer())
394
                                        .getFeatureStore());
395

    
396
                }
397
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
398
                if (window instanceof DefaultViewPanel) {
399
                        DefaultViewPanel view = (DefaultViewPanel) window;
400
                        if (e.getSource().isEditing()) {
401
                                view.showConsole();
402
                        }
403
                }
404
                if (cadtool != null) {
405
                        CADExtension.getCADToolAdapter().setCadTool(cadtool);
406
                        PluginServices.getMainFrame().setSelectedTool(cadtool.toString());
407
                        StartEditing.startCommandsApplicable(null, (FLyrVect) getLayer());
408
                        CADExtension.initFocus();
409
                }
410

    
411
        }
412

    
413
        public void activationLost(LayerEvent e) {
414
                try {
415
                        cadtool = CADExtension.getCADTool();
416
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
417
                        if (window instanceof DefaultViewPanel) {
418
                                DefaultViewPanel view = (DefaultViewPanel) window;
419
                                view.hideConsole();
420
                        }
421
                } catch (EmptyStackException e1) {
422
                        cadtool = new SelectionCADTool();
423
                        cadtool.init();
424
                }
425

    
426
        }
427

    
428
        public void setLegend(ILegend legend) {
429
                this.legend = legend;
430
        }
431

    
432
        public ILegend getLegend() {
433
                return legend;
434
        }
435

    
436
        public FeatureStore getFeatureStore() throws ReadException {
437
                return ((FLyrVect) getLayer()).getFeatureStore();
438
        }
439

    
440
        public void update(Observable observable, Object notification) {
441
                echm.update(observable, notification);
442
        }
443

    
444
        public EditionChangeManager getEditionChangeManager() {
445
                return echm;
446
        }
447

    
448
        public void setEditionChangeManager(EditionChangeManager echm) {
449
                this.echm = echm;
450
        }
451
}