Statistics
| Revision:

svn-gvsig-desktop / tags / v1_0_1_RELEASE / extensions / extCAD / src / com / iver / cit / gvsig / gui / cad / panels / JPanelFieldDefinition.java @ 9531

History | View | Annotate | Download (10.5 KB)

1
package com.iver.cit.gvsig.gui.cad.panels;
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

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

    
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
        public JPanelFieldDefinition(JWizardComponents wizardComponents) {
48
                super(wizardComponents, null);
49
                initialize();
50
                // TODO Auto-generated constructor stub
51
        }
52

    
53

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

    
76
                }
77

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

    
89
                if (valid)
90
                        super.next();
91
                if (!((FileBasedPanel)getWizardComponents().getWizardPanel(2)).getPath().equals(""))
92
                        setFinishButtonEnabled(true);
93
                else
94
                        setFinishButtonEnabled(false);
95
        }
96

    
97

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

    
112

    
113
        private boolean validate(String s) {
114
                boolean valid=true;
115
                if (s.indexOf(" ")!=-1) {
116
                        valid=false;
117
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
118
                                        PluginServices.getText(this,"no_puede_continuar")+"\n"+
119
                                        PluginServices.getText(this,"field")+" : "+s+"\n"+
120
                                        PluginServices.getText(this,"contiene_espacios_en_blanco"));
121
                }
122
                return valid;
123
        }
124

    
125

    
126
        /**
127
         * This method initializes this
128
         *
129
         */
130
        private void initialize() {
131
        jLabel = new JLabel();
132
        jLabel.setText(PluginServices.getText(this,"define_fields"));
133
        this.setLayout(new BorderLayout(5,5));
134
        this.setSize(new java.awt.Dimension(499,232));
135
        this.add(jLabel, java.awt.BorderLayout.NORTH);
136
        this.add(getJScrollPane(), java.awt.BorderLayout.CENTER);
137
        this.add(getJPanelEast(), java.awt.BorderLayout.EAST);
138
        }
139

    
140

    
141
        /**
142
         * This method initializes jScrollPane
143
         *
144
         * @return javax.swing.JScrollPane
145
         */
146
        private JScrollPane getJScrollPane() {
147
                if (jScrollPane == null) {
148
                        jScrollPane = new JScrollPane();
149
                        jScrollPane.setViewportView(getJTable());
150
                }
151
                return jScrollPane;
152
        }
153

    
154

    
155
        /**
156
         * This method initializes jTable
157
         *
158
         * @return javax.swing.JTable
159
         */
160
        private JTable getJTable() {
161
                if (jTable == null) {
162
                        jTable = new JTable();
163

    
164
                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
165
                        tm.addColumn(PluginServices.getText(this,"field"));
166

    
167

    
168
                        // TableColumn fieldTypeColumn = new TableColumn(1);
169
                        // fieldTypeColumn.setHeaderValue("Type");
170
                        // jTable.addColumn(fieldTypeColumn);
171
                        tm.addColumn(PluginServices.getText(this,"type"));
172
                        // MIRAR EL C?DIGO DEL BOT?N DE A?ADIR CAMPO PARA VER EL CellEditor con comboBox
173

    
174

    
175

    
176
                        /* TableColumn fieldLengthColumn = new TableColumn(2);
177
                        fieldLengthColumn.setHeaderValue("Length");
178
                        // fieldLengthColumn.setCellRenderer(new DefaultTableCellRenderer());
179
                        jTable.addColumn(fieldLengthColumn); */
180
                        tm.addColumn(PluginServices.getText(this,"length"));
181

    
182
//                        Ask to be notified of selection changes.
183
                        ListSelectionModel rowSM = jTable.getSelectionModel();
184
                        rowSM.addListSelectionListener(new ListSelectionListener() {
185
                            public void valueChanged(ListSelectionEvent e) {
186
                                //Ignore extra messages.
187
                                if (e.getValueIsAdjusting()) return;
188

    
189
                                ListSelectionModel lsm =
190
                                    (ListSelectionModel)e.getSource();
191
                                if (lsm.isSelectionEmpty()) {
192
                                    //no rows are selected
193
                                        jButtonDeleteField.setEnabled(false);
194
                                } else {
195
                                    // int selectedRow = lsm.getMinSelectionIndex();
196
                                    //selectedRow is selected
197
                                        jButtonDeleteField.setEnabled(true);
198
                                }
199
                            }
200
                        });
201
                        jTable.getColumn(PluginServices.getText(this,"field")).setWidth(180);
202

    
203

    
204
                }
205
                return jTable;
206
        }
207

    
208

    
209
        /**
210
         * This method initializes jPanelWest
211
         *
212
         * @return javax.swing.JPanel
213
         */
214
        private JPanel getJPanelEast() {
215
                if (jPanelEast == null) {
216
                        jPanelEast = new JPanel();
217
                        jPanelEast.setLayout(null);
218
                        jPanelEast.setPreferredSize(new java.awt.Dimension(170,100));
219
                        jPanelEast.add(getJButtonAddField(), null);
220
                        jPanelEast.add(getJButtonDeleteField(), null);
221
                }
222
                return jPanelEast;
223
        }
224

    
225

    
226
        /**
227
         * This method initializes jButtonAddField
228
         *
229
         * @return javax.swing.JButton
230
         */
231
        private JButton getJButtonAddField() {
232
                if (jButtonAddField == null) {
233
                        jButtonAddField = new JButton();
234
                        jButtonAddField.setText(PluginServices.getText(this,"add_field"));
235
                        jButtonAddField.setLocation(new java.awt.Point(7,5));
236
                        jButtonAddField.setSize(new java.awt.Dimension(145,23));
237
                        jButtonAddField.setPreferredSize(new java.awt.Dimension(100,26));
238
                        jButtonAddField.addActionListener(new java.awt.event.ActionListener() {
239
                                public void actionPerformed(java.awt.event.ActionEvent e) {
240
                                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
241

    
242
                                        // Figure out a suitable field name
243
                                        ArrayList fieldNames = new ArrayList();
244
                                        for (int i = 0; i < jTable.getRowCount(); i++) {
245
                                                fieldNames.add(tm.getValueAt(i, 0));
246
                                        }
247
                                        String[] currentFieldNames = (String[]) fieldNames.toArray(new String[0]);
248
                                        String newField = PluginServices.getText(this, "new_field").replaceAll(" +", "_");
249
                                        int index=0;
250
                                        for (int i = 0; i < currentFieldNames.length; i++) {
251
                                                if (currentFieldNames[i].startsWith(newField)) {
252
                                                        try {
253
                                                                index = Integer.parseInt(currentFieldNames[i].replaceAll(newField,""));
254
                                                        } catch (Exception ex) { /* we don't care */}
255
                                                }
256
                                        }
257
                                        String newFieldName = newField+(++index);
258

    
259

    
260
                                        // Add a new row
261
                                        Object[] newRow = new Object[tm.getColumnCount()];
262
                                        newRow[0] = newFieldName;
263
                                        newRow[1] = "String";
264
                                        newRow[2] = "20";
265
                                        tm.addRow(newRow);
266

    
267
                                        // Esto lo a?ado aqu? porque si no tiene registros, no hace caso. (Por eso no
268
                                        // lo pongo en getJTable()
269
                                        TableColumn typeColumn = jTable.getColumnModel().getColumn(1);
270
                                        JComboBox comboBox = new JComboBox();
271
                                        comboBox.addItem("Boolean");
272
                                        comboBox.addItem("Date");
273
                                        comboBox.addItem("Integer");
274
                                        comboBox.addItem("Double");
275
                                        comboBox.addItem("String");
276
                                        typeColumn.setCellEditor(new DefaultCellEditor(comboBox));
277

    
278
                                        TableColumn widthColumn = jTable.getColumnModel().getColumn(2);
279

    
280
                                        // tm.setValueAt("NewField", tm.getRowCount()-1, 0);
281
                                }
282
                        });
283

    
284
                }
285
                return jButtonAddField;
286
        }
287

    
288

    
289
        /**
290
         * This method initializes jButton
291
         *
292
         * @return javax.swing.JButton
293
         */
294
        private JButton getJButtonDeleteField() {
295
                if (jButtonDeleteField == null) {
296
                        jButtonDeleteField = new JButton();
297
                        jButtonDeleteField.setText(PluginServices.getText(this,"delete_field"));
298
                        jButtonDeleteField.setLocation(new java.awt.Point(7,33));
299
                        jButtonDeleteField.setSize(new java.awt.Dimension(145,23));
300
                        jButtonDeleteField.setEnabled(false);
301
                        jButtonDeleteField.addActionListener(new java.awt.event.ActionListener() {
302
                                public void actionPerformed(java.awt.event.ActionEvent e) {
303
                                        int[] selecteds = jTable.getSelectedRows();
304
                                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
305

    
306
                                        for (int i=selecteds.length-1; i >=0; i--)
307
                                                tm.removeRow(selecteds[i]);
308
                                }
309
                        });
310
                }
311
                return jButtonDeleteField;
312
        }
313

    
314

    
315
        /**
316
         * Convierte lo que hay en la tabla en una definici?n de campos
317
         * adecuada para crear un LayerDefinition
318
         * @return
319
         */
320
        public FieldDescription[] getFieldsDescription() {
321
                DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
322
                FieldDescription[] fieldsDesc = new FieldDescription[tm.getRowCount()];
323

    
324
                for (int i=0; i < tm.getRowCount(); i++)
325
                {
326
                        fieldsDesc[i] = new FieldDescription();
327
                        fieldsDesc[i].setFieldName((String) tm.getValueAt(i,0));
328
                        String strType = (String) tm.getValueAt(i,1);
329
                        if (strType.equals("String"))
330
                                fieldsDesc[i].setFieldType(Types.VARCHAR);
331
                        if (strType.equals("Double"))
332
                                fieldsDesc[i].setFieldType(Types.DOUBLE);
333
                        if (strType.equals("Integer"))
334
                                fieldsDesc[i].setFieldType(Types.INTEGER);
335
                        if (strType.equals("Boolean"))
336
                                fieldsDesc[i].setFieldType(Types.BOOLEAN);
337
                        if (strType.equals("Date"))
338
                                fieldsDesc[i].setFieldType(Types.DATE);
339
                        int fieldLength = Integer.parseInt((String) tm.getValueAt(i,2));
340
                        fieldsDesc[i].setFieldLength(fieldLength);
341

    
342
                        // TODO: HACERLO BIEN
343
                        if (strType.equals("Double"))
344
                                fieldsDesc[i].setFieldDecimalCount(5);
345

    
346
                }
347

    
348
                return fieldsDesc;
349
        }
350

    
351

    
352

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