Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.editing.app / org.gvsig.editing.app.mainplugin / src / main / java / org / gvsig / editing / layers / VectorialLayerEdited.java @ 40557

History | View | Annotate | Download (18.4 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.editing.layers;
25

    
26
import java.awt.Image;
27
import java.awt.geom.Point2D;
28
import java.util.ArrayList;
29
import java.util.ConcurrentModificationException;
30
import java.util.EmptyStackException;
31

    
32
import javax.swing.JOptionPane;
33

    
34
import org.cresques.cts.IProjection;
35
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37

    
38
import org.gvsig.andami.PluginServices;
39
import org.gvsig.andami.messages.NotificationManager;
40
import org.gvsig.andami.ui.mdiManager.IWindow;
41
import org.gvsig.app.ApplicationLocator;
42
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
43
import org.gvsig.editing.CADExtension;
44
import org.gvsig.editing.EditionChangeManager;
45
import org.gvsig.editing.StartEditing;
46
import org.gvsig.editing.ViewCommandStackExtension;
47
import org.gvsig.editing.gui.cad.CADTool;
48
import org.gvsig.editing.gui.cad.tools.SelectionCADTool;
49
import org.gvsig.editing.gui.cad.tools.select.SelectRowPanel;
50
import org.gvsig.fmap.dal.exception.DataException;
51
import org.gvsig.fmap.dal.exception.ReadException;
52
import org.gvsig.fmap.dal.feature.Feature;
53
import org.gvsig.fmap.dal.feature.FeatureQuery;
54
import org.gvsig.fmap.dal.feature.FeatureSelection;
55
import org.gvsig.fmap.dal.feature.FeatureSet;
56
import org.gvsig.fmap.dal.feature.FeatureStore;
57
import org.gvsig.fmap.geom.Geometry;
58
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
59
import org.gvsig.fmap.geom.Geometry.TYPES;
60
import org.gvsig.fmap.geom.GeometryLocator;
61
import org.gvsig.fmap.geom.GeometryManager;
62
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
63
import org.gvsig.fmap.geom.exception.CreateGeometryException;
64
import org.gvsig.fmap.geom.handler.Handler;
65
import org.gvsig.fmap.geom.operation.GeometryOperationException;
66
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
67
import org.gvsig.fmap.geom.primitive.Circle;
68
import org.gvsig.fmap.geom.primitive.Envelope;
69
import org.gvsig.fmap.geom.primitive.Point;
70
import org.gvsig.fmap.mapcontext.ViewPort;
71
import org.gvsig.fmap.mapcontext.layers.CancelationException;
72
import org.gvsig.fmap.mapcontext.layers.FLayer;
73
import org.gvsig.fmap.mapcontext.layers.LayerDrawEvent;
74
import org.gvsig.fmap.mapcontext.layers.LayerDrawingListener;
75
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
76
import org.gvsig.fmap.mapcontext.layers.vectorial.ContainsGeometryEvaluator;
77
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
78
import org.gvsig.fmap.mapcontext.layers.vectorial.IntersectsGeometryEvaluator;
79
import org.gvsig.fmap.mapcontext.layers.vectorial.OutGeometryEvaluator;
80
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
81
import org.gvsig.fmap.mapcontrol.MapControl;
82
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
83
import org.gvsig.fmap.mapcontrol.MapControlLocator;
84
import org.gvsig.fmap.mapcontrol.MapControlManager;
85
import org.gvsig.tools.dispose.DisposableIterator;
86
import org.gvsig.tools.dispose.DisposeUtils;
87
import org.gvsig.tools.evaluator.Evaluator;
88
import org.gvsig.tools.observer.Observable;
89
import org.gvsig.tools.observer.Observer;
90

    
91
public class VectorialLayerEdited extends DefaultLayerEdited implements
92
LayerDrawingListener, Observer {
93
        private static final GeometryManager geomManager = GeometryLocator.getGeometryManager();
94
        private static final Logger LOG = LoggerFactory.getLogger(VectorialLayerEdited.class);
95
        private static final MapControlManager MAP_CONTROL_MANAGER = MapControlLocator.getMapControlManager();
96
        private ArrayList selectedHandler = new ArrayList();
97
        private Point2D lastPoint;
98
        private Point2D firstPoint;
99
        private CADTool cadtool = null;
100

    
101
        private ILegend legend;
102
        private Image imageSelection;
103
        private Image imageHandlers;
104
        private EditionChangeManager echm=null;
105
        private MapControl mapControl = null;
106

    
107
        public VectorialLayerEdited(FLayer lyr, MapControl mapControl) {
108
                super(lyr);
109
                this.mapControl = mapControl;
110
                lyr.getMapContext().addLayerDrawingListener(this);
111
                // Por defecto, siempre hacemos snapping sobre la capa en edici?n.
112
                lyr.getMapContext().getLayersToSnap().add(lyr);
113
                ((FLyrVect) lyr).getFeatureStore().addObserver(this);                
114
        }
115

    
116
        public ArrayList getSelectedHandler() {
117
                return selectedHandler;
118
        }
119

    
120
        public void clearSelection() throws DataException {
121
                if (getFeatureStore() == null) {
122
                        return;
123
                }
124
                FeatureSelection selection = getFeatureStore().getFeatureSelection();
125
                selectedHandler.clear();
126
                selection.deselectAll();
127
        }
128

    
129
        public void selectWithPoint(double x, double y, boolean multipleSelection) {
130
                FeatureSet set = null;
131
                try {
132
                        firstPoint = new Point2D.Double(x, y);
133
                        FeatureStore featureStore = getFeatureStore();
134
                        // Se comprueba si se pincha en una gemometr?a
135
                        ViewPort viewPort = getLayer().getMapContext().getViewPort();
136
                        double tol = viewPort.toMapDistance(MAP_CONTROL_MANAGER.getTolerance());
137

    
138
                        GeometryManager manager = GeometryLocator.getGeometryManager();
139
                        Point center = (org.gvsig.fmap.geom.primitive.Point)manager.create(TYPES.POINT, SUBTYPES.GEOM2D);
140
                        center.setX(x);
141
                        center.setY(y);
142
                        Circle circle = (Circle)geomManager.create(TYPES.CIRCLE, SUBTYPES.GEOM2D);
143
                        circle.setPoints(center, tol);
144

    
145
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
146
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
147
                        
148
                        FLayer the_layer = this.getLayer();
149
                Geometry query_geo = FLyrVect.fromViewPortCRSToSourceCRS(
150
                    the_layer, circle, true);
151
                
152
                IProjection query_proj = this.getLayer().getMapContext().getProjection();
153
                if (the_layer.getCoordTrans() != null) {
154
                    query_proj = the_layer.getCoordTrans().getPOrig(); 
155
                }
156

    
157
                        Evaluator evaluator = new IntersectsGeometryEvaluator(
158
                            query_geo,
159
                            query_proj,
160
                            featureStore.getDefaultFeatureType(),
161
                            featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
162
                        
163
                        featureQuery.setFilter(evaluator);
164
                        set = featureStore.getFeatureSet(featureQuery);
165
                        if (!multipleSelection && set.getSize()>1){
166
                                SelectRowPanel selectionPanel = new SelectRowPanel(set, this);
167
                                PluginServices.getMDIManager().addCentredWindow(selectionPanel);
168
                        }
169
                        else {
170
                            selectGeometries(featureStore, set, viewPort, multipleSelection);
171
                        }
172
                } catch (ReadException e) {
173
                        NotificationManager.addError(e.getMessage(), e);
174
                } catch (GeometryOperationNotSupportedException e) {
175
                        NotificationManager.addError(e.getMessage(), e);
176
                } catch (GeometryOperationException e) {
177
                        NotificationManager.addError(e.getMessage(), e);
178
                } catch (DataException e) {
179
                        NotificationManager.addError(e.getMessage(), e);
180
                } catch (CreateGeometryException e) {
181
                        NotificationManager.addError(e.getMessage(), e);
182
                } finally {
183
                        set.dispose();
184
                }
185
        }
186

    
187
        public void selectWithSecondPoint(double x, double y) {
188
                FeatureSet set = null;
189
                try {
190
                        FeatureStore featureStore = getFeatureStore();
191
                        lastPoint = new Point2D.Double(x, y);
192
                        ViewPort viewPort = getLayer().getMapContext().getViewPort();
193
                        double x1;
194
                        double y1;
195
                        double w1;
196
                        double h1;
197

    
198
                        if (firstPoint.getX() < lastPoint.getX()) {
199
                                x1 = firstPoint.getX();
200
                                w1 = lastPoint.getX() - firstPoint.getX();
201
                        } else {
202
                                x1 = lastPoint.getX();
203
                                w1 = firstPoint.getX() - lastPoint.getX();
204
                        }
205

    
206
                        if (firstPoint.getY() < lastPoint.getY()) {
207
                                y1 = firstPoint.getY();
208
                                h1 = lastPoint.getY() - firstPoint.getY();
209
                        } else {
210
                                y1 = lastPoint.getY();
211
                                h1 = firstPoint.getY() - lastPoint.getY();
212
                        }
213

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

    
216
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
217
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
218
                        Evaluator evaluator=null;
219
                        if (firstPoint.getX() < lastPoint.getX()) {
220
                                evaluator = new IntersectsGeometryEvaluator(envelope.getGeometry(), viewPort.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
221
                        }else{
222
                                evaluator = new IntersectsGeometryEvaluator(envelope.getGeometry(), viewPort.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
223
                        }
224
                        featureQuery.setFilter(evaluator);
225
                        set = featureStore.getFeatureSet(featureQuery);
226
                        selectGeometries(featureStore, set, viewPort, false);
227
                } catch (ReadException e) {
228
                        NotificationManager.addError(e.getMessage(), e);
229
                } catch (GeometryOperationNotSupportedException e) {
230
                        NotificationManager.addError(e.getMessage(), e);
231
                } catch (GeometryOperationException e) {
232
                        NotificationManager.addError(e.getMessage(), e);
233
                } catch (DataException e) {
234
                        NotificationManager.addError(e.getMessage(), e);
235
                } catch (CreateEnvelopeException e) {
236
                        NotificationManager.addError(e.getMessage(), e);
237
                } finally {
238
                        DisposeUtils.dispose(set);
239
                }
240
        }
241

    
242
        public void selectContainsSurface(org.gvsig.fmap.geom.Geometry polygon) {
243
                FeatureSet set = null;
244
                try {
245
                        FeatureStore featureStore = getFeatureStore();
246
                        ViewPort viewPort = getLayer().getMapContext().getViewPort();
247
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
248
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
249
                        Evaluator evaluator = new ContainsGeometryEvaluator(polygon, viewPort.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
250
                        featureQuery.setFilter(evaluator);
251
                        set = featureStore.getFeatureSet(featureQuery);
252
                        selectGeometries(featureStore, set, viewPort, 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
        private void selectGeometries(FeatureStore featureStore, FeatureSet set, ViewPort vp, boolean multipleSelection) throws DataException, GeometryOperationNotSupportedException, GeometryOperationException{
267
                FeatureSelection featureSelection = null;
268
                if (multipleSelection) {
269
                        featureSelection = (FeatureSelection) featureStore.getSelection();
270
                        featureSelection.select(set);
271
                } else {
272
                        featureSelection = featureStore.createFeatureSelection();
273
                        featureSelection.select(set);
274
                        featureStore.setSelection(featureSelection);
275
                }
276
                //Draw the geometries with the edition symbology
277
                
278
        }
279
        
280
        public void selectIntersectsSurface(org.gvsig.fmap.geom.Geometry polygon) {
281
                FeatureSet set = null;
282
                try {
283
                        FeatureStore featureStore = getFeatureStore();
284
                        ViewPort vp = getLayer().getMapContext().getViewPort();
285
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
286
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
287
                        Evaluator evaluator = new IntersectsGeometryEvaluator(polygon, vp.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
288
                        featureQuery.setFilter(evaluator);
289
                        set = featureStore.getFeatureSet(featureQuery);
290
                        selectGeometries(featureStore,set,vp,false);
291
                } catch (ReadException e) {
292
                        NotificationManager.addError(e.getMessage(), e);
293
                } catch (DataException e) {
294
                        NotificationManager.addError(e.getMessage(), e);
295
                } catch (GeometryOperationNotSupportedException e) {
296
                        NotificationManager.addError(e.getMessage(), e);
297
                } catch (GeometryOperationException e) {
298
                        NotificationManager.addError(e.getMessage(), e);
299
                } finally {
300
                        DisposeUtils.dispose(set);
301
                }
302
        }
303

    
304
        public void selectOutPolygon(org.gvsig.fmap.geom.Geometry polygon) {
305
                FeatureSet set = null;
306
                try {
307
                        FeatureStore featureStore = getFeatureStore();
308
                        ViewPort vp = getLayer().getMapContext().getViewPort();
309
                        FeatureQuery featureQuery = featureStore.createFeatureQuery();
310
                        featureQuery.setAttributeNames(new String[]{featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName()});
311
                        Evaluator evaluator=new OutGeometryEvaluator(polygon, vp.getProjection(), featureStore.getDefaultFeatureType(), featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName());
312
                        featureQuery.setFilter(evaluator);
313
                        set = featureStore.getFeatureSet(featureQuery);
314
                        selectGeometries(featureStore, set, vp, false);
315

    
316
                } catch (ReadException e) {
317
                        NotificationManager.addError(e.getMessage(), e);
318
                } catch (DataException e) {
319
                        NotificationManager.addError(e.getMessage(), e);
320
                } catch (GeometryOperationNotSupportedException e) {
321
                        NotificationManager.addError(e.getMessage(), e);
322
                } catch (GeometryOperationException e) {
323
                        NotificationManager.addError(e.getMessage(), e);
324
                } finally {
325
                        DisposeUtils.dispose(set);
326
                }
327
        }
328

    
329
        public void selectAll() {
330
                FeatureSet set = null;
331
                try {
332
                        FeatureStore featureStore = getFeatureStore();
333
                        ViewPort viewPort = getLayer().getMapContext().getViewPort();
334
                        set = featureStore.getFeatureSet();
335
                        selectGeometries(featureStore, set, viewPort, false);
336
                } catch (ReadException e) {
337
                        NotificationManager.addError(e.getMessage(), e);
338
                } catch (DataException e) {
339
                        NotificationManager.addError(e.getMessage(), e);
340
                } catch (GeometryOperationNotSupportedException e) {
341
                        NotificationManager.addError(e.getMessage(), e);
342
                } catch (GeometryOperationException e) {
343
                        NotificationManager.addError(e.getMessage(), e);
344
                } finally {
345
                        DisposeUtils.dispose(set);
346
                }
347
        }
348

    
349
        public void drawHandlers(org.gvsig.fmap.geom.Geometry geom, 
350
                        ViewPort vp) {
351
            Geometry drawnGeometry = geom;
352
            //If the layer is reprojected, reproject the geometry to draw its handlers in the fine position
353
            if (getLayer().getCoordTrans() != null){
354
                drawnGeometry = drawnGeometry.cloneGeometry();
355
                drawnGeometry.reProject(getLayer().getCoordTrans());
356
        }
357
                Handler[] handlers = drawnGeometry.getHandlers(org.gvsig.fmap.geom.Geometry.SELECTHANDLER);                
358
                mapControl.getMapControlDrawer().drawHandlers(handlers, vp.getAffineTransform(), 
359
                                MAP_CONTROL_MANAGER.getHandlerSymbol());
360
        }
361

    
362
        public Image getSelectionImage() {
363
                return imageSelection;
364
        }
365

    
366
        public void setSelectionImage(Image image) {
367
                imageSelection = image;
368
        }
369

    
370
        public Image getHandlersImage() {
371
                return imageHandlers;
372
        }
373

    
374
        public void setHandlersImage(Image image) {
375
                imageHandlers = image;
376
        }
377

    
378
        public void beforeLayerDraw(LayerDrawEvent e) throws CancelationException {
379

    
380
        }
381

    
382
        public void afterLayerDraw(LayerDrawEvent e) throws CancelationException {
383
                //Draw the selected geometries...
384
                FeatureStore featureStore = null;
385
                DisposableIterator iterator = null;
386
                try {
387
                        featureStore = getFeatureStore();
388
                        if (featureStore.isEditing()) {
389
                                ViewPort viewPort = getLayer().getMapContext().getViewPort();                                
390
                                iterator = featureStore.getFeatureSelection().fastIterator();                                
391
                                MapControlDrawer mapControlDrawer = mapControl.getMapControlDrawer();
392
                                try {
393
                                        while (iterator.hasNext()) {
394
                                                Feature feature = (Feature) iterator.next();
395
                                                Geometry geometry = feature.getDefaultGeometry();
396
                                                mapControlDrawer.startDrawing(this);
397
                                                mapControlDrawer.setGraphics(e.getGraphics());                                                
398
                                            drawHandlers(geometry.cloneGeometry(), viewPort);                                                                                                                  
399
                                                mapControlDrawer.stopDrawing(this);
400
                                        }
401
                                } catch (ConcurrentModificationException e1) {
402
                                        // throw new CancelationException(e1);
403
                                        // A mitad de pintado se cambia la selecci?n y por tanto no
404
                                        // se puede seguir recorriendo la anterior.
405
                                        return;
406
                                }
407
                        }
408
                } catch (Exception e2) {
409
                  LOG.info("afterLayerDraw error. ", e2);
410
                  ApplicationLocator.getManager().message(
411
                      "_Unable_to_draw_geometry_handlers",
412
                        JOptionPane.ERROR_MESSAGE);
413
                        // LOG.error("Error drawing the selected geometry", e2);
414
                } finally {
415
                        if (iterator != null) {
416
                                iterator.dispose();
417
                        }
418
                }
419
        }
420

    
421
    public void beforeGraphicLayerDraw(LayerDrawEvent e)
422
        throws CancelationException {
423
        }
424

    
425
        public void afterLayerGraphicDraw(LayerDrawEvent e)
426
        throws CancelationException {
427
        }
428

    
429
        public void activationGained(LayerEvent e) {
430
                if (ViewCommandStackExtension.csd != null) {
431
                        ViewCommandStackExtension.csd.setModel(((FLyrVect) getLayer())
432
                                        .getFeatureStore());
433

    
434
                }
435
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
436
                if (window instanceof DefaultViewPanel) {
437
                        DefaultViewPanel view = (DefaultViewPanel) window;
438
                        if (e.getSource().isEditing()) {
439
                                view.showConsole();
440
                        }
441
                }
442
                if (cadtool != null) {
443
                        CADExtension.getCADToolAdapter().setCadTool(cadtool);
444
                        PluginServices.getMainFrame().setSelectedTool(cadtool.toString());
445
                        StartEditing.startCommandsApplicable(null, (FLyrVect) getLayer());
446
                        CADExtension.initFocus();
447
                }
448

    
449
        }
450

    
451
        public void activationLost(LayerEvent e) {
452
                try {
453
                        cadtool = CADExtension.getCADTool();
454
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
455
                        if (window instanceof DefaultViewPanel) {
456
                                DefaultViewPanel view = (DefaultViewPanel) window;
457
                                view.hideConsole();
458
                        }
459
                } catch (EmptyStackException e1) {
460
                        cadtool = new SelectionCADTool();
461
                        cadtool.init();
462
                }
463

    
464
        }
465

    
466
        public void setLegend(ILegend legend) {
467
                this.legend = legend;
468
        }
469

    
470
        public ILegend getLegend() {
471
                return legend;
472
        }
473

    
474
        public FeatureStore getFeatureStore() throws ReadException {
475
                return ((FLyrVect) getLayer()).getFeatureStore();
476
        }
477

    
478
        public void update(Observable observable, Object notification) {
479
                echm.update(observable, notification);
480
        }
481

    
482
        public EditionChangeManager getEditionChangeManager() {
483
                return echm;
484
        }
485

    
486
        public void setEditionChangeManager(EditionChangeManager echm) {
487
                this.echm = echm;
488
        }
489
}