Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extEditing / src / org / gvsig / editing / gui / cad / panels / JPanelFieldDefinition.java @ 29616

History | View | Annotate | Download (11.8 KB)

1
package org.gvsig.editing.gui.cad.panels;
2

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

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

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

    
24
import org.gvsig.andami.PluginServices;
25
import org.gvsig.fmap.dal.DataTypes;
26
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
27
import org.gvsig.fmap.dal.feature.EditableFeatureType;
28
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
29
import org.gvsig.fmap.dal.feature.FeatureStore;
30
import org.gvsig.fmap.dal.feature.FeatureType;
31
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
32

    
33

    
34
/**
35
 * @author fjp
36
 *
37
 * Panel para que el usuario seleccione el driver que va a utilizar para
38
 * crear un tema desde cero.
39
 *
40
 */
41
public class JPanelFieldDefinition extends JWizardPanel {
42

    
43

    
44
        private JLabel jLabel = null;
45
        private JScrollPane jScrollPane = null;
46
        private JTable jTable = null;
47
        private JPanel jPanelEast = null;
48
        private JButton jButtonAddField = null;
49
        private JButton jButtonDeleteField = null;
50
        private int MAX_FIELD_LENGTH = 254;
51

    
52
        private FeatureStore store = null;
53

    
54

    
55
        public JPanelFieldDefinition(JWizardComponents wizardComponents) {
56
                super(wizardComponents, null);
57
                initialize();
58
                // TODO Auto-generated constructor stub
59
        }
60

    
61

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

    
84
                }
85

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

    
97
                if (valid)
98
                        super.next();
99
                if (getWizardComponents().getWizardPanel(2) instanceof  FileBasedPanel) {
100
                        if (!((FileBasedPanel)getWizardComponents().getWizardPanel(2)).getPath().equals(""))
101
                                setFinishButtonEnabled(true);
102
                        else
103
                                setFinishButtonEnabled(false);
104
                }
105
        }
106

    
107
        public void setFeatureStore(FeatureStore store) {
108
                this.store = store;
109
        }
110

    
111
        public FeatureStore getFeatureStore() {
112
                return this.store;
113
        }
114

    
115
        private boolean validateInteger(String size) {
116
                boolean valid=true;
117
                try{
118
                Integer.parseInt(size);
119
                }catch (NumberFormatException e) {
120
                        valid=false;
121
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
122
                                        PluginServices.getText(this,"no_puede_continuar")+"\n"+
123
                                        PluginServices.getText(this,"size")+" : "+size+"\n"+
124
                                        PluginServices.getText(this,"incorrect_value"));
125
                }
126
                return valid;
127
        }
128

    
129

    
130
        private boolean validate(String s) {
131
                boolean valid=true;
132
                if (s.equals("")) {
133
                        valid=false;
134
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
135
                                        PluginServices.getText(this,"no_puede_continuar")+"\n"+
136
                                        PluginServices.getText(this,"the_field_name_is_required"));
137
                }
138
                if (s.indexOf(" ")!=-1) {
139
                        valid=false;
140
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
141
                                        PluginServices.getText(this,"no_puede_continuar")+"\n"+
142
                                        PluginServices.getText(this,"field")+" : "+s+"\n"+
143
                                        PluginServices.getText(this,"contiene_espacios_en_blanco"));
144
                }
145
//                if (this.store != null && this.store.getCapability("FieldNameMaxLength") != null) {
146
//                        String value = store.getCapability("FieldNameMaxLength");
147
//                        int intValue;
148
//                        try {
149
//                                intValue = Integer.parseInt(value);
150
//                        } catch (NumberFormatException e) {
151
//                                intValue = 0;
152
//                        }
153
//                        if (intValue > 0 && s.length() > intValue) {
154
//                                valid=false;
155
//                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
156
//                                                PluginServices.getText(this,"no_puede_continuar")+"\n"+
157
//                                                PluginServices.getText(this,"field")+" : "+s+"\n"+
158
//                                                PluginServices.getText(this,"too_long_name")+"\n"+
159
//                                                PluginServices.getText(this,"maximun_name_size")+" : "+intValue+"\n"
160
//                                                );
161
//                        }
162
//                }
163
                return valid;
164
        }
165

    
166

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

    
181

    
182
        /**
183
         * This method initializes jScrollPane
184
         *
185
         * @return javax.swing.JScrollPane
186
         */
187
        private JScrollPane getJScrollPane() {
188
                if (jScrollPane == null) {
189
                        jScrollPane = new JScrollPane();
190
                        jScrollPane.setViewportView(getJTable());
191
                }
192
                return jScrollPane;
193
        }
194

    
195

    
196
        /**
197
         * This method initializes jTable
198
         *
199
         * @return javax.swing.JTable
200
         */
201
        private JTable getJTable() {
202
                if (jTable == null) {
203
                        jTable = new JTable();
204

    
205
                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
206
                        tm.addColumn(PluginServices.getText(this,"field"));
207

    
208

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

    
215

    
216

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

    
223
//                        Ask to be notified of selection changes.
224
                        ListSelectionModel rowSM = jTable.getSelectionModel();
225
                        rowSM.addListSelectionListener(new ListSelectionListener() {
226
                            public void valueChanged(ListSelectionEvent e) {
227
                                //Ignore extra messages.
228
                                if (e.getValueIsAdjusting()) return;
229

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

    
244

    
245
                }
246
                return jTable;
247
        }
248

    
249

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

    
266

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

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

    
300

    
301
                                        // Add a new row
302
                                        Object[] newRow = new Object[tm.getColumnCount()];
303
                                        newRow[0] = newFieldName;
304
                                        newRow[1] = "String";
305
                                        newRow[2] = "20";
306
                                        tm.addRow(newRow);
307

    
308
                                        // Esto lo a?ado aqu? porque si no tiene registros, no hace caso. (Por eso no
309
                                        // lo pongo en getJTable()
310
                                        TableColumn typeColumn = jTable.getColumnModel().getColumn(1);
311
                                        JComboBox comboBox = new JComboBox();
312
                                        comboBox.addItem("Boolean");
313
                                        comboBox.addItem("Date");
314
                                        comboBox.addItem("Integer");
315
                                        comboBox.addItem("Double");
316
                                        comboBox.addItem("String");
317
                                        typeColumn.setCellEditor(new DefaultCellEditor(comboBox));
318

    
319
                                        TableColumn widthColumn = jTable.getColumnModel().getColumn(2);
320

    
321
                                        // tm.setValueAt("NewField", tm.getRowCount()-1, 0);
322
                                }
323
                        });
324

    
325
                }
326
                return jButtonAddField;
327
        }
328

    
329

    
330
        /**
331
         * This method initializes jButton
332
         *
333
         * @return javax.swing.JButton
334
         */
335
        private JButton getJButtonDeleteField() {
336
                if (jButtonDeleteField == null) {
337
                        jButtonDeleteField = new JButton();
338
                        jButtonDeleteField.setText(PluginServices.getText(this,"delete_field"));
339
                        jButtonDeleteField.setLocation(new java.awt.Point(7,33));
340
                        jButtonDeleteField.setSize(new java.awt.Dimension(145,23));
341
                        jButtonDeleteField.setEnabled(false);
342
                        jButtonDeleteField.addActionListener(new java.awt.event.ActionListener() {
343
                                public void actionPerformed(java.awt.event.ActionEvent e) {
344
                                        int[] selecteds = jTable.getSelectedRows();
345
                                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
346

    
347
                                        for (int i=selecteds.length-1; i >=0; i--)
348
                                                tm.removeRow(selecteds[i]);
349
                                }
350
                        });
351
                }
352
                return jButtonDeleteField;
353
        }
354

    
355

    
356
        /**
357
         * Convierte lo que hay en la tabla en una definici?n de campos
358
         * adecuada para crear un LayerDefinition
359
         * @return
360
         */
361
        public EditableFeatureType getFeatureType() {
362
                DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
363
                EditableFeatureType type = new DefaultEditableFeatureType();
364

    
365
                for (int i=0; i < tm.getRowCount(); i++)
366
                {
367
                        int dataType=0;
368
                        String strType = (String) tm.getValueAt(i,1);
369

    
370
                        if (strType.equals("String"))
371
                                dataType=DataTypes.STRING;
372
                        else if (strType.equals("Double"))
373
                                dataType=DataTypes.DOUBLE;
374
                        else if (strType.equals("Integer"))
375
                                dataType=DataTypes.INT;
376
                        else if (strType.equals("Boolean"))
377
                                dataType=DataTypes.BOOLEAN;
378
                        else if (strType.equals("Date"))
379
                                dataType=DataTypes.DATE;
380

    
381
                        int fieldLength = Integer.parseInt((String) tm.getValueAt(i,2));
382
                        // TODO: HACERLO BIEN
383
                        if (strType.equals("Double"))
384
                                fieldLength=5;
385
                        EditableFeatureAttributeDescriptor efad1 = type.add((String) tm.getValueAt(i,0), dataType, fieldLength);
386
                }
387

    
388
                return type;
389
        }
390

    
391

    
392

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