Statistics
| Revision:

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

History | View | Annotate | Download (25.2 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.sql.Types;
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 org.cresques.cts.ICoordTrans;
19

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

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

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

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

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

    
103
                        bitSet = sds.getSelection();
104

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

    
110
                        setFinalStep(rowCount);
111

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

    
128
                        // Creamos la tabla.
129
                        writer.preProcess();
130

    
131
                        if (bitSet.cardinality() == 0) {
132
                                rowCount = va.getShapeCount();
133
                                for (int i = 0; i < rowCount; i++) {
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
                                        if (ct != null) {
140
                                                if (bMustClone)
141
                                                        geom = geom.cloneGeometry();
142
                                                geom.reProject(ct);
143
                                        }
144
                                        reportStep();
145
                                        setNote(PluginServices.getText(this, "exporting_") + i);
146
                                        if (isCanceled())
147
                                                break;
148

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

    
176
                                        if (geom != null) {
177
                                                Value[] values = sds.getRow(i);
178
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
179
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
180
                                                                DefaultRowEdited.STATUS_ADDED, i);
181

    
182
                                                writer.process(edRow);
183
                                        }
184
                                }
185

    
186
                        }
187

    
188
                        writer.postProcess();
189
                        if (reader != null){
190
                                int res = JOptionPane.showConfirmDialog(
191
                                        (JComponent) PluginServices.getMDIManager().getActiveWindow()
192
                                        , PluginServices.getText(this, "insertar_en_la_vista_la_capa_creada"),
193
                                        PluginServices.getText(this,"insertar_capa"),
194
                                        JOptionPane.YES_NO_OPTION);
195

    
196
                                if (res == JOptionPane.YES_OPTION)
197
                                {
198
                                        PostProcessSupport.executeCalls();
199
                                        ILayerDefinition lyrDef = (ILayerDefinition) writer.getTableDefinition();
200
                                        FLayer newLayer = LayerFactory.createLayer(
201
                                                        lyrDef.getName(), reader, mapContext.getProjection());
202
                                        mapContext.getLayers().addLayer(newLayer);
203
                                }
204
                        }
205

    
206
                }
207

    
208
        }
209
        private class MultiWriterTask extends AbstractMonitorableTask{
210
                Vector tasks=new Vector();
211
                public void addTask(WriterTask wt) {
212
                        tasks.add(wt);
213
                }
214
                public void run() throws Exception {
215
                        for (int i = 0; i < tasks.size(); i++) {
216
                                ((WriterTask)tasks.get(i)).run();
217
                        }
218
                        tasks.clear();
219
                }
220

    
221

    
222
        }
223
        /**
224
         * @see com.iver.andami.plugins.IExtension#initialize()
225
         */
226
        public void initialize() {
227
        }
228

    
229
        /**
230
         * @see com.iver.andami.plugins.IExtension#execute(java.lang.String)
231
         */
232
        public void execute(String actionCommand) {
233
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
234
                                .getActiveWindow();
235

    
236
                if (f instanceof View) {
237
                        View vista = (View) f;
238
                        IProjectView model = vista.getModel();
239
                        MapContext mapa = model.getMapContext();
240
                        FLayers layers = mapa.getLayers();
241
                        FLayer[] actives = layers.getActives();
242
                        try {
243
                                // NOTA: SI HAY UNA SELECCI?N, SOLO SE SALVAN LOS SELECCIONADOS
244
                                for (int i = 0; i < actives.length; i++) {
245
                                        if (actives[i] instanceof FLyrVect) {
246
                                                FLyrVect lv = (FLyrVect) actives[i];
247
                                                int numSelec = lv.getRecordset().getSelection()
248
                                                                .cardinality();
249
                                                if (numSelec > 0) {
250
                                                        int resp = JOptionPane.showConfirmDialog(
251
                                                                        (Component) PluginServices.getMainFrame(),
252
                                                                        PluginServices.getText(this,"se_van_a_guardar_") + numSelec
253
                                                                                        + PluginServices.getText(this,"features_desea_continuar"),
254
                                                                        PluginServices.getText(this,"export_to"), JOptionPane.YES_NO_OPTION);
255
                                                        if (resp != JOptionPane.YES_OPTION) {
256
                                                                continue;
257
                                                        }
258
                                                } // if numSelec > 0
259
                                                if (actionCommand.equals("SHP")) {
260
                                                        saveToShp(mapa, lv);
261
                                                }
262
                                                if (actionCommand.equals("DXF")) {
263
                                                        saveToDxf(mapa, lv);
264
                                                }
265
                                                if (actionCommand.equals("POSTGIS")) {
266
                                                        saveToPostGIS(mapa, lv);
267
                                                }
268
                                                if (actionCommand.equals("GML")) {
269
                                                        saveToGml(mapa, lv);
270
                                                }
271
                                        } // actives[i]
272
                                } // for
273
                        } catch (ReadDriverException e) {
274
                                e.printStackTrace();
275
                                NotificationManager.addError(e.getMessage(), e);
276
                        }
277

    
278
                }
279
        }
280

    
281
        public void saveToPostGIS(MapContext mapContext, FLyrVect layer){
282
                try {
283
                        String tableName = JOptionPane.showInputDialog(PluginServices
284
                                        .getText(this, "intro_tablename"));
285
                        if (tableName == null)
286
                                return;
287
                        tableName = tableName.toLowerCase();
288
                        DlgConnection dlg = new DlgConnection();
289
                        dlg.setModal(true);
290
                        dlg.setVisible(true);
291
                        ConnectionSettings cs = dlg.getConnSettings();
292
                        if (cs == null)
293
                                return;
294
                        Connection conex = DriverManager.getConnection(cs
295
                                        .getConnectionString(), cs.getUser(), cs.getPassw());
296

    
297
                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
298
                        dbLayerDef.setCatalogName(cs.getDb());
299
                        dbLayerDef.setTableName(tableName);
300
                        dbLayerDef.setName(tableName);
301
                        dbLayerDef.setShapeType(layer.getShapeType());
302
                        SelectableDataSource sds = layer.getRecordset();
303
                        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
304
                        dbLayerDef.setFieldsDesc(fieldsDescrip);
305
                // Creamos el driver. OJO: Hay que a?adir el campo ID a la
306
                // definici?n de campos.
307

    
308
                boolean bFound = false;
309
                for (int i=0; i < fieldsDescrip.length; i++)
310
                {
311
                        FieldDescription f = fieldsDescrip[i];
312
                        if (f.getFieldName().equalsIgnoreCase("gid"))
313
                        {
314
                                bFound = true;
315
                                break;
316
                        }
317
                }
318
                // Si no est?, lo a?adimos
319
                if (!bFound)
320
                {
321
                        int numFieldsAnt = fieldsDescrip.length;
322
                        FieldDescription[] newFields = new FieldDescription[dbLayerDef.getFieldsDesc().length + 1];
323
                    for (int i=0; i < numFieldsAnt; i++)
324
                    {
325
                            newFields[i] = fieldsDescrip[i];
326
                    }
327
                    newFields[numFieldsAnt] = new FieldDescription();
328
                    newFields[numFieldsAnt].setFieldDecimalCount(0);
329
                    newFields[numFieldsAnt].setFieldType(Types.INTEGER);
330
                    newFields[numFieldsAnt].setFieldLength(7);
331
                    newFields[numFieldsAnt].setFieldName("gid");
332
                    dbLayerDef.setFieldsDesc(newFields);
333

    
334
                }
335

    
336

    
337

    
338
                        dbLayerDef.setFieldGeometry("the_geom");
339
                        dbLayerDef.setFieldID("gid");
340

    
341
                        dbLayerDef.setWhereClause("");
342
                        String strSRID = layer.getProjection().getAbrev().substring(5);
343
                        dbLayerDef.setSRID_EPSG(strSRID);
344
                        dbLayerDef.setConnection(conex);
345

    
346
                        PostGISWriter writer=(PostGISWriter)LayerFactory.getWM().getWriter("PostGIS Writer");
347
                        writer.setWriteAll(true);
348
                        writer.setCreateTable(true);
349
                        writer.initialize(dbLayerDef);
350
                        PostGisDriver postGISDriver=new PostGisDriver();
351
                        postGISDriver.setLyrDef(dbLayerDef);
352
                        postGISDriver.open();
353
                        PostProcessSupport.clearList();
354
                        Object[] params = new Object[2];
355
                        params[0] = conex;
356
                        params[1] = dbLayerDef;
357
                        PostProcessSupport.addToPostProcess(postGISDriver, "setData",
358
                                        params, 1);
359

    
360
                        writeFeatures(mapContext, layer, writer, postGISDriver);
361

    
362
                } catch (DriverLoadException e) {
363
                        e.printStackTrace();
364
                } catch (SQLException e) {
365
                        e.printStackTrace();
366
                } catch (InitializeWriterException e) {
367
                        // TODO Auto-generated catch block
368
                        e.printStackTrace();
369
                } catch (ReadDriverException e) {
370
                        // TODO Auto-generated catch block
371
                        e.printStackTrace();
372
                }
373

    
374
        }
375

    
376
        /**
377
         * Lanza un thread en background que escribe las features. Cuando termina, pregunta al usuario si quiere
378
         * a?adir la nueva capa a la vista. Para eso necesita un driver de lectura ya configurado.
379
         * @param mapContext
380
         * @param layer
381
         * @param writer
382
         * @param reader
383
         * @throws ReadDriverException
384
         * @throws DriverException
385
         * @throws DriverIOException
386
         */
387
        private void writeFeatures(MapContext mapContext, FLyrVect layer, IWriter writer, Driver reader) throws ReadDriverException
388
        {
389
                PluginServices.cancelableBackgroundExecution(new WriterTask(mapContext, layer, writer, reader));
390
        }
391
        private void writeMultiFeatures(MapContext mapContext, FLyrVect layers, IWriter[] writers, Driver[] readers) throws ReadDriverException{
392
                MultiWriterTask mwt=new MultiWriterTask();
393
                for (int i=0;i<writers.length;i++) {
394
                        mwt.addTask(new WriterTask(mapContext, layers, writers[i], readers[i]));
395
                }
396
                PluginServices.cancelableBackgroundExecution(mwt);
397
        }
398
        /**
399
         * @param layer
400
         *            FLyrVect to obtain features. If selection, only selected
401
         *            features will be precessed.
402
         * @param writer
403
         *            (Must be already initialized)
404
         * @throws ReadDriverException
405
         * @throws ProcessWriterException
406
         * @throws ExpansionFileReadException
407
         * @throws EditionException
408
         * @throws DriverException
409
         * @throws DriverIOException
410
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException
411
         */
412
        public void writeFeaturesNoThread(FLyrVect layer, IWriter writer) throws ReadDriverException, VisitorException, ExpansionFileReadException{
413
                ReadableVectorial va = layer.getSource();
414
                SelectableDataSource sds = layer.getRecordset();
415

    
416
                // Creamos la tabla.
417
                writer.preProcess();
418

    
419
                int rowCount;
420
                FBitSet bitSet = layer.getRecordset().getSelection();
421

    
422
                if (bitSet.cardinality() == 0)
423
                        rowCount = va.getShapeCount();
424
                else
425
                        rowCount = bitSet.cardinality();
426

    
427
                ProgressMonitor progress = new ProgressMonitor(
428
                                (JComponent) PluginServices.getMDIManager().getActiveWindow(),
429
                                PluginServices.getText(this, "exportando_features"),
430
                                PluginServices.getText(this, "exportando_features"), 0,
431
                                rowCount);
432

    
433
                progress.setMillisToDecideToPopup(200);
434
                progress.setMillisToPopup(500);
435

    
436
                if (bitSet.cardinality() == 0) {
437
                        rowCount = va.getShapeCount();
438
                        for (int i = 0; i < rowCount; i++) {
439
                                IGeometry geom = va.getShape(i);
440

    
441
                                progress.setProgress(i);
442
                                if (progress.isCanceled())
443
                                        break;
444

    
445
                                if (geom != null) {
446
                                        Value[] values = sds.getRow(i);
447
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
448
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
449
                                                        IRowEdited.STATUS_ADDED, i);
450
                                        writer.process(edRow);
451
                                }
452
                        }
453
                } else {
454
                        int counter = 0;
455
                        for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
456
                                        .nextSetBit(i + 1)) {
457
                                IGeometry geom = va.getShape(i);
458

    
459
                                progress.setProgress(counter++);
460
                                if (progress.isCanceled())
461
                                        break;
462

    
463
                                if (geom != null) {
464
                                        Value[] values = sds.getRow(i);
465
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
466
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
467
                                                        IRowEdited.STATUS_ADDED, i);
468

    
469
                                        writer.process(edRow);
470
                                }
471
                        }
472

    
473
                }
474

    
475
                writer.postProcess();
476
                progress.close();
477
        }
478

    
479
        public void saveToDxf(MapContext mapContext, FLyrVect layer)  {
480
                try {
481
                        JFileChooser jfc = new JFileChooser(lastPath);
482
                        SimpleFileFilter filterShp = new SimpleFileFilter("dxf",
483
                                        PluginServices.getText(this, "dxf_files"));
484
                        jfc.setFileFilter(filterShp);
485
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
486
                                File newFile = jfc.getSelectedFile();
487
                                String path = newFile.getAbsolutePath();
488
                                if (!(path.toLowerCase().endsWith(".dxf"))) {
489
                                        path = path + ".dxf";
490
                                }
491
                                newFile = new File(path);
492

    
493
                                DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter(
494
                                                "DXF Writer");
495
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
496
                                SelectableDataSource sds = layer.getRecordset();
497
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
498
                                lyrDef.setFieldsDesc(fieldsDescrip);
499
                                lyrDef.setFile(newFile);
500
                                lyrDef.setName(newFile.getName());
501
                                lyrDef.setShapeType(layer.getShapeType());
502
                                writer.setFile(newFile);
503
                                writer.initialize(lyrDef);
504
                                writer.setProjection(layer.getProjection());
505
                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
506
                                // TODO: Recuperar aqu? los campos del cuadro de di?logo.
507
                                writer.setFieldMapping(fieldsMapping);
508
                                DXFMemoryDriver dxfDriver=new DXFMemoryDriver();
509
                                dxfDriver.open(newFile);
510
                                writeFeatures(mapContext, layer, writer, dxfDriver);
511
                                String fileName = newFile.getAbsolutePath();
512
                                lastPath  = fileName.substring(0, fileName.lastIndexOf(File.separatorChar));
513
                        }
514

    
515
                } catch (ReadDriverException e) {
516
                        // TODO Auto-generated catch block
517
                        e.printStackTrace();
518
                } catch (InitializeWriterException e) {
519
                        // TODO Auto-generated catch block
520
                        e.printStackTrace();
521
                } catch (DriverLoadException e) {
522
                        // TODO Auto-generated catch block
523
                        e.printStackTrace();
524
                }
525

    
526
        }
527

    
528
        public void saveToShp(MapContext mapContext, FLyrVect layer) {
529
                try {
530
                        JFileChooser jfc = new JFileChooser();
531
                        SimpleFileFilter filterShp = new SimpleFileFilter("shp",
532
                                        PluginServices.getText(this, "shp_files"));
533
                        jfc.setFileFilter(filterShp);
534
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
535
                                File newFile = jfc.getSelectedFile();
536
                                String path = newFile.getAbsolutePath();
537
                                if( newFile.exists()){
538
                                        int resp = JOptionPane.showConfirmDialog(
539
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
540
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
541
                                        if (resp != JOptionPane.YES_OPTION) {
542
                                                return;
543
                                        }
544
                                }
545
                                if (!(path.toLowerCase().endsWith(".shp"))) {
546
                                        path = path + ".shp";
547
                                }
548
                                newFile = new File(path);
549

    
550

    
551

    
552
                                SelectableDataSource sds = layer.getRecordset();
553
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
554

    
555
                                if (layer.getShapeType() == FShape.MULTI) // Exportamos a 3
556
                                // ficheros
557
                                {
558
                                        ShpWriter writer1 = (ShpWriter) LayerFactory.getWM().getWriter(
559
                                        "Shape Writer");
560
                                        Driver[] drivers=new Driver[3];
561
                                        ShpWriter[] writers=new ShpWriter[3];
562

    
563
                                        // puntos
564
                                        String auxPoint = path.replaceFirst(".shp", "_points.shp");
565

    
566
                                        SHPLayerDefinition lyrDefPoint = new SHPLayerDefinition();
567
                                        lyrDefPoint.setFieldsDesc(fieldsDescrip);
568
                                        File filePoints = new File(auxPoint);
569
                                        lyrDefPoint.setFile(filePoints);
570
                                        lyrDefPoint.setName(filePoints.getName());
571
                                        lyrDefPoint.setShapeType(FShape.POINT);
572
                                        writer1.setFile(filePoints);
573
                                        writer1.initialize(lyrDefPoint);
574
                                        writers[0]=writer1;
575
                                        drivers[0]=getOpenShpDriver(filePoints);
576
                                        //drivers[0]=null;
577

    
578

    
579

    
580
                                        ShpWriter writer2 = (ShpWriter) LayerFactory.getWM().getWriter(
581
                                        "Shape Writer");
582
                                        // Lineas
583
                                        String auxLine = path.replaceFirst(".shp", "_line.shp");
584
                                        SHPLayerDefinition lyrDefLine = new SHPLayerDefinition();
585
                                        lyrDefLine.setFieldsDesc(fieldsDescrip);
586

    
587
                                        File fileLines = new File(auxLine);
588
                                        lyrDefLine.setFile(fileLines);
589
                                        lyrDefLine.setName(fileLines.getName());
590
                                        lyrDefLine.setShapeType(FShape.LINE);
591
                                        writer2.setFile(fileLines);
592
                                        writer2.initialize(lyrDefLine);
593
                                        writers[1]=writer2;
594
                                        drivers[1]=getOpenShpDriver(fileLines);
595
                                        //drivers[1]=null;
596

    
597
                                        ShpWriter writer3 = (ShpWriter) LayerFactory.getWM().getWriter(
598
                                        "Shape Writer");
599
                                        // Pol?gonos
600
                                        String auxPolygon = path.replaceFirst(".shp", "_polygons.shp");
601
                                        SHPLayerDefinition lyrDefPolygon = new SHPLayerDefinition();
602
                                        lyrDefPolygon.setFieldsDesc(fieldsDescrip);
603
                                        File filePolygons = new File(auxPolygon);
604
                                        lyrDefPolygon.setFile(filePolygons);
605
                                        lyrDefPolygon.setName(filePolygons.getName());
606
                                        lyrDefPolygon.setShapeType(FShape.POLYGON);
607
                                        writer3.setFile(filePolygons);
608
                                        writer3.initialize(lyrDefPolygon);
609
                                        writers[2]=writer3;
610
                                        drivers[2]=getOpenShpDriver(filePolygons);
611
                                        //drivers[2]=null;
612

    
613
                                        writeMultiFeatures(mapContext,layer, writers, drivers);
614
                                } else {
615
                                        ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter(
616
                                                "Shape Writer");
617
                                        IndexedShpDriver drv = getOpenShpDriver(newFile);
618
                                        SHPLayerDefinition lyrDef = new SHPLayerDefinition();
619
                                        lyrDef.setFieldsDesc(fieldsDescrip);
620
                                        lyrDef.setFile(newFile);
621
                                        lyrDef.setName(newFile.getName());
622
                                        lyrDef.setShapeType(layer.getShapeType());
623
                                        writer.setFile(newFile);
624
                                        writer.initialize(lyrDef);
625
                                        // CODIGO PARA EXPORTAR UN SHP A UN CHARSET DETERMINADO
626
                                        // ES UTIL PARA QUE UN DBF SE VEA CORRECTAMENTE EN EXCEL, POR EJEMPLO
627
//                                        Charset resul = (Charset) JOptionPane.showInputDialog((Component)PluginServices.getMDIManager().getActiveWindow(),
628
//                                                                PluginServices.getText(ExportTo.class, "select_charset_for_writing"),
629
//                                                                "Charset", JOptionPane.QUESTION_MESSAGE, null,
630
//                                                                Charset.availableCharsets().values().toArray(),
631
//                                                                writer.getCharsetForWriting().displayName());
632
//                                        if (resul == null)
633
//                                                return;
634
//                                        Charset charset = resul;
635
//                                        writer.setCharsetForWriting(charset);
636
                                        writeFeatures(mapContext, layer, writer, drv);
637

    
638
                                }
639
                        }
640
                } catch (InitializeWriterException e) {
641
                        // TODO Auto-generated catch block
642
                        e.printStackTrace();
643
                } catch (OpenDriverException e) {
644
                        // TODO Auto-generated catch block
645
                        e.printStackTrace();
646
                } catch (ReadDriverException e) {
647
                        // TODO Auto-generated catch block
648
                        e.printStackTrace();
649
                } catch (DriverLoadException e) {
650
                        // TODO Auto-generated catch block
651
                        e.printStackTrace();
652
                }
653

    
654
        }
655
        /**
656
         * This method saves a layer to GML
657
         * @param mapContext
658
         * @param layer
659
         * @throws EditionException
660
         * @throws DriverIOException
661
         */
662
        public void saveToGml(MapContext mapContext, FLyrVect layer)  {
663
                try {
664
                        JFileChooser jfc = new JFileChooser();
665
                        SimpleFileFilter filterShp = new SimpleFileFilter("gml",
666
                                        PluginServices.getText(this, "gml_files"));
667
                        jfc.setFileFilter(filterShp);
668
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
669
                                File newFile = jfc.getSelectedFile();
670
                                String path = newFile.getAbsolutePath();
671
                                if (!(path.toLowerCase().endsWith(".gml"))) {
672
                                        path = path + ".gml";
673
                                }
674
                                newFile = new File(path);
675

    
676
                                GMLWriter writer = (GMLWriter)LayerFactory.getWM().getWriter("GML Writer");
677

    
678
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
679
                                SelectableDataSource sds = layer.getRecordset();
680
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
681
                                lyrDef.setFieldsDesc(fieldsDescrip);
682
                                lyrDef.setName(newFile.getName());
683
                                lyrDef.setShapeType(layer.getShapeType());
684

    
685
                                writer.setFile(newFile);
686
                                writer.setSchema(lyrDef);
687
                                writer.setBoundedBy(layer.getFullExtent(),layer.getProjection());
688
                                writer.initialize(lyrDef);
689
                                GMLDriver gmlDriver=new GMLDriver();
690
                                gmlDriver.open(newFile);
691
                                writeFeatures(mapContext, layer, writer, gmlDriver);
692
                        }
693

    
694
                } catch (SchemaEditionException e) {
695
                        // TODO Auto-generated catch block
696
                        e.printStackTrace();
697
                } catch (InitializeWriterException e) {
698
                        // TODO Auto-generated catch block
699
                        e.printStackTrace();
700
                } catch (ReadDriverException e) {
701
                        // TODO Auto-generated catch block
702
                        e.printStackTrace();
703
                } catch (ExpansionFileReadException e) {
704
                        // TODO Auto-generated catch block
705
                        e.printStackTrace();
706
                } catch (DriverLoadException e) {
707
                        // TODO Auto-generated catch block
708
                        e.printStackTrace();
709
                }
710

    
711
        }
712
        private IndexedShpDriver getOpenShpDriver(File fileShp) throws OpenDriverException {
713
                IndexedShpDriver drv = new IndexedShpDriver();
714
                if (!fileShp.exists()) {
715
                        try {
716
                                fileShp.createNewFile();
717
                                File newFileSHX=new File(fileShp.getAbsolutePath().replaceAll("[.]shp",".shx"));
718
                                newFileSHX.createNewFile();
719
                                File newFileDBF=new File(fileShp.getAbsolutePath().replaceAll("[.]shp",".dbf"));
720
                                newFileDBF.createNewFile();
721
                        } catch (IOException e) {
722
                                throw new FileNotFoundDriverException("SHP",e,fileShp.getAbsolutePath());
723
                        }
724
                }
725
                drv.open(fileShp);
726
                return drv;
727
        }
728
        /**
729
         * @see com.iver.andami.plugins.IExtension#isEnabled()
730
         */
731
        public boolean isEnabled() {
732
                int status = EditionUtilities.getEditionStatus();
733
                if (( status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE || status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE)
734
                                || (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE)|| (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE))
735
                {
736
                        return true;
737
                }
738
                return false;
739
        }
740

    
741
        /**
742
         * @see com.iver.andami.plugins.IExtension#isVisible()
743
         */
744
        public boolean isVisible() {
745
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
746
                                .getActiveWindow();
747

    
748
                if (f == null) {
749
                        return false;
750
                }
751

    
752
                if (f instanceof View)
753
                        return true;
754
                return false;
755
        }
756

    
757
}