Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extCAD / src / com / iver / cit / gvsig / ExportTo.java @ 6433

History | View | Annotate | Download (19.9 KB)

1
package com.iver.cit.gvsig;
2

    
3
import java.awt.Component;
4
import java.awt.geom.Point2D;
5
import java.io.File;
6
import java.io.IOException;
7
import java.sql.Connection;
8
import java.sql.DriverManager;
9
import java.sql.SQLException;
10
import java.util.ArrayList;
11
import java.util.Vector;
12

    
13
import javax.swing.JComponent;
14
import javax.swing.JFileChooser;
15
import javax.swing.JOptionPane;
16
import javax.swing.ProgressMonitor;
17

    
18
import com.hardcode.driverManager.Driver;
19
import com.hardcode.driverManager.DriverLoadException;
20
import com.hardcode.gdbms.engine.values.Value;
21
import com.iver.andami.PluginServices;
22
import com.iver.andami.messages.NotificationManager;
23
import com.iver.andami.plugins.Extension;
24
import com.iver.cit.gvsig.fmap.DriverException;
25
import com.iver.cit.gvsig.fmap.FMap;
26
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
27
import com.iver.cit.gvsig.fmap.core.FShape;
28
import com.iver.cit.gvsig.fmap.core.IFeature;
29
import com.iver.cit.gvsig.fmap.core.IGeometry;
30
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
31
import com.iver.cit.gvsig.fmap.core.v02.FLabel;
32
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
33
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
34
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
35
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
36
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
37
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
38
import com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver;
39
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
40
import com.iver.cit.gvsig.fmap.edition.EditionException;
41
import com.iver.cit.gvsig.fmap.edition.IWriter;
42
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
43
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
44
import com.iver.cit.gvsig.fmap.edition.writers.gml.GMLWriter;
45
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
46
import com.iver.cit.gvsig.fmap.layers.FBitSet;
47
import com.iver.cit.gvsig.fmap.layers.FLayer;
48
import com.iver.cit.gvsig.fmap.layers.FLayers;
49
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
50
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
51
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
52
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
53
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
54
import com.iver.cit.gvsig.gui.View;
55
import com.iver.cit.gvsig.jdbc_spatial.DlgConnection;
56
import com.iver.cit.gvsig.jdbc_spatial.gui.jdbcwizard.ConnectionSettings;
57
import com.iver.cit.gvsig.project.ProjectView;
58
import com.iver.utiles.SimpleFileFilter;
59
import com.iver.utiles.swing.threads.AbstractMonitorableTask;
60

    
61
public class ExportTo extends Extension {
62

    
63
        private class WriterTask extends AbstractMonitorableTask
64
        {
65
                FLyrVect lyrVect;
66
                IWriter writer;
67
                int rowCount;
68
                ReadableVectorial va;
69
                SelectableDataSource sds;
70
                FBitSet bitSet;
71
                FMap mapContext;
72
                VectorialDriver reader;
73

    
74
                public WriterTask(FMap mapContext, FLyrVect lyr, IWriter writer, Driver reader) throws DriverException, DriverIOException
75
                {
76
                        this.mapContext = mapContext;
77
                        this.lyrVect = lyr;
78
                        this.writer = writer;
79
                        this.reader = (VectorialDriver) reader;
80

    
81
                        setInitialStep(0);
82
                        setDeterminatedProcess(true);
83
                        setStatusMessage(PluginServices.getText(this, "exportando_features"));
84

    
85
                        va = lyrVect.getSource();
86
                        sds = lyrVect.getRecordset();
87

    
88
                        bitSet = sds.getSelection();
89

    
90
                        if (bitSet.cardinality() == 0)
91
                                rowCount = va.getShapeCount();
92
                        else
93
                                rowCount = bitSet.cardinality();
94

    
95
                        setFinalStep(rowCount);
96

    
97
                }
98
                public void run() throws Exception {
99

    
100
                        if (lyrVect instanceof FLyrAnnotation && lyrVect.getShapeType()!=FShape.POINT) {
101
                                SHPLayerDefinition lyrDef=(SHPLayerDefinition)writer.getTableDefinition();
102
                                lyrDef.setShapeType(FShape.POINT);
103
                                writer.initialize(lyrDef);
104
                        }
105

    
106
                        // Creamos la tabla.
107
                        writer.preProcess();
108

    
109
                        if (bitSet.cardinality() == 0) {
110
                                rowCount = va.getShapeCount();
111
                                for (int i = 0; i < rowCount; i++) {
112
                                        IGeometry geom = va.getShape(i);
113
                                        if (lyrVect instanceof FLyrAnnotation && geom.getGeometryType()!=FShape.POINT) {
114
                                                Point2D p=FLabel.createLabelPoint((FShape)geom.getInternalShape());
115
                                                geom=ShapeFactory.createPoint2D(p.getX(),p.getY());
116
                                        }
117
                                        reportStep();
118
                                        setNote(PluginServices.getText(this, "exporting_") + i);
119
                                        if (isCanceled())
120
                                                break;
121

    
122
                                        if (geom != null) {
123
                                                Value[] values = sds.getRow(i);
124
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
125
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
126
                                                                DefaultRowEdited.STATUS_ADDED, i);
127
                                                writer.process(edRow);
128
                                        }
129
                                }
130
                        } else {
131
                                int counter = 0;
132
                                for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
133
                                                .nextSetBit(i + 1)) {
134
                                        IGeometry geom = va.getShape(i);
135
                                        if (lyrVect instanceof FLyrAnnotation && geom.getGeometryType()!=FShape.POINT) {
136
                                                Point2D p=FLabel.createLabelPoint((FShape)geom.getInternalShape());
137
                                                geom=ShapeFactory.createPoint2D(p.getX(),p.getY());
138
                                        }
139
                                        reportStep();
140
                                        setNote(PluginServices.getText(this, "exporting_") + counter);
141
                                        if (isCanceled())
142
                                                break;
143

    
144
                                        if (geom != null) {
145
                                                Value[] values = sds.getRow(i);
146
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
147
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
148
                                                                DefaultRowEdited.STATUS_ADDED, i);
149

    
150
                                                writer.process(edRow);
151
                                        }
152
                                }
153

    
154
                        }
155

    
156
                        writer.postProcess();
157

    
158
                        int res = JOptionPane.showConfirmDialog(
159
                                        (JComponent) PluginServices.getMDIManager().getActiveView()
160
                                        , PluginServices.getText(this, "capa_exportada"), PluginServices.getText(this,"export_to"),
161
                                        JOptionPane.YES_NO_OPTION);
162
                        if (reader != null)
163
                        {
164
                                if (res == JOptionPane.YES_OPTION)
165
                                {
166
                                        FLayer newLayer = LayerFactory.createLayer(
167
                                                        writer.getTableDefinition().getName(), reader, mapContext.getProjection());
168
                                        mapContext.getLayers().addLayer(newLayer);
169
                                }
170
                        }
171

    
172
                }
173

    
174
        }
175
        private class MultiWriterTask extends AbstractMonitorableTask{
176
                Vector tasks=new Vector();
177
                public void addTask(WriterTask wt) {
178
                        tasks.add(wt);
179
                }
180
                public void run() throws Exception {
181
                        for (int i = 0; i < tasks.size(); i++) {
182
                                ((WriterTask)tasks.get(i)).run();
183
                        }
184
                        tasks.clear();
185
                }
186

    
187

    
188
        }
189
        /**
190
         * @see com.iver.andami.plugins.IExtension#initialize()
191
         */
192
        public void initialize() {
193
        }
194

    
195
        /**
196
         * @see com.iver.andami.plugins.IExtension#execute(java.lang.String)
197
         */
198
        public void execute(String actionCommand) {
199
                com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager()
200
                                .getActiveView();
201

    
202
                if (f instanceof View) {
203
                        View vista = (View) f;
204
                        ProjectView model = vista.getModel();
205
                        FMap mapa = model.getMapContext();
206
                        FLayers layers = mapa.getLayers();
207
                        FLayer[] actives = layers.getActives();
208
                        try {
209
                                // NOTA: SI HAY UNA SELECCI?N, SOLO SE SALVAN LOS SELECCIONADOS
210
                                for (int i = 0; i < actives.length; i++) {
211
                                        if (actives[i] instanceof FLyrVect) {
212
                                                FLyrVect lv = (FLyrVect) actives[i];
213
                                                int numSelec = lv.getRecordset().getSelection()
214
                                                                .cardinality();
215
                                                if (numSelec > 0) {
216
                                                        int resp = JOptionPane.showConfirmDialog(
217
                                                                        (Component) PluginServices.getMainFrame(),
218
                                                                        PluginServices.getText(this,"se_van_a_guardar_") + numSelec
219
                                                                                        + PluginServices.getText(this,"features_desea_continuar"),
220
                                                                        PluginServices.getText(this,"export_to"), JOptionPane.YES_NO_OPTION);
221
                                                        if (resp != JOptionPane.YES_OPTION) {
222
                                                                continue;
223
                                                        }
224
                                                } // if numSelec > 0
225
                                                if (actionCommand.equals("SHP")) {
226
                                                        saveToShp(mapa, lv);
227
                                                }
228
                                                if (actionCommand.equals("DXF")) {
229
                                                        saveToDxf(mapa, lv);
230
                                                }
231
                                                if (actionCommand.equals("POSTGIS")) {
232
                                                        saveToPostGIS(mapa, lv);
233
                                                }
234
                                                if (actionCommand.equals("GML")) {
235
                                                        saveToGml(mapa, lv);
236
                                                }
237
                                        } // actives[i]
238
                                } // for
239
                        } catch (EditionException e) {
240
                                e.printStackTrace();
241
                                NotificationManager.addError(e.getMessage(), e);
242
                        } catch (DriverException e) {
243
                                e.printStackTrace();
244
                                NotificationManager.addError(e.getMessage(), e);
245
                        } catch (DriverIOException e) {
246
                                e.printStackTrace();
247
                                NotificationManager.addError(e.getMessage(), e);
248
                        }
249

    
250
                }
251
        }
252

    
253
        public void saveToPostGIS(FMap mapContext, FLyrVect layer) throws EditionException, DriverIOException {
254
                try {
255
                        String tableName = JOptionPane.showInputDialog(PluginServices
256
                                        .getText(this, "intro_tablename"));
257
                        if (tableName == null)
258
                                return;
259
                        DlgConnection dlg = new DlgConnection();
260
                        dlg.setModal(true);
261
                        dlg.setVisible(true);
262
                        ConnectionSettings cs = dlg.getConnSettings();
263
                        if (cs == null)
264
                                return;
265
                        Connection conex = DriverManager.getConnection(cs
266
                                        .getConnectionString(), cs.getUser(), cs.getPassw());
267

    
268
                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
269
                        dbLayerDef.setCatalogName(cs.getDb());
270
                        dbLayerDef.setTableName(tableName);
271
                        dbLayerDef.setShapeType(layer.getShapeType());
272
                        SelectableDataSource sds = layer.getRecordset();
273
                        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
274
                        dbLayerDef.setFieldsDesc(fieldsDescrip);
275
                        dbLayerDef.setFieldGeometry("the_geom");
276
                        dbLayerDef.setFieldID("gid");
277

    
278
                        dbLayerDef.setWhereClause("");
279
                        String strSRID = layer.getProjection().getAbrev().substring(5);
280
                        dbLayerDef.setSRID_EPSG(strSRID);
281
                        dbLayerDef.setConnection(conex);
282

    
283
                        PostGISWriter writer = new PostGISWriter(); // (PostGISWriter)LayerFactory.getWM().getWriter("PostGIS
284
                        // Writer");
285
                        writer.setWriteAll(true);
286
                        writer.setCreateTable(true);
287
                        writer.initialize(dbLayerDef);
288
                        writeFeatures(mapContext, layer, writer, null);
289

    
290
                } catch (DriverException e) {
291
                        e.printStackTrace();
292
                        throw new EditionException(e);
293
                } catch (DriverLoadException e) {
294
                        throw new EditionException(e);
295
                } catch (SQLException e) {
296
                        throw new EditionException(e);
297
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
298
                        e.printStackTrace();
299
                        throw new EditionException(e);
300
                }
301

    
302
        }
303

    
304
        private void writeFeatures(FMap mapContext, FLyrVect layer, IWriter writer, Driver reader) throws DriverException, DriverIOException
305
        {
306
                PluginServices.cancelableBackgroundExecution(new WriterTask(mapContext, layer, writer, reader));
307
        }
308
        private void writeMultiFeatures(FMap mapContext, FLyrVect layers, IWriter[] writers, Driver reader) throws DriverException, DriverIOException{
309
                MultiWriterTask mwt=new MultiWriterTask();
310
                for (int i=0;i<writers.length;i++) {
311
                        mwt.addTask(new WriterTask(mapContext, layers, writers[i], reader));
312
                }
313
                PluginServices.cancelableBackgroundExecution(mwt);
314
        }
315
        /**
316
         * @param layer
317
         *            FLyrVect to obtain features. If selection, only selected
318
         *            features will be precessed.
319
         * @param writer
320
         *            (Must be already initialized)
321
         * @throws EditionException
322
         * @throws DriverException
323
         * @throws DriverIOException
324
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException
325
         */
326
        public void writeFeaturesNoThread(FLyrVect layer, IWriter writer)
327
                        throws EditionException, DriverException, DriverIOException,
328
                        com.hardcode.gdbms.engine.data.driver.DriverException {
329
                ReadableVectorial va = layer.getSource();
330
                SelectableDataSource sds = layer.getRecordset();
331

    
332
                // Creamos la tabla.
333
                writer.preProcess();
334

    
335
                int rowCount;
336
                FBitSet bitSet = layer.getRecordset().getSelection();
337

    
338
                if (bitSet.cardinality() == 0)
339
                        rowCount = va.getShapeCount();
340
                else
341
                        rowCount = bitSet.cardinality();
342

    
343
                ProgressMonitor progress = new ProgressMonitor(
344
                                (JComponent) PluginServices.getMDIManager().getActiveView(),
345
                                PluginServices.getText(this, "exportando_features"),
346
                                PluginServices.getText(this, "exportando_features"), 0,
347
                                rowCount);
348

    
349
                progress.setMillisToDecideToPopup(200);
350
                progress.setMillisToPopup(500);
351

    
352
                if (bitSet.cardinality() == 0) {
353
                        rowCount = va.getShapeCount();
354
                        for (int i = 0; i < rowCount; i++) {
355
                                IGeometry geom = va.getShape(i);
356

    
357
                                progress.setProgress(i);
358
                                if (progress.isCanceled())
359
                                        break;
360

    
361
                                if (geom != null) {
362
                                        Value[] values = sds.getRow(i);
363
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
364
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
365
                                                        DefaultRowEdited.STATUS_ADDED, i);
366
                                        writer.process(edRow);
367
                                }
368
                        }
369
                } else {
370
                        int counter = 0;
371
                        for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
372
                                        .nextSetBit(i + 1)) {
373
                                IGeometry geom = va.getShape(i);
374

    
375
                                progress.setProgress(counter++);
376
                                if (progress.isCanceled())
377
                                        break;
378

    
379
                                if (geom != null) {
380
                                        Value[] values = sds.getRow(i);
381
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
382
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
383
                                                        DefaultRowEdited.STATUS_ADDED, i);
384

    
385
                                        writer.process(edRow);
386
                                }
387
                        }
388

    
389
                }
390

    
391
                writer.postProcess();
392
                progress.close();
393
        }
394

    
395
        public void saveToDxf(FMap mapContext, FLyrVect layer) throws EditionException, DriverIOException {
396
                try {
397
                        JFileChooser jfc = new JFileChooser();
398
                        SimpleFileFilter filterShp = new SimpleFileFilter("dxf",
399
                                        PluginServices.getText(this, "dxf_files"));
400
                        jfc.setFileFilter(filterShp);
401
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
402
                                File newFile = jfc.getSelectedFile();
403
                                String path = newFile.getAbsolutePath();
404
                                if (!(path.toLowerCase().endsWith(".dxf"))) {
405
                                        path = path + ".dxf";
406
                                }
407
                                newFile = new File(path);
408

    
409
                                DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter(
410
                                                "DXF Writer");
411
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
412
                                SelectableDataSource sds = layer.getRecordset();
413
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
414
                                lyrDef.setFieldsDesc(fieldsDescrip);
415
                                lyrDef.setFile(newFile);
416
                                lyrDef.setName(newFile.getName());
417
                                lyrDef.setShapeType(layer.getShapeType());
418
                                writer.setFile(newFile);
419
                                writer.initialize(lyrDef);
420
                                writer.setProjection(layer.getProjection());
421
                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
422
                                // TODO: Recuperar aqu? los campos del cuadro de di?logo.
423
                                writer.setFieldMapping(fieldsMapping);
424

    
425
                                writeFeatures(mapContext, layer, writer, null);
426
                        }
427

    
428
                } catch (DriverException e) {
429
                        e.printStackTrace();
430
                        throw new EditionException(e);
431
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
432
                        e.printStackTrace();
433
                        throw new EditionException(e);
434
                }
435

    
436
        }
437

    
438
        public void saveToShp(FMap mapContext, FLyrVect layer) throws EditionException, DriverIOException {
439
                try {
440
                        JFileChooser jfc = new JFileChooser();
441
                        SimpleFileFilter filterShp = new SimpleFileFilter("shp",
442
                                        PluginServices.getText(this, "shp_files"));
443
                        jfc.setFileFilter(filterShp);
444
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
445
                                File newFile = jfc.getSelectedFile();
446
                                String path = newFile.getAbsolutePath();
447
                                if( newFile.exists()){
448
                                        int resp = JOptionPane.showConfirmDialog(
449
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
450
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
451
                                        if (resp != JOptionPane.YES_OPTION) {
452
                                                return;
453
                                        }
454
                                }
455
                                if (!(path.toLowerCase().endsWith(".shp"))) {
456
                                        path = path + ".shp";
457
                                }
458
                                newFile = new File(path);
459

    
460
                                ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter(
461
                                                "Shape Writer");
462
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
463
                                SelectableDataSource sds = layer.getRecordset();
464
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
465
                                lyrDef.setFieldsDesc(fieldsDescrip);
466
                                if (layer.getShapeType() == FShape.MULTI) // Exportamos a 3
467
                                // ficheros
468
                                {
469
                                        ShpWriter[] writers=new ShpWriter[3];
470
                                        // puntos
471
                                        String aux = path.replaceFirst(".shp", "_points.shp");
472
                                        File filePoints = new File(aux);
473
                                        lyrDef.setFile(filePoints);
474
                                        lyrDef.setName(filePoints.getName());
475
                                        lyrDef.setShapeType(FShape.POINT);
476
                                        writer.setFile(filePoints);
477
                                        lyrDef.setFile(filePoints);
478
                                        writer.initialize(lyrDef);
479
                                        writers[0]=writer;
480
                                        //writeFeatures(mapContext, layer, writer, null);
481

    
482
                                        // Lineas
483
                                        aux = path.replaceFirst(".shp", "_line.shp");
484
                                        File fileLines = new File(aux);
485
                                        lyrDef.setFile(fileLines);
486
                                        lyrDef.setName(fileLines.getName());
487
                                        lyrDef.setShapeType(FShape.LINE);
488
                                        writer.setFile(fileLines);
489
                                        lyrDef.setFile(fileLines);
490
                                        writer.initialize(lyrDef);
491
                                        writers[1]=writer;
492

    
493
                                        //writeFeatures(mapContext, layer, writer, null);
494

    
495
                                        // Pol?gonos
496
                                        aux = path.replaceFirst(".shp", "_polygons.shp");
497
                                        File filePolygons = new File(aux);
498
                                        lyrDef.setFile(filePolygons);
499
                                        lyrDef.setName(filePolygons.getName());
500
                                        lyrDef.setShapeType(FShape.POLYGON);
501
                                        writer.setFile(filePolygons);
502
                                        lyrDef.setFile(filePolygons);
503
                                        writer.initialize(lyrDef);
504
                                        writers[2]=writer;
505

    
506
                                        //writeFeatures(mapContext, layer, writer, null);
507
                                        writeMultiFeatures(mapContext,layer, writers, null);
508
                                } else {
509
// Esto cuando se quiere exportar a un fichero nuevo falla.
510
//                                        IndexedShpDriver drv = new IndexedShpDriver();
511
//                                        drv.open(newFile);
512

    
513
                                        lyrDef.setFile(newFile);
514
                                        lyrDef.setName(newFile.getName());
515
                                        lyrDef.setShapeType(layer.getShapeType());
516
                                        writer.setFile(newFile);
517
                                        writer.initialize(lyrDef);
518

    
519
//                                        writeFeatures(mapContext, layer, writer, drv);
520
                                        writeFeatures(mapContext, layer, writer, null);
521

    
522
                                }
523
                        }
524
                } catch (DriverException e) {
525
                        e.printStackTrace();
526
                        throw new EditionException(e);
527
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
528
                        e.printStackTrace();
529
                        throw new EditionException(e);
530
                }
531
//                catch (IOException e) {
532
//                        e.printStackTrace();
533
//                        throw new EditionException(e);
534
//                }
535

    
536
        }
537
        
538
        /**
539
         * This method saves a layer to GML
540
         * @param mapContext
541
         * @param layer
542
         * @throws EditionException
543
         * @throws DriverIOException
544
         */
545
        public void saveToGml(FMap mapContext, FLyrVect layer) throws EditionException, DriverIOException {
546
                try {
547
                        JFileChooser jfc = new JFileChooser();
548
                        SimpleFileFilter filterShp = new SimpleFileFilter("gml",
549
                                        PluginServices.getText(this, "gml_files"));
550
                        jfc.setFileFilter(filterShp);
551
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
552
                                File newFile = jfc.getSelectedFile();
553
                                String path = newFile.getAbsolutePath();
554
                                if (!(path.toLowerCase().endsWith(".gml"))) {
555
                                        path = path + ".gml";
556
                                }
557
                                newFile = new File(path);
558
                                
559
                                GMLWriter writer = (GMLWriter)LayerFactory.getWM().getWriter("GML Writer");
560
                                        
561
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
562
                                SelectableDataSource sds = layer.getRecordset();
563
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
564
                                lyrDef.setFieldsDesc(fieldsDescrip);
565
                                lyrDef.setName(layer.getName());
566
                                lyrDef.setShapeType(layer.getShapeType());
567
                                
568
                                writer.setFile(newFile);
569
                                writer.setSchema(lyrDef);                
570
                                writer.setBoundedBy(layer.getFullExtent(),layer.getProjection());
571
                                
572
                                writeFeatures(mapContext, layer, writer, null);
573
                        }
574

    
575
                } catch (DriverException e) {
576
                        e.printStackTrace();
577
                        throw new EditionException(e);
578
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
579
                        e.printStackTrace();
580
                        throw new EditionException(e);
581
                }
582
//                catch (IOException e) {
583
//                        e.printStackTrace();
584
//                        throw new EditionException(e);
585
//                }
586

    
587
        }
588

    
589
        /**
590
         * @see com.iver.andami.plugins.IExtension#isEnabled()
591
         */
592
        public boolean isEnabled() {
593
                int status = EditionUtilities.getEditionStatus();
594
                if (( status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE || status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE)
595
                                || (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE)|| (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE))
596
                {
597
                        return true;
598
                }
599
                else
600
                        return false;
601
        }
602

    
603
        /**
604
         * @see com.iver.andami.plugins.IExtension#isVisible()
605
         */
606
        public boolean isVisible() {
607
                com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager()
608
                                .getActiveView();
609

    
610
                if (f == null) {
611
                        return false;
612
                }
613

    
614
                if (f instanceof View) {
615
                        return true;
616
                } else {
617
                        return false;
618
                }
619

    
620
        }
621

    
622
}