Statistics
| Revision:

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

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
 * @author fjp
30
 * 
31
 *         Panel para que el usuario defina los campos de la nueva tabla
32
 * 
33
 */
34
public class RepeatedFieldDefinitionPanel extends JWizardPanel {
35

    
36
        private static final long serialVersionUID = 1L;
37

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

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

    
55
        }
56

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

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

    
98
                }
99

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

    
112
                if (valid)
113
                        super.next();
114

    
115
        }
116

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

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

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

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

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

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

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

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

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

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

    
249
                }
250
                return jTable;
251
        }
252

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

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

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

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

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

    
331
                                                        TableColumn widthColumn = jTable.getColumnModel()
332
                                                                        .getColumn(2);
333

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

    
338
                }
339
                return jButtonAddField;
340
        }
341

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

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

    
370
}