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 @ 44149

History | View | Annotate | Download (28.3 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.swing.api.ListElement;
46
import org.gvsig.tools.swing.api.ToolsSwingLocator;
47
import org.gvsig.tools.swing.api.ToolsSwingManager;
48
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
49
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
50
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
51
import org.slf4j.Logger;
52
import org.slf4j.LoggerFactory;
53

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

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

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

    
77
    private boolean editable;
78
    private FeatureStoreElement featureStoreElement;
79

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

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

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

    
128
        this.initComponents();
129
    }
130

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

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

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

    
153
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
154

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

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

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

    
214

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

    
233

    
234
        this.pickerCRS = dataSwingManager.createProjectionPickerController(
235
                this.txtCRS, this.btnCRS
236
        );
237

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

    
248
            }
249
        });
250

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

    
272
    @Override
273
    public JComponent asJComponent() {
274
        return this;
275
    }
276

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

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

    
349
        this.chkAllowNulls.setSelected(false);
350
        this.chkIsAutomatic.setSelected(false);
351
        this.chkIsPrimaryKey.setSelected(false);
352

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

    
358
        ListElement.setSelected(cboGeometryType, null);
359
        ListElement.setSelected(cboGeometrySubtype, null);
360

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

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

    
409
        this.chkAllowNulls.setSelected(descriptor.allowNull());
410
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
411
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
412

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

    
432
        this.pickerCRS.set(descriptor.getSRS());
433

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

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

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

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

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

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

    
568
        this.chkAllowNulls.setEnabled(editable);
569
        this.chkIsAutomatic.setEnabled(editable);
570
        this.chkIsPrimaryKey.setEnabled(editable);
571

    
572
        this.chkVirtualField.setEnabled(editable);
573
        this.pickerVirtualField.setEditable(editable);
574

    
575
        this.cboDateFormat.setEnabled(editable);
576
        this.cboFieldType.setEnabled(editable);
577
        this.cboGeometryType.setEnabled(editable);
578
        this.cboGeometrySubtype.setEnabled(editable);
579

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

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

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

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

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