Statistics
| Revision:

svn-gvsig-desktop / branches / v10 / extensions / extCAD / src / com / iver / cit / gvsig / ExportTo.java @ 14882

History | View | Annotate | Download (26 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.engine.values.Value;
20
import com.iver.andami.PluginServices;
21
import com.iver.andami.messages.NotificationManager;
22
import com.iver.andami.plugins.Extension;
23
import com.iver.cit.gvsig.fmap.DriverException;
24
import com.iver.cit.gvsig.fmap.MapContext;
25
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
26
import com.iver.cit.gvsig.fmap.core.FShape;
27
import com.iver.cit.gvsig.fmap.core.IFeature;
28
import com.iver.cit.gvsig.fmap.core.IGeometry;
29
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
30
import com.iver.cit.gvsig.fmap.core.v02.FLabel;
31
import com.iver.cit.gvsig.fmap.drivers.ConnectionFactory;
32
import com.iver.cit.gvsig.fmap.drivers.DBException;
33
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
34
import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
35
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
36
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
37
import com.iver.cit.gvsig.fmap.drivers.IConnection;
38
import com.iver.cit.gvsig.fmap.drivers.ILayerDefinition;
39
import com.iver.cit.gvsig.fmap.drivers.IVectorialDatabaseDriver;
40
import com.iver.cit.gvsig.fmap.drivers.LayerDefinition;
41
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
42
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
43
import com.iver.cit.gvsig.fmap.drivers.dxf.DXFMemoryDriver;
44
import com.iver.cit.gvsig.fmap.drivers.gml.GMLDriver;
45
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
46
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGisDriver;
47
import com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver;
48
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
49
import com.iver.cit.gvsig.fmap.edition.EditionException;
50
import com.iver.cit.gvsig.fmap.edition.IWriter;
51
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
52
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
53
import com.iver.cit.gvsig.fmap.edition.writers.gml.GMLWriter;
54
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
55
import com.iver.cit.gvsig.fmap.layers.FBitSet;
56
import com.iver.cit.gvsig.fmap.layers.FLayer;
57
import com.iver.cit.gvsig.fmap.layers.FLayers;
58
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
59
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
60
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
61
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
62
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
63
import com.iver.cit.gvsig.project.documents.view.IProjectView;
64
import com.iver.cit.gvsig.project.documents.view.gui.View;
65
import com.iver.cit.gvsig.vectorialdb.ConnectionSettings;
66
import com.iver.cit.gvsig.vectorialdb.DlgConnection;
67
import com.iver.utiles.PostProcessSupport;
68
import com.iver.utiles.SimpleFileFilter;
69
import com.iver.utiles.swing.threads.AbstractMonitorableTask;
70

    
71
public class ExportTo extends Extension {
72
        private String lastPath = null;
73
        private class WriterTask extends AbstractMonitorableTask
74
        {
75
                FLyrVect lyrVect;
76
                IWriter writer;
77
                int rowCount;
78
                ReadableVectorial va;
79
                SelectableDataSource sds;
80
                FBitSet bitSet;
81
                MapContext mapContext;
82
                VectorialDriver reader;
83

    
84
                public WriterTask(MapContext mapContext, FLyrVect lyr, IWriter writer, Driver reader) throws DriverException, DriverIOException
85
                {
86
                        this.mapContext = mapContext;
87
                        this.lyrVect = lyr;
88
                        this.writer = writer;
89
                        this.reader = (VectorialDriver) reader;
90

    
91
                        setInitialStep(0);
92
                        setDeterminatedProcess(true);
93
                        setStatusMessage(PluginServices.getText(this, "exportando_features"));
94

    
95
                        va = lyrVect.getSource();
96
                        sds = lyrVect.getRecordset();
97

    
98
                        bitSet = sds.getSelection();
99

    
100
                        if (bitSet.cardinality() == 0)
101
                                rowCount = va.getShapeCount();
102
                        else
103
                                rowCount = bitSet.cardinality();
104

    
105
                        setFinalStep(rowCount);
106

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

    
124
                        // Creamos la tabla.
125
                        writer.preProcess();
126

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

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

    
172
                                        if (geom != null) {
173
                                                Value[] values = sds.getRow(i);
174
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
175
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
176
                                                                DefaultRowEdited.STATUS_ADDED, i);
177

    
178
                                                writer.process(edRow);
179
                                        }
180
                                }
181

    
182
                        }
183

    
184
                        writer.postProcess();
185
                        va.stop();
186
                        if (reader != null){
187
                                int res = JOptionPane.showConfirmDialog(
188
                                        (JComponent) PluginServices.getMDIManager().getActiveWindow()
189
                                        , PluginServices.getText(this, "insertar_en_la_vista_la_capa_creada"),
190
                                        PluginServices.getText(this,"insertar_capa"),
191
                                        JOptionPane.YES_NO_OPTION);
192

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

    
203
                }
204

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

    
218

    
219
        }
220
        /**
221
         * @see com.iver.andami.plugins.IExtension#initialize()
222
         */
223
        public void initialize() {
224
        }
225

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

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

    
281
                }
282
        }
283

    
284
        public void saveToPostGIS(MapContext mapContext, FLyrVect layer) throws EditionException, DriverIOException {
285
                try {
286
                        String tableName = JOptionPane.showInputDialog(PluginServices
287
                                        .getText(this, "intro_tablename"));
288
                        if (tableName == null)
289
                                return;
290
                        tableName = tableName.toLowerCase();
291
                        DlgConnection dlg = new DlgConnection();
292
                        dlg.setModal(true);
293
                        dlg.setVisible(true);
294
                        ConnectionSettings cs = dlg.getConnSettings();
295
                        if (cs == null)
296
                                return;
297
                        IConnection conex = ConnectionFactory.createConnection(cs
298
                                        .getConnectionString(), cs.getUser(), cs.getPassw());
299

    
300
                        DBLayerDefinition originalDef = null;
301
                        if (layer.getSource().getDriver() instanceof IVectorialDatabaseDriver) {
302
                                originalDef=((IVectorialDatabaseDriver) layer.getSource().getDriver()).getLyrDef();
303
                        }
304

    
305

    
306
                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
307
                        // Fjp:
308
                        // Cambio: En Postgis, el nombre de cat?logo est? siempre vac?o. Es algo heredado de Oracle, que no se usa.
309
                        // dbLayerDef.setCatalogName(cs.getDb());
310
                        dbLayerDef.setCatalogName("");
311

    
312
                        // A?adimos el schema dentro del layer definition para poder tenerlo en cuenta.
313
                        dbLayerDef.setSchema(cs.getSchema());
314

    
315
                        dbLayerDef.setTableName(tableName);
316
                        dbLayerDef.setName(tableName);
317
                        dbLayerDef.setShapeType(layer.getShapeType());
318
                        SelectableDataSource sds = layer.getRecordset();
319

    
320
                        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
321
                        dbLayerDef.setFieldsDesc(fieldsDescrip);
322
                // Creamos el driver. OJO: Hay que a?adir el campo ID a la
323
                // definici?n de campos.
324

    
325
                        if (originalDef != null){
326
                                dbLayerDef.setFieldID(originalDef.getFieldID());
327
                                dbLayerDef.setFieldGeometry(originalDef.getFieldGeometry());
328

    
329
                        }else{
330
                                // Search for id field name
331
                                int index=0;
332
                                String fieldName="gid";
333
                                while (findFileByName(fieldsDescrip,fieldName) != -1){
334
                                        index++;
335
                                        fieldName="gid"+index;
336
                                }
337
                                dbLayerDef.setFieldID(fieldName);
338

    
339
                                // search for geom field name
340
                                index=0;
341
                                fieldName="the_geom";
342
                                while (findFileByName(fieldsDescrip,fieldName) != -1){
343
                                        index++;
344
                                        fieldName="the_geom"+index;
345
                                }
346
                                dbLayerDef.setFieldGeometry(fieldName);
347

    
348
                        }
349
                        // if id field dosen't exist we add it
350
                        if (findFileByName(fieldsDescrip,dbLayerDef.getFieldID()) == -1)
351
                        {
352
                                int numFieldsAnt = fieldsDescrip.length;
353
                                FieldDescription[] newFields = new FieldDescription[dbLayerDef.getFieldsDesc().length + 1];
354
                                for (int i=0; i < numFieldsAnt; i++)
355
                                {
356
                                        newFields[i] = fieldsDescrip[i];
357
                                }
358
                                newFields[numFieldsAnt] = new FieldDescription();
359
                                newFields[numFieldsAnt].setFieldDecimalCount(0);
360
                                newFields[numFieldsAnt].setFieldType(Types.INTEGER);
361
                                newFields[numFieldsAnt].setFieldLength(7);
362
                                newFields[numFieldsAnt].setFieldName(dbLayerDef.getFieldID());
363
                                dbLayerDef.setFieldsDesc(newFields);
364
                        }
365

    
366

    
367

    
368

    
369
                        dbLayerDef.setWhereClause("");
370
                        String strSRID = layer.getProjection().getAbrev().substring(5);
371
                        dbLayerDef.setSRID_EPSG(strSRID);
372
                        dbLayerDef.setConnection(conex);
373

    
374
                        PostGISWriter writer=(PostGISWriter)LayerFactory.getWM().getWriter("PostGIS Writer");
375
                        writer.setWriteAll(true);
376
                        writer.setCreateTable(true);
377
                        writer.initialize(dbLayerDef);
378
                        PostGisDriver postGISDriver=new PostGisDriver();
379
                        postGISDriver.setLyrDef(dbLayerDef);
380
                        postGISDriver.open();
381
                        PostProcessSupport.clearList();
382
                        Object[] params = new Object[2];
383
                        params[0] = conex;
384
                        params[1] = dbLayerDef;
385
                        PostProcessSupport.addToPostProcess(postGISDriver, "setData",
386
                                        params, 1);
387

    
388
                        writeFeatures(mapContext, layer, writer, postGISDriver);
389

    
390
                } catch (DriverException e) {
391
                        e.printStackTrace();
392
                        throw new EditionException(e);
393
                } catch (DriverLoadException e) {
394
                        throw new EditionException(e);
395
                } catch (DBException e) {
396
                        throw new EditionException(e);
397
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
398
                        e.printStackTrace();
399
                        throw new EditionException(e);
400
                }
401

    
402
        }
403

    
404
        /**
405
         * Lanza un thread en background que escribe las features. Cuando termina, pregunta al usuario si quiere
406
         * a?adir la nueva capa a la vista. Para eso necesita un driver de lectura ya configurado.
407
         * @param mapContext
408
         * @param layer
409
         * @param writer
410
         * @param reader
411
         * @throws DriverException
412
         * @throws DriverIOException
413
         */
414
        private void writeFeatures(MapContext mapContext, FLyrVect layer, IWriter writer, Driver reader) throws DriverException, DriverIOException
415
        {
416
                PluginServices.cancelableBackgroundExecution(new WriterTask(mapContext, layer, writer, reader));
417
        }
418
        private void writeMultiFeatures(MapContext mapContext, FLyrVect layers, IWriter[] writers, Driver[] readers) throws DriverException, DriverIOException{
419
                MultiWriterTask mwt=new MultiWriterTask();
420
                for (int i=0;i<writers.length;i++) {
421
                        mwt.addTask(new WriterTask(mapContext, layers, writers[i], readers[i]));
422
                }
423
                PluginServices.cancelableBackgroundExecution(mwt);
424
        }
425
        /**
426
         * @param layer
427
         *            FLyrVect to obtain features. If selection, only selected
428
         *            features will be precessed.
429
         * @param writer
430
         *            (Must be already initialized)
431
         * @throws EditionException
432
         * @throws DriverException
433
         * @throws DriverIOException
434
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException
435
         */
436
        public void writeFeaturesNoThread(FLyrVect layer, IWriter writer)
437
                        throws EditionException, DriverException, DriverIOException,
438
                        com.hardcode.gdbms.engine.data.driver.DriverException {
439
                ReadableVectorial va = layer.getSource();
440
                SelectableDataSource sds = layer.getRecordset();
441

    
442
                // Creamos la tabla.
443
                writer.preProcess();
444

    
445
                int rowCount;
446
                FBitSet bitSet = layer.getRecordset().getSelection();
447

    
448
                if (bitSet.cardinality() == 0)
449
                        rowCount = va.getShapeCount();
450
                else
451
                        rowCount = bitSet.cardinality();
452

    
453
                ProgressMonitor progress = new ProgressMonitor(
454
                                (JComponent) PluginServices.getMDIManager().getActiveWindow(),
455
                                PluginServices.getText(this, "exportando_features"),
456
                                PluginServices.getText(this, "exportando_features"), 0,
457
                                rowCount);
458

    
459
                progress.setMillisToDecideToPopup(200);
460
                progress.setMillisToPopup(500);
461

    
462
                if (bitSet.cardinality() == 0) {
463
                        rowCount = va.getShapeCount();
464
                        for (int i = 0; i < rowCount; i++) {
465
                                IGeometry geom = va.getShape(i);
466

    
467
                                progress.setProgress(i);
468
                                if (progress.isCanceled())
469
                                        break;
470

    
471
                                if (geom != null) {
472
                                        Value[] values = sds.getRow(i);
473
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
474
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
475
                                                        DefaultRowEdited.STATUS_ADDED, i);
476
                                        writer.process(edRow);
477
                                }
478
                        }
479
                } else {
480
                        int counter = 0;
481
                        for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
482
                                        .nextSetBit(i + 1)) {
483
                                IGeometry geom = va.getShape(i);
484

    
485
                                progress.setProgress(counter++);
486
                                if (progress.isCanceled())
487
                                        break;
488

    
489
                                if (geom != null) {
490
                                        Value[] values = sds.getRow(i);
491
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
492
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
493
                                                        DefaultRowEdited.STATUS_ADDED, i);
494

    
495
                                        writer.process(edRow);
496
                                }
497
                        }
498

    
499
                }
500

    
501
                writer.postProcess();
502
                progress.close();
503
        }
504

    
505
        public void saveToDxf(MapContext mapContext, FLyrVect layer) throws EditionException, DriverIOException {
506
                try {
507
                        JFileChooser jfc = new JFileChooser(lastPath);
508
                        SimpleFileFilter filterShp = new SimpleFileFilter("dxf",
509
                                        PluginServices.getText(this, "dxf_files"));
510
                        jfc.setFileFilter(filterShp);
511
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
512
                                File newFile = jfc.getSelectedFile();
513
                                String path = newFile.getAbsolutePath();
514
                                if (!(path.toLowerCase().endsWith(".dxf"))) {
515
                                        path = path + ".dxf";
516
                                }
517
                                newFile = new File(path);
518

    
519
                                DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter(
520
                                                "DXF Writer");
521
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
522
                                SelectableDataSource sds = layer.getRecordset();
523
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
524
                                lyrDef.setFieldsDesc(fieldsDescrip);
525
                                lyrDef.setFile(newFile);
526
                                lyrDef.setName(newFile.getName());
527
                                lyrDef.setShapeType(layer.getShapeType());
528
                                writer.setFile(newFile);
529
                                writer.initialize(lyrDef);
530
                                writer.setProjection(layer.getProjection());
531
                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
532
                                // TODO: Recuperar aqu? los campos del cuadro de di?logo.
533
                                writer.setFieldMapping(fieldsMapping);
534
                                DXFMemoryDriver dxfDriver=new DXFMemoryDriver();
535
                                dxfDriver.open(newFile);
536
                                writeFeatures(mapContext, layer, writer, dxfDriver);
537
                                String fileName = newFile.getAbsolutePath();
538
                                lastPath  = fileName.substring(0, fileName.lastIndexOf(File.separatorChar));
539
                        }
540

    
541
                } catch (DriverException e) {
542
                        e.printStackTrace();
543
                        throw new EditionException(e);
544
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
545
                        e.printStackTrace();
546
                        throw new EditionException(e);
547
                } catch (IOException e) {
548
                        // TODO Auto-generated catch block
549
                        e.printStackTrace();
550
                }
551

    
552
        }
553

    
554
        public void saveToShp(MapContext mapContext, FLyrVect layer) throws EditionException, DriverIOException {
555
                try {
556
                        JFileChooser jfc = new JFileChooser();
557
                        SimpleFileFilter filterShp = new SimpleFileFilter("shp",
558
                                        PluginServices.getText(this, "shp_files"));
559
                        jfc.setFileFilter(filterShp);
560
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
561
                                File newFile = jfc.getSelectedFile();
562
                                String path = newFile.getAbsolutePath();
563
                                if( newFile.exists()){
564
                                        int resp = JOptionPane.showConfirmDialog(
565
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
566
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
567
                                        if (resp != JOptionPane.YES_OPTION) {
568
                                                return;
569
                                        }
570
                                }
571
                                if (!(path.toLowerCase().endsWith(".shp"))) {
572
                                        path = path + ".shp";
573
                                }
574
                                newFile = new File(path);
575

    
576

    
577

    
578
                                SelectableDataSource sds = layer.getRecordset();
579
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
580

    
581
                                if (layer.getShapeType() == FShape.MULTI) // Exportamos a 3
582
                                // ficheros
583
                                {
584
                                        ShpWriter writer1 = (ShpWriter) LayerFactory.getWM().getWriter(
585
                                        "Shape Writer");
586
                                        Driver[] drivers=new Driver[3];
587
                                        ShpWriter[] writers=new ShpWriter[3];
588

    
589
                                        // puntos
590
                                        String auxPoint = path.replaceFirst(".shp", "_points.shp");
591

    
592
                                        SHPLayerDefinition lyrDefPoint = new SHPLayerDefinition();
593
                                        lyrDefPoint.setFieldsDesc(fieldsDescrip);
594
                                        File filePoints = new File(auxPoint);
595
                                        lyrDefPoint.setFile(filePoints);
596
                                        lyrDefPoint.setName(filePoints.getName());
597
                                        lyrDefPoint.setShapeType(FShape.POINT);
598
                                        writer1.setFile(filePoints);
599
                                        writer1.initialize(lyrDefPoint);
600
                                        writers[0]=writer1;
601
                                        drivers[0]=getOpenShpDriver(filePoints);
602
                                        //drivers[0]=null;
603

    
604

    
605

    
606
                                        ShpWriter writer2 = (ShpWriter) LayerFactory.getWM().getWriter(
607
                                        "Shape Writer");
608
                                        // Lineas
609
                                        String auxLine = path.replaceFirst(".shp", "_line.shp");
610
                                        SHPLayerDefinition lyrDefLine = new SHPLayerDefinition();
611
                                        lyrDefLine.setFieldsDesc(fieldsDescrip);
612

    
613
                                        File fileLines = new File(auxLine);
614
                                        lyrDefLine.setFile(fileLines);
615
                                        lyrDefLine.setName(fileLines.getName());
616
                                        lyrDefLine.setShapeType(FShape.LINE);
617
                                        writer2.setFile(fileLines);
618
                                        writer2.initialize(lyrDefLine);
619
                                        writers[1]=writer2;
620
                                        drivers[1]=getOpenShpDriver(fileLines);
621
                                        //drivers[1]=null;
622

    
623
                                        ShpWriter writer3 = (ShpWriter) LayerFactory.getWM().getWriter(
624
                                        "Shape Writer");
625
                                        // Pol?gonos
626
                                        String auxPolygon = path.replaceFirst(".shp", "_polygons.shp");
627
                                        SHPLayerDefinition lyrDefPolygon = new SHPLayerDefinition();
628
                                        lyrDefPolygon.setFieldsDesc(fieldsDescrip);
629
                                        File filePolygons = new File(auxPolygon);
630
                                        lyrDefPolygon.setFile(filePolygons);
631
                                        lyrDefPolygon.setName(filePolygons.getName());
632
                                        lyrDefPolygon.setShapeType(FShape.POLYGON);
633
                                        writer3.setFile(filePolygons);
634
                                        writer3.initialize(lyrDefPolygon);
635
                                        writers[2]=writer3;
636
                                        drivers[2]=getOpenShpDriver(filePolygons);
637
                                        //drivers[2]=null;
638

    
639
                                        writeMultiFeatures(mapContext,layer, writers, drivers);
640
                                } else {
641
                                        ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter(
642
                                                "Shape Writer");
643
                                        IndexedShpDriver drv = getOpenShpDriver(newFile);
644
                                        SHPLayerDefinition lyrDef = new SHPLayerDefinition();
645
                                        lyrDef.setFieldsDesc(fieldsDescrip);
646
                                        lyrDef.setFile(newFile);
647
                                        lyrDef.setName(newFile.getName());
648
                                        lyrDef.setShapeType(layer.getShapeType());
649
                                        writer.setFile(newFile);
650
                                        writer.initialize(lyrDef);
651
                                        // CODIGO PARA EXPORTAR UN SHP A UN CHARSET DETERMINADO
652
                                        // ES UTIL PARA QUE UN DBF SE VEA CORRECTAMENTE EN EXCEL, POR EJEMPLO
653
//                                        Charset resul = (Charset) JOptionPane.showInputDialog((Component)PluginServices.getMDIManager().getActiveWindow(),
654
//                                                                PluginServices.getText(ExportTo.class, "select_charset_for_writing"),
655
//                                                                "Charset", JOptionPane.QUESTION_MESSAGE, null,
656
//                                                                Charset.availableCharsets().values().toArray(),
657
//                                                                writer.getCharsetForWriting().displayName());
658
//                                        if (resul == null)
659
//                                                return;
660
//                                        Charset charset = resul;
661
//                                        writer.setCharsetForWriting(charset);
662
                                        writeFeatures(mapContext, layer, writer, drv);
663

    
664
                                }
665
                        }
666
                } catch (DriverException e) {
667
                        e.printStackTrace();
668
                        throw new EditionException(e);
669
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
670
                        e.printStackTrace();
671
                        throw new EditionException(e);
672
                }
673
//                catch (IOException e) {
674
//                        e.printStackTrace();
675
//                        throw new EditionException(e);
676
//                }
677
                catch (IOException e) {
678
                        // TODO Auto-generated catch block
679
                        e.printStackTrace();
680
                }
681

    
682
        }
683
        /**
684
         * This method saves a layer to GML
685
         * @param mapContext
686
         * @param layer
687
         * @throws EditionException
688
         * @throws DriverIOException
689
         */
690
        public void saveToGml(MapContext mapContext, FLyrVect layer) throws EditionException, DriverIOException {
691
                try {
692
                        JFileChooser jfc = new JFileChooser();
693
                        SimpleFileFilter filterShp = new SimpleFileFilter("gml",
694
                                        PluginServices.getText(this, "gml_files"));
695
                        jfc.setFileFilter(filterShp);
696
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
697
                                File newFile = jfc.getSelectedFile();
698
                                String path = newFile.getAbsolutePath();
699
                                if (!(path.toLowerCase().endsWith(".gml"))) {
700
                                        path = path + ".gml";
701
                                }
702
                                newFile = new File(path);
703

    
704
                                GMLWriter writer = (GMLWriter)LayerFactory.getWM().getWriter("GML Writer");
705

    
706
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
707
                                SelectableDataSource sds = layer.getRecordset();
708
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
709
                                lyrDef.setFieldsDesc(fieldsDescrip);
710
                                lyrDef.setName(newFile.getName());
711
                                lyrDef.setShapeType(layer.getShapeType());
712

    
713
                                writer.setFile(newFile);
714
                                writer.setSchema(lyrDef);
715
                                writer.setBoundedBy(layer.getFullExtent(),layer.getProjection());
716
                                writer.initialize(lyrDef);
717
                                GMLDriver gmlDriver=new GMLDriver();
718
                                gmlDriver.open(newFile);
719
                                writeFeatures(mapContext, layer, writer, gmlDriver);
720
                        }
721

    
722
                } catch (DriverException e) {
723
                        e.printStackTrace();
724
                        throw new EditionException(e);
725
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
726
                        e.printStackTrace();
727
                        throw new EditionException(e);
728
                }
729
//                catch (IOException e) {
730
//                        e.printStackTrace();
731
//                        throw new EditionException(e);
732
//                }
733
                catch (IOException e) {
734
                        e.printStackTrace();
735
                }
736

    
737
        }
738
        private IndexedShpDriver getOpenShpDriver(File fileShp) throws IOException {
739
                IndexedShpDriver drv = new IndexedShpDriver();
740
                if (!fileShp.exists()) {
741
                        fileShp.createNewFile();
742
                        File newFileSHX=new File(fileShp.getAbsolutePath().replaceAll("[.]shp",".shx"));
743
                        newFileSHX.createNewFile();
744
                        File newFileDBF=new File(fileShp.getAbsolutePath().replaceAll("[.]shp",".dbf"));
745
                        newFileDBF.createNewFile();
746
                }
747
                drv.open(fileShp);
748
                return drv;
749
        }
750
        /**
751
         * @see com.iver.andami.plugins.IExtension#isEnabled()
752
         */
753
        public boolean isEnabled() {
754
                int status = EditionUtilities.getEditionStatus();
755
                if (( status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE || status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE)
756
                                || (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE)|| (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE))
757
                {
758
                        return true;
759
                }
760
                return false;
761
        }
762

    
763
        /**
764
         * @see com.iver.andami.plugins.IExtension#isVisible()
765
         */
766
        public boolean isVisible() {
767
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
768
                                .getActiveWindow();
769

    
770
                if (f == null) {
771
                        return false;
772
                }
773

    
774
                if (f instanceof View)
775
                        return true;
776
                return false;
777
        }
778

    
779
        private int findFileByName(FieldDescription[] fields, String fieldName){
780
        for (int i=0; i < fields.length; i++)
781
        {
782
                FieldDescription f = fields[i];
783
                if (f.getFieldName().equalsIgnoreCase(fieldName))
784
                {
785
                        return i;
786
                }
787
        }
788

    
789
                return -1;
790

    
791
        }
792
}