Statistics
| Revision:

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

History | View | Annotate | Download (30.2 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

    
30
import javax.swing.JOptionPane;
31

    
32
import org.slf4j.Logger;
33
import org.slf4j.LoggerFactory;
34

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

    
64
/**
65
 * DOCUMENT ME!
66
 * 
67
 * @author Vicente Caballero Navarro
68
 */
69
public class EditVertexCADTool extends DefaultCADTool {
70

    
71
    protected EditVertexCADToolContext _fsm;
72
    protected int numSelect = 0;
73
    protected int numHandlers;
74
    protected boolean addVertex = false;
75
    
76
    private static Logger logger =
77
        LoggerFactory.getLogger(EditVertexCADTool.class);
78

    
79
    /**
80
     * M?todo de incio, para poner el c?digo de todo lo que se requiera de una
81
     * carga previa a la utilizaci?n de la herramienta.
82
     */
83
    public void init() {
84
        _fsm = new EditVertexCADToolContext(this);
85
    }
86

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

    
98
    /*
99
     * (non-Javadoc)
100
     * 
101
     * @see
102
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
103
     * .layers.FBitSet, double)
104
     */
105
    public void transition(double d) {
106
        _fsm.addValue(d);
107
    }
108

    
109
    /*
110
     * (non-Javadoc)
111
     * 
112
     * @see
113
     * com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap
114
     * .layers.FBitSet, java.lang.String)
115
     */
116
    public void transition(String s) throws CommandException {
117
        if (!super.changeCommand(s)) {
118
            _fsm.addOption(s);
119
        }
120
    }
121

    
122
    /**
123
     * DOCUMENT ME!
124
     */
125
    public void selection() {
126
        FeatureSet selection = null;
127
        try {
128
            selection = (FeatureSet) getVLE().getFeatureStore().getSelection();
129

    
130
            if (selection.getSize() == 0
131
                && !CADExtension
132
                    .getCADTool()
133
                    .getClass()
134
                    .getName()
135
                    .equals("com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool")) {
136
                CADExtension.setCADTool("_selection", false);
137
                ((SelectionCADTool) CADExtension.getCADTool())
138
                    .setNextTool("_editvertex");
139
            }
140
        } catch (ReadException e) {
141
            // TODO Auto-generated catch block
142
            e.printStackTrace();
143
        } catch (DataException e) {
144
            // TODO Auto-generated catch block
145
            e.printStackTrace();
146
        }
147
    }
148

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

    
163
    private Geometry getSelectedGeometry() {
164
        FeatureSet selection = null;
165
        DisposableIterator iterator = null;
166
        try {
167
            selection = (FeatureSet) getVLE().getFeatureStore().getSelection();
168

    
169
            Feature feature = null;
170
            Geometry ig = null;
171
            if (selection.getSize() == 1) {
172
                iterator = selection.iterator();
173
                feature = (Feature) iterator.next();
174
                ig = (feature.getDefaultGeometry()).cloneGeometry();
175
                return ig;
176
            }
177
        } catch (ReadException e) {
178
            // TODO Auto-generated catch block
179
            e.printStackTrace();
180
        } catch (DataException e) {
181
            // TODO Auto-generated catch block
182
            e.printStackTrace();
183
        } finally {
184
            DisposeUtils.dispose(iterator);
185
        }
186

    
187
        return null;
188
    }
189

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

    
205
    /**
206
     * Add a diferent option.
207
     * 
208
     * @param s
209
     *            Diferent option.
210
     */
211
    public void addOption(String s) {
212
        EditVertexCADToolState actualState =
213
            (EditVertexCADToolState) _fsm.getPreviousState();
214
        String status = actualState.getName();
215
        VectorialLayerEdited vle = getVLE();
216
        FeatureStore featureStore = null;
217
        DisposableIterator iterator = null;
218
        try {
219
            featureStore = vle.getFeatureStore();
220

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

    
246
            int dif = 1;// En el caso de ser pol?gono.
247
            if (ig instanceof MultiPrimitive) {
248
                dif = 2;
249
            }
250

    
251
            if (status.equals("EditVertex.SelectVertexOrDelete")) {
252
                if (s.equalsIgnoreCase(PluginServices.getText(this,
253
                    "EditVertexCADTool.nextvertex"))
254
                    || s.equals(PluginServices.getText(this, "next"))) {
255
                    numSelect = numSelect - dif;
256
                    if (numSelect < 0) {
257
                        numSelect = numHandlers - 1 + (numSelect + 1);
258
                    }
259
                } else
260
                    if (s.equalsIgnoreCase(PluginServices.getText(this,
261
                        "EditVertexCADTool.previousvertex"))
262
                        || s.equals(PluginServices.getText(this, "previous"))) {
263
                        numSelect = numSelect + dif;
264
                        if (numSelect > (numHandlers - 1)) {
265
                            numSelect = numSelect - (numHandlers);
266
                        }
267

    
268
                    } else
269
                        if (s.equalsIgnoreCase(PluginServices.getText(this,
270
                            "EditVertexCADTool.delvertex"))
271
                            || s.equals(PluginServices.getText(this, "del"))) {
272
                            if (handlers != null) {
273
                                Geometry newGeometry = null;
274
                                if (ig instanceof MultiPrimitive) {
275
                                    newGeometry =
276
                                        removeVertexGC((MultiPrimitive) ig,
277
                                            handlers[numSelect]);
278
                                } else {
279
                                    newGeometry =
280
                                        removeVertex(ig, handlers[numSelect]);
281
                                }
282
                                try {
283
                                    EditableFeature eFeature =
284
                                        feature.getEditable();
285
                                    eFeature.setGeometry(featureStore
286
                                        .getDefaultFeatureType()
287
                                        .getDefaultGeometryAttributeName(),
288
                                        newGeometry);
289
                                    featureStore.update(eFeature);
290

    
291
                                } catch (ReadException e) {
292
                                    NotificationManager.addError(
293
                                        e.getMessage(), e);
294
                                } catch (DataException e) {
295
                                    // TODO Auto-generated catch block
296
                                    e.printStackTrace();
297
                                }
298
                            }
299
                        } else
300
                            if (s.equalsIgnoreCase(PluginServices.getText(this,
301
                                "EditVertexCADTool.addvertex"))
302
                                || s.equals(PluginServices.getText(this, "add"))) {
303
                                addVertex = true;
304
                            }
305
            }
306
        } catch (Exception e1) {
307
            
308
            ApplicationLocator.getManager().message(
309
                e1.getMessage(), JOptionPane.ERROR_MESSAGE);
310
            logger.info("Error in add option.", e1);
311
        } finally {
312
            if (iterator != null) {
313
                iterator.dispose();
314
            }
315
        }
316
    }
317

    
318
    private void drawVertex(MapControlDrawer renderer, ViewPort vp) {
319
        VectorialLayerEdited vle = getVLE();
320
        DisposableIterator iterator = null;
321
        try {
322
            iterator =
323
                ((FeatureSelection) vle.getFeatureStore().getSelection())
324
                    .iterator();
325
            while (iterator.hasNext()) {
326
                Feature feature = (Feature) iterator.next();
327

    
328
                Geometry ig = (feature.getDefaultGeometry()).cloneGeometry();
329
                // renderer.draw(ig,
330
                // mapControlManager.getGeometrySelectionSymbol());
331

    
332
                Handler[] handlers = ig.getHandlers(Geometry.SELECTHANDLER);
333
                if (numSelect >= handlers.length) {
334
                    numSelect = 0;
335
                }
336
                if (handlers.length == 0)
337
                    continue;
338
                renderer.drawHandler(handlers[numSelect],
339
                    vp.getAffineTransform());
340
            }
341
        } catch (DataException e) {
342
            // TODO Auto-generated catch block
343
            e.printStackTrace();
344
        } finally {
345
            if (iterator != null) {
346
                iterator.dispose();
347
            }
348
        }
349
    }
350

    
351
    /*
352
     * (non-Javadoc)
353
     * 
354
     * @see com.iver.cit.gvsig.gui.cad.CADTool#addvalue(double)
355
     */
356
    public void addValue(double d) {
357
    }
358

    
359
    private Geometry removeVertex(Geometry gp, Handler hand) {
360
        GeneralPathX newGp = new GeneralPathX();
361
        double[] theData = new double[6];
362

    
363
        PathIterator theIterator;
364
        int theType;
365
        int numParts = 0;
366

    
367
        Point2D ptSrc = new Point2D.Double();
368
        boolean bFirst = false;
369

    
370
        theIterator = gp.getPathIterator(null, geomManager.getFlatness());
371
        int numSegmentsAdded = 0;
372
        while (!theIterator.isDone()) {
373
            theType = theIterator.currentSegment(theData);
374
            if (bFirst) {
375
                newGp.moveTo(theData[0], theData[1]);
376
                numSegmentsAdded++;
377
                bFirst = false;
378
                theIterator.next();
379
                continue;
380
            }
381
            switch (theType) {
382

    
383
            case PathIterator.SEG_MOVETO:
384
                numParts++;
385
                ptSrc.setLocation(theData[0], theData[1]);
386
                if (ptSrc.equals(hand.getPoint())) {
387
                    numParts--;
388
                    bFirst = true;
389
                    break;
390
                }
391
                newGp.moveTo(ptSrc.getX(), ptSrc.getY());
392
                numSegmentsAdded++;
393
                bFirst = false;
394
                break;
395

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

    
406
            case PathIterator.SEG_QUADTO:
407
                newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
408
                numSegmentsAdded++;
409
                break;
410

    
411
            case PathIterator.SEG_CUBICTO:
412
                newGp.curveTo(theData[0], theData[1], theData[2], theData[3],
413
                    theData[4], theData[5]);
414
                numSegmentsAdded++;
415
                break;
416

    
417
            case PathIterator.SEG_CLOSE:
418
                if (numSegmentsAdded < 3) {
419
                    newGp.lineTo(theData[0], theData[1]);
420
                }
421
                newGp.closePath();
422

    
423
                break;
424
            } // end switch
425

    
426
            theIterator.next();
427
        } // end while loop
428
        Geometry shp = null;
429
        switch (gp.getType()) {
430
        case Geometry.TYPES.POINT: // Tipo punto
431
            shp = createPoint(ptSrc.getX(), ptSrc.getY());
432
            break;
433

    
434
        case Geometry.TYPES.CURVE:
435
            shp = createCurve(newGp);
436
            break;
437
        case Geometry.TYPES.SURFACE:
438
            shp = createSurface(newGp);
439
            break;
440
        }
441
        Geometry ig = shp;
442
        int dif = 1;// En el caso de ser pol?gono.
443
        numSelect = numSelect - dif;
444
        if (numSelect < 0) {
445
            numSelect = numHandlers - 1 + (numSelect + 1);
446
        }
447
        return ig;
448
    }
449

    
450
    private Geometry removeVertexGC(MultiPrimitive gc, Handler handler)
451
        throws GeometryOperationNotSupportedException,
452
        GeometryOperationException, CreateGeometryException {
453

    
454
        Primitive prim = null;
455
        int np = gc.getPrimitivesNumber();
456
        
457
        for (int i = 0; i < np; i++) {
458
            prim = gc.getPrimitiveAt(i);
459
            Handler[] hh = prim.getHandlers(Geometry.SELECTHANDLER);
460
            int nh = hh.length;
461
            for (int j=0; j<nh; j++) {
462
                if (hh[j].equalsPoint(handler)) {
463
                    /*
464
                     * Find the first primitive which has a handler
465
                     * matching received handler
466
                     */
467
                    Geometry resp = this.removeVertex(prim, handler);
468
                    for (int k=0; k<np; k++) {
469
                        if (k != i) {
470
                            resp = resp.union(gc.getPrimitiveAt(k));
471
                        }
472
                    }
473
                    return resp;
474
                }
475
            }
476
        }
477
        throw new CreateGeometryException(
478
            new Exception("Unable to remove vertex"));
479
        /*
480
            Geometry[] geoms = new Geometry[gc.getPrimitivesNumber()];
481
            for( int i=0; i<gc.getPrimitivesNumber(); i++) {
482
                    geoms[i] = gc.getPrimitiveAt(i);
483
            }
484
            
485
        ArrayList geomsAux = new ArrayList();
486
        int pos = -1;
487
        for (int i = 0; i < geoms.length; i++) {
488
            Handler[] handlers = geoms[i].getHandlers(Geometry.SELECTHANDLER);
489
            for (int j = 0; j < handlers.length; j++) {
490
                if (handlers[j].equalsPoint(handler)) {
491
                    geomsAux.add(geoms[i]);
492
                    if (pos == -1) {
493
                        pos = i;
494
                    }
495
                }
496
            }
497
        }
498
        int numGeomsAux = geomsAux.size();
499
        GeneralPathX gpx = new GeneralPathX();
500
        for (int i = 0; i < numGeomsAux; i++) {
501
            Handler[] handlers =
502
                ((Geometry) geomsAux.get(i))
503
                    .getHandlers(Geometry.SELECTHANDLER);
504
            if (numGeomsAux == 2) {
505
                for (int j = 0; j < handlers.length; j++) {
506
                    if (handlers[j].equalsPoint(handler)) {
507
                        if (j == (handlers.length - 1)) {
508
                            Point2D ph = handlers[0].getPoint();
509
                            gpx.moveTo(ph.getX(), ph.getY());
510
                        } else {
511
                            Point2D ph =
512
                                handlers[handlers.length - 1].getPoint();
513
                            gpx.lineTo(ph.getX(), ph.getY());
514
                        }
515
                    }
516
                }
517
            }
518

519
        }
520
        ArrayList newGeoms = new ArrayList();
521
        for (int i = 0; i < pos; i++) {
522
            newGeoms.add(geoms[i]);
523
        }
524
        newGeoms.add(createCurve(gpx));
525
        for (int i = pos + numGeomsAux; i < geoms.length; i++) {
526
            newGeoms.add(geoms[i]);
527
        }
528

529
        return createMultiPrimitive((Geometry[]) newGeoms
530
            .toArray(new Geometry[0]));
531
            */
532
    }
533

    
534
    private Geometry addVertex(Geometry geome, Point2D p, Rectangle2D rect) {
535
        Geometry geometryCloned = geome.cloneGeometry();
536
        Geometry geom1 = null;
537
        GeneralPathX gpxAux;
538
        boolean finish = false;
539
        // FGeometry geom2=null;
540

    
541
        // if (geometryCloned.getGeometryType() == FShape.POLYGON){
542
        // ///////////////
543

    
544
        GeneralPathX newGp = new GeneralPathX();
545
        double[] theData = new double[6];
546

    
547
        PathIterator theIterator;
548
        int theType;
549
        int numParts = 0;
550
        Point2D pLast = new Point2D.Double();
551
        Point2D pAnt = new Point2D.Double();
552
        Point2D firstPoint = null;
553
        theIterator = geome.getPathIterator(null, geomManager.getFlatness()); // ,
554
                                                                              // flatness);
555
        int numSegmentsAdded = 0;
556
        while (!theIterator.isDone()) {
557
            theType = theIterator.currentSegment(theData);
558
            switch (theType) {
559
            case PathIterator.SEG_MOVETO:
560
                pLast.setLocation(theData[0], theData[1]);
561
                if (numParts == 0) {
562
                    firstPoint = (Point2D) pLast.clone();
563
                }
564
                numParts++;
565

    
566
                gpxAux = new GeneralPathX();
567
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
568
                gpxAux.lineTo(pLast.getX(), pLast.getY());
569
                geom1 = createCurve(gpxAux);
570
                if (geom1.intersects(rect)) {
571
                    finish = true;
572
                    newGp.moveTo(pLast.getX(), pLast.getY());
573
                    // newGp.lineTo(pLast.getX(),pLast.getY());
574
                } else {
575
                    newGp.moveTo(pLast.getX(), pLast.getY());
576
                }
577
                pAnt.setLocation(pLast.getX(), pLast.getY());
578
                numSegmentsAdded++;
579
                break;
580

    
581
            case PathIterator.SEG_LINETO:
582
                pLast.setLocation(theData[0], theData[1]);
583
                gpxAux = new GeneralPathX();
584
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
585
                gpxAux.lineTo(pLast.getX(), pLast.getY());
586
                geom1 = createCurve(gpxAux);
587
                if (geom1.intersects(rect)) {
588
                    newGp.lineTo(p.getX(), p.getY());
589
                    newGp.lineTo(pLast.getX(), pLast.getY());
590
                } else {
591
                    newGp.lineTo(pLast.getX(), pLast.getY());
592
                }
593
                pAnt.setLocation(pLast.getX(), pLast.getY());
594
                numSegmentsAdded++;
595
                break;
596

    
597
            case PathIterator.SEG_QUADTO:
598
                newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
599
                numSegmentsAdded++;
600
                break;
601

    
602
            case PathIterator.SEG_CUBICTO:
603
                newGp.curveTo(theData[0], theData[1], theData[2], theData[3],
604
                    theData[4], theData[5]);
605
                numSegmentsAdded++;
606
                break;
607

    
608
            case PathIterator.SEG_CLOSE:
609
                // if (numSegmentsAdded < 3){
610
                gpxAux = new GeneralPathX();
611
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
612
                gpxAux.lineTo(firstPoint.getX(), firstPoint.getY());
613
                geom1 = createCurve(gpxAux);
614
                if (geom1.intersects(rect) || finish) {
615
                    newGp.lineTo(p.getX(), p.getY());
616
                    // newGp.lineTo(pLast.getX(), pLast.getY());
617
                } else {
618
                    newGp.lineTo(pLast.getX(), pLast.getY());
619
                }
620
                // }
621
                newGp.closePath();
622
                break;
623
            } // end switch
624

    
625
            theIterator.next();
626
        } // end while loop
627
        Geometry shp = null;
628
        switch (geometryCloned.getType()) {
629
        case POINT: // Tipo punto
630
            shp = createPoint(pLast.getX(), pLast.getY());
631
            break;
632

    
633
        case CURVE:
634
            shp = createCurve(newGp);
635
            break;
636
        case SURFACE:
637
        case CIRCLE:
638
        case ELLIPSE:
639
            shp = createSurface(newGp);
640
            break;
641
        }
642
        return shp;
643
    }
644

    
645
    private Geometry addVertexGC(
646
        MultiPrimitive mpri,
647
        Point2D p,
648
        Rectangle2D rect)
649
            throws GeometryOperationNotSupportedException,
650
            GeometryOperationException, CreateGeometryException
651
            {
652
        
653
        int n = mpri.getPrimitivesNumber();
654
        Primitive item = null;
655
        for (int i=0; i<n; i++) {
656
            item = mpri.getPrimitiveAt(i);
657
            if (item.intersects(rect)) {
658
                /*
659
                 * Only the first primitive that intersects
660
                 * with rect will be treated
661
                 */
662
                Geometry newg = this.addVertex(item, p, rect);
663
                for (int k=0; k<n; k++) {
664
                    if (k != i) {
665
                        newg = newg.union(mpri.getPrimitiveAt(k));
666
                    }
667
                    return newg;
668
                }
669
            }
670
        }
671
        throw new CreateGeometryException(
672
            new Exception("Unable to add vertex"));
673

    
674
        /*
675
            Geometry[] geoms = new Geometry[gc.getPrimitivesNumber()];
676
            for( int i=0; i<gc.getPrimitivesNumber(); i++) {
677
                    geoms[i] = gc.getPrimitiveAt(i);
678
            }
679
          
680
        int pos = -1;
681
        for (int i = 0; i < geoms.length; i++) {
682
            if (geoms[i].intersects(rect)) {
683
                pos = i;
684
            }
685
        }
686
        ArrayList newGeoms = new ArrayList();
687
        for (int i = 0; i < pos; i++) {
688
            newGeoms.add(geoms[i]);
689
        }
690
        if (pos != -1) {
691
            GeneralPathX gpx1 = new GeneralPathX();
692
            GeneralPathX gpx2 = new GeneralPathX();
693
            Handler[] handlers = geoms[pos].getHandlers(Geometry.SELECTHANDLER);
694
            Point2D p1 = handlers[0].getPoint();
695
            Point2D p2 = p;
696
            Point2D p3 = handlers[handlers.length - 1].getPoint();
697
            gpx1.moveTo(p1.getX(), p1.getY());
698
            gpx1.lineTo(p2.getX(), p2.getY());
699
            gpx2.moveTo(p2.getX(), p2.getY());
700
            gpx2.lineTo(p3.getX(), p3.getY());
701
            newGeoms.add(createCurve(gpx1));
702
            newGeoms.add(createCurve(gpx2));
703
            for (int i = pos + 1; i < geoms.length; i++) {
704
                newGeoms.add(geoms[i]);
705
            }
706
            return createMultiPrimitive((Geometry[]) newGeoms
707
                .toArray(new Geometry[0]));
708
        } else {
709
            return null;
710
        }
711
        */
712
    }
713

    
714
    public String getName() {
715
        return PluginServices.getText(this, "edit_vertex_");
716
    }
717

    
718
    private void selectHandler(double x, double y) {
719
        Point2D firstPoint = new Point2D.Double(x, y);
720
        VectorialLayerEdited vle = getVLE();
721
        FeatureStore featureStore = null;
722
        DisposableIterator iterator = null;
723
        DisposableIterator selectedIterator = null;
724

    
725
        try {
726
            featureStore = vle.getFeatureStore();
727

    
728
            iterator =
729
                ((FeatureSelection) featureStore.getSelection()).iterator();
730
            double tam =
731
                getCadToolAdapter().getMapControl().getViewPort()
732
                    .toMapDistance(mapControlManager.getTolerance());
733
            Rectangle2D rect =
734
                new Rectangle2D.Double(firstPoint.getX() - tam,
735
                    firstPoint.getY() - tam, tam * 2, tam * 2);
736
            while (iterator.hasNext()) {
737
                Feature feature = (Feature) iterator.next();
738

    
739
                boolean isSelectedHandler = false;
740
                Geometry geometry = getSelectedGeometry();
741
                if (geometry != null) {
742
                    Handler[] handlers =
743
                        geometry.getHandlers(Geometry.SELECTHANDLER);
744
                    for (int h = 0; h < handlers.length; h++) {
745
                        if (handlers[h].getPoint().distance(firstPoint) < tam) {
746
                            numSelect = h;
747
                            isSelectedHandler = true;
748
                            break;
749
                        }
750
                    }
751

    
752
                    if (!isSelectedHandler) {
753
                        boolean isSelectedGeometry = false;
754
                        if (geometry.intersects(rect)) { // , 0.1)){
755
                            isSelectedGeometry = true;
756
                        }
757
                        if (isSelectedGeometry && addVertex) {
758
                            try {
759
                                selectedIterator =
760
                                    featureStore.getFeatureSelection()
761
                                        .iterator();
762
                                Feature feat =
763
                                    (Feature) selectedIterator.next();
764
                                Point2D posVertex = new Point2D.Double(x, y);
765
                                Geometry geom1 =
766
                                    (feat.getDefaultGeometry()).cloneGeometry();
767
                                Geometry geom = null;
768
                                if (geom1 instanceof MultiPrimitive) {
769
                                    geom =
770
                                        addVertexGC((MultiPrimitive) geom1,
771
                                            posVertex, rect);
772
                                } else {
773
                                    geom = addVertex(geom1, posVertex, rect);
774
                                }
775
                                if (geom != null) {
776
                                    EditableFeature eFeature =
777
                                        feature.getEditable();
778
                                    eFeature.setGeometry(featureStore
779
                                        .getDefaultFeatureType()
780
                                        .getDefaultGeometryAttributeName(),
781
                                        geom);
782
                                    featureStore.update(eFeature);
783
                                    Handler[] newHandlers =
784
                                        geom.getHandlers(Geometry.SELECTHANDLER);
785
                                    for (int h = 0; h < newHandlers.length; h++) {
786
                                        if (newHandlers[h].getPoint().distance(
787
                                            posVertex) < tam) {
788
                                            numSelect = h;
789
                                            isSelectedHandler = true;
790
                                        }
791
                                    }
792

    
793
                                    // clearSelection();
794
                                }
795
                            } finally {
796
                                if (selectedIterator != null) {
797
                                    selectedIterator.dispose();
798
                                }
799
                            }
800
                        }
801
                    }
802
                }
803
            }
804

    
805
        } catch (Exception e) {
806
            
807
            ApplicationLocator.getManager().message(
808
                e.getMessage(), JOptionPane.ERROR_MESSAGE);
809
            logger.info("Error in select handler.", e);
810
        } finally {
811
            if (iterator != null) {
812
                iterator.dispose();
813
            }
814
        }
815

    
816
    }
817

    
818
    public String toString() {
819
        return "_editvertex";
820
    }
821

    
822
    @Override
823
    protected int[] getSupportedGeometryTypes() {
824
        return new int[] { POINT, MULTIPOINT, CURVE, MULTICURVE, CIRCLE,
825
            ELLIPSE, SURFACE, MULTISURFACE };
826
    }
827

    
828
}