Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extEditing / src / org / gvsig / editing / gui / cad / tools / EditVertexCADTool.java @ 38096

History | View | Annotate | Download (27.9 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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 2
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
 */
22
package org.gvsig.editing.gui.cad.tools;
23

    
24
import java.awt.Component;
25
import java.awt.event.InputEvent;
26
import java.awt.geom.PathIterator;
27
import java.awt.geom.Point2D;
28
import java.awt.geom.Rectangle2D;
29
import java.util.ArrayList;
30

    
31
import javax.swing.JOptionPane;
32

    
33
import org.gvsig.andami.PluginServices;
34
import org.gvsig.andami.messages.NotificationManager;
35
import org.gvsig.editing.CADExtension;
36
import org.gvsig.editing.gui.cad.DefaultCADTool;
37
import org.gvsig.editing.gui.cad.exception.CommandException;
38
import org.gvsig.editing.gui.cad.tools.smc.EditVertexCADToolContext;
39
import org.gvsig.editing.gui.cad.tools.smc.EditVertexCADToolContext.EditVertexCADToolState;
40
import org.gvsig.editing.layers.VectorialLayerEdited;
41
import org.gvsig.fmap.dal.exception.DataException;
42
import org.gvsig.fmap.dal.exception.ReadException;
43
import org.gvsig.fmap.dal.feature.EditableFeature;
44
import org.gvsig.fmap.dal.feature.Feature;
45
import org.gvsig.fmap.dal.feature.FeatureSelection;
46
import org.gvsig.fmap.dal.feature.FeatureSet;
47
import org.gvsig.fmap.dal.feature.FeatureStore;
48
import org.gvsig.fmap.geom.Geometry;
49
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
50
import org.gvsig.fmap.geom.handler.Handler;
51
import org.gvsig.fmap.geom.primitive.GeneralPathX;
52
import org.gvsig.fmap.mapcontext.ViewPort;
53
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
54
import org.gvsig.tools.dispose.DisposableIterator;
55
import org.gvsig.tools.dispose.DisposeUtils;
56

    
57
/**
58
 * DOCUMENT ME!
59
 * 
60
 * @author Vicente Caballero Navarro
61
 */
62
public class EditVertexCADTool extends DefaultCADTool {
63

    
64
    protected EditVertexCADToolContext _fsm;
65
    protected int numSelect = 0;
66
    protected int numHandlers;
67
    protected boolean addVertex = false;
68

    
69
    /**
70
     * M?todo de incio, para poner el c?digo de todo lo que se requiera de una
71
     * carga previa a la utilizaci?n de la herramienta.
72
     */
73
    public void init() {
74
        _fsm = new EditVertexCADToolContext(this);
75
    }
76

    
77
    /*
78
     * (non-Javadoc)
79
     * 
80
     * @see
81
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
82
     * .layers.FBitSet, double, double)
83
     */
84
    public void transition(double x, double y, InputEvent event) {
85
        _fsm.addPoint(x, y, event);
86
    }
87

    
88
    /*
89
     * (non-Javadoc)
90
     * 
91
     * @see
92
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
93
     * .layers.FBitSet, double)
94
     */
95
    public void transition(double d) {
96
        _fsm.addValue(d);
97
    }
98

    
99
    /*
100
     * (non-Javadoc)
101
     * 
102
     * @see
103
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
104
     * .layers.FBitSet, java.lang.String)
105
     */
106
    public void transition(String s) throws CommandException {
107
        if (!super.changeCommand(s)) {
108
            _fsm.addOption(s);
109
        }
110
    }
111

    
112
    /**
113
     * DOCUMENT ME!
114
     */
115
    public void selection() {
116
        FeatureSet selection = null;
117
        try {
118
            selection = (FeatureSet) getVLE().getFeatureStore().getSelection();
119

    
120
            if (selection.getSize() == 0
121
                && !CADExtension
122
                    .getCADTool()
123
                    .getClass()
124
                    .getName()
125
                    .equals("com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool")) {
126
                CADExtension.setCADTool("_selection", false);
127
                ((SelectionCADTool) CADExtension.getCADTool())
128
                    .setNextTool("_editvertex");
129
            }
130
        } catch (ReadException e) {
131
            // TODO Auto-generated catch block
132
            e.printStackTrace();
133
        } catch (DataException e) {
134
            // TODO Auto-generated catch block
135
            e.printStackTrace();
136
        }
137
    }
138

    
139
    /**
140
     * Equivale al transition del prototipo pero sin pasarle como par?metro el
141
     * editableFeatureSource que ya estar? creado.
142
     * 
143
     * @param x
144
     *            par?metro x del punto que se pase en esta transici?n.
145
     * @param y
146
     *            par?metro y del punto que se pase en esta transici?n.
147
     */
148
    public void addPoint(double x, double y, InputEvent event) {
149
        selectHandler(x, y);
150
        addVertex = false;
151
    }
152

    
153
    private Geometry getSelectedGeometry() {
154
        FeatureSet selection = null;
155
        DisposableIterator iterator = null;
156
        try {
157
            selection = (FeatureSet) getVLE().getFeatureStore().getSelection();
158

    
159
            Feature feature = null;
160
            Geometry ig = null;
161
            if (selection.getSize() == 1) {
162
                iterator = selection.iterator();
163
                feature = (Feature) iterator.next();
164
                ig = (feature.getDefaultGeometry()).cloneGeometry();
165
                return ig;
166
            }
167
        } catch (ReadException e) {
168
            // TODO Auto-generated catch block
169
            e.printStackTrace();
170
        } catch (DataException e) {
171
            // TODO Auto-generated catch block
172
            e.printStackTrace();
173
        } finally {
174
            DisposeUtils.dispose(iterator);
175
        }
176

    
177
        return null;
178
    }
179

    
180
    /**
181
     * M?todo para dibujar la lo necesario para el estado en el que nos
182
     * encontremos.
183
     * 
184
     * @param g
185
     *            Graphics sobre el que dibujar.
186
     * @param x
187
     *            par?metro x del punto que se pase para dibujar.
188
     * @param y
189
     *            par?metro x del punto que se pase para dibujar.
190
     */
191
    public void drawOperation(MapControlDrawer renderer, double x, double y) {
192
        drawVertex(renderer, getCadToolAdapter().getMapControl().getViewPort());
193
    }
194

    
195
    /**
196
     * Add a diferent option.
197
     * 
198
     * @param s
199
     *            Diferent option.
200
     */
201
    public void addOption(String s) {
202
        EditVertexCADToolState actualState =
203
            (EditVertexCADToolState) _fsm.getPreviousState();
204
        String status = actualState.getName();
205
        VectorialLayerEdited vle = getVLE();
206
        FeatureStore featureStore = null;
207
        DisposableIterator iterator = null;
208
        try {
209
            featureStore = vle.getFeatureStore();
210

    
211
            FeatureSet selection = (FeatureSet) featureStore.getSelection();
212
            Feature feature = null;
213
            Geometry ig = null;
214
            Handler[] handlers = null;
215
            if (selection.getSize() == 1) {
216
                iterator = selection.iterator();
217
                feature = (Feature) iterator.next();
218
                ig = (feature.getDefaultGeometry()).cloneGeometry();
219
                handlers = ig.getHandlers(Geometry.SELECTHANDLER);
220
                numHandlers = handlers.length;
221
                if (numHandlers == 0) {
222
                    try {
223
                        featureStore.delete(feature);
224
                    } catch (ReadException e) {
225
                        NotificationManager.addError(e.getMessage(), e);
226
                    } catch (DataException e) {
227
                        NotificationManager.addError(e.getMessage(), e);
228
                    }
229
                }
230
            } else {
231
                JOptionPane.showMessageDialog((Component) PluginServices
232
                    .getMainFrame(), PluginServices.getText(this,
233
                    "hay_mas_de_una_geometria_seleccionada"));
234
            }
235

    
236
            int dif = 1;// En el caso de ser pol?gono.
237
            if (ig instanceof MultiPrimitive) {
238
                dif = 2;
239
            }
240

    
241
            if (status.equals("EditVertex.SelectVertexOrDelete")) {
242
                if (s.equalsIgnoreCase(PluginServices.getText(this,
243
                    "EditVertexCADTool.nextvertex"))
244
                    || s.equals(PluginServices.getText(this, "next"))) {
245
                    numSelect = numSelect - dif;
246
                    if (numSelect < 0) {
247
                        numSelect = numHandlers - 1 + (numSelect + 1);
248
                    }
249
                } else
250
                    if (s.equalsIgnoreCase(PluginServices.getText(this,
251
                        "EditVertexCADTool.previousvertex"))
252
                        || s.equals(PluginServices.getText(this, "previous"))) {
253
                        numSelect = numSelect + dif;
254
                        if (numSelect > (numHandlers - 1)) {
255
                            numSelect = numSelect - (numHandlers);
256
                        }
257

    
258
                    } else
259
                        if (s.equalsIgnoreCase(PluginServices.getText(this,
260
                            "EditVertexCADTool.delvertex"))
261
                            || s.equals(PluginServices.getText(this, "del"))) {
262
                            if (handlers != null) {
263
                                Geometry newGeometry = null;
264
                                if (ig instanceof MultiPrimitive) {
265
                                    newGeometry =
266
                                        removeVertexGC((MultiPrimitive) ig,
267
                                            handlers[numSelect]);
268
                                } else {
269
                                    newGeometry =
270
                                        removeVertex(ig, handlers, numSelect);
271
                                }
272
                                try {
273
                                    EditableFeature eFeature =
274
                                        feature.getEditable();
275
                                    eFeature.setGeometry(featureStore
276
                                        .getDefaultFeatureType()
277
                                        .getDefaultGeometryAttributeName(),
278
                                        newGeometry);
279
                                    featureStore.update(eFeature);
280

    
281
                                } catch (ReadException e) {
282
                                    NotificationManager.addError(
283
                                        e.getMessage(), e);
284
                                } catch (DataException e) {
285
                                    // TODO Auto-generated catch block
286
                                    e.printStackTrace();
287
                                }
288
                            }
289
                        } else
290
                            if (s.equalsIgnoreCase(PluginServices.getText(this,
291
                                "EditVertexCADTool.addvertex"))
292
                                || s.equals(PluginServices.getText(this, "add"))) {
293
                                addVertex = true;
294
                            }
295
            }
296
        } catch (ReadException e1) {
297
            // TODO Auto-generated catch block
298
            e1.printStackTrace();
299
        } catch (DataException e) {
300
            // TODO Auto-generated catch block
301
            e.printStackTrace();
302
        } finally {
303
            if (iterator != null) {
304
                iterator.dispose();
305
            }
306
        }
307
    }
308

    
309
    private void drawVertex(MapControlDrawer renderer, ViewPort vp) {
310
        VectorialLayerEdited vle = getVLE();
311
        DisposableIterator iterator = null;
312
        try {
313
            iterator =
314
                ((FeatureSelection) vle.getFeatureStore().getSelection())
315
                    .iterator();
316
            while (iterator.hasNext()) {
317
                Feature feature = (Feature) iterator.next();
318

    
319
                Geometry ig = (feature.getDefaultGeometry()).cloneGeometry();
320
                // renderer.draw(ig,
321
                // mapControlManager.getGeometrySelectionSymbol());
322

    
323
                Handler[] handlers = ig.getHandlers(Geometry.SELECTHANDLER);
324
                if (numSelect >= handlers.length) {
325
                    numSelect = 0;
326
                }
327
                if (handlers.length == 0)
328
                    continue;
329
                renderer.drawHandler(handlers[numSelect],
330
                    vp.getAffineTransform());
331
            }
332
        } catch (DataException e) {
333
            // TODO Auto-generated catch block
334
            e.printStackTrace();
335
        } finally {
336
            if (iterator != null) {
337
                iterator.dispose();
338
            }
339
        }
340
    }
341

    
342
    /*
343
     * (non-Javadoc)
344
     * 
345
     * @see com.iver.cit.gvsig.gui.cad.CADTool#addvalue(double)
346
     */
347
    public void addValue(double d) {
348
    }
349

    
350
    private Geometry removeVertex(Geometry gp, Handler[] handlers,
351
        int numHandler) {
352
        GeneralPathX newGp = new GeneralPathX();
353
        double[] theData = new double[6];
354

    
355
        PathIterator theIterator;
356
        int theType;
357
        int numParts = 0;
358

    
359
        Point2D ptSrc = new Point2D.Double();
360
        boolean bFirst = false;
361

    
362
        theIterator = gp.getPathIterator(null, geomManager.getFlatness());
363
        int numSegmentsAdded = 0;
364
        while (!theIterator.isDone()) {
365
            theType = theIterator.currentSegment(theData);
366
            if (bFirst) {
367
                newGp.moveTo(theData[0], theData[1]);
368
                numSegmentsAdded++;
369
                bFirst = false;
370
                theIterator.next();
371
                continue;
372
            }
373
            switch (theType) {
374

    
375
            case PathIterator.SEG_MOVETO:
376
                numParts++;
377
                ptSrc.setLocation(theData[0], theData[1]);
378
                if (ptSrc.equals(handlers[numHandler].getPoint())) {
379
                    numParts--;
380
                    bFirst = true;
381
                    break;
382
                }
383
                newGp.moveTo(ptSrc.getX(), ptSrc.getY());
384
                numSegmentsAdded++;
385
                bFirst = false;
386
                break;
387

    
388
            case PathIterator.SEG_LINETO:
389
                ptSrc.setLocation(theData[0], theData[1]);
390
                if (ptSrc.equals(handlers[numHandler].getPoint())) {
391
                    break;
392
                }
393
                newGp.lineTo(ptSrc.getX(), ptSrc.getY());
394
                bFirst = false;
395
                numSegmentsAdded++;
396
                break;
397

    
398
            case PathIterator.SEG_QUADTO:
399
                newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
400
                numSegmentsAdded++;
401
                break;
402

    
403
            case PathIterator.SEG_CUBICTO:
404
                newGp.curveTo(theData[0], theData[1], theData[2], theData[3],
405
                    theData[4], theData[5]);
406
                numSegmentsAdded++;
407
                break;
408

    
409
            case PathIterator.SEG_CLOSE:
410
                if (numSegmentsAdded < 3) {
411
                    newGp.lineTo(theData[0], theData[1]);
412
                }
413
                newGp.closePath();
414

    
415
                break;
416
            } // end switch
417

    
418
            theIterator.next();
419
        } // end while loop
420
        Geometry shp = null;
421
        switch (gp.getType()) {
422
        case Geometry.TYPES.POINT: // Tipo punto
423
            shp = createPoint(ptSrc.getX(), ptSrc.getY());
424
            break;
425

    
426
        case Geometry.TYPES.CURVE:
427
            shp = createCurve(newGp);
428
            break;
429
        case Geometry.TYPES.SURFACE:
430
            shp = createSurface(newGp);
431
            break;
432
        }
433
        Geometry ig = shp;
434
        int dif = 1;// En el caso de ser pol?gono.
435
        numSelect = numSelect - dif;
436
        if (numSelect < 0) {
437
            numSelect = numHandlers - 1 + (numSelect + 1);
438
        }
439
        return ig;
440
    }
441

    
442
    private Geometry removeVertexGC(MultiPrimitive gc, Handler handler) {
443
            
444
//        Geometry[] geoms = gc.getGeometries(); // getPrimitives es de la implemetacion, no esta en el API
445
            Geometry[] geoms = new Geometry[gc.getPrimitivesNumber()];
446
            for( int i=0; i<gc.getPrimitivesNumber(); i++) {
447
                    geoms[i] = gc.getPrimitiveAt(i);
448
            }
449
            
450
        ArrayList geomsAux = new ArrayList();
451
        int pos = -1;
452
        for (int i = 0; i < geoms.length; i++) {
453
            Handler[] handlers = geoms[i].getHandlers(Geometry.SELECTHANDLER);
454
            for (int j = 0; j < handlers.length; j++) {
455
                if (handlers[j].equalsPoint(handler)) {
456
                    geomsAux.add(geoms[i]);
457
                    if (pos == -1) {
458
                        pos = i;
459
                    }
460
                }
461
            }
462
        }
463
        int numGeomsAux = geomsAux.size();
464
        GeneralPathX gpx = new GeneralPathX();
465
        for (int i = 0; i < numGeomsAux; i++) {
466
            Handler[] handlers =
467
                ((Geometry) geomsAux.get(i))
468
                    .getHandlers(Geometry.SELECTHANDLER);
469
            if (numGeomsAux == 2) {
470
                for (int j = 0; j < handlers.length; j++) {
471
                    if (handlers[j].equalsPoint(handler)) {
472
                        if (j == (handlers.length - 1)) {
473
                            Point2D ph = handlers[0].getPoint();
474
                            gpx.moveTo(ph.getX(), ph.getY());
475
                        } else {
476
                            Point2D ph =
477
                                handlers[handlers.length - 1].getPoint();
478
                            gpx.lineTo(ph.getX(), ph.getY());
479
                        }
480
                    }
481
                }
482
            }
483

    
484
        }
485
        ArrayList newGeoms = new ArrayList();
486
        for (int i = 0; i < pos; i++) {
487
            newGeoms.add(geoms[i]);
488
        }
489
        newGeoms.add(createCurve(gpx));
490
        for (int i = pos + numGeomsAux; i < geoms.length; i++) {
491
            newGeoms.add(geoms[i]);
492
        }
493

    
494
        return createMultiPrimitive((Geometry[]) newGeoms
495
            .toArray(new Geometry[0]));
496
    }
497

    
498
    private Geometry addVertex(Geometry geome, Point2D p, Rectangle2D rect) {
499
        Geometry geometryCloned = geome.cloneGeometry();
500
        Geometry geom1 = null;
501
        GeneralPathX gpxAux;
502
        boolean finish = false;
503
        // FGeometry geom2=null;
504

    
505
        // if (geometryCloned.getGeometryType() == FShape.POLYGON){
506
        // ///////////////
507

    
508
        GeneralPathX newGp = new GeneralPathX();
509
        double[] theData = new double[6];
510

    
511
        PathIterator theIterator;
512
        int theType;
513
        int numParts = 0;
514
        Point2D pLast = new Point2D.Double();
515
        Point2D pAnt = new Point2D.Double();
516
        Point2D firstPoint = null;
517
        theIterator = geome.getPathIterator(null, geomManager.getFlatness()); // ,
518
                                                                              // flatness);
519
        int numSegmentsAdded = 0;
520
        while (!theIterator.isDone()) {
521
            theType = theIterator.currentSegment(theData);
522
            switch (theType) {
523
            case PathIterator.SEG_MOVETO:
524
                pLast.setLocation(theData[0], theData[1]);
525
                if (numParts == 0) {
526
                    firstPoint = (Point2D) pLast.clone();
527
                }
528
                numParts++;
529

    
530
                gpxAux = new GeneralPathX();
531
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
532
                gpxAux.lineTo(pLast.getX(), pLast.getY());
533
                geom1 = createCurve(gpxAux);
534
                if (geom1.intersects(rect)) {
535
                    finish = true;
536
                    newGp.moveTo(pLast.getX(), pLast.getY());
537
                    // newGp.lineTo(pLast.getX(),pLast.getY());
538
                } else {
539
                    newGp.moveTo(pLast.getX(), pLast.getY());
540
                }
541
                pAnt.setLocation(pLast.getX(), pLast.getY());
542
                numSegmentsAdded++;
543
                break;
544

    
545
            case PathIterator.SEG_LINETO:
546
                pLast.setLocation(theData[0], theData[1]);
547
                gpxAux = new GeneralPathX();
548
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
549
                gpxAux.lineTo(pLast.getX(), pLast.getY());
550
                geom1 = createCurve(gpxAux);
551
                if (geom1.intersects(rect)) {
552
                    newGp.lineTo(p.getX(), p.getY());
553
                    newGp.lineTo(pLast.getX(), pLast.getY());
554
                } else {
555
                    newGp.lineTo(pLast.getX(), pLast.getY());
556
                }
557
                pAnt.setLocation(pLast.getX(), pLast.getY());
558
                numSegmentsAdded++;
559
                break;
560

    
561
            case PathIterator.SEG_QUADTO:
562
                newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
563
                numSegmentsAdded++;
564
                break;
565

    
566
            case PathIterator.SEG_CUBICTO:
567
                newGp.curveTo(theData[0], theData[1], theData[2], theData[3],
568
                    theData[4], theData[5]);
569
                numSegmentsAdded++;
570
                break;
571

    
572
            case PathIterator.SEG_CLOSE:
573
                // if (numSegmentsAdded < 3){
574
                gpxAux = new GeneralPathX();
575
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
576
                gpxAux.lineTo(firstPoint.getX(), firstPoint.getY());
577
                geom1 = createCurve(gpxAux);
578
                if (geom1.intersects(rect) || finish) {
579
                    newGp.lineTo(p.getX(), p.getY());
580
                    newGp.lineTo(pLast.getX(), pLast.getY());
581
                } else {
582
                    newGp.lineTo(pLast.getX(), pLast.getY());
583
                }
584
                // }
585
                newGp.closePath();
586
                break;
587
            } // end switch
588

    
589
            theIterator.next();
590
        } // end while loop
591
        Geometry shp = null;
592
        switch (geometryCloned.getType()) {
593
        case POINT: // Tipo punto
594
            shp = createPoint(pLast.getX(), pLast.getY());
595
            break;
596

    
597
        case CURVE:
598
            shp = createCurve(newGp);
599
            break;
600
        case SURFACE:
601
        case CIRCLE:
602
        case ELLIPSE:
603
            shp = createSurface(newGp);
604
            break;
605
        }
606
        return shp;
607
    }
608

    
609
    private Geometry addVertexGC(MultiPrimitive gc, Point2D p,
610
        Rectangle2D rect) {
611
//      Geometry[] geoms = gc.getGeometries(); // getPrimitives es de la implemetacion, no esta en el API
612
            Geometry[] geoms = new Geometry[gc.getPrimitivesNumber()];
613
            for( int i=0; i<gc.getPrimitivesNumber(); i++) {
614
                    geoms[i] = gc.getPrimitiveAt(i);
615
            }
616
          
617
        int pos = -1;
618
        for (int i = 0; i < geoms.length; i++) {
619
            if (geoms[i].intersects(rect)) {
620
                pos = i;
621
            }
622
        }
623
        ArrayList newGeoms = new ArrayList();
624
        for (int i = 0; i < pos; i++) {
625
            newGeoms.add(geoms[i]);
626
        }
627
        if (pos != -1) {
628
            GeneralPathX gpx1 = new GeneralPathX();
629
            GeneralPathX gpx2 = new GeneralPathX();
630
            Handler[] handlers = geoms[pos].getHandlers(Geometry.SELECTHANDLER);
631
            Point2D p1 = handlers[0].getPoint();
632
            Point2D p2 = p;
633
            Point2D p3 = handlers[handlers.length - 1].getPoint();
634
            gpx1.moveTo(p1.getX(), p1.getY());
635
            gpx1.lineTo(p2.getX(), p2.getY());
636
            gpx2.moveTo(p2.getX(), p2.getY());
637
            gpx2.lineTo(p3.getX(), p3.getY());
638
            newGeoms.add(createCurve(gpx1));
639
            newGeoms.add(createCurve(gpx2));
640
            for (int i = pos + 1; i < geoms.length; i++) {
641
                newGeoms.add(geoms[i]);
642
            }
643
            return createMultiPrimitive((Geometry[]) newGeoms
644
                .toArray(new Geometry[0]));
645
        } else {
646
            return null;
647
        }
648
    }
649

    
650
    public String getName() {
651
        return PluginServices.getText(this, "edit_vertex_");
652
    }
653

    
654
    private void selectHandler(double x, double y) {
655
        Point2D firstPoint = new Point2D.Double(x, y);
656
        VectorialLayerEdited vle = getVLE();
657
        FeatureStore featureStore = null;
658
        DisposableIterator iterator = null;
659
        DisposableIterator selectedIterator = null;
660

    
661
        try {
662
            featureStore = vle.getFeatureStore();
663

    
664
            iterator =
665
                ((FeatureSelection) featureStore.getSelection()).iterator();
666
            double tam =
667
                getCadToolAdapter().getMapControl().getViewPort()
668
                    .toMapDistance(mapControlManager.getTolerance());
669
            Rectangle2D rect =
670
                new Rectangle2D.Double(firstPoint.getX() - tam,
671
                    firstPoint.getY() - tam, tam * 2, tam * 2);
672
            while (iterator.hasNext()) {
673
                Feature feature = (Feature) iterator.next();
674

    
675
                boolean isSelectedHandler = false;
676
                Geometry geometry = getSelectedGeometry();
677
                if (geometry != null) {
678
                    Handler[] handlers =
679
                        geometry.getHandlers(Geometry.SELECTHANDLER);
680
                    for (int h = 0; h < handlers.length; h++) {
681
                        if (handlers[h].getPoint().distance(firstPoint) < tam) {
682
                            numSelect = h;
683
                            isSelectedHandler = true;
684
                            break;
685
                        }
686
                    }
687

    
688
                    if (!isSelectedHandler) {
689
                        boolean isSelectedGeometry = false;
690
                        if (geometry.intersects(rect)) { // , 0.1)){
691
                            isSelectedGeometry = true;
692
                        }
693
                        if (isSelectedGeometry && addVertex) {
694
                            try {
695
                                selectedIterator =
696
                                    featureStore.getFeatureSelection()
697
                                        .iterator();
698
                                Feature feat =
699
                                    (Feature) selectedIterator.next();
700
                                Point2D posVertex = new Point2D.Double(x, y);
701
                                Geometry geom1 =
702
                                    (feat.getDefaultGeometry()).cloneGeometry();
703
                                Geometry geom = null;
704
                                if (geom1 instanceof MultiPrimitive) {
705
                                    geom =
706
                                        addVertexGC((MultiPrimitive) geom1,
707
                                            posVertex, rect);
708
                                } else {
709
                                    geom = addVertex(geom1, posVertex, rect);
710
                                }
711
                                if (geom != null) {
712
                                    EditableFeature eFeature =
713
                                        feature.getEditable();
714
                                    eFeature.setGeometry(featureStore
715
                                        .getDefaultFeatureType()
716
                                        .getDefaultGeometryAttributeName(),
717
                                        geom);
718
                                    featureStore.update(eFeature);
719
                                    Handler[] newHandlers =
720
                                        geom.getHandlers(Geometry.SELECTHANDLER);
721
                                    for (int h = 0; h < newHandlers.length; h++) {
722
                                        if (newHandlers[h].getPoint().distance(
723
                                            posVertex) < tam) {
724
                                            numSelect = h;
725
                                            isSelectedHandler = true;
726
                                        }
727
                                    }
728

    
729
                                    // clearSelection();
730
                                }
731
                            } finally {
732
                                if (selectedIterator != null) {
733
                                    selectedIterator.dispose();
734
                                }
735
                            }
736
                        }
737
                    }
738
                }
739
            }
740

    
741
        } catch (DataException e) {
742
            e.printStackTrace();
743
        } finally {
744
            if (iterator != null) {
745
                iterator.dispose();
746
            }
747
        }
748

    
749
    }
750

    
751
    public String toString() {
752
        return "_editvertex";
753
    }
754

    
755
    @Override
756
    protected int[] getSupportedGeometryTypes() {
757
        return new int[] { POINT, MULTIPOINT, CURVE, MULTICURVE, CIRCLE,
758
            ELLIPSE, SURFACE, MULTISURFACE };
759
    }
760

    
761
}