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

History | View | Annotate | Download (50.9 KB)

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

    
3
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener;
5
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypeAttributePanel;
6
import java.awt.event.ItemEvent;
7
import java.awt.event.ItemListener;
8
import java.util.ArrayList;
9
import java.util.Comparator;
10
import java.util.List;
11
import java.util.Objects;
12
import javax.swing.ComboBoxModel;
13
import javax.swing.DefaultComboBoxModel;
14
import javax.swing.JButton;
15
import javax.swing.JCheckBox;
16
import javax.swing.JComboBox;
17
import javax.swing.JComponent;
18
import javax.swing.JOptionPane;
19
import javax.swing.JTextField;
20
import javax.swing.SwingUtilities;
21
import javax.swing.event.ChangeEvent;
22
import javax.swing.event.ChangeListener;
23
import javax.swing.text.JTextComponent;
24
import org.apache.commons.lang3.StringUtils;
25
import org.cresques.cts.IProjection;
26
import org.gvsig.expressionevaluator.Expression;
27
import org.gvsig.expressionevaluator.ExpressionUtils;
28
import org.gvsig.expressionevaluator.swing.CalculatorController;
29
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
30
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
31
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.DataManager;
34
import org.gvsig.fmap.dal.DataStore;
35
import org.gvsig.fmap.dal.DataTypes;
36
import org.gvsig.fmap.dal.StoresRepository;
37
import org.gvsig.fmap.dal.complements.Search;
38
import org.gvsig.fmap.dal.exception.DataException;
39
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
40
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
41
import org.gvsig.fmap.dal.feature.DataProfile;
42
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
43
import org.gvsig.fmap.dal.feature.EditableForeingKey;
44
import org.gvsig.fmap.dal.feature.Feature;
45
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
46
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
47
import org.gvsig.fmap.dal.feature.FeatureStore;
48
import org.gvsig.fmap.dal.feature.FeatureType;
49
import org.gvsig.fmap.dal.feature.ForeingKey;
50
import org.gvsig.fmap.dal.swing.DALSwingLocator;
51
import org.gvsig.fmap.dal.swing.DataSwingManager;
52
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
53
import org.gvsig.fmap.geom.Geometry;
54
import org.gvsig.fmap.geom.GeometryLocator;
55
import org.gvsig.fmap.geom.GeometryManager;
56
import org.gvsig.fmap.geom.type.GeometryType;
57
import org.gvsig.timesupport.RelativeInterval;
58
import org.gvsig.tools.ToolsLocator;
59
import org.gvsig.tools.dataTypes.DataTypesManager;
60
import org.gvsig.tools.dynobject.DynObjectValueItem;
61
import org.gvsig.tools.i18n.I18nManager;
62
import org.gvsig.tools.swing.api.ListElement;
63
import org.gvsig.tools.swing.api.ToolsSwingLocator;
64
import org.gvsig.tools.swing.api.ToolsSwingManager;
65
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
66
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
67
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
68
import org.slf4j.Logger;
69
import org.slf4j.LoggerFactory;
70

    
71
/**
72
 *
73
 * @author jjdelcerro
74
 */
75
@SuppressWarnings({"UseSpecificCatch","Convert2Lambda"})
76
public class DefaultFeatureTypeAttributePanel
77
        extends FeatureTypeAttributePanelView
78
        implements FeatureTypeAttributePanel {
79

    
80
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypeAttributePanel.class);
81

    
82
    private static class ForeingKeyController {
83

    
84
        private final JCheckBox chkIsForeingKey;
85
        private final JCheckBox chkIsClosedList;
86
        private final JComboBox cboTable;
87
        private final JComboBox cboCode;
88
        private final JTextField txtFormula;
89
        private final JButton btnFormula;
90
        private ExpressionPickerController pickerFormula;
91
        private boolean editable;
92
        private FeatureStoreElement featureStoreElement;
93
        private ForeingKey foreingKey;
94
        
95
        public ForeingKeyController(
96
                JCheckBox chkIsForeingKey,
97
                JCheckBox chkIsClosedList,
98
                JComboBox cboTable,
99
                JComboBox cboCode,
100
                JTextField txtFormula,
101
                JButton btnFormula
102
        ) {
103
            this.chkIsForeingKey = chkIsForeingKey;
104
            this.chkIsClosedList = chkIsClosedList;
105
            this.cboTable = cboTable;
106
            this.cboCode = cboCode;
107
            this.txtFormula = txtFormula;
108
            this.btnFormula = btnFormula;
109
            this.initComponents();
110
        }
111

    
112
        private void initComponents() {
113
            DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
114
    
115
            this.editable = true;
116
            
117
            DefaultComboBoxModel<String> model = new DefaultComboBoxModel();
118
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
119
            for (String tableName : repository.keySet()) {
120
                model.addElement(tableName);
121
            }
122
            this.cboTable.setModel(model);
123
            this.cboTable.addItemListener(new ItemListener() {
124
                @Override
125
                public void itemStateChanged(ItemEvent e) {
126
                    if (e.getStateChange() != ItemEvent.SELECTED) {
127
                        return;
128
                    }
129
                    Thread th = new Thread(new Runnable() {
130
                        @Override
131
                        public void run() {
132
                            doPopulateComboCode();
133
                        }
134
                    }, "FeatureTypePanelForeingKeyPopulateComboCode");
135
                    th.start();
136
                }
137
            });
138
            this.btnFormula.setText("");
139
            this.featureStoreElement = dataSwingManager.createFeatureStoreElement();
140
            this.pickerFormula = ExpressionEvaluatorSwingLocator.getManager()
141
                    .createExpressionPickerController(txtFormula, btnFormula);
142
            this.pickerFormula.addElement(this.featureStoreElement);
143
            
144
//            this.chkIsForeingKey.addChangeListener(new ChangeListener() {
145
//                @Override
146
//                public void stateChanged(ChangeEvent e) {
147
//                    if (chkIsForeingKey.isSelected()) {
148
//                        setEnabled(editable);
149
//                    } else {
150
//                        setEnabled(false);
151
//                    }
152
//                }
153
//            });
154
        }
155

    
156
        private void doPopulateComboCode() {
157
            String tableName = (String) this.cboTable.getSelectedItem();
158
            if( StringUtils.isBlank(tableName) ) {
159
                return;
160
            }
161
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
162
            DataStore store = repository.getStore(tableName);
163
            if( !(store instanceof FeatureStore) ) {
164
                return;
165
            }
166
            this.featureStoreElement.setFeatureStore((FeatureStore) store);
167
            FeatureType featureType;
168
            try {
169
                featureType = ((FeatureStore)store).getDefaultFeatureType();
170
            } catch (DataException ex) {
171
                return;
172
            }
173
            Search search = (Search) ToolsLocator.getComplementsManager().get(
174
                    Search.COMPLEMENT_MANE, featureType
175
            );
176
            List<Search.OrderedAttribute> attributes = search.getOrderedAttributes(
177
                    Search.BASIC_TYPES_FILTER,
178
                    Search.LABEL_ORDER, 
179
                    -1
180
            );
181
            final DefaultComboBoxModel model = new DefaultComboBoxModel();
182
            for (Search.OrderedAttribute attribute : attributes) {
183
                model.addElement(attribute.getDescriptor().getName());
184
            }
185
            SwingUtilities.invokeLater(new Runnable() {
186
                @Override
187
                public void run() {
188
                    cboCode.setModel(model);
189
                    cboCode.setSelectedItem(foreingKey.getCodeName());
190
                }
191
            });
192
        }
193

    
194
        public void setEditable(boolean editable) {
195
            this.chkIsForeingKey.setEnabled(editable);
196
            this.chkIsClosedList.setEnabled(editable);
197
            this.cboTable.setEnabled(editable);
198
            this.cboCode.setEnabled(editable);
199
            this.btnFormula.setEnabled(editable);
200
            this.txtFormula.setEditable(editable);
201
            this.editable = editable;
202
        }
203
        
204
        public void setEnabled(boolean enabled) {
205
            if( !editable ) {
206
                enabled =  false;
207
            }
208
            this.chkIsForeingKey.setEnabled(enabled);
209
            this.chkIsClosedList.setEnabled(enabled);
210
            this.cboTable.setEnabled(enabled);
211
            this.cboCode.setEnabled(enabled);
212
            this.btnFormula.setEnabled(enabled);
213
            this.txtFormula.setEnabled(enabled);
214
        }
215
        
216
        public void clean() {
217
            this.chkIsForeingKey.setSelected(false);
218
            this.chkIsClosedList.setSelected(false);
219
            this.cboTable.setSelectedItem("");
220
            this.cboCode.setSelectedItem("");
221
            this.pickerFormula.set(null);
222
        }
223
        
224
        public void put(ForeingKey foreingKey) {
225
            if( foreingKey==null ) {
226
                this.clean();
227
                return;
228
            }
229
            this.foreingKey = foreingKey;
230
            this.chkIsForeingKey.setSelected(foreingKey.isForeingKey());
231
            this.chkIsClosedList.setSelected(foreingKey.isClosedList());
232
            this.cboTable.setSelectedItem(foreingKey.getTableName());
233
            this.cboCode.setSelectedItem(foreingKey.getCodeName());
234
            this.pickerFormula.set(foreingKey.getLabelExpression(null));
235
        }
236
        
237
        public void fetch(EditableForeingKey foreingKey) {
238
            if( foreingKey==null ) {
239
                return;
240
            }
241
            foreingKey.setForeingKey(this.chkIsForeingKey.isSelected());
242
            foreingKey.setClosedList(this.chkIsClosedList.isSelected());
243
            foreingKey.setTableName((String) this.cboTable.getSelectedItem());
244
            foreingKey.setCodeName((String) this.cboCode.getSelectedItem());
245
            Expression exp = this.pickerFormula.get();
246
            if( ExpressionUtils.isPhraseEmpty(exp) ) {
247
                foreingKey.setLabelFormula("");
248
            } else {
249
                foreingKey.setLabelFormula(exp.getPhrase());
250
            }
251
        }
252
    }
253
    
254

    
255
    private static class AvailableValuesController {
256

    
257
        private final JComboBox cboValues;
258
        private final JTextComponent txtLabel;
259
        private final JTextComponent txtValue;
260
        private final JButton btnAdd;
261
        private final JButton btnUpdate;
262
        private final JButton btnRemove;
263

    
264
        public AvailableValuesController(
265
                JComboBox cblValues,
266
                JTextComponent txtLabel,
267
                JTextComponent txtValue,
268
                JButton btnAdd,
269
                JButton btnUpdate,
270
                JButton btnRemove
271
        ) {
272
            this.cboValues = cblValues;
273
            this.txtLabel = txtLabel;
274
            this.txtValue = txtValue;
275
            this.btnAdd = btnAdd;
276
            this.btnUpdate = btnUpdate;
277
            this.btnRemove = btnRemove;
278

    
279
            this.cboValues.addItemListener(new ItemListener() {
280
                @Override
281
                public void itemStateChanged(ItemEvent e) {
282
                    doValuesChanged();
283
                }
284
            });
285
            this.btnAdd.addActionListener(new ActionListener() {
286
                @Override
287
                public void actionPerformed(ActionEvent e) {
288
                    doAdd();
289
                }
290
            });
291
            this.btnUpdate.addActionListener(new ActionListener() {
292
                @Override
293
                public void actionPerformed(ActionEvent e) {
294
                    doUpdate();
295
                }
296
            });
297
            this.btnRemove.addActionListener(new ActionListener() {
298
                @Override
299
                public void actionPerformed(ActionEvent e) {
300
                    doRemove();
301
                }
302
            });
303
        }
304

    
305
        public void clean() {
306
            this.cboValues.setModel(new DefaultComboBoxModel());
307
            this.txtLabel.setText("");
308
            this.txtValue.setText("");
309
            this.cboValues.setSelectedIndex(-1);
310
        }
311

    
312
        public DynObjectValueItem[] get() {
313
            ComboBoxModel<DynObjectValueItem> model = this.cboValues.getModel();
314
            DynObjectValueItem[] values = new DynObjectValueItem[model.getSize()];
315
            for (int i = 0; i < model.getSize(); i++) {
316
                values[i] = model.getElementAt(i);
317
            }
318
            return values;
319
        }
320

    
321
        public void set(DynObjectValueItem[] availableValues) {
322
            DefaultComboBoxModel model = new DefaultComboBoxModel();
323
            if (availableValues != null) {
324
                for (DynObjectValueItem availableValue : availableValues) {
325
                    model.addElement(availableValue);
326
                }
327
            }
328
            this.cboValues.setModel(model);
329
            if (model.getSize() > 0) {
330
                this.cboValues.setSelectedIndex(0);
331
            } else {
332
                this.cboValues.setSelectedIndex(-1);
333
            }
334
        }
335

    
336
        public void setEditable(boolean editable) {
337
            this.cboValues.setEnabled(editable);
338
            this.txtLabel.setEditable(editable);
339
            this.txtValue.setEditable(editable);
340
            this.btnAdd.setEnabled(editable);
341
            this.btnUpdate.setEnabled(editable);
342
            this.btnRemove.setEnabled(editable);
343
        }
344

    
345
        private void doValuesChanged() {
346
            DynObjectValueItem value = (DynObjectValueItem) this.cboValues.getSelectedItem();
347
            if (value == null) {
348
                this.txtLabel.setText("");
349
                this.txtValue.setText("");
350
                this.btnAdd.setEnabled(true);
351
                this.btnUpdate.setEnabled(false);
352
                this.btnRemove.setEnabled(false);
353
                return;
354
            }
355
            this.txtLabel.setText(value.getLabel());
356
            this.txtValue.setText(Objects.toString(value.getValue(), ""));
357
            this.btnAdd.setEnabled(true);
358
            this.btnUpdate.setEnabled(true);
359
            this.btnRemove.setEnabled(true);
360
        }
361

    
362
        private void doAdd() {
363
            DynObjectValueItem value = new DynObjectValueItem("Value", "Label");
364
            DefaultComboBoxModel model = (DefaultComboBoxModel) this.cboValues.getModel();
365
            model.addElement(value);
366
            this.cboValues.setSelectedIndex(model.getSize() - 1);
367
        }
368

    
369
        private void doUpdate() {
370
            DynObjectValueItem value = (DynObjectValueItem) this.cboValues.getSelectedItem();
371
            if (value == null) {
372
                return; // EEhh?? esto no deberia pasar
373
            }
374
            value.setLabel(this.txtLabel.getText());
375
            value.setValue(this.txtValue.getText());
376
        }
377

    
378
        private void doRemove() {
379
            int n = this.cboValues.getSelectedIndex();
380
            if (n < 0) {
381
                return; // EEhh?? esto no deberia pasar
382
            }
383
            DefaultComboBoxModel model = (DefaultComboBoxModel) this.cboValues.getModel();
384
            model.removeElementAt(n);
385
            if (--n < 0) {
386
                n = 0;
387
            }
388
            this.cboValues.setSelectedIndex(n);
389
        }
390

    
391
    }
392

    
393
    private final List<ListElement<Integer>> fieldTypes;
394
    private final List<ListElement<Integer>> geometryTypes;
395
    private final List<ListElement<Integer>> geometrySubtypes;
396

    
397
    private DatePickerController pickerIntervalEnd;
398
    private DatePickerController pickerIntervalStart;
399
    private CalculatorController<Integer> pickerSize;
400
    private CalculatorController<Integer> pickerPrecision;
401
    private CalculatorController<Object> pickerDefaultValue;
402
    private PickerController<IProjection> pickerCRS;
403
    private ExpressionPickerController pickerVirtualField;
404
    private CalculatorController<Integer> pickerOrder;
405
    private AvailableValuesController availableValuesController;
406
    private TagsController tagsController;
407
    private ForeingKeyController foreingKeyController;
408

    
409
    private boolean editable;
410
    private FeatureStoreElement featureStoreElement;
411

    
412
    public DefaultFeatureTypeAttributePanel() {
413
        this.editable = true;
414
        DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
415
        this.fieldTypes = new ArrayList<>();
416
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.BOOLEAN), DataTypes.BOOLEAN));
417
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.DATE), DataTypes.DATE));
418
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.TIME), DataTypes.TIME));
419
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.TIMESTAMP), DataTypes.TIMESTAMP));
420
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INT), DataTypes.INT));
421
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.DOUBLE), DataTypes.DOUBLE));
422
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.LONG), DataTypes.LONG));
423
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INTERVAL), DataTypes.INTERVAL));
424
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INSTANT), DataTypes.INSTANT));
425
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.STRING), DataTypes.STRING));
426
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.GEOMETRY), DataTypes.GEOMETRY));
427
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.BYTEARRAY), DataTypes.BYTEARRAY));
428
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.OBJECT), DataTypes.OBJECT));
429
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.LIST), DataTypes.LIST));
430
        this.fieldTypes.sort(new Comparator<ListElement<Integer>>() {
431
            @Override
432
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
433
                return o1.toString().compareTo(o2.toString());
434
            }
435
        });
436

    
437
        this.geometryTypes = new ArrayList<>();
438
        this.geometryTypes.add(new ListElement("Point", Geometry.TYPES.POINT));
439
        this.geometryTypes.add(new ListElement("Line", Geometry.TYPES.LINE));
440
        this.geometryTypes.add(new ListElement("Polygon", Geometry.TYPES.POLYGON));
441
        this.geometryTypes.add(new ListElement("MultiPoint", Geometry.TYPES.MULTIPOINT));
442
        this.geometryTypes.add(new ListElement("MultiLine", Geometry.TYPES.MULTILINE));
443
        this.geometryTypes.add(new ListElement("MultiPolygon", Geometry.TYPES.MULTIPOLYGON));
444
        this.geometryTypes.sort(new Comparator<ListElement<Integer>>() {
445
            @Override
446
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
447
                return o1.toString().compareTo(o2.toString());
448
            }
449
        });
450

    
451
        this.geometrySubtypes = new ArrayList<>();
452
        this.geometrySubtypes.add(new ListElement("2D", Geometry.SUBTYPES.GEOM2D));
453
        this.geometrySubtypes.add(new ListElement("2DM", Geometry.SUBTYPES.GEOM3D));
454
        this.geometrySubtypes.add(new ListElement("3D", Geometry.SUBTYPES.GEOM2DM));
455
        this.geometrySubtypes.add(new ListElement("3DM", Geometry.SUBTYPES.GEOM3DM));
456
        this.geometrySubtypes.sort(new Comparator<ListElement<Integer>>() {
457
            @Override
458
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
459
                return o1.toString().compareTo(o2.toString());
460
            }
461
        });
462

    
463
        this.initComponents();
464
    }
465

    
466
    private void initComponents() {
467
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
468
        ExpressionEvaluatorSwingManager evaluatorManager = ExpressionEvaluatorSwingLocator.getManager();
469
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
470

    
471
        DefaultComboBoxModel<ListElement<Integer>> modelTypes = new DefaultComboBoxModel<>();
472
        for (ListElement<Integer> element : fieldTypes) {
473
            modelTypes.addElement(element);
474
        }
475
        this.cboFieldType.setModel(modelTypes);
476

    
477
        DefaultComboBoxModel<ListElement<Integer>> modelGeomTypes = new DefaultComboBoxModel<>();
478
        for (ListElement<Integer> element : this.geometryTypes) {
479
            modelGeomTypes.addElement(element);
480
        }
481
        this.cboGeometryType.setModel(modelGeomTypes);
482

    
483
        DefaultComboBoxModel<ListElement<Integer>> modelGeomSubtypes = new DefaultComboBoxModel<>();
484
        for (ListElement<Integer> element : this.geometrySubtypes) {
485
            modelGeomSubtypes.addElement(element);
486
        }
487

    
488
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
489

    
490
        swingManager.translate(this.lblAllowNulls);
491
        swingManager.translate(this.lblCRS);
492
        swingManager.translate(this.lblDataProfile);
493
        swingManager.translate(this.lblDateFormat);
494
        swingManager.translate(this.lblDefaultValue);
495
        swingManager.translate(this.lblFieldName);
496
        swingManager.translate(this.lblFieldType);
497
        swingManager.translate(this.lblGeometrySubtype);
498
        swingManager.translate(this.lblGeometryType);
499
        swingManager.translate(this.lblInterval);
500
        swingManager.translate(this.lblIntervalEnd);
501
        swingManager.translate(this.lblIntervalStart);
502
        swingManager.translate(this.lblIsAutomatic);
503
        swingManager.translate(this.lblIsPrimaryKey);
504
        swingManager.translate(this.lblPrecision);
505
        swingManager.translate(this.lblSize);
506
        swingManager.translate(this.chkVirtualField);
507
        swingManager.translate(this.tabAditionalFields);
508
        swingManager.translate(this.tabLayout);
509
        swingManager.translate(this.lblGroup);
510
        swingManager.translate(this.lblOrder);
511
        swingManager.translate(this.lblHidden);
512
        swingManager.translate(this.lblLabel);
513
        swingManager.translate(this.lblDescription);
514
        swingManager.translate(this.lblMinValue);
515
        swingManager.translate(this.lblMaxValue);
516
        swingManager.translate(this.lblAvailableValues);
517
        swingManager.translate(this.lblAvailableValuesLabel);
518
        swingManager.translate(this.lblAvailableValuesValue);
519
        swingManager.translate(this.btnAvailableValuesAdd);
520
        swingManager.translate(this.btnAvailableValuesUpdate);
521
        swingManager.translate(this.btnAvailableValuesRemove);
522
        swingManager.translate(this.lblTagsName);
523
        swingManager.translate(this.lblTagsValue);
524

    
525
        swingManager.translate(this.lblForeingKeyCodeName);
526
        swingManager.translate(this.lblForeingKeyLabelFormula);
527
        swingManager.translate(this.lblForeingKeyTableName);
528
        swingManager.translate(this.lblIsClosedList);
529
        swingManager.translate(this.chkIsForeingKey);
530

    
531
        swingManager.addClearButton(this.txtDefaultValue);
532
        swingManager.addClearButton(this.txtFieldName);
533
        swingManager.addClearButton(this.txtIntervalEnd);
534
        swingManager.addClearButton(this.txtIntervalStart);
535
        swingManager.addClearButton(this.txtPrecision);
536
        swingManager.addClearButton(this.txtSize);
537
        swingManager.addClearButton(this.txtLabel);
538
        swingManager.addClearButton(this.txtDescription);
539
        swingManager.addClearButton(this.cboGroup);
540
        swingManager.addClearButton(this.txtMaxValue);
541
        swingManager.addClearButton(this.txtMinValue);
542
        swingManager.addClearButton(this.txtAvailableValuesLabel);
543
        swingManager.addClearButton(this.txtAvailableValuesValue);
544

    
545
        swingManager.setDefaultPopupMenu(this.txtDefaultValue);
546
        swingManager.setDefaultPopupMenu(this.txtFieldName);
547
        swingManager.setDefaultPopupMenu(this.txtIntervalEnd);
548
        swingManager.setDefaultPopupMenu(this.txtIntervalStart);
549
        swingManager.setDefaultPopupMenu(this.txtPrecision);
550
        swingManager.setDefaultPopupMenu(this.txtSize);
551
        swingManager.setDefaultPopupMenu(this.cboDateFormat);
552
        swingManager.setDefaultPopupMenu(this.cboFieldType);
553
        swingManager.setDefaultPopupMenu(this.cboGeometrySubtype);
554
        swingManager.setDefaultPopupMenu(this.cboGeometryType);
555
        swingManager.setDefaultPopupMenu(this.cboDataProfile);
556

    
557
        swingManager.setDefaultPopupMenu(this.cboForeingKeyCodeName);
558
        swingManager.setDefaultPopupMenu(this.cboForeingKeyTableName);
559

    
560
        swingManager.setDefaultPopupMenu(this.cboGroup);
561
        swingManager.setDefaultPopupMenu(this.txtOrder);
562
        swingManager.setDefaultPopupMenu(this.txtLabel);
563
        swingManager.setDefaultPopupMenu(this.txtDescription);
564
        swingManager.setDefaultPopupMenu(this.txtMinValue);
565
        swingManager.setDefaultPopupMenu(this.txtMaxValue);
566
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesLabel);
567
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesValue);
568

    
569
        this.foreingKeyController = new ForeingKeyController(
570
                chkIsForeingKey, 
571
                chkIsClosedList, 
572
                cboForeingKeyTableName, 
573
                cboForeingKeyCodeName, 
574
                txtForeingKeyFormula, 
575
                btnForeingKeyFormula
576
        );
577
        this.pickerIntervalEnd = swingManager.createDatePickerController(
578
                this.txtIntervalEnd,
579
                this.btnIntervalEnd
580
        );
581
        this.pickerIntervalStart = swingManager.createDatePickerController(
582
                this.txtIntervalStart,
583
                this.btnIntervalStart
584
        );
585
        this.pickerSize = evaluatorManager.createCalculatorController(
586
                this.txtSize, DataTypes.INT
587
        );
588
        this.pickerPrecision = evaluatorManager.createCalculatorController(
589
                this.txtPrecision, DataTypes.INT
590
        );
591
        this.pickerDefaultValue = evaluatorManager.createCalculatorController(
592
                this.txtDefaultValue, DataTypes.OBJECT
593
        );
594
        this.pickerOrder = evaluatorManager.createCalculatorController(
595
                this.txtOrder, DataTypes.INT
596
        );
597

    
598
        this.availableValuesController = new AvailableValuesController(
599
                cboAvailableValues,
600
                txtAvailableValuesLabel,
601
                txtAvailableValuesValue,
602
                btnAvailableValuesAdd,
603
                btnAvailableValuesUpdate,
604
                btnAvailableValuesRemove
605
        );
606
        this.tagsController = new TagsController(
607
                tblTags,
608
                cboTagsName,
609
                cboTagsValue,
610
                btnTagsAdd,
611
                btnTagsUpdate,
612
                btnTagsRemove,
613
                lblTagsDescription
614
        );
615
        this.txtMinValue.setEnabled(false);
616
        this.txtMaxValue.setEnabled(false);
617

    
618
        this.btnVirtualField.setText("");
619
        this.featureStoreElement = dataSwingManager.createFeatureStoreElement();
620
        this.pickerVirtualField = ExpressionEvaluatorSwingLocator.getManager()
621
                .createExpressionPickerController(txtVirtualField, btnVirtualField);
622
        this.pickerVirtualField.addElement(this.featureStoreElement);
623
        this.chkVirtualField.addChangeListener(new ChangeListener() {
624
            @Override
625
            public void stateChanged(ChangeEvent e) {
626
                if (chkVirtualField.isSelected()) {
627
                    pickerVirtualField.setEnabled(editable);
628
                } else {
629
                    pickerVirtualField.setEnabled(false);
630
                }
631
            }
632
        });
633

    
634
        this.pickerCRS = dataSwingManager.createProjectionPickerController(
635
                this.txtCRS, this.btnCRS
636
        );
637

    
638
        this.cboFieldType.addItemListener(new ItemListener() {
639
            @Override
640
            public void itemStateChanged(ItemEvent e) {
641
                SwingUtilities.invokeLater(new Runnable() {
642
                    @Override
643
                    public void run() {
644
                        doFieldTypeChanged();
645
                    }
646
                });
647

    
648
            }
649
        });
650

    
651
        this.pickerPrecision.addChangeListener(new ChangeListener() {
652
            @Override
653
            public void stateChanged(ChangeEvent e) {
654
                doCheckSizeAndPrecision();
655
            }
656
        });
657
        this.pickerSize.addChangeListener(new ChangeListener() {
658
            @Override
659
            public void stateChanged(ChangeEvent e) {
660
                doCheckSizeAndPrecision();
661
            }
662
        });
663

    
664
        DefaultComboBoxModel dataProfilesModel = new DefaultComboBoxModel<>();
665
        dataProfilesModel.addElement(new ListElement<>("", null));
666
        for (DataProfile profile : DALLocator.getDataManager().getDataProfiles()) {
667
            dataProfilesModel.addElement(new ListElement<>(profile.getName(), profile.getID()));
668
        }
669
        this.cboDataProfile.setModel(dataProfilesModel);
670
    }
671

    
672
    @Override
673
    public JComponent asJComponent() {
674
        return this;
675
    }
676

    
677
    @Override
678
    public EditableFeatureAttributeDescriptor fetch(EditableFeatureAttributeDescriptor descriptor) {
679
        I18nManager i18n = ToolsLocator.getI18nManager();
680
        try {
681
            if (!this.chkAllowNulls.isSelected()) {
682
                if (descriptor.allowNull()) {
683
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
684
                    dialogs.messageDialog(
685
                            i18n.getTranslation("_You_have_marked_not_allow_nulls") + "\n"
686
                            + i18n.getTranslation("If_you_are_not_fully_aware_of_the_repercussions_of_this_it_is_advisable_to_allow_nulls"),
687
                            null,
688
                            i18n.getTranslation("_Warning"),
689
                            JOptionPane.INFORMATION_MESSAGE,
690
                            "AllowNullsInFeatureTypeEditing"
691
                    );
692
                }
693
            }
694
            descriptor.setDataType((int) ListElement.getSelected(this.cboFieldType));
695
            descriptor.setName(this.txtFieldName.getText());
696
            descriptor.setAllowNull(this.chkAllowNulls.isSelected());
697
            descriptor.setIsPrimaryKey(this.chkIsPrimaryKey.isSelected());
698
            descriptor.setIsAutomatic(this.chkIsAutomatic.isSelected());
699
            descriptor.setSize(this.pickerSize.get(0));
700
            descriptor.setPrecision(this.pickerPrecision.get(0));
701
            descriptor.setDefaultValue(this.pickerDefaultValue.get());
702
            descriptor.setDataProfileName((String) ListElement.getSelected(this.cboDataProfile));
703
            switch (descriptor.getType()) {
704
                case DataTypes.GEOMETRY:
705
                    GeometryManager geomManager = GeometryLocator.getGeometryManager();
706
                    GeometryType geomType = geomManager.getGeometryType(
707
                            (int) ListElement.getSelected(this.cboGeometryType),
708
                            (int) ListElement.getSelected(this.cboGeometrySubtype)
709
                    );
710
                    descriptor.setGeometryType(geomType);
711
                    descriptor.setSRS(this.pickerCRS.get());
712
                    break;
713
                case DataTypes.INSTANT:
714
                case DataTypes.INTERVAL:
715
                case DataTypes.DATE:
716
                case DataTypes.TIME:
717
                case DataTypes.TIMESTAMP:
718
                    // FIXME
719
                    break;
720
                default:
721
                    break;
722
            }
723
            descriptor.setDataProfileName(
724
                    StringUtils.defaultIfBlank((String) ListElement.getSelected(cboDataProfile), null)
725
            );
726

    
727
            if (this.chkVirtualField.isSelected() && this.pickerVirtualField.isEnabled()) {
728
                Expression expression = this.pickerVirtualField.get();
729
                if (expression == null) {
730
                    descriptor.setFeatureAttributeEmulator((String) null);
731
                } else {
732
                    DataManager dataManager = DALLocator.getDataManager();
733
                    FeatureAttributeEmulatorExpression emulator = dataManager.createFeatureAttributeEmulatorExpression(
734
                            descriptor.getFeatureType(),
735
                            expression
736
                    );
737
                    if (!emulator.isValid()) {
738
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
739
                        dialogs.messageDialog(
740
                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")
741
                                + "\n"
742
                                + emulator.getErrorMessage(),
743
                                i18n.getTranslation("_Warning"),
744
                                JOptionPane.WARNING_MESSAGE
745
                        );
746
                        return null;
747
                    }
748
                    for (String requiredFieldName : emulator.getRequiredFieldNames()) {
749
                        if (StringUtils.equalsIgnoreCase(requiredFieldName, descriptor.getName())) {
750
                            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
751
                            dialogs.messageDialog(
752
                                    i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")
753
                                    + "\n\n"
754
                                    + i18n.getTranslation("_The_expression_contains_a_reference_to_itself"),
755
                                    i18n.getTranslation("_Warning"),
756
                                    JOptionPane.WARNING_MESSAGE
757
                            );
758
                            return null;
759
                        }
760
                    }
761
                    descriptor.setFeatureAttributeEmulator(emulator);
762
                    //
763
                    // No se porque esto de abajo no funciona.
764
                    // Nunca se lanza la excepcion en el get(Feature) de
765
                    // DefaultFeatureAttributeEmulatorExpression.
766
                    //
767
//                    try {
768
//                        emulator.setEnableExceptions(true);
769
//                        descriptor.setFeatureAttributeEmulator(emulator);
770
//                        this.pickerVirtualField.getPreviewSymbolTable().value(descriptor.getName());
771
//                    } catch(Throwable ex) {
772
//                        emulator.setEnableExceptions(false);
773
//                        descriptor.setFeatureAttributeEmulator(null);
774
//                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
775
//                        dialogs.messageDialog(
776
//                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+
777
//                                    "\n"+
778
//                                    ex.getMessage(), 
779
//                                i18n.getTranslation("_Warning"), 
780
//                                JOptionPane.WARNING_MESSAGE
781
//                        );
782
//                        return null;
783
//                    } finally {
784
//                        emulator.setEnableExceptions(false);
785
//                    }
786
                }
787
            }
788
        } catch (Exception ex) {
789
            LOGGER.warn("Can't retrieve information from user form.", ex);
790
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
791
            dialogs.messageDialog(
792
                    i18n.getTranslation("_Cant_retrieve_information_from_user_form")
793
                    + "\n"
794
                    + i18n.getTranslation("_See_log_for_details"),
795
                    i18n.getTranslation("_Warning"),
796
                    JOptionPane.WARNING_MESSAGE
797
            );
798
            return null;
799
        }
800

    
801
        descriptor.setGroup(StringUtils.defaultIfBlank((String) this.cboGroup.getSelectedItem(), null));
802
        descriptor.setOrder(this.pickerOrder.get(0));
803
        descriptor.setHidden(this.chkHidden.isSelected());
804
        descriptor.setLabel(StringUtils.defaultIfBlank(this.txtLabel.getText(), null));
805
        descriptor.setDescription(StringUtils.defaultIfBlank(this.txtDescription.getText(), null));
806

    
807
//        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
808
//        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
809
        descriptor.setAvailableValues(this.availableValuesController.get());
810

    
811
        this.tagsController.fetch(descriptor.getTags());
812
        this.foreingKeyController.fetch(descriptor.getForeingKey());
813
        return descriptor;
814
    }
815

    
816
    @Override
817
    public void clean() {
818
        this.pickerDefaultValue.set(null);
819
        this.txtFieldName.setText("");
820
//        this.pickerFieldName.set(null);
821
        this.pickerIntervalEnd.set(null);
822
        this.pickerIntervalStart.set(null);
823
        this.pickerPrecision.set(null);
824
        this.pickerSize.set(null);
825

    
826
        this.chkAllowNulls.setSelected(false);
827
        this.chkIsAutomatic.setSelected(false);
828
        this.chkIsPrimaryKey.setSelected(false);
829

    
830
        this.chkVirtualField.setSelected(false);
831
        this.chkVirtualField.setEnabled(editable);
832
        this.pickerVirtualField.setEnabled(false);
833
        this.pickerVirtualField.set(null);
834

    
835
        ListElement.setSelected(cboGeometryType, null);
836
        ListElement.setSelected(cboGeometrySubtype, null);
837

    
838
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
839

    
840
        this.cboDataProfile.setSelectedIndex(-1);
841

    
842
        this.cboGroup.setSelectedIndex(-1);
843
        this.pickerOrder.set(null);
844
        this.chkHidden.setSelected(false);
845
        this.txtLabel.setText("");
846
        this.txtDescription.setText("");
847
        this.txtMinValue.setText("");
848
        this.txtMaxValue.setText("");
849
        this.availableValuesController.clean();
850
        this.tagsController.clean();
851
        this.foreingKeyController.clean();
852
    }
853

    
854
    @Override
855
    public void put(FeatureAttributeDescriptor descriptor) {
856
        if (descriptor == null) {
857
            this.clean();
858
            return;
859
        }
860
        FeatureType featureType = descriptor.getFeatureType();
861
        DefaultComboBoxModel groupModel = new DefaultComboBoxModel();
862

    
863
        if (featureType != null) {
864
            FeatureStore store = descriptor.getFeatureType().getStore();
865
            this.featureStoreElement.setFeatureStore(store);
866
            if (store != null) {
867
                Feature sampleFeature = null;
868
                try {
869
                    sampleFeature = store.getFeatureSelection().first();
870
                    if (sampleFeature == null) {
871
                        sampleFeature = store.first();
872
                    }
873
                } catch (DataException ex) {
874
                }
875
                if (sampleFeature != null) {
876
                    FeatureSymbolTable featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable();
877
                    featureSymbolTable.setFeature(sampleFeature);
878
                    this.pickerVirtualField.setPreviewSymbolTable(featureSymbolTable.createParent());
879
                }
880
            }
881
            List<String> groups = new ArrayList<>();
882
            for (FeatureAttributeDescriptor otherdesc : featureType) {
883
                String group = otherdesc.getGroup();
884
                if (!StringUtils.isBlank(group) && !groups.contains(group)) {
885
                    groups.add(group);
886
                }
887
            }
888
            for (String group : groups) {
889
                groupModel.addElement(group);
890
            }
891
        }
892
        if (!(descriptor instanceof EditableFeatureAttributeDescriptor)) {
893
            this.setEditable(false);
894
        }
895

    
896
        this.pickerDefaultValue.set(descriptor.getDefaultValue());
897
        this.txtFieldName.setText(descriptor.getName());
898
        RelativeInterval interval = (RelativeInterval) descriptor.getInterval();
899
        if (interval == null) {
900
            this.pickerIntervalEnd.set(null);
901
            this.pickerIntervalStart.set(null);
902
        } else {
903
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
904
            this.pickerIntervalStart.set(interval.getStart().toDate());
905
        }
906
        this.pickerPrecision.set(descriptor.getPrecision());
907
        this.pickerSize.set(descriptor.getSize());
908

    
909
        this.chkAllowNulls.setSelected(descriptor.allowNull());
910
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
911
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
912

    
913
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
914
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
915
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
916
            this.chkVirtualField.setEnabled(editable);
917
            this.chkVirtualField.setSelected(true);
918
            this.pickerVirtualField.setEnabled(editable);
919
            this.pickerVirtualField.set(expression);
920
        } else if (descriptor.isComputed()) {
921
            this.chkVirtualField.setEnabled(false);
922
            this.chkVirtualField.setSelected(true);
923
            this.pickerVirtualField.setEnabled(false);
924
            this.pickerVirtualField.set(null);
925
        } else {
926
            this.chkVirtualField.setEnabled(editable);
927
            this.chkVirtualField.setSelected(false);
928
            this.pickerVirtualField.setEnabled(false);
929
            this.pickerVirtualField.set(null);
930
        }
931

    
932
        this.pickerCRS.set(descriptor.getSRS());
933

    
934
        if (descriptor.getGeomType() != null) {
935
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
936
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
937
        }
938
        ListElement.setSelected(cboFieldType, descriptor.getType());
939

    
940
        String profile = descriptor.getDataProfileName();
941
        if (StringUtils.isBlank(profile)) {
942
            this.cboDataProfile.setSelectedIndex(-1);
943
        } else {
944
            ListElement.setSelected(this.cboDataProfile, profile);
945
        }
946

    
947
        this.cboGroup.setModel(groupModel);
948
        this.cboGroup.setSelectedItem(StringUtils.defaultIfBlank(descriptor.getGroup(), ""));
949
        this.pickerOrder.set(descriptor.getOder());
950
        this.chkHidden.setSelected(descriptor.isHidden());
951
        this.txtLabel.setText(StringUtils.defaultIfBlank(descriptor.getLabel(), ""));
952
        this.txtDescription.setText(StringUtils.defaultIfBlank(descriptor.getDescription(), ""));
953
        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
954
        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
955
        this.availableValuesController.set(descriptor.getAvailableValues());
956
        this.tagsController.set(descriptor.getTags());
957

    
958
        this.foreingKeyController.put(descriptor.getForeingKey());
959
    }
960

    
961
    private void doFieldTypeChanged() {
962
        try {
963
            Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
964
            if (fieldType == null) {
965
                fieldType = DataTypes.UNKNOWN;
966
            }
967
            Integer size = this.pickerSize.get();
968
            if (fieldType == DataTypes.STRING) {
969
                if (size == null) {
970
                    this.pickerSize.set(50);
971
                }
972
            } else {
973
                int maxsize = this.getMaxSizeOfType(fieldType);
974
                if (size == null || (maxsize > 0 && size > maxsize)) {
975
                    this.pickerSize.set(maxsize);
976
                }
977
            }
978
            Integer precision = this.pickerPrecision.get();
979
            if (precision == null) {
980
                int defaultPrecision = this.getDefaultPrecisionOfType(fieldType);
981
                if (defaultPrecision > 0) {
982
                    this.pickerPrecision.set(defaultPrecision);
983
                }
984
            }
985

    
986
            switch (fieldType) {
987
                case DataTypes.GEOMETRY:
988
                    this.cboGeometryType.setEnabled(editable);
989
                    this.cboGeometrySubtype.setEnabled(editable);
990
                    this.pickerCRS.setEnabled(editable);
991
                    this.cboDateFormat.setEnabled(false);
992
                    this.pickerIntervalStart.setEnabled(false);
993
                    this.pickerIntervalEnd.setEditable(false);
994
                    this.tabAditionalFields.setEnabledAt(1, true);
995
                    this.tabAditionalFields.setEnabledAt(2, false);
996
                    this.pickerSize.set(null);
997
                    this.pickerPrecision.set(null);
998
                    this.pickerSize.setEnabled(false);
999
                    this.pickerPrecision.setEnabled(false);
1000
                    break;
1001
                case DataTypes.INSTANT:
1002
                case DataTypes.INTERVAL:
1003
                case DataTypes.DATE:
1004
                case DataTypes.TIME:
1005
                case DataTypes.TIMESTAMP:
1006
                    this.cboGeometryType.setEnabled(false);
1007
                    this.cboGeometrySubtype.setEnabled(false);
1008
                    this.pickerCRS.setEnabled(false);
1009
                    this.cboDateFormat.setEnabled(editable);
1010
                    this.pickerIntervalStart.setEnabled(editable);
1011
                    this.pickerIntervalEnd.setEnabled(editable);
1012
                    this.tabAditionalFields.setEnabledAt(1, false);
1013
                    this.tabAditionalFields.setEnabledAt(2, true);
1014
                    this.pickerSize.set(null);
1015
                    this.pickerPrecision.set(null);
1016
                    this.pickerSize.setEnabled(false);
1017
                    this.pickerPrecision.setEnabled(false);
1018
                    break;
1019
                case DataTypes.BYTE:
1020
                case DataTypes.INT:
1021
                case DataTypes.LONG:
1022
                case DataTypes.STRING:
1023
                    this.cboGeometryType.setEnabled(false);
1024
                    this.cboGeometrySubtype.setEnabled(false);
1025
                    this.pickerCRS.setEnabled(false);
1026
                    this.cboDateFormat.setEnabled(false);
1027
                    this.pickerIntervalStart.setEnabled(false);
1028
                    this.pickerIntervalEnd.setEditable(false);
1029
                    this.tabAditionalFields.setEnabledAt(1, false);
1030
                    this.tabAditionalFields.setEnabledAt(2, false);
1031

    
1032
                    this.pickerPrecision.set(null);
1033
                    this.pickerSize.setEnabled(true);
1034
                    this.pickerPrecision.setEnabled(false);
1035
                    break;
1036
                case DataTypes.FLOAT:
1037
                case DataTypes.DOUBLE:
1038
                    this.cboGeometryType.setEnabled(false);
1039
                    this.cboGeometrySubtype.setEnabled(false);
1040
                    this.pickerCRS.setEnabled(false);
1041
                    this.cboDateFormat.setEnabled(false);
1042
                    this.pickerIntervalStart.setEnabled(false);
1043
                    this.pickerIntervalEnd.setEditable(false);
1044
                    this.tabAditionalFields.setEnabledAt(1, false);
1045
                    this.tabAditionalFields.setEnabledAt(2, false);
1046

    
1047
                    this.pickerSize.setEnabled(true);
1048
                    this.pickerPrecision.setEnabled(true);
1049
                    break;
1050
                default:
1051
                    this.cboGeometryType.setEnabled(false);
1052
                    this.cboGeometrySubtype.setEnabled(false);
1053
                    this.pickerCRS.setEnabled(false);
1054
                    this.cboDateFormat.setEnabled(false);
1055
                    this.pickerIntervalStart.setEnabled(false);
1056
                    this.pickerIntervalEnd.setEditable(false);
1057
                    this.tabAditionalFields.setEnabledAt(1, false);
1058
                    this.tabAditionalFields.setEnabledAt(2, false);
1059
                    this.pickerSize.set(null);
1060
                    this.pickerPrecision.set(null);
1061
                    this.pickerSize.setEnabled(false);
1062
                    this.pickerPrecision.setEnabled(false);
1063
            }
1064
        } catch (Exception ex) {
1065
            LOGGER.warn("Problems changing field type.", ex);
1066
        }
1067

    
1068
    }
1069

    
1070
    @Override
1071
    public void setEditable(boolean editable) {
1072
        this.editable = editable;
1073
        this.pickerDefaultValue.setEditable(editable);
1074
        this.txtFieldName.setEditable(editable);
1075
//        this.pickerFieldName.setEditable(editable);
1076
        this.pickerIntervalEnd.setEditable(editable);
1077
        this.pickerIntervalStart.setEditable(editable);
1078
        this.pickerPrecision.setEditable(editable);
1079
        this.pickerSize.setEditable(editable);
1080
        this.cboDataProfile.setEnabled(editable);
1081

    
1082
        this.chkAllowNulls.setEnabled(editable);
1083
        this.chkIsAutomatic.setEnabled(editable);
1084
        this.chkIsPrimaryKey.setEnabled(editable);
1085

    
1086
        this.chkVirtualField.setEnabled(editable);
1087
        this.pickerVirtualField.setEditable(editable);
1088

    
1089
        this.cboDateFormat.setEnabled(editable);
1090
        this.cboFieldType.setEnabled(editable);
1091
        this.cboGeometryType.setEnabled(editable);
1092
        this.cboGeometrySubtype.setEnabled(editable);
1093
        this.pickerCRS.setEditable(editable);
1094

    
1095
        this.cboGroup.setEnabled(editable);
1096
        this.pickerOrder.setEditable(editable);
1097
        this.chkHidden.setEnabled(editable);
1098
        this.txtLabel.setEditable(editable);
1099
        this.txtDescription.setEditable(editable);
1100
        this.txtMinValue.setEditable(false);
1101
        this.txtMaxValue.setEditable(false);
1102
        this.availableValuesController.setEditable(editable);
1103
        this.tagsController.setEditable(editable);
1104
        this.foreingKeyController.setEditable(editable);
1105
    }
1106

    
1107
    private int getMaxSizeOfType(int dataType) {
1108
        switch (dataType) {
1109
            case DataTypes.BOOLEAN:
1110
                return 1;
1111
            case DataTypes.BYTE:
1112
                return 3;
1113
            case DataTypes.INT:
1114
                return 9;
1115
            case DataTypes.LONG:
1116
                return 19;
1117
            case DataTypes.FLOAT:
1118
                return 20;
1119
            case DataTypes.DOUBLE:
1120
                return 20;
1121
            case DataTypes.DATE:
1122
                return 8;
1123
            default:
1124
                return -1;
1125
        }
1126
    }
1127

    
1128
    private int getDefaultPrecisionOfType(int dataType) {
1129
        switch (dataType) {
1130
            case DataTypes.FLOAT:
1131
                return 6;
1132
            case DataTypes.DOUBLE:
1133
                return 6;
1134
            default:
1135
                return -1;
1136
        }
1137
    }
1138

    
1139
    private void doCheckSizeAndPrecision() {
1140
        Integer size = this.pickerSize.get();
1141
        if (size == null) {
1142
            return;
1143
        }
1144
        int maxsize = this.getMaxSizeOfType((int) ListElement.getSelected(cboFieldType));
1145
        if (size < 1 || (maxsize > 0 && size > maxsize)) {
1146
            this.pickerSize.setWarning(true, "The size is not valid for the selected type");
1147
        } else {
1148
            this.pickerSize.setWarning(false);
1149
        }
1150
        if (this.pickerPrecision.isEnabled()) {
1151
            Integer precision = this.pickerPrecision.get();
1152
            if (precision == null) {
1153
                return;
1154
            }
1155
            if (precision < 0) {
1156
                this.pickerPrecision.setWarning(true, "the precision can not have a negative value");
1157
            } else if (precision > size) {
1158
                this.pickerPrecision.setWarning(true, "the precision can not have a value greater than the size");
1159
            } else {
1160
                this.pickerPrecision.setWarning(false);
1161
            }
1162
        }
1163
    }
1164

    
1165
    @Override
1166
    public void setNameAsNew(FeatureType featureType) {
1167
        this.txtFieldName.setText(DefaultFeatureTypePanel.getNewFieldName(featureType));
1168
    }
1169

    
1170
    @Override
1171
    public String getName() {
1172
        return StringUtils.defaultIfBlank(this.txtFieldName.getText(), null);
1173
    }
1174

    
1175
}