Statistics
| Revision:

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

History | View | Annotate | Download (27 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.dal.exception.DataException;
13
import org.gvsig.fmap.dal.exception.ReadException;
14
import org.gvsig.fmap.dal.feature.Feature;
15
import org.gvsig.fmap.dal.feature.FeatureSelection;
16
import org.gvsig.fmap.dal.feature.FeatureSet;
17
import org.gvsig.fmap.dal.feature.FeatureStore;
18
import org.gvsig.fmap.geom.handler.Handler;
19
import org.gvsig.fmap.geom.operation.Draw;
20
import org.gvsig.fmap.geom.operation.DrawOperationContext;
21
import org.gvsig.fmap.geom.operation.GeometryOperationException;
22
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
23
import org.gvsig.fmap.geom.operation.tojts.ToJTS;
24
import org.gvsig.fmap.geom.primitive.DefaultEnvelope;
25
import org.gvsig.fmap.geom.primitive.Envelope;
26
import org.gvsig.fmap.mapcontext.ViewPort;
27
import org.gvsig.fmap.mapcontext.layers.CancelationException;
28
import org.gvsig.fmap.mapcontext.layers.FLayer;
29
import org.gvsig.fmap.mapcontext.layers.LayerDrawEvent;
30
import org.gvsig.fmap.mapcontext.layers.LayerDrawingListener;
31
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
32
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
33
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
34
import org.gvsig.fmap.mapcontext.rendering.symbols.FGraphicUtilities;
35
import org.gvsig.fmap.mapcontrol.MapControl;
36
import org.gvsig.tools.observer.Observable;
37
import org.gvsig.tools.observer.Observer;
38
import org.gvsig.tools.observer.WeakReferencingObservable;
39

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

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

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

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

    
83
        public ArrayList getSelectedHandler() {
84
                return selectedHandler;
85
        }
86

    
87
        public void clearSelection(boolean savePrevious) throws DataException {
88
                if (getFeatureStore() == null)
89
                        return;
90
                FeatureSelection selection = (FeatureSelection) getFeatureStore().getSelection();
91

    
92
//                if (!selection.isEmpty() && savePrevious) {
93
//                        previousRowSelection.clear();
94
//                        previousHandlerSelection.clear();
95
//                }
96
//                if (savePrevious) {
97
//                        previousRowSelection.addAll(selection);
98
//                        previousHandlerSelection.addAll(selectedHandler);
99
//                }
100
                selectedHandler.clear();
101
                selection.dispose();
102
        }
103

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

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

    
141
                        FeatureSet newSelection = ((FLyrVect) getLayer()).queryByPoint(
142
                                        firstPoint, tol, getFeatureStore().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.select(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
                } catch (DataException e) {
189
                        NotificationManager.addError(e.getMessage(), e);
190
                }
191
        }
192

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

    
197
                        lastPoint = new Point2D.Double(x, y);
198
                        clearSelection(SAVEPREVIOUS);
199

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

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

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

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

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

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

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

    
282
        public void selectInsidePolygon(org.gvsig.fmap.geom.Geometry polygon) {
283
                try {
284
                        FeatureStore featureStore = getFeatureStore();
285
                        clearSelection(SAVEPREVIOUS);
286
                        ViewPort vp = getLayer().getMapContext().getViewPort();
287
                        Envelope envelope = polygon.getEnvelope();
288

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

    
335
        public void selectCrossPolygon(org.gvsig.fmap.geom.Geometry polygon) {
336
                try {
337
                        FeatureStore featureStore = getFeatureStore();
338
                        clearSelection(SAVEPREVIOUS);
339
                        ViewPort vp = getLayer().getMapContext().getViewPort();
340
                        Envelope envelope = polygon.getEnvelope();
341

    
342
                        String strEPSG = vp.getProjection().getAbrev();
343
                        BufferedImage selectionImage = new BufferedImage(
344
                                        vp.getImageWidth(), vp.getImageHeight(),
345
                                        BufferedImage.TYPE_INT_ARGB);
346
                        Graphics2D gs = selectionImage.createGraphics();
347
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
348
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
349
                        Graphics2D gh = handlersImage.createGraphics();
350
                        ICoordTrans ct = getLayer().getCoordTrans();
351
                        Iterator iterator = ((FLyrVect) getLayer()).queryByEnvelope(
352
                                        envelope, featureStore.getDefaultFeatureType()).iterator();
353

    
354
                        DrawOperationContext doc = new DrawOperationContext();
355
                        doc.setGraphics(gs);
356
                        doc.setViewPort(vp);
357
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
358
                        while (iterator.hasNext()) {
359
                                Feature feature = (Feature) iterator.next();
360
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
361
                                                .getDefaultGeometry();
362
                                if (geom == null) {
363
                                        continue;
364
                                }
365
                                org.gvsig.fmap.geom.Geometry geomReproject = geom
366
                                                .cloneGeometry();
367
                                if (ct != null)
368
                                        geomReproject.reProject(ct);
369
                                if (contains(polygon, geomReproject)
370
                                                || intersects(polygon, geomReproject)) {
371
                                        ((FeatureSelection) featureStore.getSelection())
372
                                                        .select(feature);
373
                                        geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
374
                                        drawHandlers(geom.cloneGeometry(), gh, vp);
375
                                }
376
                        }
377
                        setSelectionImage(selectionImage);
378
                        setHandlersImage(handlersImage);
379
                } catch (ReadException e) {
380
                        NotificationManager.addError(e.getMessage(), e);
381
                } catch (GeometryOperationNotSupportedException e) {
382
                        NotificationManager.addError(e.getMessage(), e);
383
                } catch (GeometryOperationException e) {
384
                        NotificationManager.addError(e.getMessage(), e);
385
                } catch (DataException e) {
386
                        NotificationManager.addError(e.getMessage(), e);
387
                }
388
        }
389

    
390
        public void selectOutPolygon(org.gvsig.fmap.geom.Geometry polygon) {
391
                try {
392
                        FeatureStore featureStore = getFeatureStore();
393
                        clearSelection(SAVEPREVIOUS);
394
                        ViewPort vp = getLayer().getMapContext().getViewPort();
395
                        Envelope envelope = polygon.getEnvelope();
396

    
397
                        String strEPSG = vp.getProjection().getAbrev();
398
                        BufferedImage selectionImage = new BufferedImage(
399
                                        vp.getImageWidth(), vp.getImageHeight(),
400
                                        BufferedImage.TYPE_INT_ARGB);
401
                        Graphics2D gs = selectionImage.createGraphics();
402
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
403
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
404
                        Graphics2D gh = handlersImage.createGraphics();
405
                        ICoordTrans ct = getLayer().getCoordTrans();
406
                        Iterator iterator = ((FLyrVect) getLayer()).queryByEnvelope(
407
                                        envelope, featureStore.getDefaultFeatureType()).iterator();
408

    
409
                        DrawOperationContext doc = new DrawOperationContext();
410
                        doc.setGraphics(gs);
411
                        doc.setViewPort(vp);
412
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
413
                        while (iterator.hasNext()) {
414
                                Feature feature = (Feature) iterator.next();
415
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
416
                                                .getDefaultGeometry();
417
                                if (geom == null) {
418
                                        continue;
419
                                }
420
                                org.gvsig.fmap.geom.Geometry geomReproject = geom
421
                                                .cloneGeometry();
422
                                if (ct != null)
423
                                        geomReproject.reProject(ct);
424
                                if (!contains(polygon, geomReproject)
425
                                                && !intersects(polygon, geomReproject)) {
426
                                        ((FeatureSelection) featureStore.getSelection())
427
                                                        .select(feature);
428
                                        geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
429
                                        drawHandlers(geom.cloneGeometry(), gh, vp);
430
                                }
431
                        }
432
                        setSelectionImage(selectionImage);
433
                        setHandlersImage(handlersImage);
434
                } catch (ReadException e) {
435
                        NotificationManager.addError(e.getMessage(), e);
436
                } catch (GeometryOperationNotSupportedException e) {
437
                        NotificationManager.addError(e.getMessage(), e);
438
                } catch (GeometryOperationException e) {
439
                        NotificationManager.addError(e.getMessage(), e);
440
                } catch (DataException e) {
441
                        NotificationManager.addError(e.getMessage(), e);
442
                }
443
        }
444

    
445
        public void selectAll() {
446
                try {
447
                        FeatureStore featureStore = getFeatureStore();
448
                        clearSelection(SAVEPREVIOUS);
449
                        ViewPort vp = getLayer().getMapContext().getViewPort();
450
                        BufferedImage selectionImage = new BufferedImage(
451
                                        vp.getImageWidth(), vp.getImageHeight(),
452
                                        BufferedImage.TYPE_INT_ARGB);
453
                        Graphics2D gs = selectionImage.createGraphics();
454
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
455
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
456
                        Graphics2D gh = handlersImage.createGraphics();
457
                        ICoordTrans ct = getLayer().getCoordTrans();
458
                        FeatureSet fCollection = (FeatureSet) featureStore.getDataSet();
459
                        Iterator iterator = fCollection.iterator();
460
                        featureStore.setSelection(fCollection);
461

    
462
                        DrawOperationContext doc = new DrawOperationContext();
463
                        doc.setGraphics(gs);
464
                        doc.setViewPort(vp);
465
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
466

    
467
                        while (iterator.hasNext()) {
468
                                Feature feature = (Feature) iterator.next();
469
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
470
                                                .getDefaultGeometry();
471
                                if (ct != null)
472
                                        geom.reProject(ct);
473
                                geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
474
                                drawHandlers(geom.cloneGeometry(), gh, vp);
475
                        }
476
                        setSelectionImage(selectionImage);
477
                        setHandlersImage(handlersImage);
478
                } catch (ReadException e) {
479
                        NotificationManager.addError(e.getMessage(), e);
480
                } catch (GeometryOperationNotSupportedException e) {
481
                        NotificationManager.addError(e.getMessage(), e);
482
                } catch (GeometryOperationException e) {
483
                        NotificationManager.addError(e.getMessage(), e);
484
                } catch (DataException e) {
485
                        NotificationManager.addError(e.getMessage(), e);
486
                }
487
        }
488

    
489
        public void refreshSelectionCache(Point2D firstPoint, CADToolAdapter cta) {
490
                try {
491
                        clearSelection(SAVEPREVIOUS);
492
                        double min = java.lang.Double.MAX_VALUE;
493
                        ViewPort vp = getLayer().getMapContext().getViewPort();
494
                        BufferedImage selectionImage = new BufferedImage(
495
                                        vp.getImageWidth(), vp.getImageHeight(),
496
                                        BufferedImage.TYPE_INT_ARGB);
497
                        Graphics2D gs = selectionImage.createGraphics();
498
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
499
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
500
                        Graphics2D gh = handlersImage.createGraphics();
501
                        FeatureStore featureStore = getFeatureStore();
502

    
503
                        Iterator iterator = ((FeatureSelection) featureStore.getSelection())
504
                                        .iterator();
505

    
506
                        DrawOperationContext doc = new DrawOperationContext();
507
                        doc.setGraphics(gs);
508
                        doc.setViewPort(vp);
509
                        doc.setSymbol(DefaultCADTool.selectionSymbol);
510
                        while (iterator.hasNext()) {
511
                                Feature feature = (Feature) iterator.next();
512
                                Handler[] handlers = null;
513
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
514
                                                .getDefaultGeometry();
515
                                handlers = geom
516
                                                .getHandlers(org.gvsig.fmap.geom.Geometry.SELECTHANDLER);
517

    
518
                                geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
519
                                drawHandlers(geom.cloneGeometry(), gh, vp);
520
                                // y miramos los handlers de cada entidad seleccionada
521
                                min = cta.getMapControl().getViewPort().toMapDistance(
522
                                                MapControl.tolerance);
523
                                for (int j = 0; j < handlers.length; j++) {
524
                                        Point2D handlerPoint = handlers[j].getPoint();
525
                                        double distance = firstPoint.distance(handlerPoint);
526
                                        if (distance <= min) {
527
                                                min = distance;
528
                                                selectedHandler.add(handlers[j]);
529
                                        }
530
                                }
531

    
532
                        }
533

    
534
                        setSelectionImage(selectionImage);
535
                        setHandlersImage(handlersImage);
536
                } catch (ReadException e) {
537
                        NotificationManager.addError(e.getMessage(), e);
538
                } catch (GeometryOperationNotSupportedException e) {
539
                        NotificationManager.addError(e.getMessage(), e);
540
                } catch (GeometryOperationException e) {
541
                        NotificationManager.addError(e.getMessage(), e);
542
                } catch (DataException e) {
543
                        NotificationManager.addError(e.getMessage(), e);
544
                }
545
        }
546

    
547
        public void drawHandlers(org.gvsig.fmap.geom.Geometry geom, Graphics2D gs,
548
                        ViewPort vp) {
549
                // if (!(getLayer() instanceof FLyrAnnotation)){
550
                Handler[] handlers = geom
551
                                .getHandlers(org.gvsig.fmap.geom.Geometry.SELECTHANDLER);
552
                FGraphicUtilities.DrawHandlers(gs, vp.getAffineTransform(), handlers,
553
                                DefaultCADTool.handlerSymbol);
554
                // }
555
        }
556

    
557
        public Image getSelectionImage() {
558
                return imageSelection;
559
        }
560

    
561
        public void setSelectionImage(Image image) {
562
                imageSelection = image;
563
        }
564

    
565
        public Image getHandlersImage() {
566
                return imageHandlers;
567
        }
568

    
569
        public void setHandlersImage(Image image) {
570
                imageHandlers = image;
571
        }
572

    
573
        public void beforeLayerDraw(LayerDrawEvent e) throws CancelationException {
574
                FeatureStore featureStore = null;
575
                try {
576
                        featureStore = getFeatureStore();
577
                } catch (ReadException e2) {
578
                        // TODO Auto-generated catch block
579
                        e2.printStackTrace();
580
                }
581
                if (featureStore.isEditing()) {
582
                        // VectorialEditableAdapter vea = (VectorialEditableAdapter)
583
                        // ((FLyrVect) getLayer())
584
                        // .getSource();
585
                        ViewPort vp = getLayer().getMapContext().getViewPort();
586
                        BufferedImage selectionImage = new BufferedImage(
587
                                        vp.getImageWidth(), vp.getImageHeight(),
588
                                        BufferedImage.TYPE_INT_ARGB);
589
                        BufferedImage handlersImage = new BufferedImage(vp.getImageWidth(),
590
                                        vp.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
591
                        Graphics2D gs = selectionImage.createGraphics();
592
                        Graphics2D gh = handlersImage.createGraphics();
593
                        Iterator iterator = null;
594
                        try {
595
                                iterator = ((FeatureSelection) featureStore.getSelection())
596
                                                .iterator();
597
                        } catch (DataException e2) {
598
                                // TODO Auto-generated catch block
599
                                e2.printStackTrace();
600
                        }
601
                        while (iterator.hasNext()) {
602
                                Feature feature = (Feature) iterator.next();
603

    
604
                                // }
605
                                // for (int i = 0; i < selectedRow.size(); i++) {
606
                                // IFeature feat = (IFeature) ((IRowEdited) selectedRow.get(i))
607
                                // .getLinkedRow();
608
                                org.gvsig.fmap.geom.Geometry geom = (org.gvsig.fmap.geom.Geometry) feature
609
                                                .getDefaultGeometry();
610

    
611
                                DrawOperationContext doc = new DrawOperationContext();
612
                                doc.setGraphics(gs);
613
                                doc.setViewPort(vp);
614
                                doc.setSymbol(DefaultCADTool.selectionSymbol);
615
                                try {
616
                                        geom.cloneGeometry().invokeOperation(Draw.CODE, doc);
617
                                } catch (GeometryOperationNotSupportedException e1) {
618
                                        e1.printStackTrace();
619
                                } catch (GeometryOperationException e1) {
620
                                        e1.printStackTrace();
621
                                }
622
                                drawHandlers(geom.cloneGeometry(), gh, vp);
623
                        }
624
                        setSelectionImage(selectionImage);
625
                        setHandlersImage(handlersImage);
626
                }
627
        }
628

    
629
        public void afterLayerDraw(LayerDrawEvent e) throws CancelationException {
630
        }
631

    
632
        public void beforeGraphicLayerDraw(LayerDrawEvent e)
633
                        throws CancelationException {
634
        }
635

    
636
        public void afterLayerGraphicDraw(LayerDrawEvent e)
637
                        throws CancelationException {
638
        }
639

    
640
        private static boolean contains(org.gvsig.fmap.geom.Geometry g1,
641
                        org.gvsig.fmap.geom.Geometry g2) {
642
                try {
643
                        Geometry geometry1 = (Geometry) g1
644
                                        .invokeOperation(ToJTS.CODE, null);
645
                        Geometry geometry2 = (Geometry) g2
646
                                        .invokeOperation(ToJTS.CODE, null);
647
                        if (geometry1 == null || geometry2 == null)
648
                                return false;
649
                        return geometry1.contains(geometry2);
650
                } catch (GeometryOperationNotSupportedException e) {
651
                        e.printStackTrace();
652
                } catch (GeometryOperationException e) {
653
                        e.printStackTrace();
654
                }
655
                return false;
656
        }
657

    
658
        private static boolean intersects(org.gvsig.fmap.geom.Geometry g1,
659
                        org.gvsig.fmap.geom.Geometry g2) {
660
                try {
661
                        Geometry geometry1 = (Geometry) g1
662
                                        .invokeOperation(ToJTS.CODE, null);
663
                        Geometry geometry2 = (Geometry) g2
664
                                        .invokeOperation(ToJTS.CODE, null);
665
                        if (geometry1 == null || geometry2 == null)
666
                                return false;
667
                        return geometry1.intersects(geometry2);
668
                } catch (GeometryOperationNotSupportedException e) {
669
                        e.printStackTrace();
670
                } catch (GeometryOperationException e) {
671
                        e.printStackTrace();
672
                }
673
                return false;
674
        }
675

    
676
        public void activationGained(LayerEvent e) {
677
                if (ViewCommandStackExtension.csd != null) {
678
                        try {
679
                                ViewCommandStackExtension.csd.setModel(((FLyrVect) getLayer())
680
                                                .getFeatureStore().getCommandsRecord());
681
                        } catch (ReadException e1) {
682
                                // TODO Auto-generated catch block
683
                                e1.printStackTrace();
684
                        } catch (DataException e1) {
685
                                // TODO Auto-generated catch block
686
                                e1.printStackTrace();
687
                        }
688
                }
689
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
690
                if (window instanceof View) {
691
                        View view = (View) window;
692
                        if (e.getSource().isEditing()) {
693
                                view.showConsole();
694
                        }
695
                }
696
                if (cadtool != null) {
697
                        CADExtension.getCADToolAdapter().setCadTool(cadtool);
698
                        PluginServices.getMainFrame().setSelectedTool(cadtool.toString());
699
                        StartEditing.startCommandsApplicable(null, (FLyrVect) getLayer());
700
                        CADExtension.initFocus();
701
                }
702

    
703
        }
704

    
705
        public void activationLost(LayerEvent e) {
706
                try {
707
                        cadtool = CADExtension.getCADTool();
708
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
709
                        if (window instanceof View) {
710
                                View view = (View) window;
711
                                view.hideConsole();
712
                        }
713
                } catch (EmptyStackException e1) {
714
                        cadtool = new SelectionCADTool();
715
                        cadtool.init();
716
                }
717

    
718
        }
719

    
720
        // public ArrayList getSnappers() {
721
        // return snappers;
722
        // }
723
        //
724
        // public ArrayList getLayersToSnap() {
725
        // return layersToSnap;
726
        // }
727
        //
728
        // public void setLayersToSnap(ArrayList layersToSnap) {
729
        // this.layersToSnap = layersToSnap;
730
        //
731
        // }
732

    
733
        // public void setSelectionCache(boolean savePrevious,ArrayList
734
        // selectedRowAux) {
735
        // try {
736
        // clearSelection(savePrevious);
737
        // VectorialEditableAdapter vea=getVEA();
738
        // FBitSet selection=vea.getSelection();
739
        // selectedRow.addAll(selectedRowAux);
740
        // for (int i = 0;i < selectedRow.size(); i++) {
741
        // IRowEdited edRow = (IRowEdited) selectedRow.get(i);
742
        // selection.set(edRow.getIndex());
743
        // }
744
        // FLyrVect active = (FLyrVect)getLayer();
745
        // active.getRecordset().getSelectionSupport().fireSelectionEvents();
746
        // } catch (ReadException e) {
747
        // NotificationManager.addError(e.getMessage(),e);
748
        // }
749
        // }
750

    
751
        public void setLegend(ILegend legend) {
752
                this.legend = legend;
753
        }
754

    
755
        public ILegend getLegend() {
756
                return legend;
757
        }
758

    
759
        // public void addSelectionCache(DefaultRowEdited edited) {
760
        // selectedRow.add(edited);
761
        // }
762

    
763
        public boolean getPreviousSelection() {
764
                try {
765
                        return !((FeatureSelection) ((FLyrVect) getLayer())
766
                                        .getFeatureStore().getSelection()).isEmpty();
767
                } catch (ReadException e) {
768
                        // TODO Auto-generated catch block
769
                        e.printStackTrace();
770
                } catch (DataException e) {
771
                        // TODO Auto-generated catch block
772
                        e.printStackTrace();
773
                }
774
                return false;
775
        }
776

    
777
        public FeatureStore getFeatureStore() throws ReadException {
778
                return ((FLyrVect) getLayer()).getFeatureStore();
779
        }
780

    
781
        public void update(WeakReferencingObservable observable, Object notification) {
782
                try {
783
                        if (((FeatureSelection) getFeatureStore().getSelection()).isEmpty())
784
                                clearSelection(NOTSAVEPREVIOUS);
785
                } catch (ReadException e1) {
786
                        NotificationManager.addError(e1.getMessage(), e1);
787
                } catch (DataException e1) {
788
                        NotificationManager.addError(e1.getMessage(), e1);
789
                }
790

    
791
        }
792
}