Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extOracleSpatial / src / org / gvsig / oraclespatial / gui / RepeatedFieldDefinitionPanel.java @ 29455

History | View | Annotate | Download (11.7 KB)

1
package org.gvsig.oraclespatial.gui;
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

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

    
36

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

    
45
        private IWriter writer = null;
46

    
47

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

    
54

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

    
77
                }
78

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

    
90
                if (valid)
91
                        super.next();
92

    
93
        }
94

    
95
        public void setWriter(IWriter writer) {
96
                this.writer = writer;
97
        }
98

    
99
        public IWriter getWriter() {
100
                return this.writer;
101
        }
102

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

    
117

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

    
154

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

    
169

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

    
183

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

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

    
196

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

    
203

    
204

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

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

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

    
232

    
233
                }
234
                return jTable;
235
        }
236

    
237

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

    
254

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

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

    
288

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

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

    
307
                                        TableColumn widthColumn = jTable.getColumnModel().getColumn(2);
308

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

    
313
                }
314
                return jButtonAddField;
315
        }
316

    
317

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

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

    
343

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

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

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

    
375
                }
376

    
377
                return fieldsDesc;
378
        }
379

    
380

    
381

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