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

History | View | Annotate | Download (31.1 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.ArrayUtils;
16
import org.apache.commons.lang3.StringUtils;
17
import org.cresques.cts.IProjection;
18
import org.gvsig.expressionevaluator.Expression;
19
import org.gvsig.expressionevaluator.swing.CalculatorController;
20
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
21
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
22
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
23
import org.gvsig.fmap.dal.DALLocator;
24
import org.gvsig.fmap.dal.DataManager;
25
import org.gvsig.fmap.dal.DataTypes;
26
import org.gvsig.fmap.dal.exception.DataException;
27
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
28
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
29
import org.gvsig.fmap.dal.feature.DataProfile;
30
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
31
import org.gvsig.fmap.dal.feature.Feature;
32
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
33
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
34
import org.gvsig.fmap.dal.feature.FeatureStore;
35
import org.gvsig.fmap.dal.feature.FeatureType;
36
import org.gvsig.fmap.dal.swing.DALSwingLocator;
37
import org.gvsig.fmap.dal.swing.DataSwingManager;
38
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
39
import org.gvsig.fmap.geom.Geometry;
40
import org.gvsig.fmap.geom.GeometryLocator;
41
import org.gvsig.fmap.geom.GeometryManager;
42
import org.gvsig.fmap.geom.type.GeometryType;
43
import org.gvsig.timesupport.RelativeInterval;
44
import org.gvsig.tools.ToolsLocator;
45
import org.gvsig.tools.dataTypes.DataTypesManager;
46
import org.gvsig.tools.i18n.I18nManager;
47
import org.gvsig.tools.swing.api.ListElement;
48
import org.gvsig.tools.swing.api.ToolsSwingLocator;
49
import org.gvsig.tools.swing.api.ToolsSwingManager;
50
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
51
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
52
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
53
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55

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

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

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

    
79
    private boolean editable;
80
    private FeatureStoreElement featureStoreElement;
81

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

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

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

    
130
        this.initComponents();
131
    }
132

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

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

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

    
155
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
156

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

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

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

    
213

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

    
232

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

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

    
247
            }
248
        });
249

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

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

    
276
    @Override
277
    public EditableFeatureAttributeDescriptor fetch(EditableFeatureAttributeDescriptor descriptor) {
278
        I18nManager i18n = ToolsLocator.getI18nManager();
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(0));
286
            descriptor.setPrecision(this.pickerPrecision.get(0));
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
            descriptor.setDataProfileName(
309
                StringUtils.defaultIfBlank((String) this.cboDataProfile.getSelectedItem(),null)
310
            );
311

    
312
            if( this.chkVirtualField.isSelected() && this.pickerVirtualField.isEnabled() ) {
313
                Expression expression = this.pickerVirtualField.get();
314
                if( expression==null ) {
315
                    descriptor.setFeatureAttributeEmulator(null);
316
                } else {
317
                    DataManager dataManager = DALLocator.getDataManager();
318
                    FeatureAttributeEmulatorExpression emulator = dataManager.createFeatureAttributeEmulatorExpression(
319
                            descriptor.getFeatureType(),
320
                            expression
321
                    );
322
                    if( !emulator.isValid() ) {
323
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
324
                        dialogs.messageDialog(
325
                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+
326
                                    "\n"+
327
                                    emulator.getErrorMessage(), 
328
                                i18n.getTranslation("_Warning"), 
329
                                JOptionPane.WARNING_MESSAGE
330
                        );
331
                        return null;
332
                    }
333
                    for (String requiredFieldName : emulator.getRequiredFieldNames()) {
334
                        if( StringUtils.equalsIgnoreCase(requiredFieldName, descriptor.getName()) ) {
335
                            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
336
                            dialogs.messageDialog(
337
                                    i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+
338
                                        "\n\n"+
339
                                        i18n.getTranslation("_The_expression_contains_a_reference_to_itself"), 
340
                                    i18n.getTranslation("_Warning"), 
341
                                    JOptionPane.WARNING_MESSAGE
342
                            );
343
                            return null;
344
                        }
345
                    }
346
                    descriptor.setFeatureAttributeEmulator(emulator);
347
                    //
348
                    // No se porque esto de abajo no funciona.
349
                    // Nunca se lanza la excepcion en el get(Feature) de
350
                    // DefaultFeatureAttributeEmulatorExpression.
351
                    //
352
//                    try {
353
//                        emulator.setEnableExceptions(true);
354
//                        descriptor.setFeatureAttributeEmulator(emulator);
355
//                        this.pickerVirtualField.getPreviewSymbolTable().value(descriptor.getName());
356
//                    } catch(Throwable ex) {
357
//                        emulator.setEnableExceptions(false);
358
//                        descriptor.setFeatureAttributeEmulator(null);
359
//                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
360
//                        dialogs.messageDialog(
361
//                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+
362
//                                    "\n"+
363
//                                    ex.getMessage(), 
364
//                                i18n.getTranslation("_Warning"), 
365
//                                JOptionPane.WARNING_MESSAGE
366
//                        );
367
//                        return null;
368
//                    } finally {
369
//                        emulator.setEnableExceptions(false);
370
//                    }
371
                }
372
            }
373
        } catch (Exception ex) {
374
            LOGGER.warn("Can't retrieve information from user form.",ex);
375
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
376
            dialogs.messageDialog(
377
                    i18n.getTranslation("_Cant_retrieve_information_from_user_form")+
378
                        "\n"+
379
                        i18n.getTranslation("_See_log_for_details"), 
380
                    i18n.getTranslation("_Warning"), 
381
                    JOptionPane.WARNING_MESSAGE
382
            );
383
            return null;
384
        }
385
        return descriptor;
386
    }
387

    
388
    public void clean() {
389
        this.pickerDefaultValue.set(null);
390
        this.txtFieldName.setText("");
391
//        this.pickerFieldName.set(null);
392
        this.pickerIntervalEnd.set(null);
393
        this.pickerIntervalStart.set(null);
394
        this.pickerPrecision.set(null);
395
        this.pickerSize.set(null);
396

    
397
        this.chkAllowNulls.setSelected(false);
398
        this.chkIsAutomatic.setSelected(false);
399
        this.chkIsPrimaryKey.setSelected(false);
400

    
401
        this.chkVirtualField.setSelected(false);
402
        this.chkVirtualField.setEnabled(editable);
403
        this.pickerVirtualField.setEnabled(false);
404
        this.pickerVirtualField.set(null);
405

    
406
        ListElement.setSelected(cboGeometryType, null);
407
        ListElement.setSelected(cboGeometrySubtype, null);
408

    
409
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
410
            
411
        this.cboDataProfile.setSelectedIndex(-1);
412
    }
413

    
414
    @Override
415
    public void put(FeatureAttributeDescriptor descriptor) {
416
        if (descriptor == null) {
417
            this.clean();
418
            return;
419
        }
420
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
421
        if( descriptor.getFeatureType()!=null ) {
422
            FeatureStore store = descriptor.getFeatureType().getStore();
423
            this.featureStoreElement.setFeatureStore(store);
424
            if( store != null ) {
425
                Feature sampleFeature = null;
426
                try {
427
                    sampleFeature = store.getFeatureSelection().first();
428
                    if( sampleFeature == null ) {
429
                        sampleFeature = store.first();
430
                    }
431
                } catch (DataException ex) {
432
                }
433
                if( sampleFeature!=null ) {
434
                    FeatureSymbolTable featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable();
435
                    featureSymbolTable.setFeature(sampleFeature);
436
                    this.pickerVirtualField.setPreviewSymbolTable(featureSymbolTable.createParent());
437
                }
438
            }
439
        }
440
        if (!(descriptor instanceof EditableFeatureAttributeDescriptor)) {
441
            this.setEditable(false);
442
        }
443
                
444
        this.pickerDefaultValue.set(descriptor.getDefaultValue());
445
        this.txtFieldName.setText(descriptor.getName());
446
        RelativeInterval interval = (RelativeInterval) descriptor.getInterval();
447
        if (interval == null) {
448
            this.pickerIntervalEnd.set(null);
449
            this.pickerIntervalStart.set(null);
450
        } else {
451
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
452
            this.pickerIntervalStart.set(interval.getStart().toDate());
453
        }
454
        this.pickerPrecision.set(descriptor.getPrecision());
455
        this.pickerSize.set(descriptor.getSize());
456

    
457
        this.chkAllowNulls.setSelected(descriptor.allowNull());
458
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
459
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
460

    
461
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
462
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
463
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
464
            this.chkVirtualField.setEnabled(editable);
465
            this.chkVirtualField.setSelected(true);
466
            this.pickerVirtualField.setEnabled(editable);
467
            this.pickerVirtualField.set(expression);
468
        } else if (descriptor.isComputed()) {
469
            this.chkVirtualField.setEnabled(false);
470
            this.chkVirtualField.setSelected(true);
471
            this.pickerVirtualField.setEnabled(false);
472
            this.pickerVirtualField.set(null);
473
        } else {
474
            this.chkVirtualField.setEnabled(editable);
475
            this.chkVirtualField.setSelected(false);
476
            this.pickerVirtualField.setEnabled(false);
477
            this.pickerVirtualField.set(null);
478
        }
479

    
480
        this.pickerCRS.set(descriptor.getSRS());
481

    
482
        if (descriptor.getGeomType() != null) {
483
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
484
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
485
        }
486
        ListElement.setSelected(cboFieldType, descriptor.getType());
487

    
488
        String profile = descriptor.getDataProfileName();
489
        if( StringUtils.isBlank(profile) ) {
490
            this.cboDataProfile.setSelectedIndex(-1);
491
        } else {
492
           this.cboDataProfile.setSelectedItem(profile);
493
        }
494
    }
495

    
496
    private void doFieldTypeChanged() {
497
        try {
498
            Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
499
            if (fieldType == null) {
500
                fieldType = DataTypes.UNKNOWN;
501
            }
502
            Integer size = this.pickerSize.get();
503
            if( fieldType == DataTypes.STRING ) {
504
                if( size == null ) {
505
                    this.pickerSize.set(50);
506
                }
507
            } else {
508
                int maxsize = this.getMaxSizeOfType(fieldType);
509
                if( size==null || (maxsize>0 && size>maxsize) ) {
510
                    this.pickerSize.set(maxsize);
511
                }
512
            }
513
            Integer precision = this.pickerPrecision.get();
514
            if( precision==null ) {
515
                int defaultPrecision = this.getDefaultPrecisionOfType(fieldType);
516
                if( defaultPrecision>0 ) {
517
                    this.pickerPrecision.set(defaultPrecision);
518
                }
519
            }
520
            
521
            switch (fieldType) {
522
                case DataTypes.GEOMETRY:
523
                    this.cboGeometryType.setEnabled(editable);
524
                    this.cboGeometrySubtype.setEnabled(editable);
525
                    this.pickerCRS.setEnabled(editable);
526
                    this.cboDateFormat.setEnabled(false);
527
                    this.pickerIntervalStart.setEnabled(false);
528
                    this.pickerIntervalEnd.setEditable(false);
529
                    this.tabAditionalFields.setEnabledAt(1, true);
530
                    this.tabAditionalFields.setEnabledAt(2, false);
531
                    this.pickerSize.set(null);
532
                    this.pickerPrecision.set(null);
533
                    this.pickerSize.setEnabled(false);
534
                    this.pickerPrecision.setEnabled(false);
535
                    break;
536
                case DataTypes.INSTANT:
537
                case DataTypes.INTERVAL:
538
                case DataTypes.DATE:
539
                case DataTypes.TIME:
540
                case DataTypes.TIMESTAMP:
541
                    this.cboGeometryType.setEnabled(false);
542
                    this.cboGeometrySubtype.setEnabled(false);
543
                    this.pickerCRS.setEnabled(false);
544
                    this.cboDateFormat.setEnabled(editable);
545
                    this.pickerIntervalStart.setEnabled(editable);
546
                    this.pickerIntervalEnd.setEnabled(editable);
547
                    this.tabAditionalFields.setEnabledAt(1, false);
548
                    this.tabAditionalFields.setEnabledAt(2, true);
549
                    this.pickerSize.set(null);
550
                    this.pickerPrecision.set(null);
551
                    this.pickerSize.setEnabled(false);
552
                    this.pickerPrecision.setEnabled(false);
553
                    break;
554
                case DataTypes.BYTE:
555
                case DataTypes.INT:
556
                case DataTypes.LONG:                    
557
                case DataTypes.STRING:                    
558
                    this.cboGeometryType.setEnabled(false);
559
                    this.cboGeometrySubtype.setEnabled(false);
560
                    this.pickerCRS.setEnabled(false);
561
                    this.cboDateFormat.setEnabled(false);
562
                    this.pickerIntervalStart.setEnabled(false);
563
                    this.pickerIntervalEnd.setEditable(false);
564
                    this.tabAditionalFields.setEnabledAt(1, false);
565
                    this.tabAditionalFields.setEnabledAt(2, false);
566

    
567
                    this.pickerPrecision.set(null);
568
                    this.pickerSize.setEnabled(true);
569
                    this.pickerPrecision.setEnabled(false);
570
                    break;
571
                case DataTypes.FLOAT:
572
                case DataTypes.DOUBLE:
573
                    this.cboGeometryType.setEnabled(false);
574
                    this.cboGeometrySubtype.setEnabled(false);
575
                    this.pickerCRS.setEnabled(false);
576
                    this.cboDateFormat.setEnabled(false);
577
                    this.pickerIntervalStart.setEnabled(false);
578
                    this.pickerIntervalEnd.setEditable(false);
579
                    this.tabAditionalFields.setEnabledAt(1, false);
580
                    this.tabAditionalFields.setEnabledAt(2, false);
581

    
582
                    this.pickerSize.setEnabled(true);
583
                    this.pickerPrecision.setEnabled(true);
584
                    break;
585
                default:
586
                    this.cboGeometryType.setEnabled(false);
587
                    this.cboGeometrySubtype.setEnabled(false);
588
                    this.pickerCRS.setEnabled(false);
589
                    this.cboDateFormat.setEnabled(false);
590
                    this.pickerIntervalStart.setEnabled(false);
591
                    this.pickerIntervalEnd.setEditable(false);
592
                    this.tabAditionalFields.setEnabledAt(1, false);
593
                    this.tabAditionalFields.setEnabledAt(2, false);
594
                    this.pickerSize.set(null);
595
                    this.pickerPrecision.set(null);
596
                    this.pickerSize.setEnabled(false);
597
                    this.pickerPrecision.setEnabled(false);
598
            }
599
        } catch (Exception ex) {
600
            LOGGER.warn("Problems changing field type.",ex);
601
        }
602
        
603
    }
604

    
605
    public void setEditable(boolean editable) {
606
        this.editable = editable;
607
        this.pickerDefaultValue.setEditable(editable);
608
        this.txtFieldName.setEditable(editable);
609
//        this.pickerFieldName.setEditable(editable);
610
        this.pickerIntervalEnd.setEditable(editable);
611
        this.pickerIntervalStart.setEditable(editable);
612
        this.pickerPrecision.setEditable(editable);
613
        this.pickerSize.setEditable(editable);
614
        this.cboDataProfile.setEnabled(editable);
615

    
616
        this.chkAllowNulls.setEnabled(editable);
617
        this.chkIsAutomatic.setEnabled(editable);
618
        this.chkIsPrimaryKey.setEnabled(editable);
619

    
620
        this.chkVirtualField.setEnabled(editable);
621
        this.pickerVirtualField.setEditable(editable);
622

    
623
        this.cboDateFormat.setEnabled(editable);
624
        this.cboFieldType.setEnabled(editable);
625
        this.cboGeometryType.setEnabled(editable);
626
        this.cboGeometrySubtype.setEnabled(editable);
627

    
628
    }
629
    
630
    private int getMaxSizeOfType(int dataType) {
631
        switch(dataType) {
632
            case DataTypes.BOOLEAN:
633
                return 1;
634
            case DataTypes.BYTE:
635
                return 3;
636
            case DataTypes.INT:
637
                return 9;
638
            case DataTypes.LONG:
639
                return 19;
640
            case DataTypes.FLOAT:
641
                return 20;
642
            case DataTypes.DOUBLE:
643
                return 20;
644
            case DataTypes.DATE:
645
                return 8;
646
            default:
647
                return -1;
648
        }
649
    }
650

    
651
    private int getDefaultPrecisionOfType(int dataType) {
652
        switch(dataType) {
653
            case DataTypes.FLOAT:
654
                return 6;
655
            case DataTypes.DOUBLE:
656
                return 6;
657
            default:
658
                return -1;
659
        }
660
    }
661

    
662
    private void doCheckSizeAndPrecision() {
663
        Integer size = this.pickerSize.get();
664
        if( size == null ) {
665
            return;
666
        }
667
        int maxsize = this.getMaxSizeOfType((int) ListElement.getSelected(cboFieldType));
668
        if( size<1 || (maxsize>0 && size>maxsize) ) {
669
            this.pickerSize.setWarning(true, "The size is not valid for the selected type");
670
        } else {
671
            this.pickerSize.setWarning(false);
672
        }
673
        if( this.pickerPrecision.isEnabled() ) {
674
            Integer precision = this.pickerPrecision.get();
675
            if( precision == null ) {
676
                return ;
677
            }
678
            if( precision < 0 ) {
679
                this.pickerPrecision.setWarning(true, "the precision can not have a negative value");
680
            } else if( precision>size ) {
681
                this.pickerPrecision.setWarning(true, "the precision can not have a value greater than the size");
682
            } else {
683
                this.pickerPrecision.setWarning(false);
684
            }
685
        }
686
    }
687

    
688
    @Override
689
    public void setNameAsNew(FeatureType featureType) {
690
        this.txtFieldName.setText(DefaultFeatureTypePanel.getNewFieldName(featureType));
691
    }
692

    
693
    @Override
694
    public String getName() {
695
        return StringUtils.defaultIfBlank(this.txtFieldName.getText(), null);
696
    }
697
    
698
    
699
}