Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / org.gvsig.oracle / src / org / gvsig / oracle / gui / RepeatedFieldDefinitionPanel.java @ 29865

History | View | Annotate | Download (10.3 KB)

1
package org.gvsig.oracle.gui;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Component;
5
import java.util.ArrayList;
6
import java.util.List;
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
import javax.swing.table.TableModel;
22

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

    
26
import org.gvsig.andami.PluginServices;
27

    
28

    
29

    
30
/**
31
 * @author fjp
32
 * 
33
 *         Panel para que el usuario defina los campos de la nueva tabla
34
 * 
35
 */
36
public class RepeatedFieldDefinitionPanel extends JWizardPanel {
37

    
38
        private static final long serialVersionUID = 1L;
39

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

    
48
        /**
49
         * Constructor
50
         * 
51
         * @param wizardComponents
52
         */
53
        public RepeatedFieldDefinitionPanel(JWizardComponents wizardComponents) {
54
                super(wizardComponents, null);
55
                initialize();
56

    
57
        }
58

    
59
        /**
60
         * Get table model
61
         * 
62
         * @return
63
         */
64
        public TableModel getFieldsDescription() {
65
                return jTable.getModel();
66
        }
67

    
68
        /*
69
         * (non-Javadoc)
70
         * 
71
         * @see jwizardcomponent.JWizardPanel#next()
72
         */
73
        public void next() {
74
                DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
75
                boolean valid = true;
76
                for (int i = 0; i < tm.getRowCount(); i++) {
77
                        String s = (String) tm.getValueAt(i, 0);
78
                        valid = validate(s);
79
                        String size = (String) tm.getValueAt(i, 2);
80
                        valid = valid && validateInteger(size);
81
                        if (!valid) {
82
                                return;
83
                        }
84
                        String type = (String) tm.getValueAt(i, 1);
85
                        int length = Integer.parseInt((String) tm.getValueAt(i, 2));
86
                        if (type.equals("String") && length > MAX_FIELD_LENGTH) {
87
                                JOptionPane.showMessageDialog(this, PluginServices.getText(
88
                                                this, "max_length_is")
89
                                                + ": "
90
                                                + MAX_FIELD_LENGTH
91
                                                + "\n"
92
                                                + PluginServices.getText(this, "length_of_field")
93
                                                + " '"
94
                                                + s
95
                                                + "' "
96
                                                + PluginServices.getText(this, "will_be_truncated"));
97
                                tm.setValueAt(String.valueOf(MAX_FIELD_LENGTH), i, 2);
98
                        }
99

    
100
                }
101

    
102
                // ensure no field name is used more than once
103
                List<Object> fieldNames = new ArrayList<Object>();
104
                for (int i = 0; i < jTable.getRowCount(); i++) {
105
                        if (fieldNames.contains(tm.getValueAt(i, 0))) {
106
                                valid = false;
107
                                JOptionPane.showMessageDialog(this, PluginServices.getText(
108
                                                this, "two_or_more_fields_with_the_same_name"));
109
                                break;
110
                        }
111
                        fieldNames.add(tm.getValueAt(i, 0));
112
                }
113

    
114
                if (valid)
115
                        super.next();
116

    
117
        }
118

    
119
        /**
120
         * 
121
         * @param size
122
         * @return
123
         */
124
        private boolean validateInteger(String size) {
125
                boolean valid = true;
126
                try {
127
                        Integer.parseInt(size);
128
                } catch (NumberFormatException e) {
129
                        valid = false;
130
                        JOptionPane.showMessageDialog((Component) PluginServices
131
                                        .getMainFrame(), PluginServices.getText(this,
132
                                        "no_puede_continuar")
133
                                        + "\n"
134
                                        + PluginServices.getText(this, "size")
135
                                        + " : "
136
                                        + size
137
                                        + "\n"
138
                                        + PluginServices.getText(this, "incorrect_value"));
139
                }
140
                return valid;
141
        }
142

    
143
        /**
144
         * 
145
         * @param s
146
         * @return
147
         */
148
        private boolean validate(String s) {
149
                boolean valid = true;
150
                if (s.equals("")) {
151
                        valid = false;
152
                        JOptionPane.showMessageDialog((Component) PluginServices
153
                                        .getMainFrame(), PluginServices.getText(this,
154
                                        "no_puede_continuar")
155
                                        + "\n"
156
                                        + PluginServices
157
                                                        .getText(this, "the_field_name_is_required"));
158
                }
159
                if (s.indexOf(" ") != -1) {
160
                        valid = false;
161
                        JOptionPane.showMessageDialog((Component) PluginServices
162
                                        .getMainFrame(), PluginServices.getText(this,
163
                                        "no_puede_continuar")
164
                                        + "\n"
165
                                        + PluginServices.getText(this, "field")
166
                                        + " : "
167
                                        + s
168
                                        + "\n"
169
                                        + PluginServices.getText(this,
170
                                                        "contiene_espacios_en_blanco"));
171
                }
172
                return valid;
173
        }
174

    
175
        /**
176
         * This method initializes this
177
         * 
178
         */
179
        private void initialize() {
180
                jLabel = new JLabel();
181
                jLabel.setText(PluginServices.getText(this, "define_fields"));
182
                this.setLayout(new BorderLayout(5, 5));
183
                this.setSize(new java.awt.Dimension(499, 232));
184
                this.add(jLabel, java.awt.BorderLayout.NORTH);
185
                this.add(getJScrollPane(), java.awt.BorderLayout.CENTER);
186
                this.add(getJPanelEast(), java.awt.BorderLayout.EAST);
187
        }
188

    
189
        /**
190
         * This method initializes jScrollPane
191
         * 
192
         * @return javax.swing.JScrollPane
193
         */
194
        private JScrollPane getJScrollPane() {
195
                if (jScrollPane == null) {
196
                        jScrollPane = new JScrollPane();
197
                        jScrollPane.setViewportView(getJTable());
198
                }
199
                return jScrollPane;
200
        }
201

    
202
        /**
203
         * This method initializes jTable
204
         * 
205
         * @return javax.swing.JTable
206
         */
207
        private JTable getJTable() {
208
                if (jTable == null) {
209
                        jTable = new JTable();
210

    
211
                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
212
                        tm.addColumn(PluginServices.getText(this, "field"));
213

    
214
                        // TableColumn fieldTypeColumn = new TableColumn(1);
215
                        // fieldTypeColumn.setHeaderValue("Type");
216
                        // jTable.addColumn(fieldTypeColumn);
217
                        tm.addColumn(PluginServices.getText(this, "type"));
218
                        // MIRAR EL C?DIGO DEL BOT?N DE A?ADIR CAMPO PARA VER EL CellEditor
219
                        // con comboBox
220

    
221
                        /*
222
                         * TableColumn fieldLengthColumn = new TableColumn(2);
223
                         * fieldLengthColumn.setHeaderValue("Length"); //
224
                         * fieldLengthColumn.setCellRenderer(new
225
                         * DefaultTableCellRenderer()); jTable.addColumn(fieldLengthColumn);
226
                         */
227
                        tm.addColumn(PluginServices.getText(this, "length"));
228

    
229
                        // Ask to be notified of selection changes.
230
                        ListSelectionModel rowSM = jTable.getSelectionModel();
231
                        rowSM.addListSelectionListener(new ListSelectionListener() {
232
                                public void valueChanged(ListSelectionEvent e) {
233
                                        // Ignore extra messages.
234
                                        if (e.getValueIsAdjusting())
235
                                                return;
236

    
237
                                        ListSelectionModel lsm = (ListSelectionModel) e.getSource();
238
                                        if (lsm.isSelectionEmpty()) {
239
                                                // no rows are selected
240
                                                jButtonDeleteField.setEnabled(false);
241
                                        } else {
242
                                                // int selectedRow = lsm.getMinSelectionIndex();
243
                                                // selectedRow is selected
244
                                                jButtonDeleteField.setEnabled(true);
245
                                        }
246
                                }
247
                        });
248
                        jTable.getColumn(PluginServices.getText(this, "field")).setWidth(
249
                                        180);
250

    
251
                }
252
                return jTable;
253
        }
254

    
255
        /**
256
         * This method initializes jPanelWest
257
         * 
258
         * @return javax.swing.JPanel
259
         */
260
        private JPanel getJPanelEast() {
261
                if (jPanelEast == null) {
262
                        jPanelEast = new JPanel();
263
                        jPanelEast.setLayout(null);
264
                        jPanelEast.setPreferredSize(new java.awt.Dimension(170, 100));
265
                        jPanelEast.add(getJButtonAddField(), null);
266
                        jPanelEast.add(getJButtonDeleteField(), null);
267
                }
268
                return jPanelEast;
269
        }
270

    
271
        /**
272
         * This method initializes jButtonAddField
273
         * 
274
         * @return javax.swing.JButton
275
         */
276
        private JButton getJButtonAddField() {
277
                if (jButtonAddField == null) {
278
                        jButtonAddField = new JButton();
279
                        jButtonAddField.setText(PluginServices.getText(this, "add_field"));
280
                        jButtonAddField.setLocation(new java.awt.Point(7, 5));
281
                        jButtonAddField.setSize(new java.awt.Dimension(145, 23));
282
                        jButtonAddField.setPreferredSize(new java.awt.Dimension(100, 26));
283
                        jButtonAddField
284
                                        .addActionListener(new java.awt.event.ActionListener() {
285
                                                public void actionPerformed(java.awt.event.ActionEvent e) {
286
                                                        DefaultTableModel tm = (DefaultTableModel) jTable
287
                                                                        .getModel();
288

    
289
                                                        // Figure out a suitable field name
290
                                                        List<Object> fieldNames = new ArrayList<Object>();
291
                                                        for (int i = 0; i < jTable.getRowCount(); i++) {
292
                                                                fieldNames.add(tm.getValueAt(i, 0));
293
                                                        }
294
                                                        String[] currentFieldNames = (String[]) fieldNames
295
                                                                        .toArray(new String[0]);
296
                                                        String newField = PluginServices.getText(this,
297
                                                                        "field").replaceAll(" +", "_");
298
                                                        int index = 0;
299
                                                        for (int i = 0; i < currentFieldNames.length; i++) {
300
                                                                if (currentFieldNames[i].startsWith(newField)) {
301
                                                                        try {
302
                                                                                index = Integer
303
                                                                                                .parseInt(currentFieldNames[i]
304
                                                                                                                .replaceAll(newField,
305
                                                                                                                                ""));
306
                                                                        } catch (Exception ex) { /* we don't care */
307
                                                                        }
308
                                                                }
309
                                                        }
310
                                                        String newFieldName = newField + (++index);
311

    
312
                                                        // Add a new row
313
                                                        Object[] newRow = new Object[tm.getColumnCount()];
314
                                                        newRow[0] = newFieldName;
315
                                                        newRow[1] = "String";
316
                                                        newRow[2] = "20";
317
                                                        tm.addRow(newRow);
318

    
319
                                                        // Esto lo a?ado aqu? porque si no tiene registros,
320
                                                        // no hace caso. (Por eso no
321
                                                        // lo pongo en getJTable()
322
                                                        TableColumn typeColumn = jTable.getColumnModel()
323
                                                                        .getColumn(1);
324
                                                        JComboBox comboBox = new JComboBox();
325
                                                        comboBox.addItem("Boolean");
326
                                                        comboBox.addItem("Date");
327
                                                        comboBox.addItem("Integer");
328
                                                        comboBox.addItem("Double");
329
                                                        comboBox.addItem("String");
330
                                                        typeColumn.setCellEditor(new DefaultCellEditor(
331
                                                                        comboBox));
332

    
333
                                                        TableColumn widthColumn = jTable.getColumnModel()
334
                                                                        .getColumn(2);
335

    
336
                                                        // tm.setValueAt("NewField", tm.getRowCount()-1, 0);
337
                                                }
338
                                        });
339

    
340
                }
341
                return jButtonAddField;
342
        }
343

    
344
        /**
345
         * This method initializes jButton
346
         * 
347
         * @return javax.swing.JButton
348
         */
349
        private JButton getJButtonDeleteField() {
350
                if (jButtonDeleteField == null) {
351
                        jButtonDeleteField = new JButton();
352
                        jButtonDeleteField.setText(PluginServices.getText(this,
353
                                        "delete_field"));
354
                        jButtonDeleteField.setLocation(new java.awt.Point(7, 33));
355
                        jButtonDeleteField.setSize(new java.awt.Dimension(145, 23));
356
                        jButtonDeleteField.setEnabled(false);
357
                        jButtonDeleteField
358
                                        .addActionListener(new java.awt.event.ActionListener() {
359
                                                public void actionPerformed(java.awt.event.ActionEvent e) {
360
                                                        int[] selecteds = jTable.getSelectedRows();
361
                                                        DefaultTableModel tm = (DefaultTableModel) jTable
362
                                                                        .getModel();
363

    
364
                                                        for (int i = selecteds.length - 1; i >= 0; i--)
365
                                                                tm.removeRow(selecteds[i]);
366
                                                }
367
                                        });
368
                }
369
                return jButtonDeleteField;
370
        }
371

    
372
}