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

History | View | Annotate | Download (53.7 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.dal.swing.featuretype.FeatureTypePanel;
55
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_EDIT_ALL;
56
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_EDIT_ONLY_METADATA;
57
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_SHOW_ONLY;
58
import org.gvsig.fmap.geom.Geometry;
59
import org.gvsig.fmap.geom.GeometryLocator;
60
import org.gvsig.fmap.geom.GeometryManager;
61
import org.gvsig.fmap.geom.type.GeometryType;
62
import org.gvsig.timesupport.RelativeInterval;
63
import org.gvsig.tools.ToolsLocator;
64
import org.gvsig.tools.dataTypes.DataType;
65
import org.gvsig.tools.dataTypes.DataType.NumberPrecisionAndScale;
66
import org.gvsig.tools.dataTypes.DataTypesManager;
67
import org.gvsig.tools.dynobject.DynObjectValueItem;
68
import org.gvsig.tools.i18n.I18nManager;
69
import org.gvsig.tools.swing.api.ListElement;
70
import org.gvsig.tools.swing.api.ToolsSwingLocator;
71
import org.gvsig.tools.swing.api.ToolsSwingManager;
72
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
73
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
74
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
75
import org.slf4j.Logger;
76
import org.slf4j.LoggerFactory;
77

    
78
/**
79
 *
80
 * @author jjdelcerro
81
 */
82
@SuppressWarnings({"UseSpecificCatch","Convert2Lambda"})
83
public class DefaultFeatureTypeAttributePanel
84
        extends FeatureTypeAttributePanelView
85
        implements FeatureTypeAttributePanel {
86

    
87
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypeAttributePanel.class);
88

    
89
    private static class ForeingKeyController {
90

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

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

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

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

    
262
    private static class AvailableValuesController {
263

    
264
        private final JComboBox cboValues;
265
        private final JTextComponent txtLabel;
266
        private final JTextComponent txtValue;
267
        private final JButton btnAdd;
268
        private final JButton btnUpdate;
269
        private final JButton btnRemove;
270

    
271
        public AvailableValuesController(
272
                JComboBox cblValues,
273
                JTextComponent txtLabel,
274
                JTextComponent txtValue,
275
                JButton btnAdd,
276
                JButton btnUpdate,
277
                JButton btnRemove
278
        ) {
279
            this.cboValues = cblValues;
280
            this.txtLabel = txtLabel;
281
            this.txtValue = txtValue;
282
            this.btnAdd = btnAdd;
283
            this.btnUpdate = btnUpdate;
284
            this.btnRemove = btnRemove;
285

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

    
312
        public void clean() {
313
            this.cboValues.setModel(new DefaultComboBoxModel());
314
            this.txtLabel.setText("");
315
            this.txtValue.setText("");
316
            this.cboValues.setSelectedIndex(-1);
317
        }
318

    
319
        public DynObjectValueItem[] get() {
320
            ComboBoxModel<DynObjectValueItem> model = this.cboValues.getModel();
321
            DynObjectValueItem[] values = new DynObjectValueItem[model.getSize()];
322
            for (int i = 0; i < model.getSize(); i++) {
323
                values[i] = model.getElementAt(i);
324
            }
325
            return values;
326
        }
327

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

    
343
        public void setEditable(boolean editable) {
344
            this.cboValues.setEnabled(editable);
345
            this.txtLabel.setEditable(editable);
346
            this.txtValue.setEditable(editable);
347
            this.btnAdd.setEnabled(editable);
348
            this.btnUpdate.setEnabled(editable);
349
            this.btnRemove.setEnabled(editable);
350
        }
351

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

    
369
        private void doAdd() {
370
            DynObjectValueItem value = new DynObjectValueItem("Value", "Label");
371
            DefaultComboBoxModel model = (DefaultComboBoxModel) this.cboValues.getModel();
372
            model.addElement(value);
373
            this.cboValues.setSelectedIndex(model.getSize() - 1);
374
        }
375

    
376
        private void doUpdate() {
377
            DynObjectValueItem value = (DynObjectValueItem) this.cboValues.getSelectedItem();
378
            if (value == null) {
379
                return; // EEhh?? esto no deberia pasar
380
            }
381
            value.setLabel(this.txtLabel.getText());
382
            value.setValue(this.txtValue.getText());
383
        }
384

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

    
398
    }
399

    
400
    private final List<ListElement<Integer>> fieldTypes;
401
    private final List<ListElement<Integer>> geometryTypes;
402
    private final List<ListElement<Integer>> geometrySubtypes;
403

    
404
    private DatePickerController pickerIntervalEnd;
405
    private DatePickerController pickerIntervalStart;
406
    private CalculatorController<Integer> pickerSize;
407
    private CalculatorController<Integer> pickerPrecision;
408
    private CalculatorController<Integer> pickerScale;
409
    private CalculatorController<Object> pickerDefaultValue;
410
    private PickerController<IProjection> pickerCRS;
411
    private ExpressionPickerController pickerVirtualField;
412
    private CalculatorController<Integer> pickerOrder;
413
    private AvailableValuesController availableValuesController;
414
    private TagsController tagsController;
415
    private ForeingKeyController foreingKeyController;
416

    
417
    private int mode;
418
    private FeatureStoreElement featureStoreElement;
419

    
420
    public DefaultFeatureTypeAttributePanel() {
421
        this.mode = FeatureTypePanel.MODE_SHOW_ONLY;
422
        DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
423
        this.fieldTypes = new ArrayList<>();
424
        for (DataType dataType : dataManager) {
425
            fieldTypes.add( new ListElement<>(dataType.getName(), dataType.getType()) );
426
        }
427
        fieldTypes.sort(new Comparator<ListElement<Integer>>() {
428
            @Override
429
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
430
                return o1.toString().compareTo(o2.toString());
431
            }
432
        });
433

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

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

    
460
        this.initComponents();
461
    }
462

    
463
    private void initComponents() {
464
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
465
        ExpressionEvaluatorSwingManager evaluatorManager = ExpressionEvaluatorSwingLocator.getManager();
466
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
467

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

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

    
480
        DefaultComboBoxModel<ListElement<Integer>> modelGeomSubtypes = new DefaultComboBoxModel<>();
481
        for (ListElement<Integer> element : this.geometrySubtypes) {
482
            modelGeomSubtypes.addElement(element);
483
        }
484

    
485
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
486

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

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

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

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

    
555
        swingManager.setDefaultPopupMenu(this.cboForeingKeyCodeName);
556
        swingManager.setDefaultPopupMenu(this.cboForeingKeyTableName);
557

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

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

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

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

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

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

    
649
            }
650
        });
651

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

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

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

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

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

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

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

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

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

    
828
        this.chkAllowNulls.setSelected(false);
829
        this.chkIsAutomatic.setSelected(false);
830
        this.chkIsPrimaryKey.setSelected(false);
831

    
832
        this.chkVirtualField.setSelected(false);
833
        this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
834
        this.pickerVirtualField.setEditable(false);
835
        this.pickerVirtualField.set(null);
836

    
837
        ListElement.setSelected(cboGeometryType, null);
838
        ListElement.setSelected(cboGeometrySubtype, null);
839

    
840
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
841

    
842
        this.cboDataProfile.setSelectedIndex(-1);
843

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

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

    
866
        if (featureType != null) {
867
            FeatureStore store = descriptor.getFeatureType().getStore();
868
            this.featureStoreElement.setFeatureStore(store);
869
            if (store != null) {
870
                Feature sampleFeature = null;
871
                try {
872
                    sampleFeature = store.getFeatureSelection().first();
873
                    if (sampleFeature == null) {
874
                        sampleFeature = store.first();
875
                    }
876
                } catch (DataException ex) {
877
                }
878
                if (sampleFeature != null) {
879
                    FeatureSymbolTable featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable();
880
                    featureSymbolTable.setFeature(sampleFeature);
881
                    this.pickerVirtualField.setPreviewSymbolTable(featureSymbolTable.createParent());
882
                }
883
            }
884
            List<String> groups = new ArrayList<>();
885
            for (FeatureAttributeDescriptor otherdesc : featureType) {
886
                String group = otherdesc.getGroup();
887
                if (!StringUtils.isBlank(group) && !groups.contains(group)) {
888
                    groups.add(group);
889
                }
890
            }
891
            for (String group : groups) {
892
                groupModel.addElement(group);
893
            }
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
        if( dataType.supportSize() ) {
907
          this.pickerSize.set(descriptor.getSize());
908
        } else {
909
          this.pickerSize.set(null);
910
        }
911
        if( dataType.supportPrecision() ) {
912
          this.pickerPrecision.set(descriptor.getPrecision());
913
        } else {
914
          this.pickerPrecision.set(null);
915
        }
916
        if( dataType.supportScale()) {
917
          this.pickerScale.set(descriptor.getScale());
918
        } else {
919
          this.pickerScale.set(null);
920
        }
921
        this.chkAllowNulls.setSelected(descriptor.allowNull());
922
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
923
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
924

    
925
        this.pickerVirtualField.setEnabled(true);
926
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
927
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
928
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
929
            this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL);
930
            this.chkVirtualField.setSelected(true);
931
            this.pickerVirtualField.set(expression);
932
        } else if (descriptor.isComputed()) {
933
            this.chkVirtualField.setEnabled(false);
934
            this.chkVirtualField.setSelected(true);
935
            this.pickerVirtualField.set(null);
936
        } else {
937
            this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL);
938
            this.chkVirtualField.setSelected(false);
939
            this.pickerVirtualField.set(null);
940
        }
941

    
942
        this.pickerCRS.set(descriptor.getSRS());
943

    
944
        if (descriptor.getGeomType() != null) {
945
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
946
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
947
        }
948
        ListElement.setSelected(cboFieldType, descriptor.getType());
949

    
950
        String profile = descriptor.getDataProfileName();
951
        if (StringUtils.isBlank(profile)) {
952
            this.cboDataProfile.setSelectedIndex(-1);
953
        } else {
954
            ListElement.setSelected(this.cboDataProfile, profile);
955
        }
956

    
957
        this.cboGroup.setModel(groupModel);
958
        this.cboGroup.setSelectedItem(StringUtils.defaultIfBlank(descriptor.getGroup(), ""));
959
        this.pickerOrder.set(descriptor.getOder());
960
        this.chkHidden.setSelected(descriptor.isHidden());
961
        if (descriptor.hasLabel()) {
962
            this.txtLabel.setText(StringUtils.defaultIfBlank(descriptor.getLabel(), ""));
963
        } else {
964
            this.txtLabel.setText("");
965
        }
966
        if (descriptor.hasDescription()) {
967
            this.txtDescription.setText(StringUtils.defaultIfBlank(descriptor.getDescription(), ""));
968
        } else {
969
            this.txtDescription.setText("");
970
        }
971
        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
972
        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
973
        this.availableValuesController.set(descriptor.getAvailableValues());
974
        this.tagsController.set(descriptor.getTags());
975

    
976
        this.foreingKeyController.put(descriptor.getForeingKey());
977
        
978
        if (!(descriptor instanceof EditableFeatureAttributeDescriptor)) {
979
            this.setMode(FeatureTypePanel.MODE_SHOW_ONLY);
980
        }
981
        this.updateEditableStates();
982
    }
983

    
984
    private DataType getDataType() {
985
      Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
986
      if (fieldType == null) {
987
          return null;
988
      }
989
      DataType dataType = ToolsLocator.getDataTypesManager().get(fieldType);
990
      return dataType;
991
    }
992

    
993
    private void doFieldTypeChanged() {
994
      try {
995
        DataType dataType = this.getDataType();
996

    
997
        if( dataType.supportSize() ) {
998
            this.pickerSize.setEditable(this.mode == MODE_EDIT_ALL);
999
        } else {
1000
            this.pickerSize.setEditable(false);
1001
            this.pickerSize.set(null);
1002
        }        
1003
        if( dataType.supportPrecision() ) {
1004
          if( dataType.isPredefinedPrecision() ) {
1005
            this.pickerPrecision.setEditable(false);
1006
          } else {
1007
            this.pickerPrecision.setEditable(this.mode == MODE_EDIT_ALL);
1008
          }
1009
        } else {
1010
            this.pickerPrecision.setEditable(false);
1011
            this.pickerPrecision.set(null);
1012
        }        
1013
        if( dataType.supportScale()) {
1014
            this.pickerScale.setEditable(this.mode == MODE_EDIT_ALL);
1015
        } else {
1016
            this.pickerScale.setEditable(false);
1017
            this.pickerScale.set(null);
1018
        }        
1019
        switch (dataType.getType()) {
1020
          case DataTypes.GEOMETRY:
1021
            this.cboGeometryType.setEnabled(this.mode == MODE_EDIT_ALL);
1022
            this.cboGeometrySubtype.setEnabled(this.mode == MODE_EDIT_ALL);
1023
            this.pickerCRS.setEditable(this.mode == MODE_EDIT_ALL);
1024
            this.cboDateFormat.setEnabled(false);
1025
            this.pickerIntervalStart.setEditable(false);
1026
            this.pickerIntervalEnd.setEditable(false);
1027
            this.tabAditionalFields.setEnabledAt(1, true);
1028
            this.tabAditionalFields.setEnabledAt(2, false);
1029
            break;
1030
          case DataTypes.INSTANT:
1031
          case DataTypes.INTERVAL:
1032
          case DataTypes.DATE:
1033
          case DataTypes.TIME:
1034
          case DataTypes.TIMESTAMP:
1035
            this.cboGeometryType.setEnabled(false);
1036
            this.cboGeometrySubtype.setEnabled(false);
1037
            this.pickerCRS.setEditable(false);
1038
            this.cboDateFormat.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1039
            this.pickerIntervalStart.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1040
            this.pickerIntervalEnd.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1041
            this.tabAditionalFields.setEnabledAt(1, false);
1042
            this.tabAditionalFields.setEnabledAt(2, true);
1043
            break;
1044
          case DataTypes.BYTE:
1045
          case DataTypes.INT:
1046
          case DataTypes.LONG:
1047
          case DataTypes.STRING:
1048
          case DataTypes.FILE:
1049
          case DataTypes.URL:
1050
          case DataTypes.URI:
1051
          case DataTypes.FLOAT:
1052
          case DataTypes.DOUBLE:
1053
          case DataTypes.DECIMAL:
1054
            this.cboGeometryType.setEnabled(false);
1055
            this.cboGeometrySubtype.setEnabled(false);
1056
            this.pickerCRS.setEditable(false);
1057
            this.cboDateFormat.setEnabled(false);
1058
            this.pickerIntervalStart.setEditable(false);
1059
            this.pickerIntervalEnd.setEditable(false);
1060
            this.tabAditionalFields.setEnabledAt(1, false);
1061
            this.tabAditionalFields.setEnabledAt(2, false);
1062
            break;
1063
          default:
1064
            this.cboGeometryType.setEnabled(false);
1065
            this.cboGeometrySubtype.setEnabled(false);
1066
            this.pickerCRS.setEditable(false);
1067
            this.cboDateFormat.setEnabled(false);
1068
            this.pickerIntervalStart.setEditable(false);
1069
            this.pickerIntervalEnd.setEditable(false);
1070
            this.tabAditionalFields.setEnabledAt(1, false);
1071
            this.tabAditionalFields.setEnabledAt(2, false);
1072
        }
1073
      } catch (Exception ex) {
1074
        LOGGER.warn("Problems changing field type.", ex);
1075
      }
1076

    
1077
    }
1078
    
1079
    boolean isVirtualField() {
1080
        return this.chkVirtualField.isSelected();
1081
    }
1082

    
1083
    @Override
1084
    public int getMode() {
1085
        return this.mode;
1086
    }
1087
    
1088
    @Override
1089
    public void setMode(int mode) {
1090
        this.mode = mode;
1091
        updateEditableStates();
1092
    }
1093
    
1094
    private void updateEditableStates() {
1095
        DataType dataType = this.getDataType();
1096
        switch(this.mode) {
1097
            case MODE_EDIT_ALL:
1098
                this.pickerDefaultValue.setEditable(true);
1099
                this.txtFieldName.setEditable(true);
1100
                this.pickerIntervalEnd.setEditable(true);
1101
                this.pickerIntervalStart.setEditable(true);
1102
                this.pickerSize.setEditable(dataType.supportSize());
1103
                if( dataType.isPredefinedPrecision() ) {
1104
                  this.pickerPrecision.setEditable(false);
1105
                  this.pickerPrecision.set(dataType.getMaxPrecision());
1106
                } else {
1107
                  this.pickerPrecision.setEditable(dataType.supportPrecision());
1108
                }
1109
                this.pickerScale.setEditable(dataType.supportScale());
1110
                this.cboDataProfile.setEnabled(true);
1111

    
1112
                this.chkAllowNulls.setEnabled(true);
1113
                this.chkIsAutomatic.setEnabled(true);
1114
                if( this.isVirtualField() ) {
1115
                    this.chkIsPrimaryKey.setEnabled(false);
1116
                } else {
1117
                    this.chkIsPrimaryKey.setEnabled(true);
1118
                }
1119

    
1120
                this.chkVirtualField.setEnabled(true);
1121
                this.pickerVirtualField.setEditable(true);
1122

    
1123
                this.cboDateFormat.setEnabled(true);
1124
                this.cboFieldType.setEnabled(true);
1125
                this.cboGeometryType.setEnabled(true);
1126
                this.cboGeometrySubtype.setEnabled(true);
1127
                this.pickerCRS.setEditable(true);
1128

    
1129
                this.cboGroup.setEnabled(true);
1130
                this.pickerOrder.setEditable(true);
1131
                this.chkHidden.setEnabled(true);
1132
                this.txtLabel.setEditable(true);
1133
                this.txtDescription.setEditable(true);
1134
                this.txtMinValue.setEditable(false);
1135
                this.txtMaxValue.setEditable(false);
1136
                this.availableValuesController.setEditable(true);
1137
                this.tagsController.setEditable(true);
1138
                this.foreingKeyController.setEditable(true);
1139
                break;
1140
            case MODE_EDIT_ONLY_METADATA:
1141
                if( this.chkVirtualField.isSelected() ) {
1142
                    this.txtFieldName.setEditable(true);
1143
                    this.pickerScale.setEditable(true);
1144
                    this.pickerSize.setEditable(true);
1145
                    this.pickerVirtualField.setEditable(true);
1146
                    this.cboFieldType.setEnabled(true);
1147
                    this.cboGeometryType.setEnabled(true);
1148
                    this.cboGeometrySubtype.setEnabled(true);
1149
                    this.pickerCRS.setEditable(true);
1150
                } else {
1151
                    this.txtFieldName.setEditable(false);
1152
                    this.pickerPrecision.setEditable(false);
1153
                    this.pickerScale.setEditable(false);
1154
                    this.pickerSize.setEditable(false);
1155
                    this.pickerVirtualField.setEditable(false);
1156
                    this.cboFieldType.setEnabled(false);
1157
                    this.cboGeometryType.setEnabled(false);
1158
                    this.cboGeometrySubtype.setEnabled(false);
1159
                    this.pickerCRS.setEditable(false);
1160
                }
1161

    
1162
                this.pickerDefaultValue.setEditable(true);
1163
                this.pickerIntervalEnd.setEditable(true);
1164
                this.pickerIntervalStart.setEditable(true);
1165

    
1166
                this.cboDataProfile.setEnabled(true);
1167

    
1168
                this.chkAllowNulls.setEnabled(false);
1169
                this.chkIsAutomatic.setEnabled(false);
1170
                if( this.isVirtualField() ) {
1171
                    this.chkIsPrimaryKey.setEnabled(false);
1172
                } else {
1173
                    this.chkIsPrimaryKey.setEnabled(true);
1174
                }
1175

    
1176
                this.chkVirtualField.setEnabled(false);
1177

    
1178
                this.cboDateFormat.setEnabled(true);
1179

    
1180
                this.cboGroup.setEnabled(true);
1181
                this.pickerOrder.setEditable(true);
1182
                this.chkHidden.setEnabled(true);
1183
                this.txtLabel.setEditable(true);
1184
                this.txtDescription.setEditable(true);
1185
                this.txtMinValue.setEditable(false);
1186
                this.txtMaxValue.setEditable(false);
1187
                this.availableValuesController.setEditable(true);
1188
                this.tagsController.setEditable(true);
1189
                this.foreingKeyController.setEditable(true);
1190
                break;
1191
            case MODE_SHOW_ONLY:
1192
                this.pickerDefaultValue.setEditable(false);
1193
                this.txtFieldName.setEditable(false);
1194
                this.pickerIntervalEnd.setEditable(false);
1195
                this.pickerIntervalStart.setEditable(false);
1196
                this.pickerPrecision.setEditable(false);
1197
                this.pickerScale.setEditable(false);
1198
                this.pickerSize.setEditable(false);
1199
                this.cboDataProfile.setEnabled(false);
1200

    
1201
                this.chkAllowNulls.setEnabled(false);
1202
                this.chkIsAutomatic.setEnabled(false);
1203
                this.chkIsPrimaryKey.setEnabled(false);
1204

    
1205
                this.chkVirtualField.setEnabled(false);
1206
                this.pickerVirtualField.setEditable(false);
1207

    
1208
                this.cboDateFormat.setEnabled(false);
1209
                this.cboFieldType.setEnabled(false);
1210
                this.cboGeometryType.setEnabled(false);
1211
                this.cboGeometrySubtype.setEnabled(false);
1212
                this.pickerCRS.setEditable(false);
1213

    
1214
                this.cboGroup.setEnabled(false);
1215
                this.pickerOrder.setEditable(false);
1216
                this.chkHidden.setEnabled(false);
1217
                this.txtLabel.setEditable(false);
1218
                this.txtDescription.setEditable(false);
1219
                this.txtMinValue.setEditable(false);
1220
                this.txtMaxValue.setEditable(false);
1221
                this.availableValuesController.setEditable(false);
1222
                this.tagsController.setEditable(false);
1223
                this.foreingKeyController.setEditable(false);
1224
                break;
1225
        }
1226
    }
1227

    
1228
    private void doCheckPrecisionAndScale() {
1229
      DataType dataType = this.getDataType();
1230
      
1231
      Integer precision = this.pickerPrecision.get();
1232
      if( precision==null ) {
1233
        precision = 0;
1234
      }
1235
      Integer scale = this.pickerScale.get();
1236
      if( scale == null ) {
1237
        scale = 0;
1238
      }      
1239
      NumberPrecisionAndScale r = dataType.fixPrecisionAndScale(precision, scale);
1240
      if( r.getPrecision()!=precision || r.getScale()!=scale ) {
1241
        this.pickerPrecision.setWarning(true, "The precision/scale are not valids");
1242
        this.pickerScale.setWarning(true, "The precision/scale are not valids");
1243
      } else {
1244
        this.pickerPrecision.setWarning(false);
1245
        this.pickerScale.setWarning(false);
1246
      }
1247
    }
1248

    
1249
    @Override
1250
    public void setNameAsNew(FeatureType featureType) {
1251
        EditableFeatureType cloneFeatureType = featureType.getCopy().getEditable();
1252
        EditableFeatureAttributeDescriptor newAttributeDescriptor = cloneFeatureType.add(
1253
                cloneFeatureType.getNewFieldName(), 
1254
                DataTypes.STRING);
1255
        this.put(newAttributeDescriptor);
1256
    }
1257

    
1258
    @Override
1259
    public String getName() {
1260
        return StringUtils.defaultIfBlank(this.txtFieldName.getText(), null);
1261
    }
1262

    
1263
}