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

History | View | Annotate | Download (31 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
                    //
347
                    // No se porque esto de abajo no funciona.
348
                    // Nunca se lanza la excepcion en el get(Feature) de
349
                    // DefaultFeatureAttributeEmulatorExpression.
350
                    //
351
//                    try {
352
//                        emulator.setEnableExceptions(true);
353
//                        descriptor.setFeatureAttributeEmulator(emulator);
354
//                        this.pickerVirtualField.getPreviewSymbolTable().value(descriptor.getName());
355
//                    } catch(Throwable ex) {
356
//                        emulator.setEnableExceptions(false);
357
//                        descriptor.setFeatureAttributeEmulator(null);
358
//                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
359
//                        dialogs.messageDialog(
360
//                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+
361
//                                    "\n"+
362
//                                    ex.getMessage(), 
363
//                                i18n.getTranslation("_Warning"), 
364
//                                JOptionPane.WARNING_MESSAGE
365
//                        );
366
//                        return null;
367
//                    } finally {
368
//                        emulator.setEnableExceptions(false);
369
//                    }
370
                }
371
            }
372
        } catch (Exception ex) {
373
            LOGGER.warn("Can't retrieve information from user form.",ex);
374
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
375
            dialogs.messageDialog(
376
                    i18n.getTranslation("_Cant_retrieve_information_from_user_form")+
377
                        "\n"+
378
                        i18n.getTranslation("_See_log_for_details"), 
379
                    i18n.getTranslation("_Warning"), 
380
                    JOptionPane.WARNING_MESSAGE
381
            );
382
            return null;
383
        }
384
        return descriptor;
385
    }
386

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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