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 @ 40557

History | View | Annotate | Download (30.5 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.MultiPrimitive;
57
import org.gvsig.fmap.geom.handler.Handler;
58
import org.gvsig.fmap.geom.operation.GeometryOperationException;
59
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
60
import org.gvsig.fmap.geom.primitive.GeneralPathX;
61
import org.gvsig.fmap.geom.primitive.Primitive;
62
import org.gvsig.fmap.mapcontext.ViewPort;
63
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
64
import org.gvsig.tools.dispose.DisposableIterator;
65
import org.gvsig.tools.dispose.DisposeUtils;
66

    
67
/**
68
 * DOCUMENT ME!
69
 * 
70
 * @author Vicente Caballero Navarro
71
 */
72
public class EditVertexCADTool extends DefaultCADTool {
73

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

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

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

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

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

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

    
133
            if (selection.getSize() == 0
134
                && !SelectionCADTool.isInstance(CADExtension.getCADTool(), true)) {
135
                
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 diff = 1;// En el caso de ser pol?gono.
247
            /*
248
            if (ig instanceof MultiPrimitive) {
249
                diff = 2;
250
            }
251
            */
252

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

    
268
                        numSelect = numSelect - diff;
269
                        if (numSelect < 0) {
270
                            numSelect = numHandlers - 1 + (numSelect + 1);
271
                        }
272

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

    
324
    private void drawVertex(MapControlDrawer renderer, ViewPort vp) {
325
        VectorialLayerEdited vle = getVLE();
326
        DisposableIterator iterator = null;
327
        try {
328
            iterator =
329
                ((FeatureSelection) vle.getFeatureStore().getSelection())
330
                    .iterator();
331
            while (iterator.hasNext()) {
332
                Feature feature = (Feature) iterator.next();
333

    
334
                Geometry ig = (feature.getDefaultGeometry()).cloneGeometry();
335
                // renderer.draw(ig,
336
                // mapControlManager.getGeometrySelectionSymbol());
337

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

    
357
    /*
358
     * (non-Javadoc)
359
     * 
360
     * @see com.iver.cit.gvsig.gui.cad.CADTool#addvalue(double)
361
     */
362
    public void addValue(double d) {
363
    }
364

    
365
    private Geometry removeVertex(Geometry gp, Handler hand) {
366
        GeneralPathX newGp = new GeneralPathX();
367
        double[] theData = new double[6];
368

    
369
        PathIterator theIterator;
370
        int theType;
371
        int numParts = 0;
372

    
373
        Point2D ptSrc = new Point2D.Double();
374
        boolean bFirst = false;
375

    
376
        theIterator = gp.getPathIterator(null, geomManager.getFlatness());
377
        int numSegmentsAdded = 0;
378
        while (!theIterator.isDone()) {
379
            theType = theIterator.currentSegment(theData);
380
            if (bFirst) {
381
                newGp.moveTo(theData[0], theData[1]);
382
                numSegmentsAdded++;
383
                bFirst = false;
384
                theIterator.next();
385
                continue;
386
            }
387
            switch (theType) {
388

    
389
            case PathIterator.SEG_MOVETO:
390
                numParts++;
391
                ptSrc.setLocation(theData[0], theData[1]);
392
                if (ptSrc.equals(hand.getPoint())) {
393
                    numParts--;
394
                    bFirst = true;
395
                    break;
396
                }
397
                newGp.moveTo(ptSrc.getX(), ptSrc.getY());
398
                numSegmentsAdded++;
399
                bFirst = false;
400
                break;
401

    
402
            case PathIterator.SEG_LINETO:
403
                ptSrc.setLocation(theData[0], theData[1]);
404
                if (ptSrc.equals(hand.getPoint())) {
405
                    break;
406
                }
407
                newGp.lineTo(ptSrc.getX(), ptSrc.getY());
408
                bFirst = false;
409
                numSegmentsAdded++;
410
                break;
411

    
412
            case PathIterator.SEG_QUADTO:
413
                newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
414
                numSegmentsAdded++;
415
                break;
416

    
417
            case PathIterator.SEG_CUBICTO:
418
                newGp.curveTo(theData[0], theData[1], theData[2], theData[3],
419
                    theData[4], theData[5]);
420
                numSegmentsAdded++;
421
                break;
422

    
423
            case PathIterator.SEG_CLOSE:
424
                if (numSegmentsAdded < 3) {
425
                    newGp.lineTo(theData[0], theData[1]);
426
                }
427
                newGp.closePath();
428

    
429
                break;
430
            } // end switch
431

    
432
            theIterator.next();
433
        } // end while loop
434
        Geometry shp = null;
435
        switch (gp.getType()) {
436
        case Geometry.TYPES.POINT: // Tipo punto
437
            shp = createPoint(ptSrc.getX(), ptSrc.getY());
438
            break;
439

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

    
456
    private Geometry removeVertexGC(MultiPrimitive gc, Handler handler)
457
        throws GeometryOperationNotSupportedException,
458
        GeometryOperationException, CreateGeometryException {
459

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

525
        }
526
        ArrayList newGeoms = new ArrayList();
527
        for (int i = 0; i < pos; i++) {
528
            newGeoms.add(geoms[i]);
529
        }
530
        newGeoms.add(createCurve(gpx));
531
        for (int i = pos + numGeomsAux; i < geoms.length; i++) {
532
            newGeoms.add(geoms[i]);
533
        }
534

535
        return createMultiPrimitive((Geometry[]) newGeoms
536
            .toArray(new Geometry[0]));
537
            */
538
    }
539

    
540
    private Geometry addVertex(Geometry geome, Point2D p, Rectangle2D rect) {
541
        Geometry geometryCloned = geome.cloneGeometry();
542
        Geometry geom1 = null;
543
        GeneralPathX gpxAux;
544
        boolean finish = false;
545
        // FGeometry geom2=null;
546

    
547
        // if (geometryCloned.getGeometryType() == FShape.POLYGON){
548
        // ///////////////
549

    
550
        GeneralPathX newGp = new GeneralPathX();
551
        double[] theData = new double[6];
552

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

    
572
                gpxAux = new GeneralPathX();
573
                gpxAux.moveTo(pAnt.getX(), pAnt.getY());
574
                gpxAux.lineTo(pLast.getX(), pLast.getY());
575
                geom1 = createCurve(gpxAux);
576
                if (geom1.intersects(rect)) {
577
                    finish = true;
578
                    newGp.moveTo(pLast.getX(), pLast.getY());
579
                    // newGp.lineTo(pLast.getX(),pLast.getY());
580
                } else {
581
                    newGp.moveTo(pLast.getX(), pLast.getY());
582
                }
583
                pAnt.setLocation(pLast.getX(), pLast.getY());
584
                numSegmentsAdded++;
585
                break;
586

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

    
603
            case PathIterator.SEG_QUADTO:
604
                newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
605
                numSegmentsAdded++;
606
                break;
607

    
608
            case PathIterator.SEG_CUBICTO:
609
                newGp.curveTo(theData[0], theData[1], theData[2], theData[3],
610
                    theData[4], theData[5]);
611
                numSegmentsAdded++;
612
                break;
613

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

    
631
            theIterator.next();
632
        } // end while loop
633
        Geometry shp = null;
634
        switch (geometryCloned.getType()) {
635
        case POINT: // Tipo punto
636
            shp = createPoint(pLast.getX(), pLast.getY());
637
            break;
638

    
639
        case CURVE:
640
            shp = createCurve(newGp);
641
            break;
642
        case SURFACE:
643
        case CIRCLE:
644
        case ELLIPSE:
645
            shp = createSurface(newGp);
646
            break;
647
        }
648
        return shp;
649
    }
650

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

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

    
720
    public String getName() {
721
        return PluginServices.getText(this, "edit_vertex_");
722
    }
723

    
724
    private void selectHandler(double x, double y) {
725
        Point2D firstPoint = new Point2D.Double(x, y);
726
        VectorialLayerEdited vle = getVLE();
727
        FeatureStore featureStore = null;
728
        DisposableIterator iterator = null;
729
        DisposableIterator selectedIterator = null;
730
        
731
        IEditionManager ed_man = this.getEditionManager();
732

    
733
        try {
734
            featureStore = vle.getFeatureStore();
735

    
736
            iterator =
737
                ((FeatureSelection) featureStore.getSelection()).iterator();
738
            double tam =
739
                getCadToolAdapter().getMapControl().getViewPort()
740
                    .toMapDistance(mapControlManager.getTolerance());
741
            Rectangle2D rect =
742
                new Rectangle2D.Double(firstPoint.getX() - tam,
743
                    firstPoint.getY() - tam, tam * 2, tam * 2);
744
            while (iterator.hasNext()) {
745
                Feature feature = (Feature) iterator.next();
746

    
747
                boolean isSelectedHandler = false;
748
                Geometry geometry = getSelectedGeometry();
749
                if (geometry != null) {
750
                    Handler[] handlers =
751
                        geometry.getHandlers(Geometry.SELECTHANDLER);
752
                    for (int h = 0; h < handlers.length; h++) {
753
                        if (handlers[h].getPoint().distance(firstPoint) < tam) {
754
                            numSelect = h;
755
                            isSelectedHandler = true;
756
                            break;
757
                        }
758
                    }
759

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

    
803
                                    // clearSelection();
804
                                }
805
                            } finally {
806
                                if (selectedIterator != null) {
807
                                    selectedIterator.dispose();
808
                                }
809
                            }
810
                        }
811
                    }
812
                }
813
            }
814

    
815
        } catch (Exception e) {
816
            
817
            ApplicationLocator.getManager().message(
818
                e.getMessage(), JOptionPane.ERROR_MESSAGE);
819
            logger.info("Error in select handler.", e);
820
        } finally {
821
            if (iterator != null) {
822
                iterator.dispose();
823
            }
824
        }
825

    
826
    }
827

    
828
    public String toString() {
829
        return "_editvertex";
830
    }
831

    
832
    @Override
833
    protected int[] getSupportedGeometryTypes() {
834
        return new int[] { POINT, MULTIPOINT, CURVE, MULTICURVE, CIRCLE,
835
            ELLIPSE, SURFACE, MULTISURFACE };
836
    }
837

    
838
}