Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extOracleSpatial / src / es / prodevelop / cit / gvsig / jdbc_spatial / gui / jdbcwizard / RepeatedFieldDefinitionPanel.java @ 18370

History | View | Annotate | Download (11.5 KB)

1
package es.prodevelop.cit.gvsig.jdbc_spatial.gui.jdbcwizard;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Component;
5
import java.sql.Types;
6
import java.util.ArrayList;
7

    
8
import javax.swing.DefaultCellEditor;
9
import javax.swing.JButton;
10
import javax.swing.JComboBox;
11
import javax.swing.JLabel;
12
import javax.swing.JOptionPane;
13
import javax.swing.JPanel;
14
import javax.swing.JScrollPane;
15
import javax.swing.JTable;
16
import javax.swing.ListSelectionModel;
17
import javax.swing.event.ListSelectionEvent;
18
import javax.swing.event.ListSelectionListener;
19
import javax.swing.table.DefaultTableModel;
20
import javax.swing.table.TableColumn;
21

    
22
import jwizardcomponent.JWizardComponents;
23
import jwizardcomponent.JWizardPanel;
24

    
25
import com.iver.andami.PluginServices;
26
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
27
import com.iver.cit.gvsig.fmap.edition.IWriter;
28

    
29
/**
30
 * @author fjp
31
 *
32
 * Panel para que el usuario seleccione el driver que va a utilizar para
33
 * crear un tema desde cero
34
 *
35
 */
36
public class RepeatedFieldDefinitionPanel extends JWizardPanel {
37

    
38

    
39
        private JLabel jLabel = null;
40
        private JScrollPane jScrollPane = null;
41
        private JTable jTable = null;
42
        private JPanel jPanelEast = null;
43
        private JButton jButtonAddField = null;
44
        private JButton jButtonDeleteField = null;
45
        private int MAX_FIELD_LENGTH = 254;
46

    
47
        private IWriter writer = null;
48

    
49

    
50
        public RepeatedFieldDefinitionPanel(JWizardComponents wizardComponents) {
51
                super(wizardComponents, null);
52
                initialize();
53
                // TODO Auto-generated constructor stub
54
        }
55

    
56

    
57
        /* (non-Javadoc)
58
         * @see jwizardcomponent.JWizardPanel#next()
59
         */
60
        public void next() {
61
                DefaultTableModel tm=(DefaultTableModel) jTable.getModel();
62
                boolean valid=true;
63
                for (int i = 0;i<tm.getRowCount();i++) {
64
                                String s=(String)tm.getValueAt(i,0);
65
                                valid=validate(s);
66
                                String size=(String) tm.getValueAt(i,2);
67
                                valid=valid && validateInteger(size);
68
                                if (!valid){
69
                                        return;
70
                                }
71
                                String type = (String) tm.getValueAt(i,1);
72
                                int length = Integer.parseInt((String) tm.getValueAt(i,2));
73
                                if (type.equals("String") && length > MAX_FIELD_LENGTH) {
74
                                        JOptionPane.showMessageDialog(this, PluginServices.getText(this, "max_length_is") + ": " + MAX_FIELD_LENGTH+
75
                                                        "\n"+PluginServices.getText(this, "length_of_field")+ " '"+ s + "' " + PluginServices.getText(this, "will_be_truncated"));
76
                                        tm.setValueAt(String.valueOf(MAX_FIELD_LENGTH),i,2);
77
                                }
78

    
79
                }
80

    
81
                // ensure no field name is used more than once
82
                ArrayList fieldNames = new ArrayList();
83
                for (int i = 0; i < jTable.getRowCount(); i++) {
84
                        if (fieldNames.contains(tm.getValueAt(i,0))) {
85
                                valid = false;
86
                                JOptionPane.showMessageDialog(this, PluginServices.getText(this, "two_or_more_fields_with_the_same_name"));
87
                                break;
88
                        }
89
                        fieldNames.add(tm.getValueAt(i, 0));
90
                }
91

    
92
                if (valid)
93
                        super.next();
94

    
95
        }
96

    
97
        public void setWriter(IWriter writer) {
98
                this.writer = writer;
99
        }
100

    
101
        public IWriter getWriter() {
102
                return this.writer;
103
        }
104

    
105
        private boolean validateInteger(String size) {
106
                boolean valid=true;
107
                try{
108
                Integer.parseInt(size);
109
                }catch (NumberFormatException e) {
110
                        valid=false;
111
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
112
                                        PluginServices.getText(this,"no_puede_continuar")+"\n"+
113
                                        PluginServices.getText(this,"size")+" : "+size+"\n"+
114
                                        PluginServices.getText(this,"incorrect_value"));
115
                }
116
                return valid;
117
        }
118

    
119

    
120
        private boolean validate(String s) {
121
                boolean valid=true;
122
                if (s.equals("")) {
123
                        valid=false;
124
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
125
                                        PluginServices.getText(this,"no_puede_continuar")+"\n"+
126
                                        PluginServices.getText(this,"the_field_name_is_required"));
127
                }
128
                if (s.indexOf(" ")!=-1) {
129
                        valid=false;
130
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
131
                                        PluginServices.getText(this,"no_puede_continuar")+"\n"+
132
                                        PluginServices.getText(this,"field")+" : "+s+"\n"+
133
                                        PluginServices.getText(this,"contiene_espacios_en_blanco"));
134
                }
135
                if (this.writer != null && this.writer.getCapability("FieldNameMaxLength") != null) {
136
                        String value = writer.getCapability("FieldNameMaxLength");
137
                        int intValue;
138
                        try {
139
                                intValue = Integer.parseInt(value);
140
                        } catch (NumberFormatException e) {
141
                                intValue = 0;
142
                        }
143
                        if (intValue > 0 && s.length() > intValue) {
144
                                valid=false;
145
                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
146
                                                PluginServices.getText(this,"no_puede_continuar")+"\n"+
147
                                                PluginServices.getText(this,"field")+" : "+s+"\n"+
148
                                                PluginServices.getText(this,"too_long_name")+"\n"+
149
                                                PluginServices.getText(this,"maximun_name_size")+" : "+intValue+"\n"
150
                                                );
151
                        }
152
                }
153
                return valid;
154
        }
155

    
156

    
157
        /**
158
         * This method initializes this
159
         *
160
         */
161
        private void initialize() {
162
        jLabel = new JLabel();
163
        jLabel.setText(PluginServices.getText(this,"define_fields"));
164
        this.setLayout(new BorderLayout(5,5));
165
        this.setSize(new java.awt.Dimension(499,232));
166
        this.add(jLabel, java.awt.BorderLayout.NORTH);
167
        this.add(getJScrollPane(), java.awt.BorderLayout.CENTER);
168
        this.add(getJPanelEast(), java.awt.BorderLayout.EAST);
169
        }
170

    
171

    
172
        /**
173
         * This method initializes jScrollPane
174
         *
175
         * @return javax.swing.JScrollPane
176
         */
177
        private JScrollPane getJScrollPane() {
178
                if (jScrollPane == null) {
179
                        jScrollPane = new JScrollPane();
180
                        jScrollPane.setViewportView(getJTable());
181
                }
182
                return jScrollPane;
183
        }
184

    
185

    
186
        /**
187
         * This method initializes jTable
188
         *
189
         * @return javax.swing.JTable
190
         */
191
        private JTable getJTable() {
192
                if (jTable == null) {
193
                        jTable = new JTable();
194

    
195
                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
196
                        tm.addColumn(PluginServices.getText(this,"field"));
197

    
198

    
199
                        // TableColumn fieldTypeColumn = new TableColumn(1);
200
                        // fieldTypeColumn.setHeaderValue("Type");
201
                        // jTable.addColumn(fieldTypeColumn);
202
                        tm.addColumn(PluginServices.getText(this,"type"));
203
                        // MIRAR EL C?DIGO DEL BOT?N DE A?ADIR CAMPO PARA VER EL CellEditor con comboBox
204

    
205

    
206

    
207
                        /* TableColumn fieldLengthColumn = new TableColumn(2);
208
                        fieldLengthColumn.setHeaderValue("Length");
209
                        // fieldLengthColumn.setCellRenderer(new DefaultTableCellRenderer());
210
                        jTable.addColumn(fieldLengthColumn); */
211
                        tm.addColumn(PluginServices.getText(this,"length"));
212

    
213
//                        Ask to be notified of selection changes.
214
                        ListSelectionModel rowSM = jTable.getSelectionModel();
215
                        rowSM.addListSelectionListener(new ListSelectionListener() {
216
                            public void valueChanged(ListSelectionEvent e) {
217
                                //Ignore extra messages.
218
                                if (e.getValueIsAdjusting()) return;
219

    
220
                                ListSelectionModel lsm =
221
                                    (ListSelectionModel)e.getSource();
222
                                if (lsm.isSelectionEmpty()) {
223
                                    //no rows are selected
224
                                        jButtonDeleteField.setEnabled(false);
225
                                } else {
226
                                    // int selectedRow = lsm.getMinSelectionIndex();
227
                                    //selectedRow is selected
228
                                        jButtonDeleteField.setEnabled(true);
229
                                }
230
                            }
231
                        });
232
                        jTable.getColumn(PluginServices.getText(this,"field")).setWidth(180);
233

    
234

    
235
                }
236
                return jTable;
237
        }
238

    
239

    
240
        /**
241
         * This method initializes jPanelWest
242
         *
243
         * @return javax.swing.JPanel
244
         */
245
        private JPanel getJPanelEast() {
246
                if (jPanelEast == null) {
247
                        jPanelEast = new JPanel();
248
                        jPanelEast.setLayout(null);
249
                        jPanelEast.setPreferredSize(new java.awt.Dimension(170,100));
250
                        jPanelEast.add(getJButtonAddField(), null);
251
                        jPanelEast.add(getJButtonDeleteField(), null);
252
                }
253
                return jPanelEast;
254
        }
255

    
256

    
257
        /**
258
         * This method initializes jButtonAddField
259
         *
260
         * @return javax.swing.JButton
261
         */
262
        private JButton getJButtonAddField() {
263
                if (jButtonAddField == null) {
264
                        jButtonAddField = new JButton();
265
                        jButtonAddField.setText(PluginServices.getText(this,"add_field"));
266
                        jButtonAddField.setLocation(new java.awt.Point(7,5));
267
                        jButtonAddField.setSize(new java.awt.Dimension(145,23));
268
                        jButtonAddField.setPreferredSize(new java.awt.Dimension(100,26));
269
                        jButtonAddField.addActionListener(new java.awt.event.ActionListener() {
270
                                public void actionPerformed(java.awt.event.ActionEvent e) {
271
                                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
272

    
273
                                        // Figure out a suitable field name
274
                                        ArrayList fieldNames = new ArrayList();
275
                                        for (int i = 0; i < jTable.getRowCount(); i++) {
276
                                                fieldNames.add(tm.getValueAt(i, 0));
277
                                        }
278
                                        String[] currentFieldNames = (String[]) fieldNames.toArray(new String[0]);
279
                                        String newField = PluginServices.getText(this, "field").replaceAll(" +", "_");
280
                                        int index=0;
281
                                        for (int i = 0; i < currentFieldNames.length; i++) {
282
                                                if (currentFieldNames[i].startsWith(newField)) {
283
                                                        try {
284
                                                                index = Integer.parseInt(currentFieldNames[i].replaceAll(newField,""));
285
                                                        } catch (Exception ex) { /* we don't care */}
286
                                                }
287
                                        }
288
                                        String newFieldName = newField+(++index);
289

    
290

    
291
                                        // Add a new row
292
                                        Object[] newRow = new Object[tm.getColumnCount()];
293
                                        newRow[0] = newFieldName;
294
                                        newRow[1] = "String";
295
                                        newRow[2] = "20";
296
                                        tm.addRow(newRow);
297

    
298
                                        // Esto lo a?ado aqu? porque si no tiene registros, no hace caso. (Por eso no
299
                                        // lo pongo en getJTable()
300
                                        TableColumn typeColumn = jTable.getColumnModel().getColumn(1);
301
                                        JComboBox comboBox = new JComboBox();
302
                                        comboBox.addItem("Boolean");
303
                                        comboBox.addItem("Date");
304
                                        comboBox.addItem("Integer");
305
                                        comboBox.addItem("Double");
306
                                        comboBox.addItem("String");
307
                                        typeColumn.setCellEditor(new DefaultCellEditor(comboBox));
308

    
309
                                        TableColumn widthColumn = jTable.getColumnModel().getColumn(2);
310

    
311
                                        // tm.setValueAt("NewField", tm.getRowCount()-1, 0);
312
                                }
313
                        });
314

    
315
                }
316
                return jButtonAddField;
317
        }
318

    
319

    
320
        /**
321
         * This method initializes jButton
322
         *
323
         * @return javax.swing.JButton
324
         */
325
        private JButton getJButtonDeleteField() {
326
                if (jButtonDeleteField == null) {
327
                        jButtonDeleteField = new JButton();
328
                        jButtonDeleteField.setText(PluginServices.getText(this,"delete_field"));
329
                        jButtonDeleteField.setLocation(new java.awt.Point(7,33));
330
                        jButtonDeleteField.setSize(new java.awt.Dimension(145,23));
331
                        jButtonDeleteField.setEnabled(false);
332
                        jButtonDeleteField.addActionListener(new java.awt.event.ActionListener() {
333
                                public void actionPerformed(java.awt.event.ActionEvent e) {
334
                                        int[] selecteds = jTable.getSelectedRows();
335
                                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
336

    
337
                                        for (int i=selecteds.length-1; i >=0; i--)
338
                                                tm.removeRow(selecteds[i]);
339
                                }
340
                        });
341
                }
342
                return jButtonDeleteField;
343
        }
344

    
345

    
346
        /**
347
         * Convierte lo que hay en la tabla en una definici?n de campos
348
         * adecuada para crear un LayerDefinition
349
         * @return
350
         */
351
        public FieldDescription[] getFieldsDescription() {
352
                DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
353
                FieldDescription[] fieldsDesc = new FieldDescription[tm.getRowCount()];
354

    
355
                for (int i=0; i < tm.getRowCount(); i++)
356
                {
357
                        fieldsDesc[i] = new FieldDescription();
358
                        fieldsDesc[i].setFieldName((String) tm.getValueAt(i,0));
359
                        String strType = (String) tm.getValueAt(i,1);
360
                        if (strType.equals("String"))
361
                                fieldsDesc[i].setFieldType(Types.VARCHAR);
362
                        if (strType.equals("Double"))
363
                                fieldsDesc[i].setFieldType(Types.DOUBLE);
364
                        if (strType.equals("Integer"))
365
                                fieldsDesc[i].setFieldType(Types.INTEGER);
366
                        if (strType.equals("Boolean"))
367
                                fieldsDesc[i].setFieldType(Types.BOOLEAN);
368
                        if (strType.equals("Date"))
369
                                fieldsDesc[i].setFieldType(Types.DATE);
370
                        int fieldLength = Integer.parseInt((String) tm.getValueAt(i,2));
371
                        fieldsDesc[i].setFieldLength(fieldLength);
372

    
373
                        // TODO: HACERLO BIEN
374
                        if (strType.equals("Double"))
375
                                fieldsDesc[i].setFieldDecimalCount(5);
376

    
377
                }
378

    
379
                return fieldsDesc;
380
        }
381

    
382

    
383

    
384
}  //  @jve:decl-index=0:visual-constraint="10,10"