Statistics
| Revision:

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

History | View | Annotate | Download (26.6 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.Types;
8
import java.util.Vector;
9

    
10
import javax.swing.JComponent;
11
import javax.swing.JFileChooser;
12
import javax.swing.JOptionPane;
13
import javax.swing.ProgressMonitor;
14

    
15
import org.cresques.cts.ICoordTrans;
16

    
17
import com.hardcode.driverManager.Driver;
18
import com.hardcode.driverManager.DriverLoadException;
19
import com.hardcode.gdbms.driver.exceptions.FileNotFoundDriverException;
20
import com.hardcode.gdbms.driver.exceptions.InitializeWriterException;
21
import com.hardcode.gdbms.driver.exceptions.OpenDriverException;
22
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
23
import com.hardcode.gdbms.driver.exceptions.SchemaEditionException;
24
import com.hardcode.gdbms.engine.data.driver.DriverException;
25
import com.hardcode.gdbms.engine.values.Value;
26
import com.iver.andami.PluginServices;
27
import com.iver.andami.messages.NotificationManager;
28
import com.iver.andami.plugins.Extension;
29
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
30
import com.iver.cit.gvsig.exceptions.visitors.VisitorException;
31
import com.iver.cit.gvsig.fmap.MapContext;
32
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
33
import com.iver.cit.gvsig.fmap.core.FShape;
34
import com.iver.cit.gvsig.fmap.core.IFeature;
35
import com.iver.cit.gvsig.fmap.core.IGeometry;
36
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
37
import com.iver.cit.gvsig.fmap.core.v02.FLabel;
38
import com.iver.cit.gvsig.fmap.drivers.ConnectionFactory;
39
import com.iver.cit.gvsig.fmap.drivers.DBException;
40
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
41
import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
42
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
43
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
44
import com.iver.cit.gvsig.fmap.drivers.IConnection;
45
import com.iver.cit.gvsig.fmap.drivers.ILayerDefinition;
46
import com.iver.cit.gvsig.fmap.drivers.IVectorialDatabaseDriver;
47
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
48
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
49
import com.iver.cit.gvsig.fmap.drivers.dxf.DXFMemoryDriver;
50
import com.iver.cit.gvsig.fmap.drivers.gml.GMLDriver;
51
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
52
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGisDriver;
53
import com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver;
54
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
55
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
56
import com.iver.cit.gvsig.fmap.edition.IWriter;
57
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
58
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
59
import com.iver.cit.gvsig.fmap.edition.writers.gml.GMLWriter;
60
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
61
import com.iver.cit.gvsig.fmap.layers.FBitSet;
62
import com.iver.cit.gvsig.fmap.layers.FLayer;
63
import com.iver.cit.gvsig.fmap.layers.FLayers;
64
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
65
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
66
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
67
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
68
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
69
import com.iver.cit.gvsig.project.documents.view.IProjectView;
70
import com.iver.cit.gvsig.project.documents.view.gui.View;
71
import com.iver.cit.gvsig.vectorialdb.ConnectionSettings;
72
import com.iver.cit.gvsig.vectorialdb.DlgConnection;
73
import com.iver.utiles.PostProcessSupport;
74
import com.iver.utiles.SimpleFileFilter;
75
import com.iver.utiles.swing.threads.AbstractMonitorableTask;
76

    
77
public class ExportTo extends Extension {
78
        private String lastPath = null;
79
        private class WriterTask extends AbstractMonitorableTask
80
        {
81
                FLyrVect lyrVect;
82
                IWriter writer;
83
                int rowCount;
84
                ReadableVectorial va;
85
                SelectableDataSource sds;
86
                FBitSet bitSet;
87
                MapContext mapContext;
88
                VectorialDriver reader;
89

    
90
                public WriterTask(MapContext mapContext, FLyrVect lyr, IWriter writer, Driver reader) throws ReadDriverException
91
                {
92
                        this.mapContext = mapContext;
93
                        this.lyrVect = lyr;
94
                        this.writer = writer;
95
                        this.reader = (VectorialDriver) reader;
96

    
97
                        setInitialStep(0);
98
                        setDeterminatedProcess(true);
99
                        setStatusMessage(PluginServices.getText(this, "exportando_features"));
100

    
101
                        va = lyrVect.getSource();
102
                        sds = lyrVect.getRecordset();
103

    
104
                        bitSet = sds.getSelection();
105

    
106
                        if (bitSet.cardinality() == 0)
107
                                rowCount = va.getShapeCount();
108
                        else
109
                                rowCount = bitSet.cardinality();
110

    
111
                        setFinalStep(rowCount);
112

    
113
                }
114
                public void run() throws Exception {
115
                        va.start();
116
                        ICoordTrans ct = lyrVect.getCoordTrans();
117
                        DriverAttributes attr = va.getDriverAttributes();
118
                        boolean bMustClone = false;
119
                        if (attr != null) {
120
                                if (attr.isLoadedInMemory()) {
121
                                        bMustClone = attr.isLoadedInMemory();
122
                                }
123
                        }
124
                        if (lyrVect instanceof FLyrAnnotation && lyrVect.getShapeType()!=FShape.POINT) {
125
                                SHPLayerDefinition lyrDef=(SHPLayerDefinition)writer.getTableDefinition();
126
                                lyrDef.setShapeType(FShape.POINT);
127
                                writer.initialize(lyrDef);
128
                        }
129

    
130
                        // Creamos la tabla.
131
                        writer.preProcess();
132

    
133
                        if (bitSet.cardinality() == 0) {
134
                                rowCount = va.getShapeCount();
135
                                for (int i = 0; i < rowCount; i++) {
136
                                        IGeometry geom = va.getShape(i);
137
                                        if (geom == null) {
138
                                                continue;
139
                                        }
140
                                        if (lyrVect instanceof FLyrAnnotation && geom.getGeometryType()!=FShape.POINT) {
141
                                                Point2D p=FLabel.createLabelPoint((FShape)geom.getInternalShape());
142
                                                geom=ShapeFactory.createPoint2D(p.getX(),p.getY());
143
                                        }
144
                                        if (ct != null) {
145
                                                if (bMustClone)
146
                                                        geom = geom.cloneGeometry();
147
                                                geom.reProject(ct);
148
                                        }
149
                                        reportStep();
150
                                        setNote(PluginServices.getText(this, "exporting_") + i);
151
                                        if (isCanceled())
152
                                                break;
153

    
154
                                        if (geom != null) {
155
                                                Value[] values = sds.getRow(i);
156
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
157
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
158
                                                                DefaultRowEdited.STATUS_ADDED, i);
159
                                                writer.process(edRow);
160
                                        }
161
                                }
162
                        } else {
163
                                int counter = 0;
164
                                for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
165
                                                .nextSetBit(i + 1)) {
166
                                        IGeometry geom = va.getShape(i);
167
                                        if (geom == null) {
168
                                                continue;
169
                                        }
170
                                        if (lyrVect instanceof FLyrAnnotation && geom.getGeometryType()!=FShape.POINT) {
171
                                                Point2D p=FLabel.createLabelPoint((FShape)geom.getInternalShape());
172
                                                geom=ShapeFactory.createPoint2D(p.getX(),p.getY());
173
                                        }
174
                                        if (ct != null) {
175
                                                if (bMustClone)
176
                                                        geom = geom.cloneGeometry();
177
                                                geom.reProject(ct);
178
                                        }
179
                                        reportStep();
180
                                        setNote(PluginServices.getText(this, "exporting_") + counter);
181
                                        if (isCanceled())
182
                                                break;
183

    
184
                                        if (geom != null) {
185
                                                Value[] values = sds.getRow(i);
186
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
187
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
188
                                                                DefaultRowEdited.STATUS_ADDED, i);
189

    
190
                                                writer.process(edRow);
191
                                        }
192
                                }
193

    
194
                        }
195

    
196
                        writer.postProcess();
197
                        va.stop();
198
                        if (reader != null){
199
                                int res = JOptionPane.showConfirmDialog(
200
                                        (JComponent) PluginServices.getMDIManager().getActiveWindow()
201
                                        , PluginServices.getText(this, "insertar_en_la_vista_la_capa_creada"),
202
                                        PluginServices.getText(this,"insertar_capa"),
203
                                        JOptionPane.YES_NO_OPTION);
204

    
205
                                if (res == JOptionPane.YES_OPTION)
206
                                {
207
                                        PostProcessSupport.executeCalls();
208
                                        ILayerDefinition lyrDef = (ILayerDefinition) writer.getTableDefinition();
209
                                        FLayer newLayer = LayerFactory.createLayer(
210
                                                        lyrDef.getName(), reader, mapContext.getProjection());
211
                                        mapContext.getLayers().addLayer(newLayer);
212
                                }
213
                        }
214

    
215
                }
216
                /* (non-Javadoc)
217
                 * @see com.iver.utiles.swing.threads.IMonitorableTask#finished()
218
                 */
219
                public void finished() {
220
                        // TODO Auto-generated method stub
221

    
222
                }
223

    
224
        }
225
        private class MultiWriterTask extends AbstractMonitorableTask{
226
                Vector tasks=new Vector();
227
                public void addTask(WriterTask wt) {
228
                        tasks.add(wt);
229
                }
230
                public void run() throws Exception {
231
                        for (int i = 0; i < tasks.size(); i++) {
232
                                ((WriterTask)tasks.get(i)).run();
233
                        }
234
                        tasks.clear();
235
                }
236
                /* (non-Javadoc)
237
                 * @see com.iver.utiles.swing.threads.IMonitorableTask#finished()
238
                 */
239
                public void finished() {
240
                        // TODO Auto-generated method stub
241

    
242
                }
243

    
244

    
245
        }
246
        /**
247
         * @see com.iver.andami.plugins.IExtension#initialize()
248
         */
249
        public void initialize() {
250
        }
251

    
252
        /**
253
         * @see com.iver.andami.plugins.IExtension#execute(java.lang.String)
254
         */
255
        public void execute(String actionCommand) {
256
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
257
                                .getActiveWindow();
258

    
259
                if (f instanceof View) {
260
                        View vista = (View) f;
261
                        IProjectView model = vista.getModel();
262
                        MapContext mapa = model.getMapContext();
263
                        FLayers layers = mapa.getLayers();
264
                        FLayer[] actives = layers.getActives();
265
                        try {
266
                                // NOTA: SI HAY UNA SELECCI?N, SOLO SE SALVAN LOS SELECCIONADOS
267
                                for (int i = 0; i < actives.length; i++) {
268
                                        if (actives[i] instanceof FLyrVect) {
269
                                                FLyrVect lv = (FLyrVect) actives[i];
270
                                                int numSelec = lv.getRecordset().getSelection()
271
                                                                .cardinality();
272
                                                if (numSelec > 0) {
273
                                                        int resp = JOptionPane.showConfirmDialog(
274
                                                                        (Component) PluginServices.getMainFrame(),
275
                                                                        PluginServices.getText(this,"se_van_a_guardar_") + numSelec
276
                                                                                        + PluginServices.getText(this,"features_desea_continuar"),
277
                                                                        PluginServices.getText(this,"export_to"), JOptionPane.YES_NO_OPTION);
278
                                                        if (resp != JOptionPane.YES_OPTION) {
279
                                                                continue;
280
                                                        }
281
                                                } // if numSelec > 0
282
                                                if (actionCommand.equals("SHP")) {
283
                                                        saveToShp(mapa, lv);
284
                                                }
285
                                                if (actionCommand.equals("DXF")) {
286
                                                        saveToDxf(mapa, lv);
287
                                                }
288
                                                if (actionCommand.equals("POSTGIS")) {
289
                                                        saveToPostGIS(mapa, lv);
290
                                                }
291
                                                if (actionCommand.equals("GML")) {
292
                                                        saveToGml(mapa, lv);
293
                                                }
294
                                        } // actives[i]
295
                                } // for
296
                        } catch (ReadDriverException e) {
297
                                NotificationManager.showMessageError(e.getMessage(),e);
298
                        }
299

    
300
                }
301
        }
302

    
303
        public void saveToPostGIS(MapContext mapContext, FLyrVect layer){
304
                try {
305
                        String tableName = JOptionPane.showInputDialog(PluginServices
306
                                        .getText(this, "intro_tablename"));
307
                        if (tableName == null)
308
                                return;
309
                        tableName = tableName.toLowerCase();
310
                        DlgConnection dlg = new DlgConnection();
311
                        dlg.setModal(true);
312
                        dlg.setVisible(true);
313
                        ConnectionSettings cs = dlg.getConnSettings();
314
                        if (cs == null)
315
                                return;
316
                        IConnection conex = ConnectionFactory.createConnection(cs
317
                                        .getConnectionString(), cs.getUser(), cs.getPassw());
318

    
319

    
320
                        DBLayerDefinition originalDef = null;
321
                        if (layer.getSource().getDriver() instanceof IVectorialDatabaseDriver) {
322
                                originalDef=((IVectorialDatabaseDriver) layer.getSource().getDriver()).getLyrDef();
323
                        }
324

    
325

    
326
                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
327
                        // Fjp:
328
                        // Cambio: En Postgis, el nombre de cat?logo est? siempre vac?o. Es algo heredado de Oracle, que no se usa.
329
                        // dbLayerDef.setCatalogName(cs.getDb());
330
                        dbLayerDef.setCatalogName("");
331

    
332
                        // A?adimos el schema dentro del layer definition para poder tenerlo en cuenta.
333
                        dbLayerDef.setSchema(cs.getSchema());
334

    
335
                        dbLayerDef.setTableName(tableName);
336
                        dbLayerDef.setName(tableName);
337
                        dbLayerDef.setShapeType(layer.getShapeType());
338
                        SelectableDataSource sds = layer.getRecordset();
339

    
340
                        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
341
                        dbLayerDef.setFieldsDesc(fieldsDescrip);
342
                // Creamos el driver. OJO: Hay que a?adir el campo ID a la
343
                // definici?n de campos.
344

    
345
                        if (originalDef != null){
346
                                dbLayerDef.setFieldID(originalDef.getFieldID());
347
                                dbLayerDef.setFieldGeometry(originalDef.getFieldGeometry());
348

    
349
                        }else{
350
                                // Search for id field name
351
                                int index=0;
352
                                String fieldName="gid";
353
                                while (findFileByName(fieldsDescrip,fieldName) != -1){
354
                                        index++;
355
                                        fieldName="gid"+index;
356
                                }
357
                                dbLayerDef.setFieldID(fieldName);
358

    
359
                                // search for geom field name
360
                                index=0;
361
                                fieldName="the_geom";
362
                                while (findFileByName(fieldsDescrip,fieldName) != -1){
363
                                        index++;
364
                                        fieldName="the_geom"+index;
365
                                }
366
                                dbLayerDef.setFieldGeometry(fieldName);
367

    
368
                        }
369

    
370
                        // if id field dosen't exist we add it
371
                        if (findFileByName(fieldsDescrip,dbLayerDef.getFieldID()) == -1)
372
                        {
373
                        int numFieldsAnt = fieldsDescrip.length;
374
                        FieldDescription[] newFields = new FieldDescription[dbLayerDef.getFieldsDesc().length + 1];
375
                    for (int i=0; i < numFieldsAnt; i++)
376
                    {
377
                            newFields[i] = fieldsDescrip[i];
378
                    }
379
                    newFields[numFieldsAnt] = new FieldDescription();
380
                    newFields[numFieldsAnt].setFieldDecimalCount(0);
381
                    newFields[numFieldsAnt].setFieldType(Types.INTEGER);
382
                    newFields[numFieldsAnt].setFieldLength(7);
383
                    newFields[numFieldsAnt].setFieldName("gid");
384
                    dbLayerDef.setFieldsDesc(newFields);
385

    
386
                }
387

    
388

    
389
                        dbLayerDef.setWhereClause("");
390
                        String strSRID = layer.getProjection().getAbrev();
391
                        dbLayerDef.setSRID_EPSG(strSRID);
392
                        dbLayerDef.setConnection(conex);
393

    
394
                        PostGISWriter writer=(PostGISWriter)LayerFactory.getWM().getWriter("PostGIS Writer");
395
                        writer.setWriteAll(true);
396
                        writer.setCreateTable(true);
397
                        writer.initialize(dbLayerDef);
398
                        PostGisDriver postGISDriver=new PostGisDriver();
399
                        postGISDriver.setLyrDef(dbLayerDef);
400
                        postGISDriver.open();
401
                        PostProcessSupport.clearList();
402
                        Object[] params = new Object[2];
403
                        params[0] = conex;
404
                        params[1] = dbLayerDef;
405
                        PostProcessSupport.addToPostProcess(postGISDriver, "setData",
406
                                        params, 1);
407

    
408
                        writeFeatures(mapContext, layer, writer, postGISDriver);
409

    
410
                } catch (DriverLoadException e) {
411
                        NotificationManager.addError(e.getMessage(),e);
412
                } catch (DBException e) {
413
                        NotificationManager.addError(e.getMessage(),e);
414
                } catch (InitializeWriterException e) {
415
                        NotificationManager.addError(e.getMessage(),e);
416
                } catch (ReadDriverException e) {
417
                        NotificationManager.addError(e.getMessage(),e);
418
                }
419

    
420
        }
421

    
422
        /**
423
         * Lanza un thread en background que escribe las features. Cuando termina, pregunta al usuario si quiere
424
         * a?adir la nueva capa a la vista. Para eso necesita un driver de lectura ya configurado.
425
         * @param mapContext
426
         * @param layer
427
         * @param writer
428
         * @param reader
429
         * @throws ReadDriverException
430
         * @throws DriverException
431
         * @throws DriverIOException
432
         */
433
        private void writeFeatures(MapContext mapContext, FLyrVect layer, IWriter writer, Driver reader) throws ReadDriverException
434
        {
435
                PluginServices.cancelableBackgroundExecution(new WriterTask(mapContext, layer, writer, reader));
436
        }
437
        private void writeMultiFeatures(MapContext mapContext, FLyrVect layers, IWriter[] writers, Driver[] readers) throws ReadDriverException{
438
                MultiWriterTask mwt=new MultiWriterTask();
439
                for (int i=0;i<writers.length;i++) {
440
                        mwt.addTask(new WriterTask(mapContext, layers, writers[i], readers[i]));
441
                }
442
                PluginServices.cancelableBackgroundExecution(mwt);
443
        }
444
        /**
445
         * @param layer
446
         *            FLyrVect to obtain features. If selection, only selected
447
         *            features will be precessed.
448
         * @param writer
449
         *            (Must be already initialized)
450
         * @throws ReadDriverException
451
         * @throws ProcessWriterException
452
         * @throws ExpansionFileReadException
453
         * @throws EditionException
454
         * @throws DriverException
455
         * @throws DriverIOException
456
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException
457
         */
458
        public void writeFeaturesNoThread(FLyrVect layer, IWriter writer) throws ReadDriverException, VisitorException, ExpansionFileReadException{
459
                ReadableVectorial va = layer.getSource();
460
                SelectableDataSource sds = layer.getRecordset();
461

    
462
                // Creamos la tabla.
463
                writer.preProcess();
464

    
465
                int rowCount;
466
                FBitSet bitSet = layer.getRecordset().getSelection();
467

    
468
                if (bitSet.cardinality() == 0)
469
                        rowCount = va.getShapeCount();
470
                else
471
                        rowCount = bitSet.cardinality();
472

    
473
                ProgressMonitor progress = new ProgressMonitor(
474
                                (JComponent) PluginServices.getMDIManager().getActiveWindow(),
475
                                PluginServices.getText(this, "exportando_features"),
476
                                PluginServices.getText(this, "exportando_features"), 0,
477
                                rowCount);
478

    
479
                progress.setMillisToDecideToPopup(200);
480
                progress.setMillisToPopup(500);
481

    
482
                if (bitSet.cardinality() == 0) {
483
                        rowCount = va.getShapeCount();
484
                        for (int i = 0; i < rowCount; i++) {
485
                                IGeometry geom = va.getShape(i);
486

    
487
                                progress.setProgress(i);
488
                                if (progress.isCanceled())
489
                                        break;
490

    
491
                                if (geom != null) {
492
                                        Value[] values = sds.getRow(i);
493
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
494
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
495
                                                        IRowEdited.STATUS_ADDED, i);
496
                                        writer.process(edRow);
497
                                }
498
                        }
499
                } else {
500
                        int counter = 0;
501
                        for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
502
                                        .nextSetBit(i + 1)) {
503
                                IGeometry geom = va.getShape(i);
504

    
505
                                progress.setProgress(counter++);
506
                                if (progress.isCanceled())
507
                                        break;
508

    
509
                                if (geom != null) {
510
                                        Value[] values = sds.getRow(i);
511
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
512
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
513
                                                        IRowEdited.STATUS_ADDED, i);
514

    
515
                                        writer.process(edRow);
516
                                }
517
                        }
518

    
519
                }
520

    
521
                writer.postProcess();
522
                progress.close();
523
        }
524

    
525
        public void saveToDxf(MapContext mapContext, FLyrVect layer)  {
526
                try {
527
                        JFileChooser jfc = new JFileChooser(lastPath);
528
                        SimpleFileFilter filterShp = new SimpleFileFilter("dxf",
529
                                        PluginServices.getText(this, "dxf_files"));
530
                        jfc.setFileFilter(filterShp);
531
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
532
                                File newFile = jfc.getSelectedFile();
533
                                String path = newFile.getAbsolutePath();
534
                                if (!(path.toLowerCase().endsWith(".dxf"))) {
535
                                        path = path + ".dxf";
536
                                }
537
                                newFile = new File(path);
538

    
539
                                DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter(
540
                                                "DXF Writer");
541
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
542
                                SelectableDataSource sds = layer.getRecordset();
543
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
544
                                lyrDef.setFieldsDesc(fieldsDescrip);
545
                                lyrDef.setFile(newFile);
546
                                lyrDef.setName(newFile.getName());
547
                                lyrDef.setShapeType(layer.getShapeType());
548
                                writer.setFile(newFile);
549
                                writer.initialize(lyrDef);
550
                                writer.setProjection(layer.getProjection());
551
                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
552
                                // TODO: Recuperar aqu? los campos del cuadro de di?logo.
553
                                writer.setFieldMapping(fieldsMapping);
554
                                DXFMemoryDriver dxfDriver=new DXFMemoryDriver();
555
                                dxfDriver.open(newFile);
556
                                writeFeatures(mapContext, layer, writer, dxfDriver);
557
                                String fileName = newFile.getAbsolutePath();
558
                                lastPath  = fileName.substring(0, fileName.lastIndexOf(File.separatorChar));
559
                        }
560

    
561
                } catch (ReadDriverException e) {
562
                        NotificationManager.addError(e.getMessage(),e);
563
                } catch (InitializeWriterException e) {
564
                        NotificationManager.addError(e.getMessage(),e);
565
                } catch (DriverLoadException e) {
566
                        NotificationManager.addError(e.getMessage(),e);
567
                }
568

    
569
        }
570

    
571
        public void saveToShp(MapContext mapContext, FLyrVect layer) {
572
                try {
573
                        JFileChooser jfc = new JFileChooser();
574
                        SimpleFileFilter filterShp = new SimpleFileFilter("shp",
575
                                        PluginServices.getText(this, "shp_files"));
576
                        jfc.setFileFilter(filterShp);
577
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
578
                                File newFile = jfc.getSelectedFile();
579
                                String path = newFile.getAbsolutePath();
580
                                if( newFile.exists()){
581
                                        int resp = JOptionPane.showConfirmDialog(
582
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
583
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
584
                                        if (resp != JOptionPane.YES_OPTION) {
585
                                                return;
586
                                        }
587
                                }
588
                                if (!(path.toLowerCase().endsWith(".shp"))) {
589
                                        path = path + ".shp";
590
                                }
591
                                newFile = new File(path);
592

    
593

    
594

    
595
                                SelectableDataSource sds = layer.getRecordset();
596
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
597

    
598
                                if (layer.getShapeType() == FShape.MULTI) // Exportamos a 3
599
                                // ficheros
600
                                {
601
                                        ShpWriter writer1 = (ShpWriter) LayerFactory.getWM().getWriter(
602
                                        "Shape Writer");
603
                                        Driver[] drivers=new Driver[3];
604
                                        ShpWriter[] writers=new ShpWriter[3];
605

    
606
                                        // puntos
607
                                        String auxPoint = path.replaceFirst(".shp", "_points.shp");
608

    
609
                                        SHPLayerDefinition lyrDefPoint = new SHPLayerDefinition();
610
                                        lyrDefPoint.setFieldsDesc(fieldsDescrip);
611
                                        File filePoints = new File(auxPoint);
612
                                        lyrDefPoint.setFile(filePoints);
613
                                        lyrDefPoint.setName(filePoints.getName());
614
                                        lyrDefPoint.setShapeType(FShape.POINT);
615
                                        writer1.setFile(filePoints);
616
                                        writer1.initialize(lyrDefPoint);
617
                                        writers[0]=writer1;
618
                                        drivers[0]=getOpenShpDriver(filePoints);
619
                                        //drivers[0]=null;
620

    
621

    
622

    
623
                                        ShpWriter writer2 = (ShpWriter) LayerFactory.getWM().getWriter(
624
                                        "Shape Writer");
625
                                        // Lineas
626
                                        String auxLine = path.replaceFirst(".shp", "_line.shp");
627
                                        SHPLayerDefinition lyrDefLine = new SHPLayerDefinition();
628
                                        lyrDefLine.setFieldsDesc(fieldsDescrip);
629

    
630
                                        File fileLines = new File(auxLine);
631
                                        lyrDefLine.setFile(fileLines);
632
                                        lyrDefLine.setName(fileLines.getName());
633
                                        lyrDefLine.setShapeType(FShape.LINE);
634
                                        writer2.setFile(fileLines);
635
                                        writer2.initialize(lyrDefLine);
636
                                        writers[1]=writer2;
637
                                        drivers[1]=getOpenShpDriver(fileLines);
638
                                        //drivers[1]=null;
639

    
640
                                        ShpWriter writer3 = (ShpWriter) LayerFactory.getWM().getWriter(
641
                                        "Shape Writer");
642
                                        // Pol?gonos
643
                                        String auxPolygon = path.replaceFirst(".shp", "_polygons.shp");
644
                                        SHPLayerDefinition lyrDefPolygon = new SHPLayerDefinition();
645
                                        lyrDefPolygon.setFieldsDesc(fieldsDescrip);
646
                                        File filePolygons = new File(auxPolygon);
647
                                        lyrDefPolygon.setFile(filePolygons);
648
                                        lyrDefPolygon.setName(filePolygons.getName());
649
                                        lyrDefPolygon.setShapeType(FShape.POLYGON);
650
                                        writer3.setFile(filePolygons);
651
                                        writer3.initialize(lyrDefPolygon);
652
                                        writers[2]=writer3;
653
                                        drivers[2]=getOpenShpDriver(filePolygons);
654
                                        //drivers[2]=null;
655

    
656
                                        writeMultiFeatures(mapContext,layer, writers, drivers);
657
                                } else {
658
                                        ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter(
659
                                                "Shape Writer");
660
                                        IndexedShpDriver drv = getOpenShpDriver(newFile);
661
                                        SHPLayerDefinition lyrDef = new SHPLayerDefinition();
662
                                        lyrDef.setFieldsDesc(fieldsDescrip);
663
                                        lyrDef.setFile(newFile);
664
                                        lyrDef.setName(newFile.getName());
665
                                        lyrDef.setShapeType(layer.getShapeType());
666
                                        writer.setFile(newFile);
667
                                        writer.initialize(lyrDef);
668
                                        // CODIGO PARA EXPORTAR UN SHP A UN CHARSET DETERMINADO
669
                                        // ES UTIL PARA QUE UN DBF SE VEA CORRECTAMENTE EN EXCEL, POR EJEMPLO
670
//                                        Charset resul = (Charset) JOptionPane.showInputDialog((Component)PluginServices.getMDIManager().getActiveWindow(),
671
//                                                                PluginServices.getText(ExportTo.class, "select_charset_for_writing"),
672
//                                                                "Charset", JOptionPane.QUESTION_MESSAGE, null,
673
//                                                                Charset.availableCharsets().values().toArray(),
674
//                                                                writer.getCharsetForWriting().displayName());
675
//                                        if (resul == null)
676
//                                                return;
677
//                                        Charset charset = resul;
678
//                                        writer.setCharsetForWriting(charset);
679
                                        writeFeatures(mapContext, layer, writer, drv);
680

    
681
                                }
682
                        }
683
                } catch (InitializeWriterException e) {
684
                        NotificationManager.addError(e.getMessage(),e);
685
                } catch (OpenDriverException e) {
686
                        NotificationManager.addError(e.getMessage(),e);
687
                } catch (ReadDriverException e) {
688
                        NotificationManager.addError(e.getMessage(),e);
689
                } catch (DriverLoadException e) {
690
                        NotificationManager.addError(e.getMessage(),e);
691
                }
692

    
693
        }
694
        /**
695
         * This method saves a layer to GML
696
         * @param mapContext
697
         * @param layer
698
         * @throws EditionException
699
         * @throws DriverIOException
700
         */
701
        public void saveToGml(MapContext mapContext, FLyrVect layer)  {
702
                try {
703
                        JFileChooser jfc = new JFileChooser();
704
                        SimpleFileFilter filterShp = new SimpleFileFilter("gml",
705
                                        PluginServices.getText(this, "gml_files"));
706
                        jfc.setFileFilter(filterShp);
707
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
708
                                File newFile = jfc.getSelectedFile();
709
                                String path = newFile.getAbsolutePath();
710
                                if (!(path.toLowerCase().endsWith(".gml"))) {
711
                                        path = path + ".gml";
712
                                }
713
                                newFile = new File(path);
714

    
715
                                GMLWriter writer = (GMLWriter)LayerFactory.getWM().getWriter("GML Writer");
716

    
717
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
718
                                SelectableDataSource sds = layer.getRecordset();
719
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
720
                                lyrDef.setFieldsDesc(fieldsDescrip);
721
                                lyrDef.setName(newFile.getName());
722
                                lyrDef.setShapeType(layer.getShapeType());
723

    
724
                                writer.setFile(newFile);
725
                                writer.setSchema(lyrDef);
726
                                writer.setBoundedBy(layer.getFullExtent(),layer.getProjection());
727
                                writer.initialize(lyrDef);
728
                                GMLDriver gmlDriver=new GMLDriver();
729
                                gmlDriver.open(newFile);
730
                                writeFeatures(mapContext, layer, writer, gmlDriver);
731
                        }
732

    
733
                } catch (SchemaEditionException e) {
734
                        NotificationManager.addError(e.getMessage(),e);
735
                } catch (InitializeWriterException e) {
736
                        NotificationManager.addError(e.getMessage(),e);
737
                } catch (ReadDriverException e) {
738
                        NotificationManager.addError(e.getMessage(),e);
739
                } catch (DriverLoadException e) {
740
                        NotificationManager.addError(e.getMessage(),e);
741
                }
742

    
743
        }
744
        private IndexedShpDriver getOpenShpDriver(File fileShp) throws OpenDriverException {
745
                IndexedShpDriver drv = new IndexedShpDriver();
746
                if (!fileShp.exists()) {
747
                        try {
748
                                fileShp.createNewFile();
749
                                File newFileSHX=new File(fileShp.getAbsolutePath().replaceAll("[.]shp",".shx"));
750
                                newFileSHX.createNewFile();
751
                                File newFileDBF=new File(fileShp.getAbsolutePath().replaceAll("[.]shp",".dbf"));
752
                                newFileDBF.createNewFile();
753
                        } catch (IOException e) {
754
                                throw new FileNotFoundDriverException("SHP",e,fileShp.getAbsolutePath());
755
                        }
756
                }
757
                drv.open(fileShp);
758
                return drv;
759
        }
760
        /**
761
         * @see com.iver.andami.plugins.IExtension#isEnabled()
762
         */
763
        public boolean isEnabled() {
764
                int status = EditionUtilities.getEditionStatus();
765
                if (( status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE || status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE)
766
                                || (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE)|| (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE))
767
                {
768
                        return true;
769
                }
770
                return false;
771
        }
772

    
773
        /**
774
         * @see com.iver.andami.plugins.IExtension#isVisible()
775
         */
776
        public boolean isVisible() {
777
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
778
                                .getActiveWindow();
779

    
780
                if (f == null) {
781
                        return false;
782
                }
783

    
784
                if (f instanceof View)
785
                        return true;
786
                return false;
787
        }
788

    
789
        private int findFileByName(FieldDescription[] fields, String fieldName){
790
        for (int i=0; i < fields.length; i++)
791
        {
792
                FieldDescription f = fields[i];
793
                if (f.getFieldName().equalsIgnoreCase(fieldName))
794
                {
795
                        return i;
796
                }
797
        }
798

    
799
                return -1;
800

    
801
        }
802

    
803
}