Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.editing.app / org.gvsig.editing.app.mainplugin / src / main / java / org / gvsig / editing / gui / cad / tools / EditVertexCADTool.java @ 40722

History | View | Annotate | Download (29.7 KB)

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

    
26
import java.awt.Component;
27
import java.awt.event.InputEvent;
28
import java.awt.geom.PathIterator;
29
import java.awt.geom.Point2D;
30
import java.awt.geom.Rectangle2D;
31

    
32
import javax.swing.JOptionPane;
33

    
34
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36

    
37
import org.gvsig.andami.PluginServices;
38
import org.gvsig.andami.messages.NotificationManager;
39
import org.gvsig.app.ApplicationLocator;
40
import org.gvsig.editing.CADExtension;
41
import org.gvsig.editing.IEditionManager;
42
import org.gvsig.editing.gui.cad.DefaultCADTool;
43
import org.gvsig.editing.gui.cad.exception.CommandException;
44
import org.gvsig.editing.gui.cad.tools.smc.EditVertexCADToolContext;
45
import org.gvsig.editing.gui.cad.tools.smc.EditVertexCADToolContext.EditVertexCADToolState;
46
import org.gvsig.editing.layers.VectorialLayerEdited;
47
import org.gvsig.fmap.dal.exception.DataException;
48
import org.gvsig.fmap.dal.exception.ReadException;
49
import org.gvsig.fmap.dal.feature.EditableFeature;
50
import org.gvsig.fmap.dal.feature.Feature;
51
import org.gvsig.fmap.dal.feature.FeatureSelection;
52
import org.gvsig.fmap.dal.feature.FeatureSet;
53
import org.gvsig.fmap.dal.feature.FeatureStore;
54
import org.gvsig.fmap.dal.feature.exception.CreateGeometryException;
55
import org.gvsig.fmap.geom.Geometry;
56
import org.gvsig.fmap.geom.aggregate.MultiCurve;
57
import org.gvsig.fmap.geom.aggregate.MultiPoint;
58
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
59
import org.gvsig.fmap.geom.aggregate.MultiSurface;
60
import org.gvsig.fmap.geom.handler.Handler;
61
import org.gvsig.fmap.geom.operation.GeometryOperationException;
62
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
63
import org.gvsig.fmap.geom.primitive.Curve;
64
import org.gvsig.fmap.geom.primitive.GeneralPathX;
65
import org.gvsig.fmap.geom.primitive.Point;
66
import org.gvsig.fmap.geom.primitive.Primitive;
67
import org.gvsig.fmap.geom.primitive.Surface;
68
import org.gvsig.fmap.mapcontext.ViewPort;
69
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
70
import org.gvsig.tools.dispose.DisposableIterator;
71
import org.gvsig.tools.dispose.DisposeUtils;
72

    
73
/**
74
 * DOCUMENT ME!
75
 * 
76
 * @author Vicente Caballero Navarro
77
 */
78
public class EditVertexCADTool extends DefaultCADTool {
79

    
80
    protected EditVertexCADToolContext _fsm;
81
    protected int numSelect = 0;
82
    protected int numHandlers;
83
    protected boolean addVertex = false;
84
    
85
    private static Logger logger =
86
        LoggerFactory.getLogger(EditVertexCADTool.class);
87

    
88
    /**
89
     * M?todo de incio, para poner el c?digo de todo lo que se requiera de una
90
     * carga previa a la utilizaci?n de la herramienta.
91
     */
92
    public void init() {
93
        _fsm = new EditVertexCADToolContext(this);
94
    }
95

    
96
    /*
97
     * (non-Javadoc)
98
     * 
99
     * @see
100
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
101
     * .layers.FBitSet, double, double)
102
     */
103
    public void transition(double x, double y, InputEvent event) {
104
        _fsm.addPoint(x, y, event);
105
    }
106

    
107
    /*
108
     * (non-Javadoc)
109
     * 
110
     * @see
111
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
112
     * .layers.FBitSet, double)
113
     */
114
    public void transition(double d) {
115
        _fsm.addValue(d);
116
    }
117

    
118
    /*
119
     * (non-Javadoc)
120
     * 
121
     * @see
122
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
123
     * .layers.FBitSet, java.lang.String)
124
     */
125
    public void transition(String s) throws CommandException {
126
        if (!super.changeCommand(s)) {
127
            _fsm.addOption(s);
128
        }
129
    }
130

    
131
    /**
132
     * DOCUMENT ME!
133
     */
134
    public void selection() {
135
        FeatureSet selection = null;
136
        try {
137
            selection = (FeatureSet) getVLE().getFeatureStore().getSelection();
138

    
139
            if (selection.getSize() == 0
140
                && !SelectionCADTool.isInstance(CADExtension.getCADTool(), true)) {
141
                
142
                CADExtension.setCADTool("_selection", false);
143
                ((SelectionCADTool) CADExtension.getCADTool())
144
                    .setNextTool("_editvertex");
145
            }
146
        } catch (ReadException e) {
147
            // TODO Auto-generated catch block
148
            e.printStackTrace();
149
        } catch (DataException e) {
150
            // TODO Auto-generated catch block
151
            e.printStackTrace();
152
        }
153
    }
154

    
155
    /**
156
     * Equivale al transition del prototipo pero sin pasarle como par?metro el
157
     * editableFeatureSource que ya estar? creado.
158
     * 
159
     * @param x
160
     *            par?metro x del punto que se pase en esta transici?n.
161
     * @param y
162
     *            par?metro y del punto que se pase en esta transici?n.
163
     */
164
    public void addPoint(double x, double y, InputEvent event) {
165
        selectHandler(x, y);
166
        addVertex = false;
167
    }
168

    
169
    private Geometry getSelectedGeometry() {
170
        FeatureSet selection = null;
171
        DisposableIterator iterator = null;
172
        try {
173
            selection = (FeatureSet) getVLE().getFeatureStore().getSelection();
174

    
175
            Feature feature = null;
176
            Geometry ig = null;
177
            if (selection.getSize() == 1) {
178
                iterator = selection.iterator();
179
                feature = (Feature) iterator.next();
180
                ig = (feature.getDefaultGeometry()).cloneGeometry();
181
                return ig;
182
            }
183
        } catch (ReadException e) {
184
            // TODO Auto-generated catch block
185
            e.printStackTrace();
186
        } catch (DataException e) {
187
            // TODO Auto-generated catch block
188
            e.printStackTrace();
189
        } finally {
190
            DisposeUtils.dispose(iterator);
191
        }
192

    
193
        return null;
194
    }
195

    
196
    /**
197
     * M?todo para dibujar la lo necesario para el estado en el que nos
198
     * encontremos.
199
     * 
200
     * @param g
201
     *            Graphics sobre el que dibujar.
202
     * @param x
203
     *            par?metro x del punto que se pase para dibujar.
204
     * @param y
205
     *            par?metro x del punto que se pase para dibujar.
206
     */
207
    public void drawOperation(MapControlDrawer renderer, double x, double y) {
208
        drawVertex(renderer, getCadToolAdapter().getMapControl().getViewPort());
209
    }
210

    
211
    /**
212
     * Add a diferent option.
213
     * 
214
     * @param s
215
     *            Diferent option.
216
     */
217
    public void addOption(String s) {
218
        EditVertexCADToolState actualState =
219
            (EditVertexCADToolState) _fsm.getPreviousState();
220
        String status = actualState.getName();
221
        VectorialLayerEdited vle = getVLE();
222
        FeatureStore featureStore = null;
223
        DisposableIterator iterator = null;
224
        try {
225
            featureStore = vle.getFeatureStore();
226

    
227
            FeatureSet selection = (FeatureSet) featureStore.getSelection();
228
            Feature feature = null;
229
            Geometry ig = null;
230
            Handler[] handlers = null;
231
            if (selection.getSize() == 1) {
232
                iterator = selection.iterator();
233
                feature = (Feature) iterator.next();
234
                ig = (feature.getDefaultGeometry()).cloneGeometry();
235
                handlers = ig.getHandlers(Geometry.SELECTHANDLER);
236
                numHandlers = handlers.length;
237
                if (numHandlers == 0) {
238
                    try {
239
                        featureStore.delete(feature);
240
                    } catch (ReadException e) {
241
                        NotificationManager.addError(e.getMessage(), e);
242
                    } catch (DataException e) {
243
                        NotificationManager.addError(e.getMessage(), e);
244
                    }
245
                }
246
            } else {
247
                JOptionPane.showMessageDialog((Component) PluginServices
248
                    .getMainFrame(), PluginServices.getText(this,
249
                    "hay_mas_de_una_geometria_seleccionada"));
250
            }
251

    
252
            int diff = 1;// En el caso de ser pol?gono.
253
            /*
254
            if (ig instanceof MultiPrimitive) {
255
                diff = 2;
256
            }
257
            */
258

    
259
            if (status.equals("EditVertex.SelectVertexOrDelete")) {
260
                if (s.equalsIgnoreCase(PluginServices.getText(this,
261
                    "EditVertexCADTool.nextvertex"))
262
                    || s.equals(PluginServices.getText(this, "next"))) {
263
                    
264
                    numSelect = numSelect + diff;
265
                    if (numSelect > (numHandlers - 1)) {
266
                        numSelect = numSelect - (numHandlers);
267
                    }
268
                    
269
                } else
270
                    if (s.equalsIgnoreCase(PluginServices.getText(this,
271
                        "EditVertexCADTool.previousvertex"))
272
                        || s.equals(PluginServices.getText(this, "previous"))) {
273

    
274
                        numSelect = numSelect - diff;
275
                        if (numSelect < 0) {
276
                            numSelect = numHandlers - 1 + (numSelect + 1);
277
                        }
278

    
279
                    } else
280
                        if (s.equalsIgnoreCase(PluginServices.getText(this,
281
                            "EditVertexCADTool.delvertex"))
282
                            || s.equals(PluginServices.getText(this, "del"))) {
283
                            if (handlers != null) {
284
                                Geometry newGeometry = null;
285
                                if (ig instanceof MultiPrimitive) {
286
                                    newGeometry =
287
                                        removeVertexGC((MultiPrimitive) ig,
288
                                            handlers[numSelect]);
289
                                } else {
290
                                    newGeometry =
291
                                        removeVertex(ig, handlers[numSelect]);
292
                                }
293
                                super.updateGeometry(featureStore, feature, newGeometry);
294
//                                try {
295
//                                    EditableFeature eFeature =
296
//                                        feature.getEditable();
297
//                                    eFeature.setGeometry(featureStore
298
//                                        .getDefaultFeatureType()
299
//                                        .getDefaultGeometryAttributeName(),
300
//                                        newGeometry);
301
//                                    featureStore.update(eFeature);
302
//
303
//                                } catch (ReadException e) {
304
//                                    NotificationManager.addError(
305
//                                        e.getMessage(), e);
306
//                                } catch (DataException e) {
307
//                                    // TODO Auto-generated catch block
308
//                                    e.printStackTrace();
309
//                                }
310
                            }
311
                        } else
312
                            if (s.equalsIgnoreCase(PluginServices.getText(this,
313
                                "EditVertexCADTool.addvertex"))
314
                                || s.equals(PluginServices.getText(this, "add"))) {
315
                                addVertex = true;
316
                            }
317
            }
318
        } catch (Exception e1) {
319
            
320
            ApplicationLocator.getManager().message(
321
                e1.getMessage(), JOptionPane.ERROR_MESSAGE);
322
            logger.info("Error in add option.", e1);
323
        } finally {
324
            if (iterator != null) {
325
                iterator.dispose();
326
            }
327
        }
328
    }
329

    
330
    private void drawVertex(MapControlDrawer renderer, ViewPort vp) {
331
        VectorialLayerEdited vle = getVLE();
332
        DisposableIterator iterator = null;
333
        try {
334
            iterator =
335
                ((FeatureSelection) vle.getFeatureStore().getSelection())
336
                    .iterator();
337
            while (iterator.hasNext()) {
338
                Feature feature = (Feature) iterator.next();
339

    
340
                Geometry ig = (feature.getDefaultGeometry()).cloneGeometry();
341
                // renderer.draw(ig,
342
                // mapControlManager.getGeometrySelectionSymbol());
343

    
344
                Handler[] handlers = ig.getHandlers(Geometry.SELECTHANDLER);
345
                if (numSelect >= handlers.length) {
346
                    numSelect = 0;
347
                }
348
                if (handlers.length == 0)
349
                    continue;
350
                renderer.drawHandler(handlers[numSelect],
351
                    vp.getAffineTransform());
352
            }
353
        } catch (DataException e) {
354
            // TODO Auto-generated catch block
355
            e.printStackTrace();
356
        } finally {
357
            if (iterator != null) {
358
                iterator.dispose();
359
            }
360
        }
361
    }
362

    
363
    /*
364
     * (non-Javadoc)
365
     * 
366
     * @see com.iver.cit.gvsig.gui.cad.CADTool#addvalue(double)
367
     */
368
    public void addValue(double d) {
369
    }
370

    
371
    private Geometry removeVertex(Geometry gp, Handler hand) {
372
        GeneralPathX newGp = new GeneralPathX();
373
        double[] theData = new double[6];
374

    
375
        PathIterator theIterator;
376
        int theType;
377
        int numParts = 0;
378

    
379
        Point2D ptSrc = new Point2D.Double();
380
        boolean bFirst = false;
381

    
382
        theIterator = gp.getPathIterator(null, geomManager.getFlatness());
383
        int numSegmentsAdded = 0;
384
        while (!theIterator.isDone()) {
385
            theType = theIterator.currentSegment(theData);
386
            if (bFirst) {
387
                newGp.moveTo(theData[0], theData[1]);
388
                numSegmentsAdded++;
389
                bFirst = false;
390
                theIterator.next();
391
                continue;
392
            }
393
            switch (theType) {
394

    
395
            case PathIterator.SEG_MOVETO:
396
                numParts++;
397
                ptSrc.setLocation(theData[0], theData[1]);
398
                if (ptSrc.equals(hand.getPoint())) {
399
                    numParts--;
400
                    bFirst = true;
401
                    break;
402
                }
403
                newGp.moveTo(ptSrc.getX(), ptSrc.getY());
404
                numSegmentsAdded++;
405
                bFirst = false;
406
                break;
407

    
408
            case PathIterator.SEG_LINETO:
409
                ptSrc.setLocation(theData[0], theData[1]);
410
                if (ptSrc.equals(hand.getPoint())) {
411
                    break;
412
                }
413
                newGp.lineTo(ptSrc.getX(), ptSrc.getY());
414
                bFirst = false;
415
                numSegmentsAdded++;
416
                break;
417

    
418
            case PathIterator.SEG_QUADTO:
419
                newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
420
                numSegmentsAdded++;
421
                break;
422

    
423
            case PathIterator.SEG_CUBICTO:
424
                newGp.curveTo(theData[0], theData[1], theData[2], theData[3],
425
                    theData[4], theData[5]);
426
                numSegmentsAdded++;
427
                break;
428

    
429
            case PathIterator.SEG_CLOSE:
430
                if (numSegmentsAdded < 3) {
431
                    newGp.lineTo(theData[0], theData[1]);
432
                }
433
                newGp.closePath();
434

    
435
                break;
436
            } // end switch
437

    
438
            theIterator.next();
439
        } // end while loop
440
        Geometry shp = null;
441
        switch (gp.getType()) {
442
        case Geometry.TYPES.POINT: // Tipo punto
443
            shp = createPoint(ptSrc.getX(), ptSrc.getY());
444
            break;
445

    
446
        case Geometry.TYPES.CURVE:
447
            shp = createCurve(newGp);
448
            break;
449
        case Geometry.TYPES.SURFACE:
450
            shp = createSurface(newGp);
451
            break;
452
        }
453
        Geometry ig = shp;
454
        int dif = 1;// En el caso de ser pol?gono.
455
        numSelect = numSelect - dif;
456
        if (numSelect < 0) {
457
            numSelect = numHandlers - 1 + (numSelect + 1);
458
        }
459
        return ig;
460
    }
461
    
462
    private Geometry removeVertexGC(MultiPrimitive gc, Handler handler)
463
            throws GeometryOperationNotSupportedException,
464
            GeometryOperationException, CreateGeometryException {
465

    
466
            Primitive prim = null;
467
            int np = gc.getPrimitivesNumber();
468
            
469
            for (int i = 0; i < np; i++) {
470
                prim = gc.getPrimitiveAt(i);
471
                Handler[] hh = prim.getHandlers(Geometry.SELECTHANDLER);
472
                int nh = hh.length;
473
                for (int j=0; j<nh; j++) {
474
                    if (hh[j].equalsPoint(handler)) {
475
                        /*
476
                         * Find the first primitive which has a handler
477
                         * matching received handler
478
                         */
479
                        Geometry resp = this.removeVertex(prim, handler);
480
                        for (int k=0; k<np; k++) {
481
                            if (k != i) {
482
                                resp = resp.union(gc.getPrimitiveAt(k));
483
                            }
484
                        }
485
                        if (resp.getType() == Geometry.TYPES.SURFACE){
486
                                MultiSurface geom = createMultiSurface();
487
                                geom.addSurface((Surface)resp);
488
                                return geom;
489
                        }else if (resp.getType() == Geometry.TYPES.POINT){
490
                                MultiPoint geom = createMultiPoint();
491
                                geom.addPoint((Point)resp);
492
                                return geom;
493
                        }else if (resp.getType() == Geometry.TYPES.CURVE){
494
                                MultiCurve geom = createMultiCurve();
495
                                geom.addCurve((Curve)resp);
496
                                return geom;
497
                            }
498
                        return resp;
499
                    }
500
                }
501
            }
502
            throw new CreateGeometryException(
503
                new Exception("Unable to remove vertex"));
504
        
505
    }
506
    
507

    
508

    
509
    private Geometry addVertex(Geometry geome, Point2D p, Rectangle2D rect) {
510
        Geometry geometryCloned = geome.cloneGeometry();
511
        Geometry geom1 = null;
512
        GeneralPathX gpxAux;
513
        boolean finish = false;
514
        // FGeometry geom2=null;
515

    
516
        // if (geometryCloned.getGeometryType() == FShape.POLYGON){
517
        // ///////////////
518

    
519
        GeneralPathX newGp = new GeneralPathX();
520
        double[] theData = new double[6];
521

    
522
        PathIterator theIterator;
523
        int theType;
524
        int numParts = 0;
525
        Point2D pLast = new Point2D.Double();
526
        Point2D pAnt = new Point2D.Double();
527
        Point2D firstPoint = null;
528
        theIterator = geome.getPathIterator(null, geomManager.getFlatness()); // ,
529
                                                                              // flatness);
530
        int numSegmentsAdded = 0;
531
        while (!theIterator.isDone()) {
532
            theType = theIterator.currentSegment(theData);
533
            switch (theType) {
534
            case PathIterator.SEG_MOVETO:
535
                pLast.setLocation(theData[0], theData[1]);
536
                if (numParts == 0) {
537
                    firstPoint = (Point2D) pLast.clone();
538
                }
539
                numParts++;
540

    
541
                gpxAux = new GeneralPathX();
542
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
543
                gpxAux.lineTo(pLast.getX(), pLast.getY());
544
                geom1 = createCurve(gpxAux);
545
                if (geom1.intersects(rect)) {
546
                    finish = true;
547
                    newGp.moveTo(pLast.getX(), pLast.getY());
548
                    // newGp.lineTo(pLast.getX(),pLast.getY());
549
                } else {
550
                    newGp.moveTo(pLast.getX(), pLast.getY());
551
                }
552
                pAnt.setLocation(pLast.getX(), pLast.getY());
553
                numSegmentsAdded++;
554
                break;
555

    
556
            case PathIterator.SEG_LINETO:
557
                pLast.setLocation(theData[0], theData[1]);
558
                gpxAux = new GeneralPathX();
559
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
560
                gpxAux.lineTo(pLast.getX(), pLast.getY());
561
                geom1 = createCurve(gpxAux);
562
                if (geom1.intersects(rect)) {
563
                    newGp.lineTo(p.getX(), p.getY());
564
                    newGp.lineTo(pLast.getX(), pLast.getY());
565
                } else {
566
                    newGp.lineTo(pLast.getX(), pLast.getY());
567
                }
568
                pAnt.setLocation(pLast.getX(), pLast.getY());
569
                numSegmentsAdded++;
570
                break;
571

    
572
            case PathIterator.SEG_QUADTO:
573
                newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
574
                numSegmentsAdded++;
575
                break;
576

    
577
            case PathIterator.SEG_CUBICTO:
578
                newGp.curveTo(theData[0], theData[1], theData[2], theData[3],
579
                    theData[4], theData[5]);
580
                numSegmentsAdded++;
581
                break;
582

    
583
            case PathIterator.SEG_CLOSE:
584
                // if (numSegmentsAdded < 3){
585
                gpxAux = new GeneralPathX();
586
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
587
                gpxAux.lineTo(firstPoint.getX(), firstPoint.getY());
588
                geom1 = createCurve(gpxAux);
589
                if (geom1.intersects(rect) || finish) {
590
                    newGp.lineTo(p.getX(), p.getY());
591
                    // newGp.lineTo(pLast.getX(), pLast.getY());
592
                } else {
593
                    newGp.lineTo(pLast.getX(), pLast.getY());
594
                }
595
                // }
596
                newGp.closePath();
597
                break;
598
            } // end switch
599

    
600
            theIterator.next();
601
        } // end while loop
602
        Geometry shp = null;
603
        switch (geometryCloned.getType()) {
604
        case POINT: // Tipo punto
605
            shp = createPoint(pLast.getX(), pLast.getY());
606
            break;
607

    
608
        case CURVE:
609
            shp = createCurve(newGp);
610
            break;
611
        case SURFACE:
612
        case CIRCLE:
613
        case ELLIPSE:
614
            shp = createSurface(newGp);
615
            break;
616
        }
617
        return shp;
618
    }
619

    
620
    private Geometry addVertexGC(
621
        MultiPrimitive mpri,
622
        Point2D p,
623
        Rectangle2D rect)
624
            throws GeometryOperationNotSupportedException,
625
            GeometryOperationException, CreateGeometryException
626
            {
627
        
628
        int n = mpri.getPrimitivesNumber();
629
        Primitive item = null;
630
        for (int i=0; i<n; i++) {
631
            item = mpri.getPrimitiveAt(i);
632
            if (item.intersects(rect)) {
633
                /*
634
                 * Only the first primitive that intersects
635
                 * with rect will be treated
636
                 */
637
                Geometry newg = this.addVertex(item, p, rect);
638
                for (int k=0; k<n; k++) {
639
                    if (k != i) {
640
                        newg = newg.union(mpri.getPrimitiveAt(k));
641
                    }
642
                    return newg;
643
                }
644
            }
645
        }
646
        throw new CreateGeometryException(
647
            new Exception("Unable to add vertex"));
648

    
649
        /*
650
            Geometry[] geoms = new Geometry[gc.getPrimitivesNumber()];
651
            for( int i=0; i<gc.getPrimitivesNumber(); i++) {
652
                    geoms[i] = gc.getPrimitiveAt(i);
653
            }
654
          
655
        int pos = -1;
656
        for (int i = 0; i < geoms.length; i++) {
657
            if (geoms[i].intersects(rect)) {
658
                pos = i;
659
            }
660
        }
661
        ArrayList newGeoms = new ArrayList();
662
        for (int i = 0; i < pos; i++) {
663
            newGeoms.add(geoms[i]);
664
        }
665
        if (pos != -1) {
666
            GeneralPathX gpx1 = new GeneralPathX();
667
            GeneralPathX gpx2 = new GeneralPathX();
668
            Handler[] handlers = geoms[pos].getHandlers(Geometry.SELECTHANDLER);
669
            Point2D p1 = handlers[0].getPoint();
670
            Point2D p2 = p;
671
            Point2D p3 = handlers[handlers.length - 1].getPoint();
672
            gpx1.moveTo(p1.getX(), p1.getY());
673
            gpx1.lineTo(p2.getX(), p2.getY());
674
            gpx2.moveTo(p2.getX(), p2.getY());
675
            gpx2.lineTo(p3.getX(), p3.getY());
676
            newGeoms.add(createCurve(gpx1));
677
            newGeoms.add(createCurve(gpx2));
678
            for (int i = pos + 1; i < geoms.length; i++) {
679
                newGeoms.add(geoms[i]);
680
            }
681
            return createMultiPrimitive((Geometry[]) newGeoms
682
                .toArray(new Geometry[0]));
683
        } else {
684
            return null;
685
        }
686
        */
687
    }
688

    
689
    public String getName() {
690
        return PluginServices.getText(this, "edit_vertex_");
691
    }
692

    
693
    private void selectHandler(double x, double y) {
694
        Point2D firstPoint = new Point2D.Double(x, y);
695
        VectorialLayerEdited vle = getVLE();
696
        FeatureStore featureStore = null;
697
        DisposableIterator iterator = null;
698
        DisposableIterator selectedIterator = null;
699
        
700
        IEditionManager ed_man = this.getEditionManager();
701

    
702
        try {
703
            featureStore = vle.getFeatureStore();
704

    
705
            iterator =
706
                ((FeatureSelection) featureStore.getSelection()).iterator();
707
            double tam =
708
                getCadToolAdapter().getMapControl().getViewPort()
709
                    .toMapDistance(mapControlManager.getTolerance());
710
            Rectangle2D rect =
711
                new Rectangle2D.Double(firstPoint.getX() - tam,
712
                    firstPoint.getY() - tam, tam * 2, tam * 2);
713
            while (iterator.hasNext()) {
714
                Feature feature = (Feature) iterator.next();
715

    
716
                boolean isSelectedHandler = false;
717
                Geometry geometry = getSelectedGeometry();
718
                if (geometry != null) {
719
                    Handler[] handlers =
720
                        geometry.getHandlers(Geometry.SELECTHANDLER);
721
                    for (int h = 0; h < handlers.length; h++) {
722
                        if (handlers[h].getPoint().distance(firstPoint) < tam) {
723
                            numSelect = h;
724
                            isSelectedHandler = true;
725
                            break;
726
                        }
727
                    }
728

    
729
                    if (!isSelectedHandler) {
730
                        boolean isSelectedGeometry = false;
731
                        if (geometry.intersects(rect)) { // , 0.1)){
732
                            isSelectedGeometry = true;
733
                        }
734
                        if (isSelectedGeometry && addVertex) {
735
                            try {
736
                                selectedIterator =
737
                                    featureStore.getFeatureSelection()
738
                                        .iterator();
739
                                Feature feat =
740
                                    (Feature) selectedIterator.next();
741
                                Point2D posVertex = new Point2D.Double(x, y);
742
                                Geometry geom1 =
743
                                    (feat.getDefaultGeometry()).cloneGeometry();
744
                                Geometry geom = null;
745
                                if (geom1 instanceof MultiPrimitive) {
746
                                    geom =
747
                                        addVertexGC((MultiPrimitive) geom1,
748
                                            posVertex, rect);
749
                                } else {
750
                                    geom = addVertex(geom1, posVertex, rect);
751
                                }
752
                                if (geom != null) {
753
                                    EditableFeature eFeature =
754
                                        feature.getEditable();
755
                                    eFeature.setGeometry(featureStore
756
                                        .getDefaultFeatureType()
757
                                        .getDefaultGeometryAttributeName(),
758
                                        geom);
759
                                    
760
                                    ed_man.updateFeature(featureStore, eFeature);
761
                                    
762
                                    Handler[] newHandlers =
763
                                        geom.getHandlers(Geometry.SELECTHANDLER);
764
                                    for (int h = 0; h < newHandlers.length; h++) {
765
                                        if (newHandlers[h].getPoint().distance(
766
                                            posVertex) < tam) {
767
                                            numSelect = h;
768
                                            isSelectedHandler = true;
769
                                        }
770
                                    }
771

    
772
                                    // clearSelection();
773
                                }
774
                            } finally {
775
                                if (selectedIterator != null) {
776
                                    selectedIterator.dispose();
777
                                }
778
                            }
779
                        }
780
                    }
781
                }
782
            }
783

    
784
        } catch (Exception e) {
785
            
786
            ApplicationLocator.getManager().message(
787
                e.getMessage(), JOptionPane.ERROR_MESSAGE);
788
            logger.info("Error in select handler.", e);
789
        } finally {
790
            if (iterator != null) {
791
                iterator.dispose();
792
            }
793
        }
794

    
795
    }
796

    
797
    public String toString() {
798
        return "_editvertex";
799
    }
800

    
801
    @Override
802
    protected int[] getSupportedGeometryTypes() {
803
        return new int[] { POINT, MULTIPOINT, CURVE, MULTICURVE, CIRCLE,
804
            ELLIPSE, SURFACE, MULTISURFACE };
805
    }
806

    
807
}