Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extCAD / src / com / iver / cit / gvsig / layers / VectorialLayerEdited.java @ 23657

History | View | Annotate | Download (25.7 KB)

1
package com.iver.cit.gvsig.layers;
2

    
3
import java.awt.Graphics2D;
4
import java.awt.Image;
5
import java.awt.geom.Point2D;
6
import java.awt.image.BufferedImage;
7
import java.util.ArrayList;
8
import java.util.EmptyStackException;
9
import java.util.Iterator;
10

    
11
import org.cresques.cts.ICoordTrans;
12
import org.gvsig.fmap.data.DataException;
13
import org.gvsig.fmap.data.ReadException;
14
import org.gvsig.fmap.data.feature.Feature;
15
import org.gvsig.fmap.data.feature.FeatureCollection;
16
import org.gvsig.fmap.data.feature.FeatureStore;
17
import org.gvsig.fmap.geom.handler.Handler;
18
import org.gvsig.fmap.geom.operation.Draw;
19
import org.gvsig.fmap.geom.operation.DrawOperationContext;
20
import org.gvsig.fmap.geom.operation.GeometryOperationException;
21
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
22
import org.gvsig.fmap.geom.operation.tojts.ToJTS;
23
import org.gvsig.fmap.geom.primitive.DefaultEnvelope;
24
import org.gvsig.fmap.geom.primitive.Envelope;
25
import org.gvsig.fmap.mapcontext.ViewPort;
26
import org.gvsig.fmap.mapcontext.layers.CancelationException;
27
import org.gvsig.fmap.mapcontext.layers.FLayer;
28
import org.gvsig.fmap.mapcontext.layers.LayerDrawEvent;
29
import org.gvsig.fmap.mapcontext.layers.LayerDrawingListener;
30
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
31
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
32
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
33
import org.gvsig.fmap.mapcontext.rendering.symbols.FGraphicUtilities;
34
import org.gvsig.fmap.mapcontrol.MapControl;
35
import org.gvsig.tools.observer.Observable;
36
import org.gvsig.tools.observer.Observer;
37

    
38
import com.iver.andami.PluginServices;
39
import com.iver.andami.messages.NotificationManager;
40
import com.iver.andami.ui.mdiManager.IWindow;
41
import com.iver.cit.gvsig.CADExtension;
42
import com.iver.cit.gvsig.StartEditing;
43
import com.iver.cit.gvsig.ViewCommandStackExtension;
44
import com.iver.cit.gvsig.gui.cad.CADTool;
45
import com.iver.cit.gvsig.gui.cad.CADToolAdapter;
46
import com.iver.cit.gvsig.gui.cad.DefaultCADTool;
47
import com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool;
48
import com.iver.cit.gvsig.project.documents.view.gui.View;
49
import com.vividsolutions.jts.geom.Geometry;
50

    
51
public class VectorialLayerEdited extends DefaultLayerEdited implements
52
                LayerDrawingListener, Observer {
53
        private ArrayList selectedHandler = new ArrayList();
54
        private Point2D lastPoint;
55
        private Point2D firstPoint;
56
        private CADTool cadtool = null;
57

    
58
//        private ArrayList snappers = new ArrayList();
59
//        private ArrayList layersToSnap = new ArrayList();
60
        private ILegend legend;
61
        /** Selecci?n previa* */
62
        private ArrayList previousRowSelection = new ArrayList();
63
        private ArrayList previousHandlerSelection = new ArrayList();
64
        private Image imageSelection;
65
        private Image imageHandlers;
66
        public static final boolean SAVEPREVIOUS = true;
67
        public static final boolean NOTSAVEPREVIOUS = false;
68

    
69
        public VectorialLayerEdited(FLayer lyr) {
70
                super(lyr);
71
                lyr.getMapContext().addLayerDrawingListener(this);
72
                // Por defecto, siempre hacemos snapping sobre la capa en edici?n.
73
                lyr.getMapContext().getLayersToSnap().add(lyr);
74
                try {
75
                        ((FLyrVect) lyr).getFeatureStore().addObserver(this);
76
                } catch (ReadException e) {
77
                        NotificationManager.addError(e.getMessage(), e);
78
                }
79
        }
80

    
81
        public ArrayList getSelectedHandler() {
82
                return selectedHandler;
83
        }
84

    
85
        public void clearSelection(boolean savePrevious) throws ReadException {
86
                if (getFeatureStore() == null)
87
                        return;
88
                FeatureCollection selection = (FeatureCollection) getFeatureStore()
89
                                .getSelection();
90
                if (!selection.isEmpty() && savePrevious) {
91
                        previousRowSelection.clear();
92
                        previousHandlerSelection.clear();
93
                }
94
                if (savePrevious) {
95
                        previousRowSelection.addAll(selection);
96
                        previousHandlerSelection.addAll(selectedHandler);
97
                }
98
                selectedHandler.clear();
99
                selection.clear();
100
        }
101

    
102
        public void restorePreviousSelection() throws ReadException {
103
                FeatureCollection selection = (FeatureCollection) getFeatureStore()
104
                                .getSelection();
105
                selection.clear();
106
                selectedHandler.clear();
107
                selection.addAll(previousRowSelection);
108
                selectedHandler.addAll(previousHandlerSelection);
109
                // VectorialEditableAdapter vea=getVEA();
110
                // FBitSet selection=vea.getSelection();
111
                //
112
                // selection.clear();
113
                // selectedRow.clear();
114
                // selectedHandler.clear();
115
                //
116
                // selectedRow.addAll(previousRowSelection);
117
                // selectedHandler.addAll(previousHandlerSelection);
118
                // for (int i = 0;i < selectedRow.size(); i++) {
119
                // IRowEdited edRow = (IRowEdited) selectedRow.get(i);
120
                // selection.set(edRow.getIndex());
121
                // }
122

    
123
                previousRowSelection.clear();
124
                previousHandlerSelection.clear();
125
        }
126

    
127
        public void selectWithPoint(double x, double y, boolean multipleSelection) {
128
                try {
129
                        firstPoint = new Point2D.Double(x, y);
130
                        FeatureStore featureStore = getFeatureStore();
131
                        FeatureCollection selection = (FeatureCollection) featureStore
132
                                        .getSelection();
133
                        if (!multipleSelection) {
134
                                clearSelection(SAVEPREVIOUS);
135
                        }
136
                        // Se comprueba si se pincha en una gemometr?a
137
                        ViewPort vp = getLayer().getMapContext().getViewPort();
138
                        double tol = vp.toMapDistance(MapControl.tolerance);
139

    
140
                        FeatureCollection newSelection = ((FLyrVect) getLayer())
141
                                        .queryByPoint(firstPoint, tol, getFeatureStore()
142
                                                        .getDefaultFeatureType());
143

    
144
                        String strEPSG = vp.getProjection().getAbrev();
145
                        BufferedImage selectionImage = new BufferedImage(
146
                                        vp.getImageWidth(), vp.getImageHeight(),
147
                                        BufferedImage.TYPE_INT_ARGB);
148
                        Graphics2D gs = selectionImage.createGraphics();
149
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
150
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
151
                        Graphics2D gh = handlersImage.createGraphics();
152
                        Iterator iterator = newSelection.iterator();
153
                        while (iterator.hasNext()) {
154
                                Feature feature = (Feature) iterator.next();
155
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
156
                                                .getDefaultGeometry();
157
                                if (geom == null) {
158
                                        continue;
159
                                }
160
                                org.gvsig.fmap.geom.Geometry geomReproject = geom
161
                                                .cloneGeometry();
162
                                // if (ct!=null)
163
                                // geomReproject.reProject(ct);
164
                                // if (geomReproject.intersects(new
165
                                // Rectangle2D.Double(rect.getMinimum(0),rect.getMaximum(0),rect.getMinimum(1)-rect.getMinimum(0),rect.getMaximum(1)-rect.getMaximum(0))))
166
                                // { // , 0.1)){
167
                                selection.add(feature);
168
                                // selection.set(feats[i].getIndex(), true);
169
                                // selectedRow.add(feats[i]);
170
                                DrawOperationContext doc = new DrawOperationContext();
171
                                doc.setGraphics(gs);
172
                                doc.setViewPort(vp);
173
                                doc.setSymbol(DefaultCADTool.selectionSymbol);
174
                                drawHandlers(geomReproject.cloneGeometry(), gh, vp);
175
                                geomReproject.invokeOperation(Draw.CODE, doc);// cloneGeometry().draw(gs,
176
                                                                                                                                // vp,
177
                                                                                                                                // DefaultCADTool.selectionSymbol);
178

    
179
                        }
180
                        setSelectionImage(selectionImage);
181
                        setHandlersImage(handlersImage);
182
                } catch (ReadException e) {
183
                        NotificationManager.addError(e.getMessage(), e);
184
                } catch (GeometryOperationNotSupportedException e) {
185
                        NotificationManager.addError(e.getMessage(), e);
186
                } catch (GeometryOperationException e) {
187
                        NotificationManager.addError(e.getMessage(), e);
188
                }
189
        }
190

    
191
        public void selectWithSecondPoint(double x, double y) {
192
                try {
193
                        FeatureStore featureStore = getFeatureStore();
194

    
195
                        lastPoint = new Point2D.Double(x, y);
196
                        clearSelection(SAVEPREVIOUS);
197

    
198
                        ViewPort vp = getLayer().getMapContext().getViewPort();
199
                        double x1;
200
                        double y1;
201
                        double w1;
202
                        double h1;
203

    
204
                        if (firstPoint.getX() < lastPoint.getX()) {
205
                                x1 = firstPoint.getX();
206
                                w1 = lastPoint.getX() - firstPoint.getX();
207
                        } else {
208
                                x1 = lastPoint.getX();
209
                                w1 = firstPoint.getX() - lastPoint.getX();
210
                        }
211

    
212
                        if (firstPoint.getY() < lastPoint.getY()) {
213
                                y1 = firstPoint.getY();
214
                                h1 = lastPoint.getY() - firstPoint.getY();
215
                        } else {
216
                                y1 = lastPoint.getY();
217
                                h1 = firstPoint.getY() - lastPoint.getY();
218
                        }
219

    
220
                        Envelope envelope = new DefaultEnvelope(x1, y1, x1 + w1, y1 + h1);
221
                        String strEPSG = vp.getProjection().getAbrev();
222
                        BufferedImage selectionImage = new BufferedImage(
223
                                        vp.getImageWidth(), vp.getImageHeight(),
224
                                        BufferedImage.TYPE_INT_ARGB);
225
                        Graphics2D gs = selectionImage.createGraphics();
226
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
227
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
228
                        Graphics2D gh = handlersImage.createGraphics();
229
                        ICoordTrans ct = getLayer().getCoordTrans();
230

    
231
                        Iterator iterator = ((FLyrVect) getLayer()).queryByEnvelope(
232
                                        envelope, featureStore.getDefaultFeatureType()).iterator();
233
                        DrawOperationContext doc = new DrawOperationContext();
234
                        doc.setGraphics(gs);
235
                        doc.setViewPort(vp);
236
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
237
                        while (iterator.hasNext()) {
238
                                Feature feature = (Feature) iterator.next();
239
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
240
                                                .getDefaultGeometry();
241

    
242
                                if (geom == null) {
243
                                        continue;
244
                                }
245
                                org.gvsig.fmap.geom.Geometry geomReproject = geom
246
                                                .cloneGeometry();
247
                                if (ct != null)
248
                                        geomReproject.reProject(ct);
249

    
250
                                if (firstPoint.getX() < lastPoint.getX()) {
251
                                        if (envelope.contains(geomReproject.getEnvelope())) {
252
                                                featureStore.getSelection().add(feature);
253
                                                geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
254
                                                drawHandlers(geom.cloneGeometry(), gh, vp);
255
                                        }
256
                                } else {
257
                                        if (geomReproject.intersects(envelope.getGeometry()
258
                                                        .getBounds2D())) { // , 0.1)){
259
                                                featureStore.getSelection().add(feature);
260
                                                geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
261
                                                drawHandlers(geom.cloneGeometry(), gh, vp);
262
                                        }
263
                                }
264
                        }
265
                        setSelectionImage(selectionImage);
266
                        setHandlersImage(handlersImage);
267
                } catch (ReadException e) {
268
                        NotificationManager.addError(e.getMessage(), e);
269
                } catch (GeometryOperationNotSupportedException e) {
270
                        NotificationManager.addError(e.getMessage(), e);
271
                } catch (GeometryOperationException e) {
272
                        NotificationManager.addError(e.getMessage(), e);
273
                }
274
        }
275

    
276
        public void selectInsidePolygon(org.gvsig.fmap.geom.Geometry polygon) {
277
                try {
278
                        FeatureStore featureStore = getFeatureStore();
279
                        clearSelection(SAVEPREVIOUS);
280
                        ViewPort vp = getLayer().getMapContext().getViewPort();
281
                        Envelope envelope = polygon.getEnvelope();
282

    
283
                        String strEPSG = vp.getProjection().getAbrev();
284
                        BufferedImage selectionImage = new BufferedImage(
285
                                        vp.getImageWidth(), vp.getImageHeight(),
286
                                        BufferedImage.TYPE_INT_ARGB);
287
                        Graphics2D gs = selectionImage.createGraphics();
288
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
289
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
290
                        Graphics2D gh = handlersImage.createGraphics();
291
                        ICoordTrans ct = getLayer().getCoordTrans();
292
                        Iterator iterator = ((FLyrVect) getLayer()).queryByEnvelope(
293
                                        envelope, featureStore.getDefaultFeatureType()).iterator();
294
                        DrawOperationContext doc = new DrawOperationContext();
295
                        doc.setGraphics(gs);
296
                        doc.setViewPort(vp);
297
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
298
                        while (iterator.hasNext()) {
299
                                Feature feature = (Feature) iterator.next();
300
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
301
                                                .getDefaultGeometry();
302
                                if (geom == null) {
303
                                        continue;
304
                                }
305
                                org.gvsig.fmap.geom.Geometry geomReproject = geom
306
                                                .cloneGeometry();
307
                                if (ct != null)
308
                                        geomReproject.reProject(ct);
309
                                if (contains(polygon, geomReproject)) {
310
                                        featureStore.getSelection().add(feature);
311
                                        geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
312
                                        drawHandlers(geom.cloneGeometry(), gh, vp);
313
                                }
314
                        }
315
                        setSelectionImage(selectionImage);
316
                        setHandlersImage(handlersImage);
317
                } catch (ReadException e) {
318
                        NotificationManager.addError(e.getMessage(), e);
319
                } catch (GeometryOperationNotSupportedException e) {
320
                        NotificationManager.addError(e.getMessage(), e);
321
                } catch (GeometryOperationException e) {
322
                        NotificationManager.addError(e.getMessage(), e);
323
                }
324
        }
325

    
326
        public void selectCrossPolygon(org.gvsig.fmap.geom.Geometry polygon) {
327
                try {
328
                        FeatureStore featureStore = getFeatureStore();
329
                        clearSelection(SAVEPREVIOUS);
330
                        ViewPort vp = getLayer().getMapContext().getViewPort();
331
                        Envelope envelope = polygon.getEnvelope();
332

    
333
                        String strEPSG = vp.getProjection().getAbrev();
334
                        BufferedImage selectionImage = new BufferedImage(
335
                                        vp.getImageWidth(), vp.getImageHeight(),
336
                                        BufferedImage.TYPE_INT_ARGB);
337
                        Graphics2D gs = selectionImage.createGraphics();
338
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
339
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
340
                        Graphics2D gh = handlersImage.createGraphics();
341
                        ICoordTrans ct = getLayer().getCoordTrans();
342
                        Iterator iterator = ((FLyrVect) getLayer()).queryByEnvelope(
343
                                        envelope, featureStore.getDefaultFeatureType()).iterator();
344

    
345
                        DrawOperationContext doc = new DrawOperationContext();
346
                        doc.setGraphics(gs);
347
                        doc.setViewPort(vp);
348
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
349
                        while (iterator.hasNext()) {
350
                                Feature feature = (Feature) iterator.next();
351
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
352
                                                .getDefaultGeometry();
353
                                if (geom == null) {
354
                                        continue;
355
                                }
356
                                org.gvsig.fmap.geom.Geometry geomReproject = geom
357
                                                .cloneGeometry();
358
                                if (ct != null)
359
                                        geomReproject.reProject(ct);
360
                                if (contains(polygon, geomReproject)
361
                                                || intersects(polygon, geomReproject)) {
362
                                        featureStore.getSelection().add(feature);
363
                                        geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
364
                                        drawHandlers(geom.cloneGeometry(), gh, vp);
365
                                }
366
                        }
367
                        setSelectionImage(selectionImage);
368
                        setHandlersImage(handlersImage);
369
                } catch (ReadException e) {
370
                        NotificationManager.addError(e.getMessage(), e);
371
                } catch (GeometryOperationNotSupportedException e) {
372
                        NotificationManager.addError(e.getMessage(), e);
373
                } catch (GeometryOperationException e) {
374
                        NotificationManager.addError(e.getMessage(), e);
375
                }
376
        }
377

    
378
        public void selectOutPolygon(org.gvsig.fmap.geom.Geometry polygon) {
379
                try {
380
                        FeatureStore featureStore = getFeatureStore();
381
                        clearSelection(SAVEPREVIOUS);
382
                        ViewPort vp = getLayer().getMapContext().getViewPort();
383
                        Envelope envelope = polygon.getEnvelope();
384

    
385
                        String strEPSG = vp.getProjection().getAbrev();
386
                        BufferedImage selectionImage = new BufferedImage(
387
                                        vp.getImageWidth(), vp.getImageHeight(),
388
                                        BufferedImage.TYPE_INT_ARGB);
389
                        Graphics2D gs = selectionImage.createGraphics();
390
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
391
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
392
                        Graphics2D gh = handlersImage.createGraphics();
393
                        ICoordTrans ct = getLayer().getCoordTrans();
394
                        Iterator iterator = ((FLyrVect) getLayer()).queryByEnvelope(
395
                                        envelope, featureStore.getDefaultFeatureType()).iterator();
396

    
397
                        DrawOperationContext doc = new DrawOperationContext();
398
                        doc.setGraphics(gs);
399
                        doc.setViewPort(vp);
400
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
401
                        while (iterator.hasNext()) {
402
                                Feature feature = (Feature) iterator.next();
403
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
404
                                                .getDefaultGeometry();
405
                                if (geom == null) {
406
                                        continue;
407
                                }
408
                                org.gvsig.fmap.geom.Geometry geomReproject = geom
409
                                                .cloneGeometry();
410
                                if (ct != null)
411
                                        geomReproject.reProject(ct);
412
                                if (!contains(polygon, geomReproject)
413
                                                && !intersects(polygon, geomReproject)) {
414
                                        featureStore.getSelection().add(feature);
415
                                        geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
416
                                        drawHandlers(geom.cloneGeometry(), gh, vp);
417
                                }
418
                        }
419
                        setSelectionImage(selectionImage);
420
                        setHandlersImage(handlersImage);
421
                } catch (ReadException e) {
422
                        NotificationManager.addError(e.getMessage(), e);
423
                } catch (GeometryOperationNotSupportedException e) {
424
                        NotificationManager.addError(e.getMessage(), e);
425
                } catch (GeometryOperationException e) {
426
                        NotificationManager.addError(e.getMessage(), e);
427
                }
428
        }
429

    
430
        public void selectAll() {
431
                try {
432
                        FeatureStore featureStore = getFeatureStore();
433
                        clearSelection(SAVEPREVIOUS);
434
                        ViewPort vp = getLayer().getMapContext().getViewPort();
435
                        BufferedImage selectionImage = new BufferedImage(
436
                                        vp.getImageWidth(), vp.getImageHeight(),
437
                                        BufferedImage.TYPE_INT_ARGB);
438
                        Graphics2D gs = selectionImage.createGraphics();
439
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
440
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
441
                        Graphics2D gh = handlersImage.createGraphics();
442
                        ICoordTrans ct = getLayer().getCoordTrans();
443
                        FeatureCollection fCollection = (FeatureCollection) featureStore
444
                                        .getDataCollection();
445
                        Iterator iterator = fCollection.iterator();
446
                        featureStore.setSelection(fCollection);
447

    
448
                        DrawOperationContext doc = new DrawOperationContext();
449
                        doc.setGraphics(gs);
450
                        doc.setViewPort(vp);
451
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
452

    
453
                        while (iterator.hasNext()) {
454
                                Feature feature = (Feature) iterator.next();
455
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
456
                                                .getDefaultGeometry();
457
                                if (ct != null)
458
                                        geom.reProject(ct);
459
                                geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
460
                                drawHandlers(geom.cloneGeometry(), gh, vp);
461
                        }
462
                        setSelectionImage(selectionImage);
463
                        setHandlersImage(handlersImage);
464
                } catch (ReadException e) {
465
                        NotificationManager.addError(e.getMessage(), e);
466
                } catch (GeometryOperationNotSupportedException e) {
467
                        NotificationManager.addError(e.getMessage(), e);
468
                } catch (GeometryOperationException e) {
469
                        NotificationManager.addError(e.getMessage(), e);
470
                } catch (DataException e) {
471
                        NotificationManager.addError(e.getMessage(), e);
472
                }
473
        }
474

    
475
        public void refreshSelectionCache(Point2D firstPoint, CADToolAdapter cta) {
476
                try {
477
                        clearSelection(SAVEPREVIOUS);
478
                        double min = java.lang.Double.MAX_VALUE;
479
                        ViewPort vp = getLayer().getMapContext().getViewPort();
480
                        BufferedImage selectionImage = new BufferedImage(
481
                                        vp.getImageWidth(), vp.getImageHeight(),
482
                                        BufferedImage.TYPE_INT_ARGB);
483
                        Graphics2D gs = selectionImage.createGraphics();
484
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
485
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
486
                        Graphics2D gh = handlersImage.createGraphics();
487
                        FeatureStore featureStore = getFeatureStore();
488

    
489
                        Iterator iterator = featureStore.getSelection().iterator();
490

    
491
                        DrawOperationContext doc = new DrawOperationContext();
492
                        doc.setGraphics(gs);
493
                        doc.setViewPort(vp);
494
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
495
                        while (iterator.hasNext()) {
496
                                Feature feature = (Feature) iterator.next();
497
                                Handler[] handlers = null;
498
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
499
                                                .getDefaultGeometry();
500
                                handlers = geom
501
                                                .getHandlers(org.gvsig.fmap.geom.Geometry.SELECTHANDLER);
502

    
503
                                geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
504
                                drawHandlers(geom.cloneGeometry(), gh, vp);
505
                                // y miramos los handlers de cada entidad seleccionada
506
                                min = cta.getMapControl().getViewPort().toMapDistance(
507
                                                MapControl.tolerance);
508
                                for (int j = 0; j < handlers.length; j++) {
509
                                        Point2D handlerPoint = handlers[j].getPoint();
510
                                        double distance = firstPoint.distance(handlerPoint);
511
                                        if (distance <= min) {
512
                                                min = distance;
513
                                                selectedHandler.add(handlers[j]);
514
                                        }
515
                                }
516

    
517
                        }
518

    
519
                        setSelectionImage(selectionImage);
520
                        setHandlersImage(handlersImage);
521
                } catch (ReadException e) {
522
                        NotificationManager.addError(e.getMessage(), e);
523
                } catch (GeometryOperationNotSupportedException e) {
524
                        NotificationManager.addError(e.getMessage(), e);
525
                } catch (GeometryOperationException e) {
526
                        NotificationManager.addError(e.getMessage(), e);
527
                }
528
        }
529

    
530
        public void drawHandlers(org.gvsig.fmap.geom.Geometry geom, Graphics2D gs,
531
                        ViewPort vp) {
532
                // if (!(getLayer() instanceof FLyrAnnotation)){
533
                Handler[] handlers = geom
534
                                .getHandlers(org.gvsig.fmap.geom.Geometry.SELECTHANDLER);
535
                FGraphicUtilities.DrawHandlers(gs, vp.getAffineTransform(), handlers,
536
                                DefaultCADTool.handlerSymbol);
537
                // }
538
        }
539

    
540
        public Image getSelectionImage() {
541
                return imageSelection;
542
        }
543

    
544
        public void setSelectionImage(Image image) {
545
                imageSelection = image;
546
        }
547

    
548
        public Image getHandlersImage() {
549
                return imageHandlers;
550
        }
551

    
552
        public void setHandlersImage(Image image) {
553
                imageHandlers = image;
554
        }
555

    
556
        public void beforeLayerDraw(LayerDrawEvent e) throws CancelationException {
557
                FeatureStore featureStore = null;
558
                try {
559
                        featureStore = getFeatureStore();
560
                } catch (ReadException e2) {
561
                        // TODO Auto-generated catch block
562
                        e2.printStackTrace();
563
                }
564
                if (featureStore.isEditing()) {
565
                        // VectorialEditableAdapter vea = (VectorialEditableAdapter)
566
                        // ((FLyrVect) getLayer())
567
                        // .getSource();
568
                        ViewPort vp = getLayer().getMapContext().getViewPort();
569
                        BufferedImage selectionImage = new BufferedImage(
570
                                        vp.getImageWidth(), vp.getImageHeight(),
571
                                        BufferedImage.TYPE_INT_ARGB);
572
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
573
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
574
                        Graphics2D gs = selectionImage.createGraphics();
575
                        Graphics2D gh = handlersImage.createGraphics();
576
                        Iterator iterator = featureStore.getSelection().iterator();
577
                        while (iterator.hasNext()) {
578
                                Feature feature = (Feature) iterator.next();
579

    
580
                                // }
581
                                // for (int i = 0; i < selectedRow.size(); i++) {
582
                                // IFeature feat = (IFeature) ((IRowEdited) selectedRow.get(i))
583
                                // .getLinkedRow();
584
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
585
                                                .getDefaultGeometry();
586

    
587
                                DrawOperationContext doc = new DrawOperationContext();
588
                                doc.setGraphics(gs);
589
                                doc.setViewPort(vp);
590
                                doc.setSymbol(DefaultCADTool.selectionSymbol);
591
                                try {
592
                                        geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
593
                                } catch (GeometryOperationNotSupportedException e1) {
594
                                        e1.printStackTrace();
595
                                } catch (GeometryOperationException e1) {
596
                                        e1.printStackTrace();
597
                                }
598
                                drawHandlers(geom.cloneGeometry(), gh, vp);
599
                        }
600
                        setSelectionImage(selectionImage);
601
                        setHandlersImage(handlersImage);
602
                }
603
        }
604

    
605
        public void afterLayerDraw(LayerDrawEvent e) throws CancelationException {
606
        }
607

    
608
        public void beforeGraphicLayerDraw(LayerDrawEvent e)
609
                        throws CancelationException {
610
        }
611

    
612
        public void afterLayerGraphicDraw(LayerDrawEvent e)
613
                        throws CancelationException {
614
        }
615

    
616
        private static boolean contains(org.gvsig.fmap.geom.Geometry g1,
617
                        org.gvsig.fmap.geom.Geometry g2) {
618
                try {
619
                        Geometry geometry1 = (Geometry) g1
620
                                        .invokeOperation(ToJTS.CODE, null);
621
                        Geometry geometry2 = (Geometry) g2
622
                                        .invokeOperation(ToJTS.CODE, null);
623
                        if (geometry1 == null || geometry2 == null)
624
                                return false;
625
                        return geometry1.contains(geometry2);
626
                } catch (GeometryOperationNotSupportedException e) {
627
                        e.printStackTrace();
628
                } catch (GeometryOperationException e) {
629
                        e.printStackTrace();
630
                }
631
                return false;
632
        }
633

    
634
        private static boolean intersects(org.gvsig.fmap.geom.Geometry g1,
635
                        org.gvsig.fmap.geom.Geometry g2) {
636
                try {
637
                        Geometry geometry1 = (Geometry) g1
638
                                        .invokeOperation(ToJTS.CODE, null);
639
                        Geometry geometry2 = (Geometry) g2
640
                                        .invokeOperation(ToJTS.CODE, null);
641
                        if (geometry1 == null || geometry2 == null)
642
                                return false;
643
                        return geometry1.intersects(geometry2);
644
                } catch (GeometryOperationNotSupportedException e) {
645
                        e.printStackTrace();
646
                } catch (GeometryOperationException e) {
647
                        e.printStackTrace();
648
                }
649
                return false;
650
        }
651

    
652
        public void activationGained(LayerEvent e) {
653
                if (ViewCommandStackExtension.csd != null) {
654
                        try {
655
                                ViewCommandStackExtension.csd.setModel(((FLyrVect) getLayer())
656
                                                .getFeatureStore().getCommandsRecord());
657
                        } catch (ReadException e1) {
658
                                // TODO Auto-generated catch block
659
                                e1.printStackTrace();
660
                        }
661
                }
662
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
663
                if (window instanceof View) {
664
                        View view = (View) window;
665
                        if (e.getSource().isEditing()) {
666
                                view.showConsole();
667
                        }
668
                }
669
                if (cadtool != null) {
670
                        CADExtension.getCADToolAdapter().setCadTool(cadtool);
671
                        PluginServices.getMainFrame().setSelectedTool(cadtool.toString());
672
                        StartEditing.startCommandsApplicable(null, (FLyrVect) getLayer());
673
                        CADExtension.initFocus();
674
                }
675

    
676
        }
677

    
678
        public void activationLost(LayerEvent e) {
679
                try {
680
                        cadtool = CADExtension.getCADTool();
681
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
682
                        if (window instanceof View) {
683
                                View view = (View) window;
684
                                view.hideConsole();
685
                        }
686
                } catch (EmptyStackException e1) {
687
                        cadtool = new SelectionCADTool();
688
                        cadtool.init();
689
                }
690

    
691
        }
692

    
693
//        public ArrayList getSnappers() {
694
//                return snappers;
695
//        }
696
//
697
//        public ArrayList getLayersToSnap() {
698
//                return layersToSnap;
699
//        }
700
//
701
//        public void setLayersToSnap(ArrayList layersToSnap) {
702
//                this.layersToSnap = layersToSnap;
703
//
704
//        }
705

    
706
        // public void setSelectionCache(boolean savePrevious,ArrayList
707
        // selectedRowAux) {
708
        // try {
709
        // clearSelection(savePrevious);
710
        // VectorialEditableAdapter vea=getVEA();
711
        // FBitSet selection=vea.getSelection();
712
        // selectedRow.addAll(selectedRowAux);
713
        // for (int i = 0;i < selectedRow.size(); i++) {
714
        // IRowEdited edRow = (IRowEdited) selectedRow.get(i);
715
        // selection.set(edRow.getIndex());
716
        // }
717
        // FLyrVect active = (FLyrVect)getLayer();
718
        // active.getRecordset().getSelectionSupport().fireSelectionEvents();
719
        // } catch (ReadException e) {
720
        // NotificationManager.addError(e.getMessage(),e);
721
        // }
722
        // }
723

    
724
        public void setLegend(ILegend legend) {
725
                this.legend = legend;
726
        }
727

    
728
        public ILegend getLegend() {
729
                return legend;
730
        }
731

    
732
        // public void addSelectionCache(DefaultRowEdited edited) {
733
        // selectedRow.add(edited);
734
        // }
735

    
736
        public boolean getPreviousSelection() {
737
                try {
738
                        return !((FLyrVect) getLayer()).getFeatureStore().getSelection()
739
                                        .isEmpty();
740
                } catch (ReadException e) {
741
                        // TODO Auto-generated catch block
742
                        e.printStackTrace();
743
                }
744
                return false;
745
        }
746

    
747
        public FeatureStore getFeatureStore() throws ReadException {
748
                return ((FLyrVect) getLayer()).getFeatureStore();
749
        }
750

    
751
        public void update(Observable observable, Object notification) {
752
                try {
753
                        if (getFeatureStore().getSelection().isEmpty())
754
                                clearSelection(NOTSAVEPREVIOUS);
755
                } catch (ReadException e1) {
756
                        NotificationManager.addError(e1.getMessage(), e1);
757
                }
758

    
759
        }
760
}