Statistics
| Revision:

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

History | View | Annotate | Download (26 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.editing.gui.cad.tools;
42

    
43
import java.awt.Component;
44
import java.awt.Graphics;
45
import java.awt.Graphics2D;
46
import java.awt.event.InputEvent;
47
import java.awt.geom.PathIterator;
48
import java.awt.geom.Point2D;
49
import java.awt.geom.Rectangle2D;
50
import java.util.ArrayList;
51

    
52
import javax.swing.JOptionPane;
53

    
54
import org.gvsig.andami.PluginServices;
55
import org.gvsig.andami.messages.NotificationManager;
56
import org.gvsig.editing.CADExtension;
57
import org.gvsig.editing.gui.cad.DefaultCADTool;
58
import org.gvsig.editing.gui.cad.exception.CommandException;
59
import org.gvsig.editing.gui.cad.tools.smc.EditVertexCADToolContext;
60
import org.gvsig.editing.gui.cad.tools.smc.EditVertexCADToolContext.EditVertexCADToolState;
61
import org.gvsig.editing.layers.VectorialLayerEdited;
62
import org.gvsig.fmap.dal.exception.DataException;
63
import org.gvsig.fmap.dal.exception.ReadException;
64
import org.gvsig.fmap.dal.feature.DisposableIterator;
65
import org.gvsig.fmap.dal.feature.EditableFeature;
66
import org.gvsig.fmap.dal.feature.Feature;
67
import org.gvsig.fmap.dal.feature.FeatureSelection;
68
import org.gvsig.fmap.dal.feature.FeatureSet;
69
import org.gvsig.fmap.dal.feature.FeatureStore;
70
import org.gvsig.fmap.geom.Geometry;
71
import org.gvsig.fmap.geom.aggregate.impl.BaseMultiPrimitive;
72
import org.gvsig.fmap.geom.handler.Handler;
73
import org.gvsig.fmap.geom.operation.DrawInts;
74
import org.gvsig.fmap.geom.operation.DrawOperationContext;
75
import org.gvsig.fmap.geom.operation.GeometryOperationException;
76
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
77
import org.gvsig.fmap.geom.primitive.GeneralPathX;
78
import org.gvsig.fmap.geom.util.Converter;
79
import org.gvsig.fmap.mapcontext.ViewPort;
80
import org.gvsig.fmap.mapcontext.rendering.symbols.FGraphicUtilities;
81
import org.gvsig.fmap.mapcontrol.MapControl;
82

    
83

    
84

    
85
/**
86
 * DOCUMENT ME!
87
 *
88
 * @author Vicente Caballero Navarro
89
 */
90
public class EditVertexCADTool extends DefaultCADTool {
91
    protected EditVertexCADToolContext _fsm;
92
    protected int numSelect=0;
93
    protected int numHandlers;
94
    protected boolean addVertex=false;
95

    
96
    /**
97
     * Crea un nuevo PolylineCADTool.
98
     */
99
    public EditVertexCADTool() {
100
    }
101

    
102
    /**
103
     * M?todo de incio, para poner el c?digo de todo lo que se requiera de una
104
     * carga previa a la utilizaci?n de la herramienta.
105
     */
106
    public void init() {
107
        _fsm = new EditVertexCADToolContext(this);
108
    }
109

    
110
    /* (non-Javadoc)
111
     * @see com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap.layers.FBitSet, double, double)
112
     */
113
    public void transition(double x, double y, InputEvent event) {
114
        _fsm.addPoint(x, y, event);
115
    }
116

    
117
    /* (non-Javadoc)
118
     * @see com.iver.cit.gvsig.gui.cad.CADTool#transition(com.iver.cit.gvsig.fmap.layers.FBitSet, double)
119
     */
120
    public void transition(double d) {
121
            _fsm.addValue(d);
122
    }
123

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

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

    
141
                    if (selection.getSize() == 0 && !CADExtension.getCADTool().getClass().getName().equals("com.iver.cit.gvsig.gui.cad.tools.SelectionCADTool")) {
142
                            CADExtension.setCADTool("_selection",false);
143
                            ((SelectionCADTool) CADExtension.getCADTool()).setNextTool(
144
                            "_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 par?metro x del punto que se pase en esta transici?n.
160
     * @param y par?metro y del punto que se pase en esta transici?n.
161
     */
162
    public void addPoint(double x, double y,InputEvent event) {
163
            selectHandler(x,y);
164
            addVertex=false;
165
    }
166

    
167
    private Geometry getSelectedGeometry() {
168
            FeatureSet selection=null;
169
            try {
170
                    selection = (FeatureSet)getVLE().getFeatureStore().getSelection();
171

    
172
                    Feature feature=null;
173
                    Geometry ig=null;
174
                    if (selection.getSize()==1){
175
                            feature=(Feature)selection.iterator().next();
176
                            ig=(feature.getDefaultGeometry()).cloneGeometry();
177
                            return ig;
178
                    }
179
            } catch (ReadException e) {
180
                    // TODO Auto-generated catch block
181
                    e.printStackTrace();
182
            } catch (DataException e) {
183
                        // TODO Auto-generated catch block
184
                        e.printStackTrace();
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 Graphics sobre el que dibujar.
195
     * @param x par?metro x del punto que se pase para dibujar.
196
     * @param y par?metro x del punto que se pase para dibujar.
197
     */
198
    public void drawOperation(Graphics g, double x, double y) {
199
        drawVertex(g,getCadToolAdapter().getMapControl().getViewPort());
200
    }
201

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

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

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

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

    
254
                }else if(s.equalsIgnoreCase(PluginServices.getText(this,"EditVertexCADTool.delvertex")) || s.equals(PluginServices.getText(this,"del"))){
255
                        if (handlers!=null){
256
                                Geometry newGeometry=null;
257
                                if (ig instanceof BaseMultiPrimitive) {
258
                                        newGeometry=removeVertexGC((BaseMultiPrimitive)ig,handlers[numSelect]);
259
                                }else {
260
                                        newGeometry=removeVertex(ig,handlers,numSelect);
261
                                }
262
                                try {
263
                                        EditableFeature eFeature=feature.getEditable();
264
                                        eFeature.setGeometry(featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName(),newGeometry);
265
                                        featureStore.update(eFeature);
266

    
267
                                } catch (ReadException e) {
268
                                        NotificationManager.addError(e.getMessage(),e);
269
                                }
270
                                catch (DataException e) {
271
                                        // TODO Auto-generated catch block
272
                                        e.printStackTrace();
273
                                }
274
                        }
275
                }else if(s.equalsIgnoreCase(PluginServices.getText(this,"EditVertexCADTool.addvertex")) || s.equals(PluginServices.getText(this,"add"))){
276
                        addVertex=true;
277
                }
278
        }
279
                } catch (ReadException e1) {
280
                        // TODO Auto-generated catch block
281
                        e1.printStackTrace();
282
                } catch (DataException e) {
283
                        // TODO Auto-generated catch block
284
                        e.printStackTrace();
285
                }
286
    }
287
    private void drawVertex(Graphics g,ViewPort vp){
288
            VectorialLayerEdited vle=getVLE();
289
            DisposableIterator iterator = null;
290
            try {
291
                        iterator = ((FeatureSelection) vle.getFeatureStore().getSelection())
292
                                        .iterator();
293
                        while (iterator.hasNext()) {
294
                                Feature feature = (Feature) iterator.next();
295

    
296
                            Geometry ig = (feature.getDefaultGeometry()).cloneGeometry();
297
                                if (ig == null) {
298
                                        continue;
299
                                }
300
                                DrawOperationContext doc = new DrawOperationContext();
301
                                doc.setGraphics((Graphics2D) g);
302
                                doc.setViewPort(vp);
303
                                doc.setSymbol(DefaultCADTool.geometrySelectSymbol);
304
                                try {
305
                                        ig.invokeOperation(DrawInts.CODE, doc);
306
                                } catch (GeometryOperationNotSupportedException e) {
307
                                        e.printStackTrace();
308
                                } catch (GeometryOperationException e) {
309
                                        e.printStackTrace();
310
                                }
311
                                Handler[] handlers = ig.getHandlers(Geometry.SELECTHANDLER);
312
                                if (numSelect >= handlers.length) {
313
                                        numSelect = 0;
314
                                }
315
                                if (handlers.length==0)
316
                                        continue;
317
                                FGraphicUtilities.DrawVertex((Graphics2D) g, vp
318
                                                .getAffineTransform(), handlers[numSelect]);
319
                        }
320
                } catch (DataException e) {
321
                        // TODO Auto-generated catch block
322
                        e.printStackTrace();
323
                } finally {
324
                        if (iterator != null) {
325
                                iterator.dispose();
326
                        }
327
                }
328
        }
329

    
330
    /* (non-Javadoc)
331
     * @see com.iver.cit.gvsig.gui.cad.CADTool#addvalue(double)
332
     */
333
    public void addValue(double d) {
334
    }
335
    private Geometry removeVertex(Geometry gp,Handler[] handlers,int numHandler) {
336
        GeneralPathX newGp = new GeneralPathX();
337
        double[] theData = new double[6];
338

    
339
        PathIterator theIterator;
340
        int theType;
341
        int numParts = 0;
342

    
343
        Point2D ptSrc = new Point2D.Double();
344
        boolean bFirst = false;
345

    
346
        theIterator = gp.getPathIterator(null, Converter.FLATNESS);
347
        int numSegmentsAdded = 0;
348
        while (!theIterator.isDone()) {
349
            theType = theIterator.currentSegment(theData);
350
            if (bFirst){
351
                        newGp.moveTo(theData[0], theData[1]);
352
                        numSegmentsAdded++;
353
                        bFirst=false;
354
                        theIterator.next();
355
                        continue;
356
                }
357
            switch (theType) {
358

    
359
                case PathIterator.SEG_MOVETO:
360
                    numParts++;
361
                    ptSrc.setLocation(theData[0], theData[1]);
362
                    if (ptSrc.equals(handlers[numHandler].getPoint())){
363
                            numParts--;
364
                            bFirst=true;
365
                            break;
366
                    }
367
                    newGp.moveTo(ptSrc.getX(), ptSrc.getY());
368
                    numSegmentsAdded++;
369
                    bFirst = false;
370
                    break;
371

    
372
                case PathIterator.SEG_LINETO:
373
                    ptSrc.setLocation(theData[0], theData[1]);
374
                    if (ptSrc.equals(handlers[numHandler].getPoint())){
375
                            break;
376
                    }
377
                    newGp.lineTo(ptSrc.getX(), ptSrc.getY());
378
                    bFirst = false;
379
                    numSegmentsAdded++;
380
                    break;
381

    
382
                case PathIterator.SEG_QUADTO:
383
                    newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
384
                    numSegmentsAdded++;
385
                    break;
386

    
387
                case PathIterator.SEG_CUBICTO:
388
                    newGp.curveTo(theData[0], theData[1], theData[2], theData[3], theData[4], theData[5]);
389
                    numSegmentsAdded++;
390
                    break;
391

    
392
                case PathIterator.SEG_CLOSE:
393
                    if (numSegmentsAdded < 3) {
394
                                                newGp.lineTo(theData[0], theData[1]);
395
                                        }
396
                    newGp.closePath();
397

    
398
                    break;
399
            } //end switch
400

    
401
            theIterator.next();
402
        } //end while loop
403
        Geometry shp = null;
404
        switch (gp.getType())
405
        {
406
            case Geometry.TYPES.POINT: //Tipo punto
407
                shp = createPoint(ptSrc.getX(), ptSrc.getY());
408
                break;
409

    
410
            case Geometry.TYPES.CURVE:
411
                shp = createCurve(newGp);
412
                break;
413
            case Geometry.TYPES.SURFACE:
414
                shp = createSurface(newGp);
415
                break;
416
        }
417
        Geometry ig=shp;
418
        int dif=1;//En el caso de ser pol?gono.
419
               numSelect=numSelect-dif;
420
                if (numSelect<0){
421
                        numSelect=numHandlers-1+(numSelect+1);
422
                }
423
        return ig;
424
    }
425

    
426
    private Geometry removeVertexGC(BaseMultiPrimitive gc,Handler handler) {
427
        Geometry[] geoms=gc.getGeometries();
428
            ArrayList geomsAux=new ArrayList();
429
        int pos=-1;
430
            for (int i=0;i<geoms.length;i++) {
431
                    Handler[] handlers=geoms[i].getHandlers(Geometry.SELECTHANDLER);
432
                    for (int j=0;j<handlers.length;j++) {
433
                            if (handlers[j].equalsPoint(handler)) {
434
                                    geomsAux.add(geoms[i]);
435
                                    if (pos==-1) {
436
                                                pos=i;
437
                                        }
438
                            }
439
                    }
440
            }
441
            int numGeomsAux=geomsAux.size();
442
            GeneralPathX gpx=new GeneralPathX();
443
        for (int i=0;i<numGeomsAux;i++) {
444
                    Handler[] handlers=((Geometry)geomsAux.get(i)).getHandlers(Geometry.SELECTHANDLER);
445
                    if (numGeomsAux == 2) {
446
                                for (int j = 0; j < handlers.length; j++) {
447
                                        if (handlers[j].equalsPoint(handler)) {
448
                                                if (j == (handlers.length - 1)) {
449
                                                        Point2D ph = handlers[0].getPoint();
450
                                                        gpx.moveTo(ph.getX(), ph.getY());
451
                                                } else {
452
                                                        Point2D ph = handlers[handlers.length - 1]
453
                                                                        .getPoint();
454
                                                        gpx.lineTo(ph.getX(), ph.getY());
455
                                                }
456
                                        }
457
                                }
458
                        }
459

    
460
            }
461
        ArrayList newGeoms=new ArrayList();
462
        for (int i=0;i<pos;i++) {
463
                newGeoms.add(geoms[i]);
464
        }
465
        newGeoms.add(createCurve(gpx));
466
        for (int i=pos+numGeomsAux;i<geoms.length;i++) {
467
                newGeoms.add(geoms[i]);
468
        }
469

    
470

    
471
            return createMultiPrimitive((Geometry[])newGeoms.toArray(new Geometry[0]));
472
    }
473

    
474

    
475

    
476
    private Geometry addVertex(Geometry geome,Point2D p,Rectangle2D rect) {
477
            Geometry geometryCloned=geome.cloneGeometry();
478
            Geometry geom1=null;
479
            GeneralPathX gpxAux;
480
            boolean finish=false;
481
            //FGeometry geom2=null;
482

    
483
            //if (geometryCloned.getGeometryType() == FShape.POLYGON){
484
                    /////////////////
485

    
486
                    GeneralPathX newGp = new GeneralPathX();
487
            double[] theData = new double[6];
488

    
489
            PathIterator theIterator;
490
            int theType;
491
            int numParts = 0;
492
            Point2D pLast=new Point2D.Double();
493
            Point2D pAnt = new Point2D.Double();
494
            Point2D firstPoint=null;
495
            theIterator = geome.getPathIterator(null,Converter.FLATNESS); //, flatness);
496
            int numSegmentsAdded = 0;
497
            while (!theIterator.isDone()) {
498
                theType = theIterator.currentSegment(theData);
499
                switch (theType) {
500
                    case PathIterator.SEG_MOVETO:
501
                            pLast.setLocation(theData[0], theData[1]);
502
                            if (numParts==0) {
503
                                                        firstPoint=(Point2D)pLast.clone();
504
                                                }
505
                            numParts++;
506

    
507
                            gpxAux=new GeneralPathX();
508
                            gpxAux.moveTo(pAnt.getX(),pAnt.getY());
509
                            gpxAux.lineTo(pLast.getX(),pLast.getY());
510
                            geom1=createCurve(gpxAux);
511
                            if (geom1.intersects(rect)){
512
                                    finish=true;
513
                                    newGp.moveTo(pLast.getX(), pLast.getY());
514
                                    //newGp.lineTo(pLast.getX(),pLast.getY());
515
                            }else{
516
                                    newGp.moveTo(pLast.getX(), pLast.getY());
517
                            }
518
                        pAnt.setLocation(pLast.getX(), pLast.getY());
519
                        numSegmentsAdded++;
520
                        break;
521

    
522
                    case PathIterator.SEG_LINETO:
523
                            pLast.setLocation(theData[0], theData[1]);
524
                            gpxAux=new GeneralPathX();
525
                            gpxAux.moveTo(pAnt.getX(),pAnt.getY());
526
                            gpxAux.lineTo(pLast.getX(),pLast.getY());
527
                            geom1=createCurve(gpxAux);
528
                            if (geom1.intersects(rect)){
529
                                    newGp.lineTo(p.getX(), p.getY());
530
                                    newGp.lineTo(pLast.getX(),pLast.getY());
531
                            }else{
532
                                    newGp.lineTo(pLast.getX(), pLast.getY());
533
                            }
534
                            pAnt.setLocation(pLast.getX(), pLast.getY());
535
                        numSegmentsAdded++;
536
                        break;
537

    
538
                    case PathIterator.SEG_QUADTO:
539
                        newGp.quadTo(theData[0], theData[1], theData[2], theData[3]);
540
                        numSegmentsAdded++;
541
                        break;
542

    
543
                    case PathIterator.SEG_CUBICTO:
544
                        newGp.curveTo(theData[0], theData[1], theData[2], theData[3], theData[4], theData[5]);
545
                        numSegmentsAdded++;
546
                        break;
547

    
548
                    case PathIterator.SEG_CLOSE:
549
                        //if (numSegmentsAdded < 3){
550
                                gpxAux=new GeneralPathX();
551
                                gpxAux.moveTo(pAnt.getX(),pAnt.getY());
552
                                gpxAux.lineTo(firstPoint.getX(),firstPoint.getY());
553
                                geom1=createCurve(gpxAux);
554
                                if (geom1.intersects(rect)|| finish){
555
                                        newGp.lineTo(p.getX(), p.getY());
556
                                        newGp.lineTo(pLast.getX(),pLast.getY());
557
                                }else{
558
                                        newGp.lineTo(pLast.getX(), pLast.getY());
559
                                }
560
                        //}
561
                        newGp.closePath();
562
                        break;
563
                } //end switch
564

    
565
                theIterator.next();
566
            } //end while loop
567
            Geometry shp = null;
568
            switch (geometryCloned.getType())
569
            {
570
                case Geometry.TYPES.POINT: //Tipo punto
571
                        shp = createPoint(pLast.getX(), pLast.getY());
572
                    break;
573

    
574
                case Geometry.TYPES.CURVE:
575
                    shp = createCurve(newGp);
576
                    break;
577
                case Geometry.TYPES.SURFACE:
578
                case Geometry.TYPES.CIRCLE:
579
                case Geometry.TYPES.ELLIPSE:
580
                    shp = createSurface(newGp);
581
                    break;
582
            }
583
            return shp;
584

    
585

    
586
                    /////////////////////
587
            //}else if (geometryCloned.getGeometryType() == FShape.LINE){
588

    
589
            //}
590

    
591

    
592

    
593

    
594
    /*        if (geometryCloned instanceof FGeometryCollection){
595
                    IGeometry[] geometries=((FGeometryCollection)geometryCloned).getGeometries();
596
                    boolean isSelected=false;
597
                    for (int i=0;i<geometries.length;i++){
598
                            if (geometries[i].intersects(rect) && !isSelected){
599
                                    isSelected=true;
600
                                    Handler[] handlers=geometries[i].getHandlers(IGeometry.SELECTHANDLER);
601

602
                                    GeneralPathX gp1=new GeneralPathX();
603
                                    Point2D pinit1=(Point2D)handlers[0].getPoint().clone();
604
                                    gp1.moveTo(pinit1.getX(),pinit1.getY());
605
                                    System.out.println("Handler inicial = "+pinit1);
606
                                    gp1.lineTo(p.getX(),p.getY());
607
                                    System.out.println("Handler medio = "+p);
608
                                    FPolyline2D poly1=new FPolyline2D(gp1);
609
                                    geom1=ShapeFactory.createGeometry(poly1);
610

611
                                    GeneralPathX gp2=new GeneralPathX();
612
                                    gp2.moveTo(p.getX(),p.getY());
613
                                    System.out.println("Handler medio = "+p);
614
                                    Point2D pEnd=(Point2D)handlers[1].getPoint().clone();
615
                                    gp2.lineTo(pEnd.getX(),pEnd.getY());
616
                                    System.out.println("Handler final = "+pEnd);
617
                                    FPolyline2D poly2=new FPolyline2D(gp2);
618
                                    geom2=ShapeFactory.createGeometry(poly2);
619

620
                                    ArrayList geomsAux=new ArrayList();
621
                                    geometries[i]=geom1;
622
                                    for (int j=i;j<geometries.length;j++){
623
                                            geomsAux.add(geometries[j]);
624
                                    }
625

626
                                    if (i<geometries.length-1){
627
                                            geometries[i+1]=geom2;
628
                                            Handler[] hands=((IGeometry)geom1).getHandlers(IGeometry.SELECTHANDLER);
629
                                            for (int h=0;h<hands.length;h++)
630
                                            System.out.println("Handlers New Geometry = "+hands[h].getPoint());
631
                                            Handler[] hands2=((IGeometry)geom2).getHandlers(IGeometry.SELECTHANDLER);
632
                                            for (int h=0;h<hands2.length;h++)
633
                                            System.out.println("Handlers New Geometry = "+hands2[h].getPoint());
634
                                    }else{
635
                                            geometryCloned=new FGeometryCollection(geometries);
636
                                            ((FGeometryCollection)geometryCloned).addGeometry(geom2);
637
                                    }
638
                                    for (int j=i+1;j<geometries.length;j++){
639
                                            if ((j-i)<geomsAux.size()-1){
640
                                                geometries[j+1]=(IGeometry)geomsAux.get(j-i);
641
                                        }else{
642
                                                geometryCloned=new FGeometryCollection(geometries);
643
                                                ((FGeometryCollection)geometryCloned).addGeometry((IGeometry)geomsAux.get(j-i));
644

645
                                        }
646
                                    }
647
                            }
648

649
                    }
650
            }
651
            return geometryCloned;
652
*/
653
    }
654
    private Geometry addVertexGC(BaseMultiPrimitive gc,Point2D p,Rectangle2D rect) {
655
            Geometry[] geoms=gc.getGeometries();
656
            int pos=-1;
657
            for (int i=0;i<geoms.length;i++) {
658
                    if (geoms[i].intersects(rect)) {
659
                            pos=i;
660
                    }
661
            }
662
            ArrayList newGeoms=new ArrayList();
663
            for (int i=0;i<pos;i++) {
664
                    newGeoms.add(geoms[i]);
665
            }
666
            if (pos!=-1) {
667
            GeneralPathX gpx1=new GeneralPathX();
668
            GeneralPathX gpx2=new GeneralPathX();
669
            Handler[] handlers=geoms[pos].getHandlers(Geometry.SELECTHANDLER);
670
            Point2D p1=handlers[0].getPoint();
671
            Point2D p2=p;
672
            Point2D p3=handlers[handlers.length-1].getPoint();
673
            gpx1.moveTo(p1.getX(),p1.getY());
674
            gpx1.lineTo(p2.getX(),p2.getY());
675
            gpx2.moveTo(p2.getX(),p2.getY());
676
            gpx2.lineTo(p3.getX(),p3.getY());
677
            newGeoms.add(createCurve(gpx1));
678
            newGeoms.add(createCurve(gpx2));
679
            for (int i=pos+1;i<geoms.length;i++) {
680
                    newGeoms.add(geoms[i]);
681
            }
682
            return createMultiPrimitive((Geometry[])newGeoms.toArray(new Geometry[0]));
683
            }else {
684
                    return null;
685
            }
686
    }
687
        public String getName() {
688
                return PluginServices.getText(this,"edit_vertex_");
689
        }
690
        private void selectHandler(double x, double y) {
691
                Point2D firstPoint = new Point2D.Double(x, y);
692
                VectorialLayerEdited vle = getVLE();
693
                FeatureStore featureStore=null;
694
                DisposableIterator iterator = null;
695
                try {
696
                        featureStore = vle.getFeatureStore();
697

    
698
                        iterator = ((FeatureSelection) featureStore.getSelection())
699
                                        .iterator();
700
                        double tam = getCadToolAdapter().getMapControl().getViewPort()
701
                                        .toMapDistance(MapControl.tolerance);
702
                        Rectangle2D rect = new Rectangle2D.Double(firstPoint.getX() - tam,
703
                                        firstPoint.getY() - tam, tam * 2, tam * 2);
704
                        while (iterator.hasNext()) {
705
                                Feature feature = (Feature) iterator.next();
706

    
707
                                boolean isSelectedHandler = false;
708
                                Geometry geometry = getSelectedGeometry();
709
                                if (geometry != null) {
710
                                        Handler[] handlers = geometry
711
                                                        .getHandlers(Geometry.SELECTHANDLER);
712
                                        for (int h = 0; h < handlers.length; h++) {
713
                                                if (handlers[h].getPoint().distance(firstPoint) < tam) {
714
                                                        numSelect = h;
715
                                                        isSelectedHandler = true;
716
                                                }
717
                                        }
718

    
719
                                        if (!isSelectedHandler) {
720
                                                boolean isSelectedGeometry = false;
721
                                                if (geometry.intersects(rect)) { // , 0.1)){
722
                                                        isSelectedGeometry = true;
723
                                                }
724
                                                if (isSelectedGeometry && addVertex) {
725
                                                        Feature feat = (Feature) ((FeatureSelection) featureStore
726
                                                                        .getSelection()).iterator().next();
727
                                                        Point2D posVertex = new Point2D.Double(x, y);
728
                                                        Geometry geom1 = (feat.getDefaultGeometry())
729
                                                                        .cloneGeometry();
730
                                                        Geometry geom = null;
731
                                                        if (geom1 instanceof BaseMultiPrimitive) {
732
                                                                geom = addVertexGC((BaseMultiPrimitive) geom1,
733
                                                                                posVertex, rect);
734
                                                        } else {
735
                                                                geom = addVertex(geom1, posVertex, rect);
736
                                                        }
737
                                                        if (geom != null) {
738
                                                                EditableFeature eFeature = feature
739
                                                                                .getEditable();
740
                                                                eFeature.setGeometry(featureStore
741
                                                                                .getDefaultFeatureType()
742
                                                                                .getDefaultGeometryAttributeName(),
743
                                                                                geom);
744
                                                                featureStore.update(eFeature);
745
                                                                Handler[] newHandlers = geom
746
                                                                                .getHandlers(Geometry.SELECTHANDLER);
747
                                                                for (int h = 0; h < newHandlers.length; h++) {
748
                                                                        if (newHandlers[h].getPoint().distance(
749
                                                                                        posVertex) < tam) {
750
                                                                                numSelect = h;
751
                                                                                isSelectedHandler = true;
752
                                                                        }
753
                                                                }
754

    
755
                                                                // clearSelection();
756
                                                        }
757
                                                }
758
                                        }
759
                                }
760
                        }
761

    
762
                } catch (DataException e) {
763
                        if (iterator != null) {
764
                                iterator.dispose();
765
                        }
766
                        e.printStackTrace();
767
                }
768

    
769
        }
770

    
771
        public String toString() {
772
                return "_editvertex";
773
        }
774

    
775
        public boolean isApplicable(int shapeType) {
776
                switch (shapeType) {
777
                case Geometry.TYPES.POINT:
778
                case Geometry.TYPES.MULTIPOINT:
779
                        return false;
780
                }
781
                return true;
782
        }
783

    
784

    
785
}