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

History | View | Annotate | Download (49.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.EditableFeatureType;
44
import org.gvsig.fmap.dal.feature.EditableForeingKey;
45
import org.gvsig.fmap.dal.feature.Feature;
46
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
47
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
48
import org.gvsig.fmap.dal.feature.FeatureStore;
49
import org.gvsig.fmap.dal.feature.FeatureType;
50
import org.gvsig.fmap.dal.feature.ForeingKey;
51
import org.gvsig.fmap.dal.swing.DALSwingLocator;
52
import org.gvsig.fmap.dal.swing.DataSwingManager;
53
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
54
import org.gvsig.fmap.geom.Geometry;
55
import org.gvsig.fmap.geom.GeometryLocator;
56
import org.gvsig.fmap.geom.GeometryManager;
57
import org.gvsig.fmap.geom.type.GeometryType;
58
import org.gvsig.timesupport.RelativeInterval;
59
import org.gvsig.tools.ToolsLocator;
60
import org.gvsig.tools.dataTypes.DataType;
61
import org.gvsig.tools.dataTypes.DataTypesManager;
62
import org.gvsig.tools.dynobject.DynObjectValueItem;
63
import org.gvsig.tools.i18n.I18nManager;
64
import org.gvsig.tools.swing.api.ListElement;
65
import org.gvsig.tools.swing.api.ToolsSwingLocator;
66
import org.gvsig.tools.swing.api.ToolsSwingManager;
67
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
68
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
69
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
70
import org.slf4j.Logger;
71
import org.slf4j.LoggerFactory;
72

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

    
82
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypeAttributePanel.class);
83

    
84
    private static class ForeingKeyController {
85

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

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

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

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

    
257
    private static class AvailableValuesController {
258

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

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

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

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

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

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

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

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

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

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

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

    
393
    }
394

    
395
    private final List<ListElement<Integer>> fieldTypes;
396
    private final List<ListElement<Integer>> geometryTypes;
397
    private final List<ListElement<Integer>> geometrySubtypes;
398

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

    
411
    private boolean editable;
412
    private FeatureStoreElement featureStoreElement;
413

    
414
    public DefaultFeatureTypeAttributePanel() {
415
        this.editable = true;
416
        DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
417
        this.fieldTypes = new ArrayList<>();
418
        for (DataType dataType : dataManager) {
419
            fieldTypes.add( new ListElement<>(dataType.getName(), dataType.getType()) );
420
        }
421
        fieldTypes.sort(new Comparator<ListElement<Integer>>() {
422
            @Override
423
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
424
                return o1.toString().compareTo(o2.toString());
425
            }
426
        });
427

    
428
        this.geometryTypes = new ArrayList<>();
429
        this.geometryTypes.add(new ListElement("Point", Geometry.TYPES.POINT));
430
        this.geometryTypes.add(new ListElement("Line", Geometry.TYPES.LINE));
431
        this.geometryTypes.add(new ListElement("Polygon", Geometry.TYPES.POLYGON));
432
        this.geometryTypes.add(new ListElement("MultiPoint", Geometry.TYPES.MULTIPOINT));
433
        this.geometryTypes.add(new ListElement("MultiLine", Geometry.TYPES.MULTILINE));
434
        this.geometryTypes.add(new ListElement("MultiPolygon", Geometry.TYPES.MULTIPOLYGON));
435
        this.geometryTypes.sort(new Comparator<ListElement<Integer>>() {
436
            @Override
437
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
438
                return o1.toString().compareTo(o2.toString());
439
            }
440
        });
441

    
442
        this.geometrySubtypes = new ArrayList<>();
443
        this.geometrySubtypes.add(new ListElement("2D", Geometry.SUBTYPES.GEOM2D));
444
        this.geometrySubtypes.add(new ListElement("2DM", Geometry.SUBTYPES.GEOM3D));
445
        this.geometrySubtypes.add(new ListElement("3D", Geometry.SUBTYPES.GEOM2DM));
446
        this.geometrySubtypes.add(new ListElement("3DM", Geometry.SUBTYPES.GEOM3DM));
447
        this.geometrySubtypes.sort(new Comparator<ListElement<Integer>>() {
448
            @Override
449
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
450
                return o1.toString().compareTo(o2.toString());
451
            }
452
        });
453

    
454
        this.initComponents();
455
    }
456

    
457
    private void initComponents() {
458
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
459
        ExpressionEvaluatorSwingManager evaluatorManager = ExpressionEvaluatorSwingLocator.getManager();
460
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
461

    
462
        DefaultComboBoxModel<ListElement<Integer>> modelTypes = new DefaultComboBoxModel<>();
463
        for (ListElement<Integer> element : fieldTypes) {
464
            modelTypes.addElement(element);
465
        }
466
        this.cboFieldType.setModel(modelTypes);
467

    
468
        DefaultComboBoxModel<ListElement<Integer>> modelGeomTypes = new DefaultComboBoxModel<>();
469
        for (ListElement<Integer> element : this.geometryTypes) {
470
            modelGeomTypes.addElement(element);
471
        }
472
        this.cboGeometryType.setModel(modelGeomTypes);
473

    
474
        DefaultComboBoxModel<ListElement<Integer>> modelGeomSubtypes = new DefaultComboBoxModel<>();
475
        for (ListElement<Integer> element : this.geometrySubtypes) {
476
            modelGeomSubtypes.addElement(element);
477
        }
478

    
479
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
480

    
481
        swingManager.translate(this.lblAllowNulls);
482
        swingManager.translate(this.lblCRS);
483
        swingManager.translate(this.lblDataProfile);
484
        swingManager.translate(this.lblDateFormat);
485
        swingManager.translate(this.lblDefaultValue);
486
        swingManager.translate(this.lblFieldName);
487
        swingManager.translate(this.lblFieldType);
488
        swingManager.translate(this.lblGeometrySubtype);
489
        swingManager.translate(this.lblGeometryType);
490
        swingManager.translate(this.lblInterval);
491
        swingManager.translate(this.lblIntervalEnd);
492
        swingManager.translate(this.lblIntervalStart);
493
        swingManager.translate(this.lblIsAutomatic);
494
        swingManager.translate(this.lblIsPrimaryKey);
495
        swingManager.translate(this.lblPrecision);
496
        swingManager.translate(this.lblSize);
497
        swingManager.translate(this.chkVirtualField);
498
        swingManager.translate(this.tabAditionalFields);
499
        swingManager.translate(this.tabLayout);
500
        swingManager.translate(this.lblGroup);
501
        swingManager.translate(this.lblOrder);
502
        swingManager.translate(this.lblHidden);
503
        swingManager.translate(this.lblLabel);
504
        swingManager.translate(this.lblDescription);
505
        swingManager.translate(this.lblMinValue);
506
        swingManager.translate(this.lblMaxValue);
507
        swingManager.translate(this.lblAvailableValues);
508
        swingManager.translate(this.lblAvailableValuesLabel);
509
        swingManager.translate(this.lblAvailableValuesValue);
510
        swingManager.translate(this.btnAvailableValuesAdd);
511
        swingManager.translate(this.btnAvailableValuesUpdate);
512
        swingManager.translate(this.btnAvailableValuesRemove);
513
        swingManager.translate(this.lblTagsName);
514
        swingManager.translate(this.lblTagsValue);
515

    
516
        swingManager.translate(this.lblForeingKeyCodeName);
517
        swingManager.translate(this.lblForeingKeyLabelFormula);
518
        swingManager.translate(this.lblForeingKeyTableName);
519
        swingManager.translate(this.lblIsClosedList);
520
        swingManager.translate(this.chkIsForeingKey);
521

    
522
        swingManager.addClearButton(this.txtDefaultValue);
523
        swingManager.addClearButton(this.txtFieldName);
524
        swingManager.addClearButton(this.txtIntervalEnd);
525
        swingManager.addClearButton(this.txtIntervalStart);
526
        swingManager.addClearButton(this.txtPrecision);
527
        swingManager.addClearButton(this.txtSize);
528
        swingManager.addClearButton(this.txtLabel);
529
        swingManager.addClearButton(this.txtDescription);
530
        swingManager.addClearButton(this.cboGroup);
531
        swingManager.addClearButton(this.txtMaxValue);
532
        swingManager.addClearButton(this.txtMinValue);
533
        swingManager.addClearButton(this.txtAvailableValuesLabel);
534
        swingManager.addClearButton(this.txtAvailableValuesValue);
535

    
536
        swingManager.setDefaultPopupMenu(this.txtDefaultValue);
537
        swingManager.setDefaultPopupMenu(this.txtFieldName);
538
        swingManager.setDefaultPopupMenu(this.txtIntervalEnd);
539
        swingManager.setDefaultPopupMenu(this.txtIntervalStart);
540
        swingManager.setDefaultPopupMenu(this.txtPrecision);
541
        swingManager.setDefaultPopupMenu(this.txtSize);
542
        swingManager.setDefaultPopupMenu(this.cboDateFormat);
543
        swingManager.setDefaultPopupMenu(this.cboFieldType);
544
        swingManager.setDefaultPopupMenu(this.cboGeometrySubtype);
545
        swingManager.setDefaultPopupMenu(this.cboGeometryType);
546
        swingManager.setDefaultPopupMenu(this.cboDataProfile);
547

    
548
        swingManager.setDefaultPopupMenu(this.cboForeingKeyCodeName);
549
        swingManager.setDefaultPopupMenu(this.cboForeingKeyTableName);
550

    
551
        swingManager.setDefaultPopupMenu(this.cboGroup);
552
        swingManager.setDefaultPopupMenu(this.txtOrder);
553
        swingManager.setDefaultPopupMenu(this.txtLabel);
554
        swingManager.setDefaultPopupMenu(this.txtDescription);
555
        swingManager.setDefaultPopupMenu(this.txtMinValue);
556
        swingManager.setDefaultPopupMenu(this.txtMaxValue);
557
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesLabel);
558
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesValue);
559

    
560
        this.foreingKeyController = new ForeingKeyController(
561
                chkIsForeingKey, 
562
                chkIsClosedList, 
563
                cboForeingKeyTableName, 
564
                cboForeingKeyCodeName, 
565
                txtForeingKeyFormula, 
566
                btnForeingKeyFormula
567
        );
568
        this.pickerIntervalEnd = swingManager.createDatePickerController(
569
                this.txtIntervalEnd,
570
                this.btnIntervalEnd
571
        );
572
        this.pickerIntervalStart = swingManager.createDatePickerController(
573
                this.txtIntervalStart,
574
                this.btnIntervalStart
575
        );
576
        this.pickerSize = evaluatorManager.createCalculatorController(
577
                this.txtSize, DataTypes.INT
578
        );
579
        this.pickerPrecision = evaluatorManager.createCalculatorController(
580
                this.txtPrecision, DataTypes.INT
581
        );
582
        this.pickerDefaultValue = evaluatorManager.createCalculatorController(
583
                this.txtDefaultValue, DataTypes.OBJECT
584
        );
585
        this.pickerOrder = evaluatorManager.createCalculatorController(
586
                this.txtOrder, DataTypes.INT
587
        );
588

    
589
        this.availableValuesController = new AvailableValuesController(
590
                cboAvailableValues,
591
                txtAvailableValuesLabel,
592
                txtAvailableValuesValue,
593
                btnAvailableValuesAdd,
594
                btnAvailableValuesUpdate,
595
                btnAvailableValuesRemove
596
        );
597
        this.tagsController = new TagsController(
598
                tblTags,
599
                cboTagsName,
600
                cboTagsValue,
601
                btnTagsAdd,
602
                btnTagsUpdate,
603
                btnTagsRemove,
604
                lblTagsDescription
605
        );
606
        this.txtMinValue.setEnabled(false);
607
        this.txtMaxValue.setEnabled(false);
608

    
609
        this.btnVirtualField.setText("");
610
        this.featureStoreElement = dataSwingManager.createFeatureStoreElement();
611
        this.pickerVirtualField = ExpressionEvaluatorSwingLocator.getManager()
612
                .createExpressionPickerController(txtVirtualField, btnVirtualField);
613
        this.pickerVirtualField.addElement(this.featureStoreElement);
614
        this.chkVirtualField.addChangeListener(new ChangeListener() {
615
            @Override
616
            public void stateChanged(ChangeEvent e) {
617
                if (chkVirtualField.isSelected()) {
618
                    pickerVirtualField.setEnabled(editable);
619
                } else {
620
                    pickerVirtualField.setEnabled(false);
621
                }
622
            }
623
        });
624

    
625
        this.pickerCRS = dataSwingManager.createProjectionPickerController(
626
                this.txtCRS, this.btnCRS
627
        );
628

    
629
        this.cboFieldType.addItemListener(new ItemListener() {
630
            @Override
631
            public void itemStateChanged(ItemEvent e) {
632
                SwingUtilities.invokeLater(new Runnable() {
633
                    @Override
634
                    public void run() {
635
                        doFieldTypeChanged();
636
                    }
637
                });
638

    
639
            }
640
        });
641

    
642
        this.pickerPrecision.addChangeListener(new ChangeListener() {
643
            @Override
644
            public void stateChanged(ChangeEvent e) {
645
                doCheckSizeAndPrecision();
646
            }
647
        });
648
        this.pickerSize.addChangeListener(new ChangeListener() {
649
            @Override
650
            public void stateChanged(ChangeEvent e) {
651
                doCheckSizeAndPrecision();
652
            }
653
        });
654

    
655
        DefaultComboBoxModel dataProfilesModel = new DefaultComboBoxModel<>();
656
        dataProfilesModel.addElement(new ListElement<>("", null));
657
        for (DataProfile profile : DALLocator.getDataManager().getDataProfiles()) {
658
            dataProfilesModel.addElement(new ListElement<>(profile.getName(), profile.getID()));
659
        }
660
        this.cboDataProfile.setModel(dataProfilesModel);
661
    }
662

    
663
    @Override
664
    public JComponent asJComponent() {
665
        return this;
666
    }
667

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

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

    
792
        descriptor.setGroup(StringUtils.defaultIfBlank((String) this.cboGroup.getSelectedItem(), null));
793
        descriptor.setOrder(this.pickerOrder.get(0));
794
        descriptor.setHidden(this.chkHidden.isSelected());
795
        descriptor.setLabel(StringUtils.defaultIfBlank(this.txtLabel.getText(), null));
796
        descriptor.setDescription(StringUtils.defaultIfBlank(this.txtDescription.getText(), null));
797

    
798
//        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
799
//        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
800
        descriptor.setAvailableValues(this.availableValuesController.get());
801

    
802
        this.tagsController.fetch(descriptor.getTags());
803
        this.foreingKeyController.fetch(descriptor.getForeingKey());
804
        return descriptor;
805
    }
806

    
807
    @Override
808
    public void clean() {
809
        this.pickerDefaultValue.set(null);
810
        this.txtFieldName.setText("");
811
//        this.pickerFieldName.set(null);
812
        this.pickerIntervalEnd.set(null);
813
        this.pickerIntervalStart.set(null);
814
        this.pickerPrecision.set(null);
815
        this.pickerSize.set(null);
816

    
817
        this.chkAllowNulls.setSelected(false);
818
        this.chkIsAutomatic.setSelected(false);
819
        this.chkIsPrimaryKey.setSelected(false);
820

    
821
        this.chkVirtualField.setSelected(false);
822
        this.chkVirtualField.setEnabled(editable);
823
        this.pickerVirtualField.setEnabled(false);
824
        this.pickerVirtualField.set(null);
825

    
826
        ListElement.setSelected(cboGeometryType, null);
827
        ListElement.setSelected(cboGeometrySubtype, null);
828

    
829
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
830

    
831
        this.cboDataProfile.setSelectedIndex(-1);
832

    
833
        this.cboGroup.setSelectedIndex(-1);
834
        this.pickerOrder.set(null);
835
        this.chkHidden.setSelected(false);
836
        this.txtLabel.setText("");
837
        this.txtDescription.setText("");
838
        this.txtMinValue.setText("");
839
        this.txtMaxValue.setText("");
840
        this.availableValuesController.clean();
841
        this.tagsController.clean();
842
        this.foreingKeyController.clean();
843
    }
844

    
845
    @Override
846
    public void put(FeatureAttributeDescriptor descriptor) {
847
        if (descriptor == null) {
848
            this.clean();
849
            return;
850
        }
851
        FeatureType featureType = descriptor.getFeatureType();
852
        DefaultComboBoxModel groupModel = new DefaultComboBoxModel();
853

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

    
887
        this.pickerDefaultValue.set(descriptor.getDefaultValue());
888
        this.txtFieldName.setText(descriptor.getName());
889
        RelativeInterval interval = (RelativeInterval) descriptor.getInterval();
890
        if (interval == null) {
891
            this.pickerIntervalEnd.set(null);
892
            this.pickerIntervalStart.set(null);
893
        } else {
894
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
895
            this.pickerIntervalStart.set(interval.getStart().toDate());
896
        }
897
        this.pickerPrecision.set(descriptor.getPrecision());
898
        this.pickerSize.set(descriptor.getSize());
899

    
900
        this.chkAllowNulls.setSelected(descriptor.allowNull());
901
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
902
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
903

    
904
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
905
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
906
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
907
            this.chkVirtualField.setEnabled(editable);
908
            this.chkVirtualField.setSelected(true);
909
            this.pickerVirtualField.setEnabled(editable);
910
            this.pickerVirtualField.set(expression);
911
        } else if (descriptor.isComputed()) {
912
            this.chkVirtualField.setEnabled(false);
913
            this.chkVirtualField.setSelected(true);
914
            this.pickerVirtualField.setEnabled(false);
915
            this.pickerVirtualField.set(null);
916
        } else {
917
            this.chkVirtualField.setEnabled(editable);
918
            this.chkVirtualField.setSelected(false);
919
            this.pickerVirtualField.setEnabled(false);
920
            this.pickerVirtualField.set(null);
921
        }
922

    
923
        this.pickerCRS.set(descriptor.getSRS());
924

    
925
        if (descriptor.getGeomType() != null) {
926
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
927
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
928
        }
929
        ListElement.setSelected(cboFieldType, descriptor.getType());
930

    
931
        String profile = descriptor.getDataProfileName();
932
        if (StringUtils.isBlank(profile)) {
933
            this.cboDataProfile.setSelectedIndex(-1);
934
        } else {
935
            ListElement.setSelected(this.cboDataProfile, profile);
936
        }
937

    
938
        this.cboGroup.setModel(groupModel);
939
        this.cboGroup.setSelectedItem(StringUtils.defaultIfBlank(descriptor.getGroup(), ""));
940
        this.pickerOrder.set(descriptor.getOder());
941
        this.chkHidden.setSelected(descriptor.isHidden());
942
        this.txtLabel.setText(StringUtils.defaultIfBlank(descriptor.getLabel(), ""));
943
        this.txtDescription.setText(StringUtils.defaultIfBlank(descriptor.getDescription(), ""));
944
        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
945
        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
946
        this.availableValuesController.set(descriptor.getAvailableValues());
947
        this.tagsController.set(descriptor.getTags());
948

    
949
        this.foreingKeyController.put(descriptor.getForeingKey());
950
    }
951

    
952
    private void doFieldTypeChanged() {
953
        try {
954
            Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
955
            if (fieldType == null) {
956
                fieldType = DataTypes.UNKNOWN;
957
            }
958
            Integer size = this.pickerSize.get();
959
            if (fieldType == DataTypes.STRING) {
960
                if (size == null) {
961
                    this.pickerSize.set(50);
962
                }
963
            } else {
964
                int maxsize = this.getMaxSizeOfType(fieldType);
965
                if (size == null || (maxsize > 0 && size > maxsize)) {
966
                    this.pickerSize.set(maxsize);
967
                }
968
            }
969
            Integer precision = this.pickerPrecision.get();
970
            if (precision == null) {
971
                int defaultPrecision = this.getDefaultPrecisionOfType(fieldType);
972
                if (defaultPrecision > 0) {
973
                    this.pickerPrecision.set(defaultPrecision);
974
                }
975
            }
976

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

    
1026
                    this.pickerPrecision.set(null);
1027
                    this.pickerSize.setEnabled(true);
1028
                    this.pickerPrecision.setEnabled(false);
1029
                    break;
1030
                case DataTypes.FLOAT:
1031
                case DataTypes.DOUBLE:
1032
                    this.cboGeometryType.setEnabled(false);
1033
                    this.cboGeometrySubtype.setEnabled(false);
1034
                    this.pickerCRS.setEnabled(false);
1035
                    this.cboDateFormat.setEnabled(false);
1036
                    this.pickerIntervalStart.setEnabled(false);
1037
                    this.pickerIntervalEnd.setEditable(false);
1038
                    this.tabAditionalFields.setEnabledAt(1, false);
1039
                    this.tabAditionalFields.setEnabledAt(2, false);
1040

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

    
1062
    }
1063

    
1064
    @Override
1065
    public void setEditable(boolean editable) {
1066
        this.editable = editable;
1067
        this.pickerDefaultValue.setEditable(editable);
1068
        this.txtFieldName.setEditable(editable);
1069
//        this.pickerFieldName.setEditable(editable);
1070
        this.pickerIntervalEnd.setEditable(editable);
1071
        this.pickerIntervalStart.setEditable(editable);
1072
        this.pickerPrecision.setEditable(editable);
1073
        this.pickerSize.setEditable(editable);
1074
        this.cboDataProfile.setEnabled(editable);
1075

    
1076
        this.chkAllowNulls.setEnabled(editable);
1077
        this.chkIsAutomatic.setEnabled(editable);
1078
        this.chkIsPrimaryKey.setEnabled(editable);
1079

    
1080
        this.chkVirtualField.setEnabled(editable);
1081
        this.pickerVirtualField.setEditable(editable);
1082

    
1083
        this.cboDateFormat.setEnabled(editable);
1084
        this.cboFieldType.setEnabled(editable);
1085
        this.cboGeometryType.setEnabled(editable);
1086
        this.cboGeometrySubtype.setEnabled(editable);
1087
        this.pickerCRS.setEditable(editable);
1088

    
1089
        this.cboGroup.setEnabled(editable);
1090
        this.pickerOrder.setEditable(editable);
1091
        this.chkHidden.setEnabled(editable);
1092
        this.txtLabel.setEditable(editable);
1093
        this.txtDescription.setEditable(editable);
1094
        this.txtMinValue.setEditable(false);
1095
        this.txtMaxValue.setEditable(false);
1096
        this.availableValuesController.setEditable(editable);
1097
        this.tagsController.setEditable(editable);
1098
        this.foreingKeyController.setEditable(editable);
1099
    }
1100

    
1101
    private int getMaxSizeOfType(int dataType) {
1102
        switch (dataType) {
1103
            case DataTypes.BOOLEAN:
1104
                return 1;
1105
            case DataTypes.BYTE:
1106
                return 3;
1107
            case DataTypes.INT:
1108
                return 9;
1109
            case DataTypes.LONG:
1110
                return 19;
1111
            case DataTypes.FLOAT:
1112
                return 20;
1113
            case DataTypes.DOUBLE:
1114
                return 20;
1115
            case DataTypes.DATE:
1116
                return 8;
1117
            default:
1118
                return -1;
1119
        }
1120
    }
1121

    
1122
    private int getDefaultPrecisionOfType(int dataType) {
1123
        switch (dataType) {
1124
            case DataTypes.FLOAT:
1125
                return 6;
1126
            case DataTypes.DOUBLE:
1127
                return 6;
1128
            default:
1129
                return -1;
1130
        }
1131
    }
1132

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

    
1159
    @Override
1160
    public void setNameAsNew(FeatureType featureType) {
1161
        EditableFeatureType cloneFeatureType = featureType.getCopy().getEditable();
1162
        EditableFeatureAttributeDescriptor newAttributeDescriptor = cloneFeatureType.add(
1163
                cloneFeatureType.getNewFieldName(), 
1164
                DataTypes.STRING);
1165
        this.put(newAttributeDescriptor);
1166
    }
1167

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

    
1173
}