Statistics
| Revision:

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

History | View | Annotate | Download (11.7 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.FeatureStore;
29
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
30

    
31

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

    
41

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

    
50
        private FeatureStore store = null;
51

    
52

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

    
59

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

    
82
                }
83

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

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

    
105
        public void setFeatureStore(FeatureStore store) {
106
                this.store = store;
107
        }
108

    
109
        public FeatureStore getFeatureStore() {
110
                return this.store;
111
        }
112

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

    
127

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

    
164

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

    
179

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

    
193

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

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

    
206

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

    
213

    
214

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

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

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

    
242

    
243
                }
244
                return jTable;
245
        }
246

    
247

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

    
264

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

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

    
298

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

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

    
317
                                        TableColumn widthColumn = jTable.getColumnModel().getColumn(2);
318

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

    
323
                }
324
                return jButtonAddField;
325
        }
326

    
327

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

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

    
353

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

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

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

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

    
386
                return type;
387
        }
388

    
389

    
390

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