Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.swing / org.gvsig.fmap.dal.swing.impl / src / main / java / org / gvsig / fmap / dal / swing / impl / featuretype / DefaultFeatureTypeAttributePanel.java @ 44152

History | View | Annotate | Download (28.2 KB)

1
package org.gvsig.fmap.dal.swing.impl.featuretype;
2

    
3
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypeAttributePanel;
4
import java.awt.event.ItemEvent;
5
import java.awt.event.ItemListener;
6
import java.util.ArrayList;
7
import java.util.Comparator;
8
import java.util.List;
9
import javax.swing.DefaultComboBoxModel;
10
import javax.swing.JComponent;
11
import javax.swing.JOptionPane;
12
import javax.swing.SwingUtilities;
13
import javax.swing.event.ChangeEvent;
14
import javax.swing.event.ChangeListener;
15
import org.apache.commons.lang3.StringUtils;
16
import org.cresques.cts.IProjection;
17
import org.gvsig.expressionevaluator.Expression;
18
import org.gvsig.expressionevaluator.swing.CalculatorController;
19
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
20
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
21
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
22
import org.gvsig.fmap.dal.DALLocator;
23
import org.gvsig.fmap.dal.DataManager;
24
import org.gvsig.fmap.dal.DataTypes;
25
import org.gvsig.fmap.dal.exception.DataException;
26
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
27
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
28
import org.gvsig.fmap.dal.feature.DataProfile;
29
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
30
import org.gvsig.fmap.dal.feature.Feature;
31
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
32
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
33
import org.gvsig.fmap.dal.feature.FeatureStore;
34
import org.gvsig.fmap.dal.feature.FeatureType;
35
import org.gvsig.fmap.dal.swing.DALSwingLocator;
36
import org.gvsig.fmap.dal.swing.DataSwingManager;
37
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
38
import org.gvsig.fmap.geom.Geometry;
39
import org.gvsig.fmap.geom.GeometryLocator;
40
import org.gvsig.fmap.geom.GeometryManager;
41
import org.gvsig.fmap.geom.type.GeometryType;
42
import org.gvsig.timesupport.RelativeInterval;
43
import org.gvsig.tools.ToolsLocator;
44
import org.gvsig.tools.dataTypes.DataTypesManager;
45
import org.gvsig.tools.i18n.I18nManager;
46
import org.gvsig.tools.swing.api.ListElement;
47
import org.gvsig.tools.swing.api.ToolsSwingLocator;
48
import org.gvsig.tools.swing.api.ToolsSwingManager;
49
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
50
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
51
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
52
import org.slf4j.Logger;
53
import org.slf4j.LoggerFactory;
54

    
55
/**
56
 *
57
 * @author jjdelcerro
58
 */
59
@SuppressWarnings("UseSpecificCatch")
60
public class DefaultFeatureTypeAttributePanel
61
        extends FeatureTypeAttributePanelView
62
        implements FeatureTypeAttributePanel {
63

    
64
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypeAttributePanel.class);
65
    
66
    private final List<ListElement<Integer>> fieldTypes;
67
    private final List<ListElement<Integer>> geometryTypes;
68
    private final List<ListElement<Integer>> geometrySubtypes;
69

    
70
    private DatePickerController pickerIntervalEnd;
71
    private DatePickerController pickerIntervalStart;
72
    private CalculatorController<Integer> pickerSize;
73
    private CalculatorController<Integer> pickerPrecision;
74
    private CalculatorController<Object> pickerDefaultValue;
75
    private PickerController<IProjection> pickerCRS;
76
    private ExpressionPickerController pickerVirtualField;
77

    
78
    private boolean editable;
79
    private FeatureStoreElement featureStoreElement;
80

    
81
    public DefaultFeatureTypeAttributePanel() {
82
        this.editable = true;
83
        DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
84
        this.fieldTypes = new ArrayList<>();
85
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.BOOLEAN), DataTypes.BOOLEAN));
86
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.DATE), DataTypes.DATE));
87
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.TIME), DataTypes.TIME));
88
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.TIMESTAMP), DataTypes.TIMESTAMP));
89
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INT), DataTypes.INT));
90
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.DOUBLE), DataTypes.DOUBLE));
91
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.LONG), DataTypes.LONG));
92
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INTERVAL), DataTypes.INTERVAL));
93
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INSTANT), DataTypes.INSTANT));
94
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.STRING), DataTypes.STRING));
95
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.GEOMETRY), DataTypes.GEOMETRY));
96
        this.fieldTypes.sort(new Comparator<ListElement<Integer>>() {
97
            @Override
98
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
99
                return o1.toString().compareTo(o2.toString());
100
            }
101
        });
102

    
103
        this.geometryTypes = new ArrayList<>();
104
        this.geometryTypes.add(new ListElement("Point", Geometry.TYPES.POINT));
105
        this.geometryTypes.add(new ListElement("Line", Geometry.TYPES.LINE));
106
        this.geometryTypes.add(new ListElement("Polygon", Geometry.TYPES.POLYGON));
107
        this.geometryTypes.add(new ListElement("MultiPoint", Geometry.TYPES.MULTIPOINT));
108
        this.geometryTypes.add(new ListElement("MultiLine", Geometry.TYPES.MULTILINE));
109
        this.geometryTypes.add(new ListElement("MultiPolygon", Geometry.TYPES.MULTIPOLYGON));
110
        this.geometryTypes.sort(new Comparator<ListElement<Integer>>() {
111
            @Override
112
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
113
                return o1.toString().compareTo(o2.toString());
114
            }
115
        });
116

    
117
        this.geometrySubtypes = new ArrayList<>();
118
        this.geometrySubtypes.add(new ListElement("2D", Geometry.SUBTYPES.GEOM2D));
119
        this.geometrySubtypes.add(new ListElement("2DM", Geometry.SUBTYPES.GEOM3D));
120
        this.geometrySubtypes.add(new ListElement("3D", Geometry.SUBTYPES.GEOM2DM));
121
        this.geometrySubtypes.add(new ListElement("3DM", Geometry.SUBTYPES.GEOM3DM));
122
        this.geometrySubtypes.sort(new Comparator<ListElement<Integer>>() {
123
            @Override
124
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
125
                return o1.toString().compareTo(o2.toString());
126
            }
127
        });
128

    
129
        this.initComponents();
130
    }
131

    
132
    private void initComponents() {
133
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
134
        ExpressionEvaluatorSwingManager evaluatorManager = ExpressionEvaluatorSwingLocator.getManager();
135
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
136
        
137
        DefaultComboBoxModel<ListElement<Integer>> modelTypes = new DefaultComboBoxModel<>();
138
        for (ListElement<Integer> element : fieldTypes) {
139
            modelTypes.addElement(element);
140
        }
141
        this.cboFieldType.setModel(modelTypes);
142

    
143
        DefaultComboBoxModel<ListElement<Integer>> modelGeomTypes = new DefaultComboBoxModel<>();
144
        for (ListElement<Integer> element : this.geometryTypes) {
145
            modelGeomTypes.addElement(element);
146
        }
147
        this.cboGeometryType.setModel(modelGeomTypes);
148

    
149
        DefaultComboBoxModel<ListElement<Integer>> modelGeomSubtypes = new DefaultComboBoxModel<>();
150
        for (ListElement<Integer> element : this.geometrySubtypes) {
151
            modelGeomSubtypes.addElement(element);
152
        }
153

    
154
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
155

    
156
        swingManager.translate(this.lblAllowNulls);
157
        swingManager.translate(this.lblCRS);
158
        swingManager.translate(this.lblDataProfile);
159
        swingManager.translate(this.lblDateFormat);
160
        swingManager.translate(this.lblDefaultValue);
161
        swingManager.translate(this.lblFieldName);
162
        swingManager.translate(this.lblFieldType);
163
        swingManager.translate(this.lblGeometrySubtype);
164
        swingManager.translate(this.lblGeometryType);
165
        swingManager.translate(this.lblInterval);
166
        swingManager.translate(this.lblIntervalEnd);
167
        swingManager.translate(this.lblIntervalStart);
168
        swingManager.translate(this.lblIsAutomatic);
169
        swingManager.translate(this.lblIsPrimaryKey);
170
        swingManager.translate(this.lblPrecision);
171
        swingManager.translate(this.lblSize);
172
        swingManager.translate(this.chkVirtualField);
173
        swingManager.translate(this.tabAditionalFields);
174
                
175
        swingManager.addClearButton(this.txtDefaultValue);
176
        swingManager.addClearButton(this.txtFieldName);
177
        swingManager.addClearButton(this.txtIntervalEnd);
178
        swingManager.addClearButton(this.txtIntervalStart);
179
        swingManager.addClearButton(this.txtPrecision);
180
        swingManager.addClearButton(this.txtSize);
181

    
182
        swingManager.setDefaultPopupMenu(this.txtDefaultValue);
183
        swingManager.setDefaultPopupMenu(this.txtFieldName);
184
        swingManager.setDefaultPopupMenu(this.txtIntervalEnd);
185
        swingManager.setDefaultPopupMenu(this.txtIntervalStart);
186
        swingManager.setDefaultPopupMenu(this.txtPrecision);
187
        swingManager.setDefaultPopupMenu(this.txtSize);
188
        swingManager.setDefaultPopupMenu(this.cboDateFormat);
189
        swingManager.setDefaultPopupMenu(this.cboFieldType);
190
        swingManager.setDefaultPopupMenu(this.cboGeometrySubtype);
191
        swingManager.setDefaultPopupMenu(this.cboGeometryType);
192
        swingManager.setDefaultPopupMenu(this.cboDataProfile);
193

    
194
        this.pickerIntervalEnd = swingManager.createDatePickerController(
195
                this.txtIntervalEnd,
196
                this.btnIntervalEnd
197
        );
198
        this.pickerIntervalStart = swingManager.createDatePickerController(
199
                this.txtIntervalStart,
200
                this.btnIntervalStart
201
        );
202
        this.pickerSize = evaluatorManager.createCalculatorController(
203
                this.txtSize, DataTypes.INT
204
        );
205
        this.pickerPrecision = evaluatorManager.createCalculatorController(
206
                this.txtPrecision, DataTypes.INT
207
        );
208
        this.pickerDefaultValue = evaluatorManager.createCalculatorController(
209
                this.txtDefaultValue, DataTypes.OBJECT
210
        );
211

    
212

    
213
        this.btnVirtualField.setText("");
214
        this.pickerVirtualField = ExpressionEvaluatorSwingLocator.getManager()
215
                .createExpressionPickerController(txtVirtualField, btnVirtualField);
216
        this.featureStoreElement = dataSwingManager.createFeatureStoreElement(
217
                this.pickerVirtualField
218
        );
219
        this.pickerVirtualField.addElement(this.featureStoreElement);
220
        this.chkVirtualField.addChangeListener(new ChangeListener() {
221
            @Override
222
            public void stateChanged(ChangeEvent e) {
223
                if (chkVirtualField.isSelected()) {
224
                    pickerVirtualField.setEnabled(editable);
225
                } else {
226
                    pickerVirtualField.setEnabled(false);
227
                }
228
            }
229
        });
230

    
231

    
232
        this.pickerCRS = dataSwingManager.createProjectionPickerController(
233
                this.txtCRS, this.btnCRS
234
        );
235

    
236
        this.cboFieldType.addItemListener(new ItemListener() {
237
            @Override
238
            public void itemStateChanged(ItemEvent e) {
239
                SwingUtilities.invokeLater(new Runnable() {
240
                    @Override
241
                    public void run() {
242
                        doFieldTypeChanged();
243
                    }
244
                });
245

    
246
            }
247
        });
248

    
249
        this.pickerPrecision.addChangeListener(new ChangeListener() {
250
            @Override
251
            public void stateChanged(ChangeEvent e) {
252
                doCheckSizeAndPrecision();
253
            }
254
        });
255
        this.pickerSize.addChangeListener(new ChangeListener() {
256
            @Override
257
            public void stateChanged(ChangeEvent e) {
258
                doCheckSizeAndPrecision();
259
            }
260
        });
261
        
262
        DefaultComboBoxModel<String> dataProfilesModel = new DefaultComboBoxModel<>();
263
        dataProfilesModel.addElement(" ");
264
        for (DataProfile profile : DALLocator.getDataManager().getDataProfiles()) {
265
            dataProfilesModel.addElement(profile.getName());
266
        }
267
        this.cboDataProfile.setModel(dataProfilesModel);
268
    }
269

    
270
    @Override
271
    public JComponent asJComponent() {
272
        return this;
273
    }
274

    
275
    @Override
276
    public EditableFeatureAttributeDescriptor fetch(EditableFeatureAttributeDescriptor descriptor) {
277
        I18nManager i18n = ToolsLocator.getI18nManager();
278
        try {
279
            descriptor.setDataType((int) ListElement.getSelected(this.cboFieldType));
280
            descriptor.setName(this.txtFieldName.getText());
281
            descriptor.setAllowNull(this.chkAllowNulls.isSelected());
282
            descriptor.setIsPrimaryKey(this.chkIsPrimaryKey.isSelected());
283
            descriptor.setIsAutomatic(this.chkIsAutomatic.isSelected());
284
            descriptor.setSize(this.pickerSize.get(0));
285
            descriptor.setPrecision(this.pickerPrecision.get(0));
286
            descriptor.setDefaultValue(this.pickerDefaultValue.get());
287
            switch (descriptor.getType()) {
288
                case DataTypes.GEOMETRY:
289
                    GeometryManager geomManager = GeometryLocator.getGeometryManager();
290
                    GeometryType geomType = geomManager.getGeometryType(
291
                            (int) ListElement.getSelected(this.cboGeometryType),
292
                            (int) ListElement.getSelected(this.cboGeometrySubtype)
293
                    );
294
                    descriptor.setGeometryType(geomType);
295
                    descriptor.setSRS(this.pickerCRS.get());
296
                    break;
297
                case DataTypes.INSTANT:
298
                case DataTypes.INTERVAL:
299
                case DataTypes.DATE:
300
                case DataTypes.TIME:
301
                case DataTypes.TIMESTAMP:
302
                    // FIXME
303
                    break;
304
                default:
305
                    break;
306
            }
307
            if( this.chkVirtualField.isSelected() && this.pickerVirtualField.isEnabled() ) {
308
                Expression expression = this.pickerVirtualField.get();
309
                if( expression==null ) {
310
                    descriptor.setFeatureAttributeEmulator(null);
311
                } else {
312
                    DataManager dataManager = DALLocator.getDataManager();
313
                    FeatureAttributeEmulatorExpression emulator = dataManager.createFeatureAttributeEmulatorExpression(
314
                            descriptor.getFeatureType(),
315
                            expression
316
                    );
317
                    descriptor.setFeatureAttributeEmulator(emulator);
318
                }
319
            }
320
            descriptor.setDataProfileName(
321
                StringUtils.defaultIfBlank((String) this.cboDataProfile.getSelectedItem(),null)
322
            );
323
        } catch (Exception ex) {
324
            LOGGER.warn("Can't retrieve information from user form.",ex);
325
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
326
            dialogs.messageDialog(
327
                    i18n.getTranslation("_Cant_retrieve_information_from_user_form")+
328
                        "\n"+
329
                        i18n.getTranslation("_See_log_for_details"), 
330
                    i18n.getTranslation("_Warning"), 
331
                    JOptionPane.WARNING_MESSAGE
332
            );
333
            return null;
334
        }
335
        return descriptor;
336
    }
337

    
338
    public void clean() {
339
        this.pickerDefaultValue.set(null);
340
        this.txtFieldName.setText("");
341
//        this.pickerFieldName.set(null);
342
        this.pickerIntervalEnd.set(null);
343
        this.pickerIntervalStart.set(null);
344
        this.pickerPrecision.set(null);
345
        this.pickerSize.set(null);
346

    
347
        this.chkAllowNulls.setSelected(false);
348
        this.chkIsAutomatic.setSelected(false);
349
        this.chkIsPrimaryKey.setSelected(false);
350

    
351
        this.chkVirtualField.setSelected(false);
352
        this.chkVirtualField.setEnabled(editable);
353
        this.pickerVirtualField.setEnabled(false);
354
        this.pickerVirtualField.set(null);
355

    
356
        ListElement.setSelected(cboGeometryType, null);
357
        ListElement.setSelected(cboGeometrySubtype, null);
358

    
359
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
360
            
361
        this.cboDataProfile.setSelectedIndex(-1);
362
    }
363

    
364
    @Override
365
    public void put(FeatureAttributeDescriptor descriptor) {
366
        if (descriptor == null) {
367
            this.clean();
368
            return;
369
        }
370
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
371
        if( descriptor.getFeatureType()!=null ) {
372
            FeatureStore store = descriptor.getFeatureType().getStore();
373
            this.featureStoreElement.setFeatureStore(store);
374
            if( store != null ) {
375
                Feature sampleFeature = null;
376
                try {
377
                    sampleFeature = store.getFeatureSelection().first();
378
                    if( sampleFeature == null ) {
379
                        sampleFeature = store.first();
380
                    }
381
                } catch (DataException ex) {
382
                }
383
                if( sampleFeature!=null ) {
384
                    FeatureSymbolTable featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable();
385
                    featureSymbolTable.setFeature(sampleFeature);
386
                    this.pickerVirtualField.setPreviewSymbolTable(featureSymbolTable.createParent());
387
                }
388
            }
389
        }
390
        if (!(descriptor instanceof EditableFeatureAttributeDescriptor)) {
391
            this.setEditable(false);
392
        }
393
                
394
        this.pickerDefaultValue.set(descriptor.getDefaultValue());
395
        this.txtFieldName.setText(descriptor.getName());
396
        RelativeInterval interval = (RelativeInterval) descriptor.getInterval();
397
        if (interval == null) {
398
            this.pickerIntervalEnd.set(null);
399
            this.pickerIntervalStart.set(null);
400
        } else {
401
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
402
            this.pickerIntervalStart.set(interval.getStart().toDate());
403
        }
404
        this.pickerPrecision.set(descriptor.getPrecision());
405
        this.pickerSize.set(descriptor.getSize());
406

    
407
        this.chkAllowNulls.setSelected(descriptor.allowNull());
408
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
409
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
410

    
411
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
412
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
413
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
414
            this.chkVirtualField.setEnabled(editable);
415
            this.chkVirtualField.setSelected(true);
416
            this.pickerVirtualField.setEnabled(editable);
417
            this.pickerVirtualField.set(expression);
418
        } else if (descriptor.isComputed()) {
419
            this.chkVirtualField.setEnabled(false);
420
            this.chkVirtualField.setSelected(true);
421
            this.pickerVirtualField.setEnabled(false);
422
            this.pickerVirtualField.set(null);
423
        } else {
424
            this.chkVirtualField.setEnabled(editable);
425
            this.chkVirtualField.setSelected(false);
426
            this.pickerVirtualField.setEnabled(false);
427
            this.pickerVirtualField.set(null);
428
        }
429

    
430
        this.pickerCRS.set(descriptor.getSRS());
431

    
432
        if (descriptor.getGeomType() != null) {
433
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
434
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
435
        }
436
        ListElement.setSelected(cboFieldType, descriptor.getType());
437

    
438
        String profile = descriptor.getDataProfileName();
439
        if( StringUtils.isBlank(profile) ) {
440
            this.cboDataProfile.setSelectedIndex(-1);
441
        } else {
442
           this.cboDataProfile.setSelectedItem(profile);
443
        }
444
    }
445

    
446
    private void doFieldTypeChanged() {
447
        try {
448
            Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
449
            if (fieldType == null) {
450
                fieldType = DataTypes.UNKNOWN;
451
            }
452
            Integer size = this.pickerSize.get();
453
            if( fieldType == DataTypes.STRING ) {
454
                if( size == null ) {
455
                    this.pickerSize.set(50);
456
                }
457
            } else {
458
                int maxsize = this.getMaxSizeOfType(fieldType);
459
                if( size==null || (maxsize>0 && size>maxsize) ) {
460
                    this.pickerSize.set(maxsize);
461
                }
462
            }
463
            Integer precision = this.pickerPrecision.get();
464
            if( precision==null ) {
465
                int defaultPrecision = this.getDefaultPrecisionOfType(fieldType);
466
                if( defaultPrecision>0 ) {
467
                    this.pickerPrecision.set(defaultPrecision);
468
                }
469
            }
470
            
471
            switch (fieldType) {
472
                case DataTypes.GEOMETRY:
473
                    this.cboGeometryType.setEnabled(editable);
474
                    this.cboGeometrySubtype.setEnabled(editable);
475
                    this.pickerCRS.setEnabled(editable);
476
                    this.cboDateFormat.setEnabled(false);
477
                    this.pickerIntervalStart.setEnabled(false);
478
                    this.pickerIntervalEnd.setEditable(false);
479
                    this.tabAditionalFields.setEnabledAt(1, true);
480
                    this.tabAditionalFields.setEnabledAt(2, false);
481
                    this.pickerSize.set(null);
482
                    this.pickerPrecision.set(null);
483
                    this.pickerSize.setEnabled(false);
484
                    this.pickerPrecision.setEnabled(false);
485
                    break;
486
                case DataTypes.INSTANT:
487
                case DataTypes.INTERVAL:
488
                case DataTypes.DATE:
489
                case DataTypes.TIME:
490
                case DataTypes.TIMESTAMP:
491
                    this.cboGeometryType.setEnabled(false);
492
                    this.cboGeometrySubtype.setEnabled(false);
493
                    this.pickerCRS.setEnabled(false);
494
                    this.cboDateFormat.setEnabled(editable);
495
                    this.pickerIntervalStart.setEnabled(editable);
496
                    this.pickerIntervalEnd.setEnabled(editable);
497
                    this.tabAditionalFields.setEnabledAt(1, false);
498
                    this.tabAditionalFields.setEnabledAt(2, true);
499
                    this.pickerSize.set(null);
500
                    this.pickerPrecision.set(null);
501
                    this.pickerSize.setEnabled(false);
502
                    this.pickerPrecision.setEnabled(false);
503
                    break;
504
                case DataTypes.BYTE:
505
                case DataTypes.INT:
506
                case DataTypes.LONG:                    
507
                case DataTypes.STRING:                    
508
                    this.cboGeometryType.setEnabled(false);
509
                    this.cboGeometrySubtype.setEnabled(false);
510
                    this.pickerCRS.setEnabled(false);
511
                    this.cboDateFormat.setEnabled(false);
512
                    this.pickerIntervalStart.setEnabled(false);
513
                    this.pickerIntervalEnd.setEditable(false);
514
                    this.tabAditionalFields.setEnabledAt(1, false);
515
                    this.tabAditionalFields.setEnabledAt(2, false);
516

    
517
                    this.pickerPrecision.set(null);
518
                    this.pickerSize.setEnabled(true);
519
                    this.pickerPrecision.setEnabled(false);
520
                    break;
521
                case DataTypes.FLOAT:
522
                case DataTypes.DOUBLE:
523
                    this.cboGeometryType.setEnabled(false);
524
                    this.cboGeometrySubtype.setEnabled(false);
525
                    this.pickerCRS.setEnabled(false);
526
                    this.cboDateFormat.setEnabled(false);
527
                    this.pickerIntervalStart.setEnabled(false);
528
                    this.pickerIntervalEnd.setEditable(false);
529
                    this.tabAditionalFields.setEnabledAt(1, false);
530
                    this.tabAditionalFields.setEnabledAt(2, false);
531

    
532
                    this.pickerSize.setEnabled(true);
533
                    this.pickerPrecision.setEnabled(true);
534
                    break;
535
                default:
536
                    this.cboGeometryType.setEnabled(false);
537
                    this.cboGeometrySubtype.setEnabled(false);
538
                    this.pickerCRS.setEnabled(false);
539
                    this.cboDateFormat.setEnabled(false);
540
                    this.pickerIntervalStart.setEnabled(false);
541
                    this.pickerIntervalEnd.setEditable(false);
542
                    this.tabAditionalFields.setEnabledAt(1, false);
543
                    this.tabAditionalFields.setEnabledAt(2, false);
544
                    this.pickerSize.set(null);
545
                    this.pickerPrecision.set(null);
546
                    this.pickerSize.setEnabled(false);
547
                    this.pickerPrecision.setEnabled(false);
548
            }
549
        } catch (Exception ex) {
550
            LOGGER.warn("Problems changing field type.",ex);
551
        }
552
        
553
    }
554

    
555
    public void setEditable(boolean editable) {
556
        this.editable = editable;
557
        this.pickerDefaultValue.setEditable(editable);
558
        this.txtFieldName.setEditable(editable);
559
//        this.pickerFieldName.setEditable(editable);
560
        this.pickerIntervalEnd.setEditable(editable);
561
        this.pickerIntervalStart.setEditable(editable);
562
        this.pickerPrecision.setEditable(editable);
563
        this.pickerSize.setEditable(editable);
564
        this.cboDataProfile.setEnabled(editable);
565

    
566
        this.chkAllowNulls.setEnabled(editable);
567
        this.chkIsAutomatic.setEnabled(editable);
568
        this.chkIsPrimaryKey.setEnabled(editable);
569

    
570
        this.chkVirtualField.setEnabled(editable);
571
        this.pickerVirtualField.setEditable(editable);
572

    
573
        this.cboDateFormat.setEnabled(editable);
574
        this.cboFieldType.setEnabled(editable);
575
        this.cboGeometryType.setEnabled(editable);
576
        this.cboGeometrySubtype.setEnabled(editable);
577

    
578
    }
579
    
580
    private int getMaxSizeOfType(int dataType) {
581
        switch(dataType) {
582
            case DataTypes.BOOLEAN:
583
                return 1;
584
            case DataTypes.BYTE:
585
                return 3;
586
            case DataTypes.INT:
587
                return 9;
588
            case DataTypes.LONG:
589
                return 19;
590
            case DataTypes.FLOAT:
591
                return 20;
592
            case DataTypes.DOUBLE:
593
                return 20;
594
            case DataTypes.DATE:
595
                return 8;
596
            default:
597
                return -1;
598
        }
599
    }
600

    
601
    private int getDefaultPrecisionOfType(int dataType) {
602
        switch(dataType) {
603
            case DataTypes.FLOAT:
604
                return 6;
605
            case DataTypes.DOUBLE:
606
                return 6;
607
            default:
608
                return -1;
609
        }
610
    }
611

    
612
    private void doCheckSizeAndPrecision() {
613
        Integer size = this.pickerSize.get();
614
        if( size == null ) {
615
            return;
616
        }
617
        int maxsize = this.getMaxSizeOfType((int) ListElement.getSelected(cboFieldType));
618
        if( size<1 || (maxsize>0 && size>maxsize) ) {
619
            this.pickerSize.setWarning(true, "The size is not valid for the selected type");
620
        } else {
621
            this.pickerSize.setWarning(false);
622
        }
623
        if( this.pickerPrecision.isEnabled() ) {
624
            Integer precision = this.pickerPrecision.get();
625
            if( precision == null ) {
626
                return ;
627
            }
628
            if( precision < 0 ) {
629
                this.pickerPrecision.setWarning(true, "the precision can not have a negative value");
630
            } else if( precision>size ) {
631
                this.pickerPrecision.setWarning(true, "the precision can not have a value greater than the size");
632
            } else {
633
                this.pickerPrecision.setWarning(false);
634
            }
635
        }
636
    }
637

    
638
    @Override
639
    public void setNameAsNew(FeatureType featureType) {
640
        this.txtFieldName.setText(DefaultFeatureTypePanel.getNewFieldName(featureType));
641
    }
642

    
643
    @Override
644
    public String getName() {
645
        return StringUtils.defaultIfBlank(this.txtFieldName.getText(), null);
646
    }
647
    
648
    
649
}