Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extCAD / src / com / iver / cit / gvsig / gui / cad / MyFinishAction.java @ 28394

History | View | Annotate | Download (11.4 KB)

1
package com.iver.cit.gvsig.gui.cad;
2

    
3
import java.awt.Component;
4
import java.io.File;
5
import java.sql.Types;
6

    
7
import javax.swing.JOptionPane;
8

    
9
import jwizardcomponent.FinishAction;
10
import jwizardcomponent.JWizardComponents;
11

    
12
import org.cresques.cts.IProjection;
13

    
14
import com.hardcode.driverManager.Driver;
15
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
16
import com.iver.andami.PluginServices;
17
import com.iver.andami.messages.NotificationManager;
18
import com.iver.cit.gvsig.CADExtension;
19
import com.iver.cit.gvsig.StartEditing;
20
import com.iver.cit.gvsig.exceptions.layers.StartEditionLayerException;
21
import com.iver.cit.gvsig.fmap.MapControl;
22
import com.iver.cit.gvsig.fmap.core.FShape;
23
import com.iver.cit.gvsig.fmap.core.ICanReproject;
24
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
25
import com.iver.cit.gvsig.fmap.drivers.ConnectionFactory;
26
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
27
import com.iver.cit.gvsig.fmap.drivers.DXFLayerDefinition;
28
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
29
import com.iver.cit.gvsig.fmap.drivers.IConnection;
30
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
31
import com.iver.cit.gvsig.fmap.drivers.IVectorialJDBCDriver;
32
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
33
import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver;
34
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
35
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
36
import com.iver.cit.gvsig.fmap.edition.rules.IRule;
37
import com.iver.cit.gvsig.fmap.edition.rules.RulePolygon;
38
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
39
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
40
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
41
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
42
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
43
import com.iver.cit.gvsig.gui.cad.panels.ChooseGeometryType;
44
import com.iver.cit.gvsig.gui.cad.panels.FileBasedPanel;
45
import com.iver.cit.gvsig.gui.cad.panels.JPanelFieldDefinition;
46
import com.iver.cit.gvsig.gui.cad.panels.PostGISpanel;
47
import com.iver.cit.gvsig.project.documents.view.gui.View;
48
import com.iver.cit.gvsig.vectorialdb.ConnectionSettings;
49

    
50
public class MyFinishAction extends FinishAction
51
{
52
        JWizardComponents myWizardComponents;
53
        FinishAction oldAction;
54
        ITableDefinition lyrDef = null;
55
        View view;
56
        String actionComand;
57
        public MyFinishAction(JWizardComponents wizardComponents, View view, String actionComand) {
58
                super(wizardComponents);
59
                oldAction = wizardComponents.getFinishAction();
60
                myWizardComponents = wizardComponents;
61
                this.view = view;
62
                this.actionComand = actionComand;
63
                // TODO Auto-generated constructor stub
64
        }
65

    
66
        public void performAction() {
67
                FLyrVect lyr = null;
68
                MapControl mapCtrl = view.getMapControl();
69
                try {
70
                        // ChooseWriteDriver driverPanel = (ChooseWriteDriver) myWizardComponents.getWizardPanel(0);
71
                        mapCtrl.getMapContext().beginAtomicEvent();
72
                        if (actionComand.equals("SHP"))
73
                        {
74
                                FileBasedPanel shpPanel = (FileBasedPanel) myWizardComponents.getWizardPanel(2);
75
                                String path=shpPanel.getPath();
76
                                if (!path.toLowerCase().endsWith(".shp")){
77
                                        path+=".shp";
78
                                }
79
                                File newFile = new File(path);
80
                                if( newFile.exists()){
81
                                        int resp = JOptionPane.showConfirmDialog(
82
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
83
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
84
                                        if (resp != JOptionPane.YES_OPTION) {
85
                                                return;
86
                                        }
87
                                }
88
                                ChooseGeometryType geometryTypePanel = (ChooseGeometryType) myWizardComponents.getWizardPanel(0);
89
                                JPanelFieldDefinition fieldDefinitionPanel = (JPanelFieldDefinition) myWizardComponents.getWizardPanel(1);
90

    
91

    
92
                                String layerName = geometryTypePanel.getLayerName();
93
                                String selectedDriver = geometryTypePanel.getSelectedDriver();
94
                                int geometryType = geometryTypePanel.getSelectedGeometryType();
95
                                FieldDescription[] fieldsDesc = fieldDefinitionPanel.getFieldsDescription();
96

    
97
                                Driver drv = LayerFactory.getDM().getDriver(selectedDriver);
98

    
99

    
100

    
101
                        SHPLayerDefinition lyrDef = new SHPLayerDefinition();
102
                        lyrDef.setFieldsDesc(fieldsDesc);
103
                        lyrDef.setFile(newFile);
104
                        lyrDef.setName(layerName);
105
                        lyrDef.setShapeType(geometryType);
106
                            ShpWriter writer= (ShpWriter)LayerFactory.getWM().getWriter("Shape Writer");
107
                            writer.setFile(newFile);
108
                            writer.initialize(lyrDef);
109
                            writer.preProcess();
110
                            writer.postProcess();
111

    
112

    
113
                lyr = (FLyrVect) LayerFactory.createLayer(layerName,
114
                        (VectorialFileDriver) drv, newFile, mapCtrl.getProjection());
115

    
116
                        }
117
                        else if (actionComand.equals("DXF"))
118
                        {
119
                            FileBasedPanel dxfPanel = (FileBasedPanel) myWizardComponents.getWizardPanel(0);
120
                            String path=dxfPanel.getPath();
121
                                if (!path.toLowerCase().endsWith(".dxf")){
122
                                        path+=".dxf";
123
                                }
124
                            File newFile = new File(path);
125
                        if( newFile.exists()){
126
                                        int resp = JOptionPane.showConfirmDialog(
127
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
128
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
129
                                        if (resp != JOptionPane.YES_OPTION) {
130
                                                return;
131
                                        }
132
                                }
133
                        DXFLayerDefinition lyrDef = new DXFLayerDefinition();
134
                        lyrDef.setFile(newFile);
135
                        String layerName = newFile.getName();
136
                        lyrDef.setName(layerName);
137
                            DxfWriter writer= (DxfWriter)LayerFactory.getWM().getWriter("DXF Writer");
138
                            writer.setFile(newFile);
139
                            DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
140
                            fieldsMapping.setLayerField("Layer");
141
                            fieldsMapping.setColorField("Color");
142
                            fieldsMapping.setElevationField("Elevation");
143
                            fieldsMapping.setThicknessField("Thickness");
144
                            fieldsMapping.setTextField("Text");
145
                            fieldsMapping.setHeightText("HeightText");
146
                            fieldsMapping.setRotationText("RotationText");
147
                            writer.setFieldMapping(fieldsMapping);
148
                            writer.setProjection(mapCtrl.getProjection());
149
                            writer.initialize(lyrDef);
150
                            writer.preProcess();
151
                            writer.postProcess();
152
                            Driver drv = LayerFactory.getDM().getDriver("gvSIG DXF Memory Driver");
153

    
154
                lyr = (FLyrVect) LayerFactory.createLayer(layerName,
155
                        (VectorialFileDriver) drv, newFile, mapCtrl.getProjection());
156

    
157
                        }
158
                        else if (actionComand.equals("POSTGIS"))
159
                        {
160
                                ChooseGeometryType geometryTypePanel = (ChooseGeometryType) myWizardComponents.getWizardPanel(0);
161
                                JPanelFieldDefinition fieldDefinitionPanel = (JPanelFieldDefinition) myWizardComponents.getWizardPanel(1);
162

    
163

    
164
                                String layerName = geometryTypePanel.getLayerName();
165
                                String selectedDriver = geometryTypePanel.getSelectedDriver();
166
                                int geometryType = geometryTypePanel.getSelectedGeometryType();
167
                                FieldDescription[] fieldsDesc = fieldDefinitionPanel.getFieldsDescription();
168

    
169
                                Driver drv = LayerFactory.getDM().getDriver(selectedDriver);
170

    
171
                                IVectorialJDBCDriver dbDriver = (IVectorialJDBCDriver) drv;
172
                            PostGISpanel postgisPanel = (PostGISpanel) myWizardComponents.getWizardPanel(2);
173
                                ConnectionSettings cs = postgisPanel.getConnSettings();
174
                                if (cs == null)
175
                                        return;
176
                                IConnection conex = ConnectionFactory.createConnection(cs.getConnectionString(),
177
                                                cs.getUser(), cs.getPassw());
178

    
179
                                DBLayerDefinition dbLayerDef = new DBLayerDefinition();
180
                                dbLayerDef.setCatalogName(cs.getDb());
181
                                dbLayerDef.setSchema(cs.getSchema());
182
                                dbLayerDef.setTableName(layerName);
183
                                dbLayerDef.setShapeType(geometryType);
184
                                dbLayerDef.setFieldsDesc(fieldsDesc);
185
                                dbLayerDef.setFieldGeometry("the_geom");
186
                                dbLayerDef.setFieldID("gid");
187

    
188
                                dbLayerDef.setWhereClause("");
189
                                String strSRID = mapCtrl.getProjection().getAbrev()
190
                                                .substring(5);
191
                                dbLayerDef.setSRID_EPSG(strSRID);
192
                                dbLayerDef.setConnection(conex);
193

    
194
                            PostGISWriter writer= new PostGISWriter(); //(PostGISWriter)LayerFactory.getWM().getWriter("PostGIS Writer");
195
                            writer.setWriteAll(true);
196
                            writer.setCreateTable(true);
197
                            writer.initialize(dbLayerDef);
198

    
199
                            // Creamos la tabla.
200
                            writer.preProcess();
201
                            writer.postProcess();
202

    
203
                    if (dbDriver instanceof ICanReproject)
204
                    {
205
                        ((ICanReproject)dbDriver).setDestProjection(strSRID);
206
                    }
207

    
208
                    // Creamos el driver. OJO: Hay que a?adir el campo ID a la
209
                    // definici?n de campos.
210

    
211
                    boolean bFound = false;
212
                    for (int i=0; i < dbLayerDef.getFieldsDesc().length; i++)
213
                    {
214
                            FieldDescription f = dbLayerDef.getFieldsDesc()[i];
215
                            if (f.getFieldName().equalsIgnoreCase(dbLayerDef.getFieldID()))
216
                            {
217
                                    bFound = true;
218
                                    break;
219
                            }
220
                    }
221
                    // Si no est?, lo a?adimos
222
                    if (!bFound)
223
                    {
224
                            int numFieldsAnt = dbLayerDef.getFieldsDesc().length;
225
                            FieldDescription[] newFields = new FieldDescription[dbLayerDef.getFieldsDesc().length + 1];
226
                        for (int i=0; i < numFieldsAnt; i++)
227
                        {
228
                                newFields[i] = dbLayerDef.getFieldsDesc()[i];
229
                        }
230
                        newFields[numFieldsAnt] = new FieldDescription();
231
                        newFields[numFieldsAnt].setFieldDecimalCount(0);
232
                        newFields[numFieldsAnt].setFieldType(Types.INTEGER);
233
                        newFields[numFieldsAnt].setFieldLength(7);
234
                        newFields[numFieldsAnt].setFieldName(dbLayerDef.getFieldID());
235
                        dbLayerDef.setFieldsDesc(newFields);
236

    
237
                    }
238

    
239
                // all fields to lowerCase
240
                         FieldDescription field;
241
                         for (int i=0;i<dbLayerDef.getFieldsDesc().length;i++){
242
                                 field = dbLayerDef.getFieldsDesc()[i];
243
                                 field.setFieldName(field.getFieldName().toLowerCase());
244
                         }
245
                         dbLayerDef.setFieldID(dbLayerDef.getFieldID().toLowerCase());
246
                         dbLayerDef.setFieldGeometry(dbLayerDef.getFieldGeometry().toLowerCase());
247

    
248
                    dbDriver.setData(conex, dbLayerDef);
249
                    IProjection proj = null;
250
                    if (drv instanceof ICanReproject)
251
                    {
252
                             proj = CRSFactory.getCRS("EPSG:" + ((ICanReproject)dbDriver).getSourceProjection(null,null));
253
                    }
254

    
255
                            lyr = (FLyrVect) LayerFactory.createDBLayer(dbDriver, layerName, proj);
256
                            postgisPanel.saveConnectionSettings();
257

    
258
                        }
259
                        else // Si no es ni lo uno ni lo otro,
260
                        {
261

    
262

    
263
                        }
264
                } catch (Exception e) {
265
                        NotificationManager.showMessageError(e.getLocalizedMessage(),e);
266
                        return;
267
                }
268
        lyr.setVisible(true);
269

    
270
                mapCtrl.getMapContext().getLayers().addLayer(lyr);
271

    
272
                mapCtrl.getMapContext().endAtomicEvent();
273
                lyr.addLayerListener(CADExtension.getEditionManager());
274
                lyr.setActive(true);
275

    
276
                try {
277
                        lyr.setEditing(true);
278
                VectorialEditableAdapter vea = (VectorialEditableAdapter) lyr.getSource();
279
                        vea.getRules().clear();
280
                        // TODO: ESTO ES PROVISIONAL, DESCOMENTAR LUEGO
281
                        if (vea.getShapeType() == FShape.POLYGON)
282
                        {
283
                                IRule rulePol = new RulePolygon();
284
                                vea.getRules().add(rulePol);
285
                        }
286
                        StartEditing.startCommandsApplicable(view,lyr);
287
                vea.getCommandRecord().addCommandListener(mapCtrl);
288
                view.showConsole();
289

    
290
                        // Para cerrar el cuadro de di?logo.
291
                        oldAction.performAction();
292
                } catch (ReadDriverException e) {
293
                        NotificationManager.addError(e);
294
                } catch (StartEditionLayerException e) {
295
                        NotificationManager.addError(e);
296
                }
297

    
298

    
299
        }
300

    
301
}
302