Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extEditing / src / org / gvsig / editing / gui / cad / DefaultCADTool.java @ 33205

History | View | Annotate | Download (29 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;
42

    
43
import java.awt.event.MouseEvent;
44
import java.awt.geom.AffineTransform;
45
import java.awt.geom.Point2D;
46
import java.util.ArrayList;
47

    
48
import org.apache.log4j.Logger;
49
import org.cresques.cts.ICoordTrans;
50
import org.gvsig.andami.PluginServices;
51
import org.gvsig.andami.messages.NotificationManager;
52
import org.gvsig.andami.ui.mdiManager.IWindow;
53
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
54
import org.gvsig.editing.CADExtension;
55
import org.gvsig.editing.gui.cad.exception.CommandException;
56
import org.gvsig.editing.layers.VectorialLayerEdited;
57
import org.gvsig.fmap.dal.exception.DataException;
58
import org.gvsig.fmap.dal.exception.ReadException;
59
import org.gvsig.tools.dispose.DisposableIterator;
60
import org.gvsig.fmap.dal.feature.EditableFeature;
61
import org.gvsig.fmap.dal.feature.Feature;
62
import org.gvsig.fmap.dal.feature.FeatureSelection;
63
import org.gvsig.fmap.dal.feature.FeatureSet;
64
import org.gvsig.fmap.dal.feature.FeatureStore;
65
import org.gvsig.fmap.dal.feature.exception.CreateGeometryException;
66
import org.gvsig.fmap.geom.Geometry;
67
import org.gvsig.fmap.geom.GeometryLocator;
68
import org.gvsig.fmap.geom.GeometryManager;
69
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
70
import org.gvsig.fmap.geom.Geometry.TYPES;
71
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
72
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
73
import org.gvsig.fmap.geom.handler.Handler;
74
import org.gvsig.fmap.geom.primitive.Arc;
75
import org.gvsig.fmap.geom.primitive.Circle;
76
import org.gvsig.fmap.geom.primitive.Curve;
77
import org.gvsig.fmap.geom.primitive.Ellipse;
78
import org.gvsig.fmap.geom.primitive.Envelope;
79
import org.gvsig.fmap.geom.primitive.GeneralPathX;
80
import org.gvsig.fmap.geom.primitive.Point;
81
import org.gvsig.fmap.geom.primitive.Primitive;
82
import org.gvsig.fmap.geom.primitive.Spline;
83
import org.gvsig.fmap.geom.primitive.Surface;
84
import org.gvsig.fmap.geom.util.UtilFunctions;
85
import org.gvsig.fmap.mapcontext.MapContextLocator;
86
import org.gvsig.fmap.mapcontext.MapContextManager;
87
import org.gvsig.fmap.mapcontext.ViewPort;
88
import org.gvsig.fmap.mapcontext.layers.SpatialCache;
89
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
90
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
91
import org.gvsig.fmap.mapcontrol.MapControlLocator;
92
import org.gvsig.fmap.mapcontrol.MapControlManager;
93
import org.gvsig.utils.console.JConsole;
94

    
95

    
96

    
97
/**
98
 * DOCUMENT ME!
99
 *
100
 * @author Vicente Caballero Navarro
101
 */
102
public abstract class DefaultCADTool implements CADTool {
103

    
104
        /**
105
         * Reference to the MapContext library manager, used to create symbols
106
         * and legends.
107
         */
108
        private static MapContextManager mapContextManager = MapContextLocator
109
        .getMapContextManager();
110

    
111
        /**
112
         * Reference to the MapControl library manager, used to manage
113
         * tools.
114
         */
115
        protected static MapControlManager mapControlManager = MapControlLocator.getMapControlManager();
116

    
117
        protected static Logger logger = Logger.getLogger(DefaultCADTool.class
118
                        .getName());
119
        private CADToolAdapter cadToolAdapter;
120

    
121
        private String question;
122

    
123
        private String[] currentdescriptions;
124

    
125
        private String tool = "selection";
126

    
127
        private DefaultCADTool previousTool;
128

    
129
        private ArrayList temporalCache = new ArrayList();
130
        protected GeometryManager geomManager = GeometryLocator.getGeometryManager();
131

    
132
        public void addTemporalCache(Geometry geom) {
133
                temporalCache.add(geom);
134
                try {
135
                        insertSpatialCache(geom);
136
                } catch (CreateEnvelopeException e) {
137
                        logger.error("Error adding the spatial cache", e);
138
                }
139
        }
140

    
141
        public void clearTemporalCache() {
142
                Geometry[] geoms = (Geometry[]) temporalCache.toArray(new Geometry[0]);
143
                for (int i = 0; i < geoms.length; i++) {
144
                        try {
145
                                removeSpatialCache(geoms[i]);
146
                        } catch (CreateEnvelopeException e) {
147
                                logger.error("Error removing the temporal cache", e);
148
                        }
149
                }
150
                temporalCache.clear();
151
        }
152

    
153
        private void insertSpatialCache(Geometry geom) throws CreateEnvelopeException {
154
                VectorialLayerEdited vle = getVLE();
155
                SpatialCache spatialCache = ((FLyrVect) vle.getLayer())
156
                .getSpatialCache();
157
                Envelope r = geom.getEnvelope();
158
                if (geom.getType() == Geometry.TYPES.POINT) {
159
                        r = geomManager.createEnvelope(r.getMinimum(0), r.getMinimum(1), r
160
                                        .getMinimum(0) + 1, r.getMinimum(1) + 1, SUBTYPES.GEOM2D);// Rectangle2D.Double(r.getX(),r.getY(),1,1);
161
                }
162
                spatialCache.insert(r, geom);
163

    
164
        }
165

    
166
        private void removeSpatialCache(Geometry geom) throws CreateEnvelopeException {
167
                VectorialLayerEdited vle = getVLE();
168
                SpatialCache spatialCache = ((FLyrVect) vle.getLayer())
169
                .getSpatialCache();
170
                Envelope r = geom.getEnvelope();
171
                if (geom.getType() == Geometry.TYPES.POINT) {
172
                        r = geomManager.createEnvelope(r.getMinimum(0), r.getMinimum(1), r
173
                                        .getMinimum(0) + 1, r.getMinimum(1) + 1, SUBTYPES.GEOM2D);// Rectangle2D.Double(r.getX(),r.getY(),1,1);
174
                }
175
                spatialCache.remove(r, geom);
176

    
177
        }
178

    
179
        /**
180
         * DOCUMENT ME!
181
         * @param feature 
182
         */
183
        public void draw(Geometry geometry, Feature feature) {
184
                if (geometry != null) {
185
                        getCadToolAdapter().getMapControl().getMapControlDrawer().
186
                        draw(geometry, mapControlManager.getGeometrySelectionSymbol());                        
187
                }
188
        }
189
        
190
        /**
191
         * It draw the selected geometries from the initial point until a new
192
         * point.
193
         * @param mapControlDrawer
194
         * The drawer.
195
         * @param firstPoint
196
         * The initial point.
197
         * @param x
198
         * The X coordinate of the mouse.
199
         * @param y
200
         * The Y coordinate of the mouse.
201
         */
202
        protected void drawSelectedGeometries(MapControlDrawer mapControlDrawer,
203
                        Point2D firstPoint, double x, double y){
204
                FeatureStore featureStore = null;
205
                DisposableIterator iterator = null;
206
                ICoordTrans ct = getVLE().getLayer().getCoordTrans();
207

    
208
                try {
209
                        featureStore = getVLE().getFeatureStore();
210
                        FeatureSet selection = (FeatureSet) featureStore.getSelection();
211

    
212
                        iterator = selection.iterator();
213
                        while (iterator.hasNext()) {
214
                                Feature feature = (Feature) iterator.next();
215
                                Geometry geometry = (feature.getDefaultGeometry())
216
                                .cloneGeometry();
217
                                                                        
218
                                if (geometry == null) {
219
                                        continue;
220
                                }                                
221
                                
222
                                Point2D currentPoint = new Point2D.Double(x, y);
223
                                if (ct != null) {
224
                                        currentPoint = ct.getInverted().convert(currentPoint,
225
                                                        null);
226
                                }                                
227
                                
228
                                UtilFunctions.moveGeom(geometry, currentPoint.getX()
229
                                                - firstPoint.getX(), currentPoint.getY()
230
                                                - firstPoint.getY());
231
                                                
232
                                mapControlDrawer.draw(geometry, mapControlManager.getGeometrySelectionSymbol());                                        
233
                        }                                
234
                } catch (Exception e) {
235
                        logger.error("Retrieving the selection", e);
236
                } finally {
237
                        if (iterator != null) {
238
                                iterator.dispose();
239
                        }
240
                }           
241
        }
242
        
243
        /**
244
         * It draw the selected geometries from the initial point until a new
245
         * point.
246
         * @param mapControlDrawer
247
         * The drawer.
248
         * @param firstPoint
249
         * The initial point.
250
         * @param x
251
         * The X coordinate of the mouse.
252
         * @param y
253
         * The Y coordinate of the mouse.
254
         * @param affineTransform
255
         * The transformation to apply
256
         */
257
        protected void drawAndRotateSelectedGeometries(MapControlDrawer mapControlDrawer,
258
                        Point2D firstPoint, double x, double y){
259
                FeatureStore featureStore = null;
260
                DisposableIterator iterator = null;
261
                ICoordTrans ct = getVLE().getLayer().getCoordTrans();
262

    
263
                try {
264
                        Point2D lastPoint = new Point2D.Double(x, y);
265

    
266
                        double w = lastPoint.getX() - firstPoint.getX();
267
                        double h = lastPoint.getY() - firstPoint.getY();
268
                                
269
                        featureStore = getVLE().getFeatureStore();
270
                        FeatureSet selection = (FeatureSet) featureStore.getSelection();
271

    
272
                        iterator = selection.iterator();
273
                        while (iterator.hasNext()) {
274
                                Feature feature = (Feature) iterator.next();
275
                                Geometry geometry = (feature.getDefaultGeometry())
276
                                .cloneGeometry();
277
                                                                        
278
                                if (geometry == null) {
279
                                        continue;
280
                                }                                
281
                                
282
                                UtilFunctions.rotateGeom(geometry, -Math.atan2(w, h)
283
                                                + (Math.PI / 2), firstPoint.getX(), firstPoint
284
                                                .getY());                                        
285
                                                
286
                                mapControlDrawer.draw(geometry, mapControlManager.getGeometrySelectionSymbol());                                        
287
                        }                                
288
                } catch (Exception e) {
289
                        logger.error("Retrieving the selection", e);
290
                } finally {
291
                        if (iterator != null) {
292
                                iterator.dispose();
293
                        }
294
                }           
295
        }
296

    
297
        /**
298
         *
299
         * @param cta
300
         *            DOCUMENT ME!
301
         */
302
        public void setCadToolAdapter(CADToolAdapter cta) {
303
                cadToolAdapter = cta;
304
        }
305

    
306
        /**
307
         * DOCUMENT ME!
308
         *
309
         * @return DOCUMENT ME!
310
         */
311
        public CADToolAdapter getCadToolAdapter() {
312
                return cadToolAdapter;
313
        }
314

    
315
        public VectorialLayerEdited getVLE() {
316
                return (VectorialLayerEdited) CADExtension.getEditionManager()
317
                .getActiveLayerEdited();
318
        }
319

    
320
        /**
321
         * DOCUMENT ME!
322
         *
323
         * @param geometry
324
         *            DOCUMENT ME!
325
         */
326
        public Feature insertGeometry(Geometry geometry, Feature feature) {
327
                VectorialLayerEdited vle = getVLE();
328

    
329
                try {
330
                        FeatureStore featureStore = ((FLyrVect) vle.getLayer())
331
                        .getFeatureStore();
332
                        EditableFeature eFeature = featureStore.createNewFeature(
333
                                        featureStore.getDefaultFeatureType(), feature);
334
                        eFeature.setGeometry(featureStore.getDefaultFeatureType()
335
                                        .getDefaultGeometryAttributeName(), geometry);
336
                        featureStore.insert(eFeature);
337
                        //                        drawToImage(featureStore, vle, eFeature);
338
                        insertSpatialCache(geometry);
339

    
340
                        getCadToolAdapter().getMapControl().getMapControlDrawer().draw(geometry, mapControlManager.getGeometrySelectionSymbol());                
341

    
342
                        return eFeature;
343
                } catch (ReadException e) {
344
                        NotificationManager.addError(e.getMessage(), e);
345
                        return null;
346
                } catch (DataException e) {
347
                        NotificationManager.addError(e.getMessage(), e);
348
                        return null;
349
                } catch (CreateEnvelopeException e) {
350
                        NotificationManager.addError(e.getMessage(), e);
351
                        return null;
352
                }
353
        }
354
        public Feature insertAndSelectGeometry(Geometry geometry){
355
                Feature feature=null;
356
                try{
357
                        FeatureStore featureStore = getVLE().getFeatureStore();
358
                        featureStore.beginComplexNotification();
359
                        featureStore.beginEditingGroup(getName());
360
                        FeatureSelection newSelection = featureStore
361
                        .createFeatureSelection();
362
                        feature=insertGeometry(geometry);
363
                        newSelection.select(feature);
364
                        //                        clearSelection();
365
                        featureStore.setSelection(newSelection);
366
                        featureStore.endEditingGroup();
367
                        featureStore.endComplexNotification();
368
                }catch (DataException e) {
369
                        NotificationManager.showMessageError("insertAndSelectGeoemtry", e);
370
                }
371
                return feature;
372
        }
373
        public Feature insertGeometry(Geometry geometry) {
374
                VectorialLayerEdited vle = getVLE();
375

    
376
                try {
377
                        FeatureStore featureStore = ((FLyrVect) vle.getLayer())
378
                        .getFeatureStore();
379
                        EditableFeature eFeature = featureStore.createNewFeature(true);
380
                        eFeature.setGeometry(featureStore.getDefaultFeatureType()
381
                                        .getDefaultGeometryAttributeName(), geometry);
382
                        featureStore.insert(eFeature);
383

    
384
                        //                        drawToImage(featureStore, vle, eFeature);
385
                        insertSpatialCache(geometry);
386

    
387
                        getCadToolAdapter().getMapControl().getMapControlDrawer().draw(geometry, mapControlManager.getGeometrySelectionSymbol());                
388

    
389
                        draw(geometry.cloneGeometry(), eFeature);
390
                        return eFeature;
391
                } catch (ReadException e) {
392
                        NotificationManager.addError(e.getMessage(), e);
393
                        return null;
394
                } catch (DataException e) {
395
                        NotificationManager.addError(e.getMessage(), e);
396
                        return null;
397
                } catch (CreateEnvelopeException e) {
398
                        NotificationManager.addError(e.getMessage(), e);
399
                        return null;
400
                }
401

    
402
        }
403
        //        private void drawToImage(FeatureStore featureStore,VectorialLayerEdited vle, Feature feature) throws DataException, GeometryOperationNotSupportedException, GeometryOperationException {
404
        //                // clearSelection();
405
        //                // ViewPort vp = vle.getLayer().getMapContext().getViewPort();
406
        ////                BufferedImage selectionImage = new BufferedImage(
407
        ////                                vp.getImageWidth(), vp.getImageHeight(),
408
        ////                                BufferedImage.TYPE_INT_ARGB);
409
        ////                Graphics2D gs = selectionImage.createGraphics();
410
        ////                BufferedImage handlersImage = new BufferedImage(
411
        ////                                vp.getImageWidth(), vp.getImageHeight(),
412
        ////                                BufferedImage.TYPE_INT_ARGB);
413
        ////                Graphics2D gh = handlersImage.createGraphics();
414
        //
415
        //                // int inversedIndex=vea.getInversedIndex(index);
416
        //                // FeatureSelection selection = (FeatureSelection)
417
        //                // featureStore.getSelection();
418
        //                // selection.select(feature);
419
        //                // vle.addSelectionCache(new DefaultRowEdited(df,
420
        //                // IRowEdited.STATUS_ADDED, inversedIndex ));
421
        //                // vea.getSelection().set(inversedIndex);
422
        //                // Geometry geom = (Geometry)feature.getDefaultGeometry();
423
        ////                DrawOperationContext doc = new DrawOperationContext();
424
        ////                doc.setGraphics(gs);
425
        ////                doc.setViewPort(vp);
426
        ////                doc.setSymbol(DefaultCADTool.selectionSymbol);
427
        //                Geometry geometry=feature.getDefaultGeometry();
428
        ////                geometry.cloneGeometry().invokeOperation(Draw.CODE, doc);
429
        ////                // draw(gs, vp, DefaultCADTool.selectionSymbol);
430
        ////                vle.drawHandlers(geometry.cloneGeometry(), gh, vp);
431
        ////                vle.setHandlersImage(handlersImage);
432
        ////                vle.setSelectionImage(selectionImage);
433
        //                try {
434
        //                        insertSpatialCache(geometry);
435
        //                } catch (CreateEnvelopeException e) {
436
        //                        logger.error("Error creating the envelope", e);
437
        //                }
438
        //
439
        //        }
440

    
441
        /**
442
         * DOCUMENT ME!
443
         *
444
         * @param geometry
445
         *            DOCUMENT ME!
446
         */
447
        // public void modifyFeature(Feature feature, Feature oldFeature) {
448
        // try {
449
        // CommandsRecord
450
        // cr=((FLyrVect)getVLE().getLayer()).getFeatureStore().getCommandsRecord();
451
        // cr.update(feature, oldFeature);
452
        // } catch (ReadException e) {
453
        // NotificationManager.addError(e.getMessage(),e);
454
        // }
455
        // draw(((Geometry)feature.getDefaultGeometry()).cloneGeometry());
456
        // }
457
        /**
458
         * DOCUMENT ME!
459
         *
460
         * @param geometry
461
         *            DOCUMENT ME!
462
         * @param values
463
         *            DOCUMENT ME!
464
         */
465
        //        public Feature addGeometry(Geometry geometry, Object[] values) {
466
        //                // int index = 0;
467
        //                try {
468
        //                        FeatureStore featureStore = ((FLyrVect) getVLE().getLayer())
469
        //                                        .getFeatureStore();
470
        //                        EditableFeature eFeature = featureStore.createNewFeature(true);
471
        //                        eFeature.setGeometry(featureStore.getDefaultFeatureType()
472
        //                                        .getDefaultGeometryAttributeName(), geometry);
473
        //                        for (int i = 0; i < values.length; i++) {
474
        //                                eFeature.set(i, values[i]);
475
        //                        }
476
        //                        featureStore.insert(eFeature);
477
        //                        return eFeature;
478
        //                } catch (DataException e) {
479
        //                        // TODO Auto-generated catch block
480
        //                        e.printStackTrace();
481
        //                }
482
        //                // try {
483
        //                // String newFID = vea.getNewFID();
484
        //                // DefaultFeature df = new DefaultFeature(geometry, values, newFID);
485
        //                // index = vea.addRow(df, getName(), EditionEvent.GRAPHIC);
486
        //                // insertSpatialCache(geometry);
487
        //                // } catch (ValidateRowException e) {
488
        //                // NotificationManager.addError(e);
489
        //                // } catch (ReadException e) {
490
        //                // NotificationManager.addError(e);
491
        //                // }
492
        //                // return vea.getInversedIndex(index);
493
        //                return null;
494
        //        }
495

    
496
        /**
497
         * Devuelve la cadena que corresponde al estado en el que nos encontramos.
498
         *
499
         * @return Cadena para mostrar por consola.
500
         */
501
        public String getQuestion() {
502
                return question;
503
        }
504

    
505
        /**
506
         * Actualiza la cadena que corresponde al estado actual.
507
         *
508
         * @param s
509
         *            Cadena que aparecer� en consola.
510
         */
511
        public void setQuestion(String s) {
512
                question = s;
513
                // ConsoleToken.addQuestion(s);
514
        }
515

    
516
        /**
517
         * Provoca un repintado "soft" de la capa activa en edici�n. Las capas por
518
         * debajo de ella no se dibujan de verdad, solo se dibuja la que est� en
519
         * edici�n y las que est�n por encima de ella en el TOC.
520
         */
521
        public void refresh() {
522
                // getCadToolAdapter().getMapControl().drawMap(false);
523

    
524
                getCadToolAdapter().getMapControl().rePaintDirtyLayers();
525
        }
526

    
527
        /*
528
         * public void drawHandlers(Graphics g, FBitSet sel, AffineTransform at)
529
         * throws DriverIOException { for (int i = sel.nextSetBit(0); i >= 0; i =
530
         * sel.nextSetBit(i + 1)) { IGeometry ig =
531
         * getCadToolAdapter().getVectorialAdapter() .getShape(i).cloneGeometry();
532
         * if (ig == null) continue; Handler[] handlers =
533
         * ig.getHandlers(IGeometry.SELECTHANDLER);
534
         * FGraphicUtilities.DrawHandlers((Graphics2D) g, at, handlers); } }
535
         */
536
        public void drawHandlers(MapControlDrawer renderer, ArrayList selectedRows,
537
                        AffineTransform at) {
538
                FeatureSet selection = null;
539
                DisposableIterator iterator = null;
540
                try {
541
                        selection = (FeatureSet) ((FLyrVect) getVLE().getLayer())
542
                        .getFeatureStore().getSelection();
543

    
544
                        iterator = selection.iterator();
545
                        while (iterator.hasNext()) {
546
                                Feature feature = (Feature) iterator.next();
547

    
548
                                // }
549
                                // for (int i = 0; i < selectedRows.size(); i++) {
550
                                // IRowEdited edRow = (IRowEdited) selectedRows.get(i);
551
                                // IFeature feat = (IFeature) edRow.getLinkedRow();
552
                                // IFeature feat = (IFeature) selectedRows.get(i);
553
                                Geometry ig = (feature.getDefaultGeometry())
554
                                .cloneGeometry();
555
                                if (ig == null) {
556
                                        continue;
557
                                }
558
                                Handler[] handlers = ig.getHandlers(Geometry.SELECTHANDLER);
559
                                renderer.drawHandlers(handlers, at, mapControlManager.getGeometrySelectionSymbol());                
560
                        }
561

    
562
                } catch (ReadException e) {
563
                        // TODO Auto-generated catch block
564
                        e.printStackTrace();
565
                } catch (DataException e) {
566
                        // TODO Auto-generated catch block
567
                        e.printStackTrace();
568
                } finally {
569
                        if (iterator != null) {
570
                                iterator.dispose();
571
                        }
572
                }
573

    
574
        }
575

    
576
        public void setDescription(String[] currentdescriptions) {
577
                this.currentdescriptions = currentdescriptions;
578
        }
579

    
580
        public String[] getDescriptions() {
581
                return currentdescriptions;
582
        }
583

    
584
        /*
585
         * (non-Javadoc)
586
         *
587
         * @see com.iver.cit.gvsig.gui.cad.CADTool#end()
588
         */
589
        public void end() {
590
                CADExtension.setCADTool("_selection", true);
591
                PluginServices.getMainFrame().setSelectedTool("_selection");
592
                CADTool cadtool = CADExtension.getCADTool();
593
                cadtool.setPreviosTool(this);
594
        }
595

    
596
        public void init() {
597
                // jaume, should not be necessary
598
                // CADTool.drawingSymbol.setOutlined(true);
599
                // CADTool.drawingSymbol.setOutlineColor(Color.GREEN);
600

    
601
        }
602

    
603
        // protected ArrayList getSelectedRows() {
604
        // VectorialLayerEdited vle = getVLE();
605
        // ArrayList selectedRow = vle.getSelectedRow();
606
        // return selectedRow;
607
        // }
608

    
609
        protected ArrayList getSelectedHandlers() {
610
                VectorialLayerEdited vle = getVLE();
611
                ArrayList selectedHandlers = vle.getSelectedHandler();
612
                return selectedHandlers;
613
        }
614

    
615
        public void clearSelection() throws DataException {
616
                VectorialLayerEdited vle = getVLE();
617
                FeatureSelection selection = null;
618
                selection = (FeatureSelection) ((FLyrVect) vle.getLayer())
619
                .getFeatureStore().getSelection();
620
                // ArrayList selectedRow = vle.getSelectedRow();
621
                ArrayList selectedHandlers = vle.getSelectedHandler();
622
                selection.deselectAll();
623
                selectedHandlers.clear();
624
                // VectorialEditableAdapter vea = vle.getVEA();
625
                // FBitSet selection = vea.getSelection();
626
                // selection.clear();
627
                vle.setSelectionImage(null);
628
                vle.setHandlersImage(null);
629

    
630
        }
631

    
632
        public String getNextTool() {
633
                return tool;
634
        }
635

    
636
        public void setNextTool(String tool) {
637
                this.tool = tool;
638
        }
639

    
640
        public boolean changeCommand(String name) throws CommandException {
641
                CADTool[] cadtools = CADExtension.getCADTools();
642
                for (int i = 0; i < cadtools.length; i++) {
643
                        CADTool ct = cadtools[i];
644
                        if (name.equalsIgnoreCase(ct.getName())
645
                                        || name.equalsIgnoreCase(ct.toString())) {
646
                                int type = Geometry.TYPES.POINT;
647
                                try {
648
                                        type = ((FLyrVect) getVLE().getLayer()).getShapeType();
649
                                } catch (ReadException e) {
650
                                        throw new CommandException(e);
651
                                }
652
                                if (ct.isApplicable(type)) {
653
                                        getCadToolAdapter().setCadTool(ct);
654
                                        ct.init();
655
                                        DefaultViewPanel vista = (DefaultViewPanel) PluginServices.getMDIManager()
656
                                        .getActiveWindow();
657
                                        vista.getConsolePanel().addText("\n" + ct.getName(),
658
                                                        JConsole.COMMAND);
659
                                        String question = ct.getQuestion();
660
                                        vista.getConsolePanel().addText(
661
                                                        "\n" + "#" + question + " > ", JConsole.MESSAGE);
662
                                        return true;
663
                                }
664
                                throw new CommandException(name);
665
                        }
666
                }
667
                return false;
668
        }
669

    
670
        public boolean isApplicable(int shapeType) {
671
                return true;
672
        }
673

    
674
        public abstract String toString();
675

    
676
        public void throwValueException(String s, double d) {
677
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
678
                if (window instanceof DefaultViewPanel){
679
                        ((DefaultViewPanel)window).getConsolePanel().addText(s + " : " + d, JConsole.ERROR);
680
                }
681
        }
682

    
683
        public void throwOptionException(String s, String o) {
684
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
685
                if (window instanceof DefaultViewPanel){
686
                        ((DefaultViewPanel)window).getConsolePanel().addText(s + " : " + o, JConsole.ERROR);
687
                }
688
        }
689
        
690
        public void throwPointException(String s, double x, double y) {
691
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
692
                if (window instanceof DefaultViewPanel){
693
                        ((DefaultViewPanel)window).getConsolePanel().addText(s + " : " + " X = " + x + ", Y = " + y,
694
                                JConsole.ERROR);
695
                }
696
        }
697
        
698

    
699
        public void setPreviosTool(DefaultCADTool tool) {
700
                previousTool = tool;
701
        }
702

    
703
        public void restorePreviousTool() {
704
                CADExtension.setCADTool(previousTool.toString(), true);
705
                PluginServices.getMainFrame().setSelectedTool(previousTool.toString());
706
        }
707

    
708
        public void endTransition(double x, double y, MouseEvent e) {
709
                // TODO Auto-generated method stub
710

    
711
        }
712

    
713
        /**
714
         * Create a curve from a GeneralPath. If there is an
715
         * error return <code>null</code> and add the error
716
         * to the log
717
         * @param gpx
718
         * The GeneralPath
719
         * @return
720
         * The Curve
721
         */
722
        protected Curve createCurve(GeneralPathX gpx){
723
                Curve curve = null;
724
                try {
725
                        curve = (Curve)geomManager.create(TYPES.CURVE, getSubType());
726
                        curve.setGeneralPath(gpx);
727
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
728
                        logger.error(new CreateGeometryException(TYPES.CURVE, getSubType(), e));
729
                }
730
                return curve;
731
        }
732

    
733
        /**
734
         * Create a surface from a GeneralPath. If there is an
735
         * error return <code>null</code> and add the error
736
         * to the log
737
         * @param gpx
738
         * The general path
739
         * @return
740
         * The Surface
741
         */
742
        protected Surface createSurface(GeneralPathX gpx){
743
                Surface surface = null;
744
                try {
745
                        surface = (Surface)geomManager.create(TYPES.SURFACE, getSubType());
746
                        surface.setGeneralPath(gpx);
747
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
748
                        logger.error(new CreateGeometryException(TYPES.SURFACE, getSubType(), e));
749
                }
750
                return surface;
751
        }
752

    
753
        /**
754
         * Create a curve point. If there is an
755
         * error return <code>null</code> and add the error
756
         * to the log
757
         * @param p1
758
         * The AWT point
759
         * @return
760
         * The gvSIG point
761
         */
762
        protected Point createPoint(Point2D p1){
763
                return createPoint(p1.getX(), p1.getY());
764
        }
765

    
766
        /**
767
         * Create point. If there is an
768
         * error return <code>null</code> and add the error
769
         * to the log
770
         * @param x
771
         * The X coordinate
772
         * @param y
773
         * The y coordinate
774
         * @return
775
         * The Point
776
         */
777
        protected Point createPoint(double x, double y){
778
                Point point = null;
779
                try {
780
                        point = (Point)geomManager.create(TYPES.POINT, getSubType());
781
                        point.setX(x);
782
                        point.setY(y);
783
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
784
                        logger.error(new CreateGeometryException(TYPES.POINT, getSubType(), e));
785
                }
786
                return point;
787
        }
788

    
789
        /**
790
         * Create an Arc. If there is an
791
         * error return <code>null</code> and add the error
792
         * to the log
793
         * @param p1
794
         * @param p2
795
         * @param p3
796
         * @return
797
         * The arc
798
         */
799
        protected Arc createArc(Point2D p1, Point2D p2, Point2D p3){
800
                return createArc(createPoint(p1), createPoint(p2), createPoint(p3));
801
        }
802

    
803
        /**
804
         * Create an arc. If there is an
805
         * error return <code>null</code> and add the error
806
         * to the log
807
         * @param p1
808
         * @param p2
809
         * @param p3
810
         * @return
811
         * The arc
812
         */
813
        protected Arc createArc(Point p1, Point p2, Point p3){
814
                Arc arc = null;
815
                try {
816
                        arc = (Arc)geomManager.create(TYPES.ARC, getSubType());
817
                        arc.setPoints(p1, p2, p3);
818
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
819
                        logger.error(new CreateGeometryException(TYPES.ARC, getSubType(), e));
820
                }
821
                return arc;
822
        }
823

    
824
        /**
825
         * Create a circle. If there is an
826
         * error return <code>null</code> and add the error
827
         * to the log
828
         * @param p1
829
         * @param p2
830
         * @param p3
831
         * @return
832
         * The Circle
833
         */
834
        protected Circle createCircle(Point p1, Point p2, Point p3){
835
                Circle circle = null;
836
                try {
837
                        circle = (Circle)geomManager.create(TYPES.CIRCLE, getSubType());
838
                        circle.setPoints(p1, p2, p3);
839
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
840
                        logger.error(new CreateGeometryException(TYPES.CIRCLE, getSubType(), e));
841
                }
842
                return circle;
843
        }
844

    
845
        /**
846
         * Create a circle from a GeneralPath. If there is an
847
         * error return <code>null</code> and add the error
848
         * to the log
849
         * @param p1
850
         * @param p2
851
         * @return
852
         * The circle
853
         */
854
        protected Circle createCircle(Point2D p1, Point2D p2){
855
                return createCircle(createPoint(p1), createPoint(p2));
856
        }
857

    
858
        /**
859
         * Create a circle. If there is an
860
         * error return <code>null</code> and add the error
861
         * to the log
862
         * @param p1
863
         * @param p2
864
         * @return
865
         * The circle
866
         */
867
        protected Circle createCircle(Point p1, Point p2){
868
                Circle circle = null;
869
                try {
870
                        circle = (Circle)geomManager.create(TYPES.CIRCLE, getSubType());
871
                        circle.setPoints(p1, p2);
872
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
873
                        logger.error(new CreateGeometryException(TYPES.CIRCLE, getSubType(), e));
874
                }
875
                return circle;
876
        }
877

    
878
        /**
879
         * Create a circle. If there is an
880
         * error return <code>null</code> and add the error
881
         * to the log
882
         * @param p1
883
         * @param radious
884
         * @return
885
         * The Circle
886
         */
887
        protected Circle createCircle(Point2D p1, double radious){
888
                return createCircle(createPoint(p1), radious);
889
        }
890

    
891
        /**
892
         * Create a circle. If there is an
893
         * error return <code>null</code> and add the error
894
         * to the log
895
         * @param p1
896
         * @param radious
897
         * @return
898
         * The Circle
899
         */
900
        protected Circle createCircle(Point p1, double radious){
901
                Circle circle = null;
902
                try {
903
                        circle = (Circle)geomManager.create(TYPES.CIRCLE, getSubType());
904
                        circle.setPoints(p1, radious);
905
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
906
                        logger.error(new CreateGeometryException(TYPES.CIRCLE, getSubType(), e));
907
                }
908
                return circle;
909
        }
910

    
911
        /**
912
         * Create an Ellipse. If there is an
913
         * error return <code>null</code> and add the error
914
         * to the log
915
         * @param p1
916
         * @param p2
917
         * @param d
918
         * @return
919
         * The Ellipse
920
         */
921
        protected Ellipse createEllipse(Point2D p1, Point2D p2, double d){
922
                return createEllipse(createPoint(p1), createPoint(p2), d);
923
        }
924

    
925
        /**
926
         * Create an Ellipse. If there is an
927
         * error return <code>null</code> and add the error
928
         * to the log
929
         * @param p1
930
         * @param p2
931
         * @param d
932
         * @return
933
         * The Ellipse
934
         */
935
        protected Ellipse createEllipse(Point p1, Point p2, double d){
936
                Ellipse ellipse = null;
937
                try {
938
                        ellipse = (Ellipse)geomManager.create(TYPES.ELLIPSE, getSubType());
939
                        ellipse.setPoints(p1, p2, d);
940
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
941
                        logger.error(new CreateGeometryException(TYPES.ELLIPSE, getSubType(), e));
942
                }
943
                return ellipse;
944
        }
945

    
946
        /**
947
         * Create a Spline from a GeneralPath. If there is an
948
         * error return <code>null</code> and add the error
949
         * to the log
950
         * @param points
951
         * @return
952
         * The Spline
953
         */
954
        protected Spline createSpline(Point2D[] points){
955
                Spline spline = null;
956
                try {
957
                        spline = (Spline)geomManager.create(TYPES.SPLINE, getSubType());
958
                        for (int i=0 ; i<points.length ; i++){
959
                                spline.addVertex(createPoint(points[i]));
960
                        }
961
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
962
                        logger.error(new CreateGeometryException(TYPES.SPLINE, getSubType(), e));
963
                }
964
                return spline;
965
        }
966

    
967
        /**
968
         * Create a MultiPrimitive. If there is an
969
         * error return <code>null</code> and add the error
970
         * to the log
971
         * @param geometries
972
         * @return
973
         */
974
        protected MultiPrimitive createMultiPrimitive(Geometry[] geometries){
975
                MultiPrimitive multiPrimitive = null;
976
                try {
977
                        multiPrimitive = (MultiPrimitive)geomManager.create(TYPES.AGGREGATE, getSubType());
978
                        for (int i=0 ; i<geometries.length ; i++){
979
                                multiPrimitive.addPrimitive((Primitive)geometries[i]);
980
                        }
981
                } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
982
                        logger.error(new CreateGeometryException(TYPES.SPLINE, getSubType(), e));
983
                }
984
                return multiPrimitive;
985
        }
986

    
987
        /**
988
         * @return the subtype of the default geometry.
989
         */
990
        protected int getSubType(){
991
                FeatureStore featureStore = ((FLyrVect) getVLE().getLayer())
992
                .getFeatureStore();
993
                try {
994
                        return featureStore.getDefaultFeatureType().getDefaultGeometryAttribute().getGeometrySubType();
995
                } catch (DataException e) {
996
                        logger.error(e);
997
                        return SUBTYPES.GEOM3D;                        
998
                }
999
        }
1000
}