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 / DefaultFeatureAttributePanel.java @ 44947

History | View | Annotate | Download (61.4 KB)

1 44077 jjdelcerro
package org.gvsig.fmap.dal.swing.impl.featuretype;
2
3 44740 jjdelcerro
import java.awt.Component;
4 44202 jjdelcerro
import java.awt.event.ActionEvent;
5 44096 jjdelcerro
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypeAttributePanel;
6 44085 jjdelcerro
import java.awt.event.ItemEvent;
7 44740 jjdelcerro
import java.net.URL;
8 44077 jjdelcerro
import java.util.ArrayList;
9
import java.util.List;
10 44202 jjdelcerro
import java.util.Objects;
11 44077 jjdelcerro
import javax.swing.DefaultComboBoxModel;
12 44740 jjdelcerro
import javax.swing.DefaultListCellRenderer;
13 44719 jjdelcerro
import javax.swing.DefaultListModel;
14 44740 jjdelcerro
import javax.swing.ImageIcon;
15 44202 jjdelcerro
import javax.swing.JButton;
16 44262 jjdelcerro
import javax.swing.JCheckBox;
17 44202 jjdelcerro
import javax.swing.JComboBox;
18 44077 jjdelcerro
import javax.swing.JComponent;
19 44740 jjdelcerro
import javax.swing.JLabel;
20 44719 jjdelcerro
import javax.swing.JList;
21 44085 jjdelcerro
import javax.swing.JOptionPane;
22 44740 jjdelcerro
import javax.swing.JScrollPane;
23 44262 jjdelcerro
import javax.swing.JTextField;
24 44719 jjdelcerro
import javax.swing.ListModel;
25 44085 jjdelcerro
import javax.swing.SwingUtilities;
26
import javax.swing.event.ChangeEvent;
27 44719 jjdelcerro
import javax.swing.event.ListSelectionEvent;
28 44202 jjdelcerro
import javax.swing.text.JTextComponent;
29 44740 jjdelcerro
import org.apache.commons.io.FilenameUtils;
30 44128 jjdelcerro
import org.apache.commons.lang3.StringUtils;
31 44077 jjdelcerro
import org.cresques.cts.IProjection;
32
import org.gvsig.expressionevaluator.Expression;
33 44262 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionUtils;
34 44077 jjdelcerro
import org.gvsig.expressionevaluator.swing.CalculatorController;
35
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
36
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
37
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
38 44085 jjdelcerro
import org.gvsig.fmap.dal.DALLocator;
39
import org.gvsig.fmap.dal.DataManager;
40 44262 jjdelcerro
import org.gvsig.fmap.dal.DataStore;
41 44077 jjdelcerro
import org.gvsig.fmap.dal.DataTypes;
42 44262 jjdelcerro
import org.gvsig.fmap.dal.StoresRepository;
43
import org.gvsig.fmap.dal.complements.Search;
44 44100 jjdelcerro
import org.gvsig.fmap.dal.exception.DataException;
45 44077 jjdelcerro
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
46 44100 jjdelcerro
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
47 44128 jjdelcerro
import org.gvsig.fmap.dal.feature.DataProfile;
48 44077 jjdelcerro
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
49 44498 omartinez
import org.gvsig.fmap.dal.feature.EditableFeatureType;
50 44262 jjdelcerro
import org.gvsig.fmap.dal.feature.EditableForeingKey;
51 44100 jjdelcerro
import org.gvsig.fmap.dal.feature.Feature;
52 44077 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
53
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
54 44100 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureStore;
55 44128 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureType;
56 44262 jjdelcerro
import org.gvsig.fmap.dal.feature.ForeingKey;
57 44077 jjdelcerro
import org.gvsig.fmap.dal.swing.DALSwingLocator;
58 44085 jjdelcerro
import org.gvsig.fmap.dal.swing.DataSwingManager;
59 44149 jjdelcerro
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
60 44505 jjdelcerro
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel;
61
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_EDIT_ALL;
62
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_EDIT_ONLY_METADATA;
63
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_SHOW_ONLY;
64 44077 jjdelcerro
import org.gvsig.fmap.geom.Geometry;
65 44085 jjdelcerro
import org.gvsig.fmap.geom.GeometryLocator;
66
import org.gvsig.fmap.geom.GeometryManager;
67
import org.gvsig.fmap.geom.type.GeometryType;
68 44077 jjdelcerro
import org.gvsig.timesupport.RelativeInterval;
69
import org.gvsig.tools.ToolsLocator;
70 44472 jjdelcerro
import org.gvsig.tools.dataTypes.DataType;
71 44673 jjdelcerro
import org.gvsig.tools.dataTypes.DataType.NumberPrecisionAndScale;
72 44077 jjdelcerro
import org.gvsig.tools.dataTypes.DataTypesManager;
73 44740 jjdelcerro
import org.gvsig.tools.dynobject.DynField;
74 44202 jjdelcerro
import org.gvsig.tools.dynobject.DynObjectValueItem;
75 44152 jjdelcerro
import org.gvsig.tools.i18n.I18nManager;
76 44077 jjdelcerro
import org.gvsig.tools.swing.api.ListElement;
77
import org.gvsig.tools.swing.api.ToolsSwingLocator;
78
import org.gvsig.tools.swing.api.ToolsSwingManager;
79
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
80
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
81 44085 jjdelcerro
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
82 44740 jjdelcerro
import org.gvsig.tools.swing.api.windowmanager.Dialog;
83
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
84
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
85
import org.gvsig.tools.swing.icontheme.IconTheme;
86 44128 jjdelcerro
import org.slf4j.Logger;
87
import org.slf4j.LoggerFactory;
88 44077 jjdelcerro
89
/**
90
 *
91
 * @author jjdelcerro
92
 */
93 44713 jjdelcerro
@SuppressWarnings({"UseSpecificCatch"})
94
public class DefaultFeatureAttributePanel
95
        extends DefaultFeatureAttributePanelView
96 44085 jjdelcerro
        implements FeatureTypeAttributePanel {
97 44077 jjdelcerro
98 44713 jjdelcerro
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureAttributePanel.class);
99 44202 jjdelcerro
100 44262 jjdelcerro
    private static class ForeingKeyController {
101
102
        private final JCheckBox chkIsForeingKey;
103 44338 jjdelcerro
        private final JCheckBox chkIsClosedList;
104 44262 jjdelcerro
        private final JComboBox cboTable;
105
        private final JComboBox cboCode;
106
        private final JTextField txtFormula;
107
        private final JButton btnFormula;
108
        private ExpressionPickerController pickerFormula;
109
        private boolean editable;
110
        private FeatureStoreElement featureStoreElement;
111 44412 omartinez
        private ForeingKey foreingKey;
112 44262 jjdelcerro
113
        public ForeingKeyController(
114
                JCheckBox chkIsForeingKey,
115 44338 jjdelcerro
                JCheckBox chkIsClosedList,
116 44262 jjdelcerro
                JComboBox cboTable,
117
                JComboBox cboCode,
118
                JTextField txtFormula,
119
                JButton btnFormula
120
        ) {
121
            this.chkIsForeingKey = chkIsForeingKey;
122 44338 jjdelcerro
            this.chkIsClosedList = chkIsClosedList;
123 44262 jjdelcerro
            this.cboTable = cboTable;
124
            this.cboCode = cboCode;
125
            this.txtFormula = txtFormula;
126
            this.btnFormula = btnFormula;
127
            this.initComponents();
128
        }
129
130
        private void initComponents() {
131
            DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
132
133
            this.editable = true;
134
135
            DefaultComboBoxModel<String> model = new DefaultComboBoxModel();
136
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
137
            for (String tableName : repository.keySet()) {
138
                model.addElement(tableName);
139
            }
140
            this.cboTable.setModel(model);
141 44719 jjdelcerro
            this.cboTable.addItemListener((ItemEvent e) -> {
142
              if (e.getStateChange() != ItemEvent.SELECTED) {
143
                return;
144
              }
145
              Thread th = new Thread(() -> {
146
                doPopulateComboCode();
147
              }, "FeatureTypePanelForeingKeyPopulateComboCode");
148
              th.start();
149 44262 jjdelcerro
            });
150
            this.btnFormula.setText("");
151
            this.featureStoreElement = dataSwingManager.createFeatureStoreElement();
152
            this.pickerFormula = ExpressionEvaluatorSwingLocator.getManager()
153
                    .createExpressionPickerController(txtFormula, btnFormula);
154
            this.pickerFormula.addElement(this.featureStoreElement);
155
156
//            this.chkIsForeingKey.addChangeListener(new ChangeListener() {
157
//                @Override
158
//                public void stateChanged(ChangeEvent e) {
159
//                    if (chkIsForeingKey.isSelected()) {
160
//                        setEnabled(editable);
161
//                    } else {
162
//                        setEnabled(false);
163
//                    }
164
//                }
165
//            });
166
        }
167
168
        private void doPopulateComboCode() {
169
            String tableName = (String) this.cboTable.getSelectedItem();
170
            if( StringUtils.isBlank(tableName) ) {
171
                return;
172
            }
173
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
174 44304 jjdelcerro
            DataStore store = repository.getStore(tableName);
175 44262 jjdelcerro
            if( !(store instanceof FeatureStore) ) {
176
                return;
177
            }
178
            this.featureStoreElement.setFeatureStore((FeatureStore) store);
179
            FeatureType featureType;
180
            try {
181
                featureType = ((FeatureStore)store).getDefaultFeatureType();
182
            } catch (DataException ex) {
183
                return;
184
            }
185
            Search search = (Search) ToolsLocator.getComplementsManager().get(
186
                    Search.COMPLEMENT_MANE, featureType
187
            );
188 44337 jjdelcerro
            List<Search.OrderedAttribute> attributes = search.getOrderedAttributes(
189 44262 jjdelcerro
                    Search.BASIC_TYPES_FILTER,
190
                    Search.LABEL_ORDER,
191
                    -1
192
            );
193
            final DefaultComboBoxModel model = new DefaultComboBoxModel();
194 44337 jjdelcerro
            for (Search.OrderedAttribute attribute : attributes) {
195
                model.addElement(attribute.getDescriptor().getName());
196 44262 jjdelcerro
            }
197 44719 jjdelcerro
            SwingUtilities.invokeLater(() -> {
198
              cboCode.setModel(model);
199
              cboCode.setSelectedItem(foreingKey.getCodeName());
200 44262 jjdelcerro
            });
201
        }
202
203
        public void setEditable(boolean editable) {
204
            this.chkIsForeingKey.setEnabled(editable);
205 44338 jjdelcerro
            this.chkIsClosedList.setEnabled(editable);
206 44262 jjdelcerro
            this.cboTable.setEnabled(editable);
207
            this.cboCode.setEnabled(editable);
208
            this.btnFormula.setEnabled(editable);
209
            this.txtFormula.setEditable(editable);
210
            this.editable = editable;
211
        }
212
213
        public void setEnabled(boolean enabled) {
214
            if( !editable ) {
215
                enabled =  false;
216
            }
217
            this.chkIsForeingKey.setEnabled(enabled);
218 44338 jjdelcerro
            this.chkIsClosedList.setEnabled(enabled);
219 44262 jjdelcerro
            this.cboTable.setEnabled(enabled);
220
            this.cboCode.setEnabled(enabled);
221
            this.btnFormula.setEnabled(enabled);
222
            this.txtFormula.setEnabled(enabled);
223
        }
224
225
        public void clean() {
226
            this.chkIsForeingKey.setSelected(false);
227 44338 jjdelcerro
            this.chkIsClosedList.setSelected(false);
228 44262 jjdelcerro
            this.cboTable.setSelectedItem("");
229
            this.cboCode.setSelectedItem("");
230
            this.pickerFormula.set(null);
231
        }
232
233
        public void put(ForeingKey foreingKey) {
234
            if( foreingKey==null ) {
235
                this.clean();
236
                return;
237
            }
238 44412 omartinez
            this.foreingKey = foreingKey;
239 44262 jjdelcerro
            this.chkIsForeingKey.setSelected(foreingKey.isForeingKey());
240 44338 jjdelcerro
            this.chkIsClosedList.setSelected(foreingKey.isClosedList());
241 44262 jjdelcerro
            this.cboTable.setSelectedItem(foreingKey.getTableName());
242
            this.cboCode.setSelectedItem(foreingKey.getCodeName());
243
            this.pickerFormula.set(foreingKey.getLabelExpression(null));
244
        }
245
246
        public void fetch(EditableForeingKey foreingKey) {
247
            if( foreingKey==null ) {
248
                return;
249
            }
250
            foreingKey.setForeingKey(this.chkIsForeingKey.isSelected());
251 44338 jjdelcerro
            foreingKey.setClosedList(this.chkIsClosedList.isSelected());
252 44262 jjdelcerro
            foreingKey.setTableName((String) this.cboTable.getSelectedItem());
253
            foreingKey.setCodeName((String) this.cboCode.getSelectedItem());
254
            Expression exp = this.pickerFormula.get();
255
            if( ExpressionUtils.isPhraseEmpty(exp) ) {
256
                foreingKey.setLabelFormula("");
257
            } else {
258
                foreingKey.setLabelFormula(exp.getPhrase());
259
            }
260
        }
261
    }
262
263
264 44202 jjdelcerro
    private static class AvailableValuesController {
265 44262 jjdelcerro
266 44719 jjdelcerro
        private final JList lstValues;
267 44202 jjdelcerro
        private final JTextComponent txtLabel;
268
        private final JTextComponent txtValue;
269
        private final JButton btnAdd;
270
        private final JButton btnUpdate;
271
        private final JButton btnRemove;
272 44719 jjdelcerro
        private final JButton btnRemoveAll;
273 44262 jjdelcerro
274
        public AvailableValuesController(
275 44719 jjdelcerro
                JList lstValues,
276 44202 jjdelcerro
                JTextComponent txtLabel,
277
                JTextComponent txtValue,
278
                JButton btnAdd,
279
                JButton btnUpdate,
280 44719 jjdelcerro
                JButton btnRemove,
281
                JButton btnRemoveAll
282 44262 jjdelcerro
        ) {
283 44719 jjdelcerro
            this.lstValues = lstValues;
284 44202 jjdelcerro
            this.txtLabel = txtLabel;
285
            this.txtValue = txtValue;
286
            this.btnAdd = btnAdd;
287
            this.btnUpdate = btnUpdate;
288
            this.btnRemove = btnRemove;
289 44719 jjdelcerro
            this.btnRemoveAll = btnRemoveAll;
290 44262 jjdelcerro
291 44719 jjdelcerro
            this.lstValues.addListSelectionListener((ListSelectionEvent e) -> {
292
              doValuesChanged();
293 44202 jjdelcerro
            });
294 44719 jjdelcerro
            this.btnAdd.addActionListener((ActionEvent e) -> {
295
              doAdd();
296 44202 jjdelcerro
            });
297 44719 jjdelcerro
            this.btnUpdate.addActionListener((ActionEvent e) -> {
298
              doUpdate();
299 44202 jjdelcerro
            });
300 44719 jjdelcerro
            this.btnRemove.addActionListener((ActionEvent e) -> {
301
              doRemove();
302 44202 jjdelcerro
            });
303 44719 jjdelcerro
            this.btnRemoveAll.addActionListener((ActionEvent e) -> {
304
              doRemoveAll();
305
            });
306 44202 jjdelcerro
        }
307
308
        public void clean() {
309 44719 jjdelcerro
            this.lstValues.setModel(new DefaultListModel());
310 44202 jjdelcerro
            this.txtLabel.setText("");
311
            this.txtValue.setText("");
312 44719 jjdelcerro
            this.lstValues.setSelectedIndex(-1);
313 44202 jjdelcerro
        }
314
315
        public DynObjectValueItem[] get() {
316 44719 jjdelcerro
            ListModel<DynObjectValueItem> model = this.lstValues.getModel();
317
            if( model.getSize()==0 ) {
318
              return null;
319
            }
320 44202 jjdelcerro
            DynObjectValueItem[] values = new DynObjectValueItem[model.getSize()];
321
            for (int i = 0; i < model.getSize(); i++) {
322
                values[i] = model.getElementAt(i);
323
            }
324 44262 jjdelcerro
            return values;
325 44202 jjdelcerro
        }
326
327
        public void set(DynObjectValueItem[] availableValues) {
328 44719 jjdelcerro
            DefaultListModel model = new DefaultListModel();
329 44262 jjdelcerro
            if (availableValues != null) {
330 44202 jjdelcerro
                for (DynObjectValueItem availableValue : availableValues) {
331
                    model.addElement(availableValue);
332
                }
333
            }
334 44719 jjdelcerro
            this.lstValues.setModel(model);
335 44262 jjdelcerro
            if (model.getSize() > 0) {
336 44719 jjdelcerro
                this.lstValues.setSelectedIndex(0);
337 44202 jjdelcerro
            } else {
338 44719 jjdelcerro
                this.lstValues.setSelectedIndex(-1);
339 44202 jjdelcerro
            }
340
        }
341 44262 jjdelcerro
342 44202 jjdelcerro
        public void setEditable(boolean editable) {
343 44719 jjdelcerro
            this.lstValues.setEnabled(editable);
344 44202 jjdelcerro
            this.txtLabel.setEditable(editable);
345
            this.txtValue.setEditable(editable);
346
            this.btnAdd.setEnabled(editable);
347
            this.btnUpdate.setEnabled(editable);
348
            this.btnRemove.setEnabled(editable);
349 44719 jjdelcerro
            this.btnRemoveAll.setEnabled(editable);
350 44202 jjdelcerro
        }
351
352
        private void doValuesChanged() {
353 44719 jjdelcerro
            DynObjectValueItem value = (DynObjectValueItem) this.lstValues.getSelectedValue();
354 44262 jjdelcerro
            if (value == null) {
355 44202 jjdelcerro
                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 44262 jjdelcerro
            this.txtValue.setText(Objects.toString(value.getValue(), ""));
364 44202 jjdelcerro
            this.btnAdd.setEnabled(true);
365
            this.btnUpdate.setEnabled(true);
366
            this.btnRemove.setEnabled(true);
367
        }
368 44262 jjdelcerro
369 44202 jjdelcerro
        private void doAdd() {
370
            DynObjectValueItem value = new DynObjectValueItem("Value", "Label");
371 44719 jjdelcerro
            DefaultListModel model = (DefaultListModel) this.lstValues.getModel();
372 44202 jjdelcerro
            model.addElement(value);
373 44719 jjdelcerro
            this.lstValues.setSelectedIndex(model.getSize() - 1);
374 44202 jjdelcerro
        }
375 44262 jjdelcerro
376 44202 jjdelcerro
        private void doUpdate() {
377 44719 jjdelcerro
            DynObjectValueItem value = (DynObjectValueItem) this.lstValues.getSelectedValue();
378 44262 jjdelcerro
            if (value == null) {
379 44202 jjdelcerro
                return; // EEhh?? esto no deberia pasar
380
            }
381
            value.setLabel(this.txtLabel.getText());
382
            value.setValue(this.txtValue.getText());
383
        }
384 44262 jjdelcerro
385 44202 jjdelcerro
        private void doRemove() {
386 44719 jjdelcerro
            int n = this.lstValues.getSelectedIndex();
387 44262 jjdelcerro
            if (n < 0) {
388 44202 jjdelcerro
                return; // EEhh?? esto no deberia pasar
389
            }
390 44719 jjdelcerro
            DefaultListModel model = (DefaultListModel) this.lstValues.getModel();
391 44202 jjdelcerro
            model.removeElementAt(n);
392 44262 jjdelcerro
            if (--n < 0) {
393 44202 jjdelcerro
                n = 0;
394
            }
395 44719 jjdelcerro
            this.lstValues.setSelectedIndex(n);
396 44202 jjdelcerro
        }
397
398 44719 jjdelcerro
        private void doRemoveAll() {
399
            DefaultListModel model = new DefaultListModel();
400
            this.lstValues.setModel(model);
401
            this.lstValues.setSelectedIndex(-1);
402
        }
403
404 44202 jjdelcerro
    }
405
406 44077 jjdelcerro
    private final List<ListElement<Integer>> fieldTypes;
407
    private final List<ListElement<Integer>> geometryTypes;
408
    private final List<ListElement<Integer>> geometrySubtypes;
409 44085 jjdelcerro
410 44077 jjdelcerro
    private DatePickerController pickerIntervalEnd;
411
    private DatePickerController pickerIntervalStart;
412
    private CalculatorController<Integer> pickerSize;
413 44947 jjdelcerro
    private CalculatorController<Integer> pickerDisplaySize;
414 44673 jjdelcerro
    private CalculatorController<Integer> pickerPrecision;
415 44669 jjdelcerro
    private CalculatorController<Integer> pickerScale;
416 44077 jjdelcerro
    private CalculatorController<Object> pickerDefaultValue;
417
    private PickerController<IProjection> pickerCRS;
418
    private ExpressionPickerController pickerVirtualField;
419 44202 jjdelcerro
    private CalculatorController<Integer> pickerOrder;
420
    private AvailableValuesController availableValuesController;
421 44253 jjdelcerro
    private TagsController tagsController;
422 44262 jjdelcerro
    private ForeingKeyController foreingKeyController;
423 44077 jjdelcerro
424 44505 jjdelcerro
    private int mode;
425 44149 jjdelcerro
    private FeatureStoreElement featureStoreElement;
426 44077 jjdelcerro
427 44713 jjdelcerro
    public DefaultFeatureAttributePanel() {
428 44505 jjdelcerro
        this.mode = FeatureTypePanel.MODE_SHOW_ONLY;
429 44077 jjdelcerro
        DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
430
        this.fieldTypes = new ArrayList<>();
431 44740 jjdelcerro
        fieldTypes.add( new ListElement<>("Decimal", DataTypes.DECIMAL) );
432
        fieldTypes.add( new ListElement<>("Integer", DataTypes.INTEGER) );
433
        fieldTypes.add( new ListElement<>("String", DataTypes.STRING) );
434
        fieldTypes.add( new ListElement<>("Boolean", DataTypes.BOOLEAN) );
435
        fieldTypes.add( new ListElement<>("Date/Time", DataTypes.TIMESTAMP) );
436
//        for (DataType dataType : dataManager) {
437
//            fieldTypes.add( new ListElement<>(dataType.getName(), dataType.getType()) );
438
//        }
439 44719 jjdelcerro
        fieldTypes.sort((ListElement<Integer> o1, ListElement<Integer> o2) ->
440
                o1.toString().compareTo(o2.toString())
441
        );
442 44077 jjdelcerro
443
        this.geometryTypes = new ArrayList<>();
444
        this.geometryTypes.add(new ListElement("Point", Geometry.TYPES.POINT));
445
        this.geometryTypes.add(new ListElement("Line", Geometry.TYPES.LINE));
446
        this.geometryTypes.add(new ListElement("Polygon", Geometry.TYPES.POLYGON));
447
        this.geometryTypes.add(new ListElement("MultiPoint", Geometry.TYPES.MULTIPOINT));
448
        this.geometryTypes.add(new ListElement("MultiLine", Geometry.TYPES.MULTILINE));
449
        this.geometryTypes.add(new ListElement("MultiPolygon", Geometry.TYPES.MULTIPOLYGON));
450 44719 jjdelcerro
        this.geometryTypes.sort((ListElement<Integer> o1, ListElement<Integer> o2) ->
451
                  o1.toString().compareTo(o2.toString())
452
        );
453 44085 jjdelcerro
454 44077 jjdelcerro
        this.geometrySubtypes = new ArrayList<>();
455
        this.geometrySubtypes.add(new ListElement("2D", Geometry.SUBTYPES.GEOM2D));
456
        this.geometrySubtypes.add(new ListElement("2DM", Geometry.SUBTYPES.GEOM3D));
457
        this.geometrySubtypes.add(new ListElement("3D", Geometry.SUBTYPES.GEOM2DM));
458
        this.geometrySubtypes.add(new ListElement("3DM", Geometry.SUBTYPES.GEOM3DM));
459 44719 jjdelcerro
        this.geometrySubtypes.sort((ListElement<Integer> o1, ListElement<Integer> o2) ->
460
                o1.toString().compareTo(o2.toString())
461
        );
462 44085 jjdelcerro
463 44077 jjdelcerro
        this.initComponents();
464
    }
465 44085 jjdelcerro
466 44077 jjdelcerro
    private void initComponents() {
467 44740 jjdelcerro
        final ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
468
        final ExpressionEvaluatorSwingManager evaluatorManager = ExpressionEvaluatorSwingLocator.getManager();
469
        final DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
470
        final I18nManager i18n = ToolsLocator.getI18nManager();
471
        final DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
472 44262 jjdelcerro
473 44077 jjdelcerro
        DefaultComboBoxModel<ListElement<Integer>> modelTypes = new DefaultComboBoxModel<>();
474
        for (ListElement<Integer> element : fieldTypes) {
475
            modelTypes.addElement(element);
476
        }
477
        this.cboFieldType.setModel(modelTypes);
478 44740 jjdelcerro
        this.cboFieldType.setRenderer(new DefaultListCellRenderer() {
479
          @Override
480
          public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
481
              JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
482
              label.setIcon(null);
483
              try {
484
                DataType dataType = dataTypeManager.get((int) value);
485
                IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
486
                if (theme.exists(dataType.getIconName())) {
487
                    label.setIcon(theme.get(dataType.getIconName()));
488
                }
489
              } catch(Exception ex) {
490
                // Do nothing, ignore
491
              }
492
              return label;
493
          }
494
        });
495 44077 jjdelcerro
496
        DefaultComboBoxModel<ListElement<Integer>> modelGeomTypes = new DefaultComboBoxModel<>();
497
        for (ListElement<Integer> element : this.geometryTypes) {
498
            modelGeomTypes.addElement(element);
499
        }
500
        this.cboGeometryType.setModel(modelGeomTypes);
501
502
        DefaultComboBoxModel<ListElement<Integer>> modelGeomSubtypes = new DefaultComboBoxModel<>();
503
        for (ListElement<Integer> element : this.geometrySubtypes) {
504
            modelGeomSubtypes.addElement(element);
505
        }
506 44085 jjdelcerro
507
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
508
509 44128 jjdelcerro
        swingManager.translate(this.lblAllowNulls);
510
        swingManager.translate(this.lblCRS);
511
        swingManager.translate(this.lblDataProfile);
512
        swingManager.translate(this.lblDateFormat);
513
        swingManager.translate(this.lblDefaultValue);
514
        swingManager.translate(this.lblFieldName);
515
        swingManager.translate(this.lblFieldType);
516
        swingManager.translate(this.lblGeometrySubtype);
517
        swingManager.translate(this.lblGeometryType);
518
        swingManager.translate(this.lblInterval);
519
        swingManager.translate(this.lblIntervalEnd);
520
        swingManager.translate(this.lblIntervalStart);
521
        swingManager.translate(this.lblIsAutomatic);
522
        swingManager.translate(this.lblIsPrimaryKey);
523 44673 jjdelcerro
        swingManager.translate(this.lblPrecision);
524 44669 jjdelcerro
        swingManager.translate(this.lblScale);
525 44128 jjdelcerro
        swingManager.translate(this.lblSize);
526 44947 jjdelcerro
        swingManager.translate(this.lblDisplaySize);
527 44128 jjdelcerro
        swingManager.translate(this.chkVirtualField);
528
        swingManager.translate(this.tabAditionalFields);
529 44202 jjdelcerro
        swingManager.translate(this.tabLayout);
530
        swingManager.translate(this.lblGroup);
531
        swingManager.translate(this.lblOrder);
532
        swingManager.translate(this.lblHidden);
533
        swingManager.translate(this.lblLabel);
534
        swingManager.translate(this.lblDescription);
535
        swingManager.translate(this.lblMinValue);
536
        swingManager.translate(this.lblMaxValue);
537
        swingManager.translate(this.lblAvailableValues);
538
        swingManager.translate(this.lblAvailableValuesLabel);
539
        swingManager.translate(this.lblAvailableValuesValue);
540 44746 jjdelcerro
        swingManager.translate(this.lblRelationType);
541 44202 jjdelcerro
        swingManager.translate(this.btnAvailableValuesAdd);
542
        swingManager.translate(this.btnAvailableValuesUpdate);
543
        swingManager.translate(this.btnAvailableValuesRemove);
544 44719 jjdelcerro
        swingManager.translate(this.btnAvailableValuesRemoveAll);
545 44253 jjdelcerro
        swingManager.translate(this.lblTagsName);
546
        swingManager.translate(this.lblTagsValue);
547
548 44262 jjdelcerro
        swingManager.translate(this.lblForeingKeyCodeName);
549
        swingManager.translate(this.lblForeingKeyLabelFormula);
550
        swingManager.translate(this.lblForeingKeyTableName);
551 44338 jjdelcerro
        swingManager.translate(this.lblIsClosedList);
552 44262 jjdelcerro
        swingManager.translate(this.chkIsForeingKey);
553
554 44947 jjdelcerro
        swingManager.translate(this.txtDisplaySize);
555 44845 jjdelcerro
        swingManager.translate(this.txtPrecision);
556
        swingManager.translate(this.txtScale);
557
        swingManager.translate(this.txtScale);
558
559 44077 jjdelcerro
        swingManager.addClearButton(this.txtDefaultValue);
560
        swingManager.addClearButton(this.txtFieldName);
561
        swingManager.addClearButton(this.txtIntervalEnd);
562
        swingManager.addClearButton(this.txtIntervalStart);
563 44669 jjdelcerro
        swingManager.addClearButton(this.txtScale);
564 44077 jjdelcerro
        swingManager.addClearButton(this.txtSize);
565 44947 jjdelcerro
        swingManager.addClearButton(this.txtDisplaySize);
566 44202 jjdelcerro
        swingManager.addClearButton(this.txtLabel);
567
        swingManager.addClearButton(this.txtDescription);
568
        swingManager.addClearButton(this.cboGroup);
569
        swingManager.addClearButton(this.txtMaxValue);
570
        swingManager.addClearButton(this.txtMinValue);
571
        swingManager.addClearButton(this.txtAvailableValuesLabel);
572 44262 jjdelcerro
        swingManager.addClearButton(this.txtAvailableValuesValue);
573
574 44077 jjdelcerro
        swingManager.setDefaultPopupMenu(this.txtDefaultValue);
575
        swingManager.setDefaultPopupMenu(this.txtFieldName);
576
        swingManager.setDefaultPopupMenu(this.txtIntervalEnd);
577
        swingManager.setDefaultPopupMenu(this.txtIntervalStart);
578 44669 jjdelcerro
        swingManager.setDefaultPopupMenu(this.txtScale);
579 44077 jjdelcerro
        swingManager.setDefaultPopupMenu(this.txtSize);
580 44947 jjdelcerro
        swingManager.setDefaultPopupMenu(this.txtDisplaySize);
581 44077 jjdelcerro
        swingManager.setDefaultPopupMenu(this.cboDateFormat);
582
        swingManager.setDefaultPopupMenu(this.cboFieldType);
583
        swingManager.setDefaultPopupMenu(this.cboGeometrySubtype);
584
        swingManager.setDefaultPopupMenu(this.cboGeometryType);
585 44128 jjdelcerro
        swingManager.setDefaultPopupMenu(this.cboDataProfile);
586 44085 jjdelcerro
587 44262 jjdelcerro
        swingManager.setDefaultPopupMenu(this.cboForeingKeyCodeName);
588
        swingManager.setDefaultPopupMenu(this.cboForeingKeyTableName);
589
590 44202 jjdelcerro
        swingManager.setDefaultPopupMenu(this.cboGroup);
591
        swingManager.setDefaultPopupMenu(this.txtOrder);
592
        swingManager.setDefaultPopupMenu(this.txtLabel);
593
        swingManager.setDefaultPopupMenu(this.txtDescription);
594
        swingManager.setDefaultPopupMenu(this.txtMinValue);
595
        swingManager.setDefaultPopupMenu(this.txtMaxValue);
596
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesLabel);
597
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesValue);
598 44262 jjdelcerro
599
        this.foreingKeyController = new ForeingKeyController(
600
                chkIsForeingKey,
601 44338 jjdelcerro
                chkIsClosedList,
602 44262 jjdelcerro
                cboForeingKeyTableName,
603
                cboForeingKeyCodeName,
604
                txtForeingKeyFormula,
605
                btnForeingKeyFormula
606
        );
607 44077 jjdelcerro
        this.pickerIntervalEnd = swingManager.createDatePickerController(
608 44085 jjdelcerro
                this.txtIntervalEnd,
609 44077 jjdelcerro
                this.btnIntervalEnd
610
        );
611
        this.pickerIntervalStart = swingManager.createDatePickerController(
612 44085 jjdelcerro
                this.txtIntervalStart,
613 44077 jjdelcerro
                this.btnIntervalStart
614
        );
615
        this.pickerSize = evaluatorManager.createCalculatorController(
616 44085 jjdelcerro
                this.txtSize, DataTypes.INT
617 44077 jjdelcerro
        );
618 44947 jjdelcerro
        this.pickerDisplaySize = evaluatorManager.createCalculatorController(this.txtDisplaySize, DataTypes.INT
619 44844 jjdelcerro
        );
620 44673 jjdelcerro
        this.pickerPrecision = evaluatorManager.createCalculatorController(
621
                this.txtPrecision, DataTypes.INT
622
        );
623 44669 jjdelcerro
        this.pickerScale = evaluatorManager.createCalculatorController(
624
                this.txtScale, DataTypes.INT
625 44077 jjdelcerro
        );
626
        this.pickerDefaultValue = evaluatorManager.createCalculatorController(
627 44085 jjdelcerro
                this.txtDefaultValue, DataTypes.OBJECT
628 44077 jjdelcerro
        );
629 44202 jjdelcerro
        this.pickerOrder = evaluatorManager.createCalculatorController(
630
                this.txtOrder, DataTypes.INT
631
        );
632 44085 jjdelcerro
633 44202 jjdelcerro
        this.availableValuesController = new AvailableValuesController(
634 44719 jjdelcerro
                lstAvailableValues,
635 44262 jjdelcerro
                txtAvailableValuesLabel,
636
                txtAvailableValuesValue,
637
                btnAvailableValuesAdd,
638
                btnAvailableValuesUpdate,
639 44719 jjdelcerro
                btnAvailableValuesRemove,
640
                btnAvailableValuesRemoveAll
641 44202 jjdelcerro
        );
642 44253 jjdelcerro
        this.tagsController = new TagsController(
643 44262 jjdelcerro
                tblTags,
644
                cboTagsName,
645 44351 jjdelcerro
                cboTagsValue,
646 44262 jjdelcerro
                btnTagsAdd,
647
                btnTagsUpdate,
648 44253 jjdelcerro
                btnTagsRemove,
649
                lblTagsDescription
650
        );
651 44202 jjdelcerro
        this.txtMinValue.setEnabled(false);
652
        this.txtMaxValue.setEnabled(false);
653 44262 jjdelcerro
654 44085 jjdelcerro
        this.btnVirtualField.setText("");
655 44259 jjdelcerro
        this.featureStoreElement = dataSwingManager.createFeatureStoreElement();
656 44077 jjdelcerro
        this.pickerVirtualField = ExpressionEvaluatorSwingLocator.getManager()
657
                .createExpressionPickerController(txtVirtualField, btnVirtualField);
658 44149 jjdelcerro
        this.pickerVirtualField.addElement(this.featureStoreElement);
659 44719 jjdelcerro
        this.chkVirtualField.addChangeListener((ChangeEvent e) -> {
660
          if (chkVirtualField.isSelected()) {
661
            pickerVirtualField.setEditable(mode==MODE_EDIT_ALL || mode==MODE_EDIT_ONLY_METADATA);
662
          } else {
663
            pickerVirtualField.setEditable(false);
664
          }
665 44149 jjdelcerro
        });
666 44077 jjdelcerro
667 44149 jjdelcerro
        this.pickerCRS = dataSwingManager.createProjectionPickerController(
668
                this.txtCRS, this.btnCRS
669
        );
670
671 44719 jjdelcerro
        this.cboFieldType.addItemListener((ItemEvent e) -> {
672
          SwingUtilities.invokeLater(() -> {
673
            doFieldTypeChanged();
674
          });
675 44085 jjdelcerro
        });
676
677 44719 jjdelcerro
        this.pickerPrecision.addChangeListener((ChangeEvent e) -> {
678
          doCheckPrecisionAndScale();
679 44100 jjdelcerro
        });
680 44719 jjdelcerro
        this.pickerScale.addChangeListener((ChangeEvent e) -> {
681
          doCheckPrecisionAndScale();
682 44100 jjdelcerro
        });
683 44262 jjdelcerro
684 44253 jjdelcerro
        DefaultComboBoxModel dataProfilesModel = new DefaultComboBoxModel<>();
685 44262 jjdelcerro
        dataProfilesModel.addElement(new ListElement<>("", null));
686 44128 jjdelcerro
        for (DataProfile profile : DALLocator.getDataManager().getDataProfiles()) {
687 44253 jjdelcerro
            dataProfilesModel.addElement(new ListElement<>(profile.getName(), profile.getID()));
688 44128 jjdelcerro
        }
689
        this.cboDataProfile.setModel(dataProfilesModel);
690 44740 jjdelcerro
691
        this.btnFieldType.addActionListener((ActionEvent e) -> {
692
          doDataTypeSelection();
693
        });
694
695
        DefaultComboBoxModel<ListElement<Integer>> relationTypeModel = new DefaultComboBoxModel<>();
696
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_None"),DynField.RELATION_TYPE_NONE));
697
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Identity_1_1"),DynField.RELATION_TYPE_IDENTITY));
698
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Collaboration_1_1"),DynField.RELATION_TYPE_COLLABORATION));
699
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Composition_1_N"),DynField.RELATION_TYPE_COMPOSITION));
700
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Aggregate_1_N"),DynField.RELATION_TYPE_AGGREGATE));
701
        this.cboRelationType.setModel(relationTypeModel);
702 44077 jjdelcerro
    }
703 44085 jjdelcerro
704 44077 jjdelcerro
    @Override
705
    public JComponent asJComponent() {
706
        return this;
707
    }
708 44740 jjdelcerro
709
    private void doDataTypeSelection() {
710
        final DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
711
        final I18nManager i18n = ToolsLocator.getI18nManager();
712
        List<ListElement<Integer>> types = new ArrayList<>();
713
        for (DataType dataType : dataManager) {
714
            types.add( new ListElement<>(dataType.getName(), dataType.getType()) );
715
        }
716
        types.sort((ListElement<Integer> o1, ListElement<Integer> o2) ->
717
                o1.toString().compareTo(o2.toString())
718
        );
719
720
        DefaultListModel<ListElement<Integer>> modelTypes = new DefaultListModel<>();
721
        for (ListElement<Integer> element : types) {
722
            modelTypes.addElement(element);
723
        }
724
        final JList list = new JList();
725
        list.setCellRenderer(new DefaultListCellRenderer() {
726
          @Override
727
          public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
728
              JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
729
              label.setIcon(null);
730
              try {
731
                DataType dataType = dataManager.get((int) value);
732
                IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
733
                if (theme.exists(dataType.getIconName())) {
734
                    label.setIcon(theme.get(dataType.getIconName()));
735
                }
736
              } catch(Exception ex) {
737
                // Do nothing, ignore
738
              }
739
              return label;
740
          }
741
        });
742
        list.setModel(modelTypes);
743
        final JScrollPane scrollpanel = new JScrollPane(list);
744
        WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
745
        Dialog dialog = winManager.createDialog(
746
              scrollpanel,
747
              i18n.getTranslation("_Data_type_selection"),
748
              i18n.getTranslation("_Select_the_data_type"),
749
              WindowManager_v2.BUTTONS_OK_CANCEL
750
        );
751
        dialog.addActionListener((ActionEvent e) -> {
752
          if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
753
            Integer type = (Integer) ListElement.getSelected(list);
754
            if( type!=null ) {
755
              ListElement.setSelected(cboFieldType, type);
756
              if( ListElement.getSelected(cboFieldType)==null ) {
757
                DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
758
                DataType dataType = dataTypeManager.get(type);
759
                cboFieldType.addItem(new ListElement<>(dataType.getName(), dataType.getType()));
760
                ListElement.setSelected(cboFieldType, dataType.getType());
761
              }
762
            }
763
          }
764
        });
765
        dialog.show(WindowManager.MODE.DIALOG);
766
    }
767 44077 jjdelcerro
768
    @Override
769
    public EditableFeatureAttributeDescriptor fetch(EditableFeatureAttributeDescriptor descriptor) {
770 44152 jjdelcerro
        I18nManager i18n = ToolsLocator.getI18nManager();
771 44085 jjdelcerro
        try {
772 44262 jjdelcerro
            if (!this.chkAllowNulls.isSelected()) {
773
                if (descriptor.allowNull()) {
774 44223 jjdelcerro
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
775
                    dialogs.messageDialog(
776 44262 jjdelcerro
                            i18n.getTranslation("_You_have_marked_not_allow_nulls") + "\n"
777
                            + i18n.getTranslation("If_you_are_not_fully_aware_of_the_repercussions_of_this_it_is_advisable_to_allow_nulls"),
778 44223 jjdelcerro
                            null,
779 44262 jjdelcerro
                            i18n.getTranslation("_Warning"),
780 44223 jjdelcerro
                            JOptionPane.INFORMATION_MESSAGE,
781
                            "AllowNullsInFeatureTypeEditing"
782
                    );
783
                }
784
            }
785 44085 jjdelcerro
            descriptor.setDataType((int) ListElement.getSelected(this.cboFieldType));
786
            descriptor.setName(this.txtFieldName.getText());
787
            descriptor.setAllowNull(this.chkAllowNulls.isSelected());
788
            descriptor.setIsPrimaryKey(this.chkIsPrimaryKey.isSelected());
789
            descriptor.setIsAutomatic(this.chkIsAutomatic.isSelected());
790 44152 jjdelcerro
            descriptor.setSize(this.pickerSize.get(0));
791 44947 jjdelcerro
            descriptor.setDisplaySize(this.pickerDisplaySize.get(0));
792 44673 jjdelcerro
            descriptor.setPrecision(this.pickerPrecision.get(0));
793 44669 jjdelcerro
            descriptor.setScale(this.pickerScale.get(0));
794 44085 jjdelcerro
            descriptor.setDefaultValue(this.pickerDefaultValue.get());
795 44253 jjdelcerro
            descriptor.setDataProfileName((String) ListElement.getSelected(this.cboDataProfile));
796 44740 jjdelcerro
            descriptor.setRelationType((int) ListElement.getSelected(this.cboRelationType));
797 44085 jjdelcerro
            switch (descriptor.getType()) {
798
                case DataTypes.GEOMETRY:
799
                    GeometryManager geomManager = GeometryLocator.getGeometryManager();
800
                    GeometryType geomType = geomManager.getGeometryType(
801
                            (int) ListElement.getSelected(this.cboGeometryType),
802
                            (int) ListElement.getSelected(this.cboGeometrySubtype)
803
                    );
804
                    descriptor.setGeometryType(geomType);
805
                    descriptor.setSRS(this.pickerCRS.get());
806
                    break;
807
                case DataTypes.INSTANT:
808
                case DataTypes.INTERVAL:
809
                case DataTypes.DATE:
810
                case DataTypes.TIME:
811
                case DataTypes.TIMESTAMP:
812
                    // FIXME
813
                    break;
814
                default:
815
                    break;
816
            }
817 44154 jjdelcerro
            descriptor.setDataProfileName(
818 44262 jjdelcerro
                    StringUtils.defaultIfBlank((String) ListElement.getSelected(cboDataProfile), null)
819 44154 jjdelcerro
            );
820
821 44505 jjdelcerro
            if (this.chkVirtualField.isSelected() ) { //&& this.pickerVirtualField.isEnabled()) {
822 44085 jjdelcerro
                Expression expression = this.pickerVirtualField.get();
823 44262 jjdelcerro
                if (expression == null) {
824
                    descriptor.setFeatureAttributeEmulator((String) null);
825 44085 jjdelcerro
                } else {
826
                    DataManager dataManager = DALLocator.getDataManager();
827
                    FeatureAttributeEmulatorExpression emulator = dataManager.createFeatureAttributeEmulatorExpression(
828
                            descriptor.getFeatureType(),
829
                            expression
830
                    );
831 44262 jjdelcerro
                    if (!emulator.isValid()) {
832 44154 jjdelcerro
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
833
                        dialogs.messageDialog(
834 44744 jjdelcerro
                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+"\n"
835 44262 jjdelcerro
                                + "\n"
836
                                + emulator.getErrorMessage(),
837
                                i18n.getTranslation("_Warning"),
838 44154 jjdelcerro
                                JOptionPane.WARNING_MESSAGE
839
                        );
840
                        return null;
841
                    }
842
                    for (String requiredFieldName : emulator.getRequiredFieldNames()) {
843 44262 jjdelcerro
                        if (StringUtils.equalsIgnoreCase(requiredFieldName, descriptor.getName())) {
844 44154 jjdelcerro
                            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
845
                            dialogs.messageDialog(
846 44262 jjdelcerro
                                    i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")
847
                                    + "\n\n"
848
                                    + i18n.getTranslation("_The_expression_contains_a_reference_to_itself"),
849
                                    i18n.getTranslation("_Warning"),
850 44154 jjdelcerro
                                    JOptionPane.WARNING_MESSAGE
851
                            );
852
                            return null;
853
                        }
854
                    }
855 44744 jjdelcerro
                    List<String> undefinedSymbols = emulator.getUndefinedSymbols();
856
                    if( undefinedSymbols!=null && !undefinedSymbols.isEmpty() ) {
857
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
858
                        dialogs.messageDialog(
859
                                i18n.getTranslation("_The_expression_has_undefined_symbols_at_this_moment")+"\n"
860
                                + i18n.getTranslation("_This_may_not_be_a_mistake")+"\n"
861
                                + "\n"
862
                                + "("+StringUtils.join(undefinedSymbols,",")+")",
863
                                i18n.getTranslation("_Warning"),
864
                                JOptionPane.WARNING_MESSAGE
865
                        );
866
                    }
867 44155 jjdelcerro
                    descriptor.setFeatureAttributeEmulator(emulator);
868 44154 jjdelcerro
                    //
869
                    // No se porque esto de abajo no funciona.
870
                    // Nunca se lanza la excepcion en el get(Feature) de
871
                    // DefaultFeatureAttributeEmulatorExpression.
872
                    //
873
//                    try {
874
//                        emulator.setEnableExceptions(true);
875
//                        descriptor.setFeatureAttributeEmulator(emulator);
876
//                        this.pickerVirtualField.getPreviewSymbolTable().value(descriptor.getName());
877
//                    } catch(Throwable ex) {
878
//                        emulator.setEnableExceptions(false);
879
//                        descriptor.setFeatureAttributeEmulator(null);
880
//                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
881
//                        dialogs.messageDialog(
882
//                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+
883
//                                    "\n"+
884
//                                    ex.getMessage(),
885
//                                i18n.getTranslation("_Warning"),
886
//                                JOptionPane.WARNING_MESSAGE
887
//                        );
888
//                        return null;
889
//                    } finally {
890
//                        emulator.setEnableExceptions(false);
891
//                    }
892 44085 jjdelcerro
                }
893
            }
894
        } catch (Exception ex) {
895 44262 jjdelcerro
            LOGGER.warn("Can't retrieve information from user form.", ex);
896 44085 jjdelcerro
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
897
            dialogs.messageDialog(
898 44262 jjdelcerro
                    i18n.getTranslation("_Cant_retrieve_information_from_user_form")
899
                    + "\n"
900
                    + i18n.getTranslation("_See_log_for_details"),
901
                    i18n.getTranslation("_Warning"),
902 44085 jjdelcerro
                    JOptionPane.WARNING_MESSAGE
903
            );
904 44152 jjdelcerro
            return null;
905 44085 jjdelcerro
        }
906 44262 jjdelcerro
907 44202 jjdelcerro
        descriptor.setGroup(StringUtils.defaultIfBlank((String) this.cboGroup.getSelectedItem(), null));
908
        descriptor.setOrder(this.pickerOrder.get(0));
909
        descriptor.setHidden(this.chkHidden.isSelected());
910
        descriptor.setLabel(StringUtils.defaultIfBlank(this.txtLabel.getText(), null));
911
        descriptor.setDescription(StringUtils.defaultIfBlank(this.txtDescription.getText(), null));
912 44262 jjdelcerro
913 44202 jjdelcerro
//        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
914
//        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
915 44262 jjdelcerro
        descriptor.setAvailableValues(this.availableValuesController.get());
916 44202 jjdelcerro
917 44253 jjdelcerro
        this.tagsController.fetch(descriptor.getTags());
918 44262 jjdelcerro
        this.foreingKeyController.fetch(descriptor.getForeingKey());
919 44077 jjdelcerro
        return descriptor;
920
    }
921
922 44202 jjdelcerro
    @Override
923 44077 jjdelcerro
    public void clean() {
924
        this.pickerDefaultValue.set(null);
925 44100 jjdelcerro
        this.txtFieldName.setText("");
926
//        this.pickerFieldName.set(null);
927 44077 jjdelcerro
        this.pickerIntervalEnd.set(null);
928
        this.pickerIntervalStart.set(null);
929 44669 jjdelcerro
        this.pickerScale.set(null);
930 44077 jjdelcerro
        this.pickerSize.set(null);
931 44947 jjdelcerro
        this.pickerDisplaySize.set(null);
932 44077 jjdelcerro
933
        this.chkAllowNulls.setSelected(false);
934
        this.chkIsAutomatic.setSelected(false);
935
        this.chkIsPrimaryKey.setSelected(false);
936 44085 jjdelcerro
937 44077 jjdelcerro
        this.chkVirtualField.setSelected(false);
938 44505 jjdelcerro
        this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
939
        this.pickerVirtualField.setEditable(false);
940 44077 jjdelcerro
        this.pickerVirtualField.set(null);
941
942
        ListElement.setSelected(cboGeometryType, null);
943
        ListElement.setSelected(cboGeometrySubtype, null);
944 44085 jjdelcerro
945
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
946 44262 jjdelcerro
947 44128 jjdelcerro
        this.cboDataProfile.setSelectedIndex(-1);
948 44262 jjdelcerro
949 44202 jjdelcerro
        this.cboGroup.setSelectedIndex(-1);
950
        this.pickerOrder.set(null);
951
        this.chkHidden.setSelected(false);
952
        this.txtLabel.setText("");
953
        this.txtDescription.setText("");
954
        this.txtMinValue.setText("");
955
        this.txtMaxValue.setText("");
956
        this.availableValuesController.clean();
957 44262 jjdelcerro
        this.tagsController.clean();
958
        this.foreingKeyController.clean();
959 44077 jjdelcerro
    }
960 44085 jjdelcerro
961 44077 jjdelcerro
    @Override
962
    public void put(FeatureAttributeDescriptor descriptor) {
963 44085 jjdelcerro
        if (descriptor == null) {
964 44077 jjdelcerro
            this.clean();
965
            return;
966
        }
967 44678 jjdelcerro
        DataType dataType = descriptor.getDataType();
968 44202 jjdelcerro
        FeatureType featureType = descriptor.getFeatureType();
969
        DefaultComboBoxModel groupModel = new DefaultComboBoxModel();
970 44262 jjdelcerro
971
        if (featureType != null) {
972 44100 jjdelcerro
            FeatureStore store = descriptor.getFeatureType().getStore();
973 44149 jjdelcerro
            this.featureStoreElement.setFeatureStore(store);
974 44262 jjdelcerro
            if (store != null) {
975 44100 jjdelcerro
                Feature sampleFeature = null;
976
                try {
977
                    sampleFeature = store.getFeatureSelection().first();
978 44262 jjdelcerro
                    if (sampleFeature == null) {
979 44100 jjdelcerro
                        sampleFeature = store.first();
980
                    }
981
                } catch (DataException ex) {
982
                }
983 44262 jjdelcerro
                if (sampleFeature != null) {
984 44100 jjdelcerro
                    FeatureSymbolTable featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable();
985
                    featureSymbolTable.setFeature(sampleFeature);
986
                    this.pickerVirtualField.setPreviewSymbolTable(featureSymbolTable.createParent());
987
                }
988
            }
989 44202 jjdelcerro
            List<String> groups = new ArrayList<>();
990
            for (FeatureAttributeDescriptor otherdesc : featureType) {
991
                String group = otherdesc.getGroup();
992 44262 jjdelcerro
                if (!StringUtils.isBlank(group) && !groups.contains(group)) {
993 44202 jjdelcerro
                    groups.add(group);
994
                }
995
            }
996
            for (String group : groups) {
997
                groupModel.addElement(group);
998
            }
999 44085 jjdelcerro
        }
1000 44262 jjdelcerro
1001 44077 jjdelcerro
        this.pickerDefaultValue.set(descriptor.getDefaultValue());
1002 44100 jjdelcerro
        this.txtFieldName.setText(descriptor.getName());
1003 44077 jjdelcerro
        RelativeInterval interval = (RelativeInterval) descriptor.getInterval();
1004 44085 jjdelcerro
        if (interval == null) {
1005
            this.pickerIntervalEnd.set(null);
1006
            this.pickerIntervalStart.set(null);
1007 44077 jjdelcerro
        } else {
1008
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
1009
            this.pickerIntervalStart.set(interval.getStart().toDate());
1010
        }
1011 44678 jjdelcerro
        if( dataType.supportSize() ) {
1012
          this.pickerSize.set(descriptor.getSize());
1013
        } else {
1014
          this.pickerSize.set(null);
1015
        }
1016 44947 jjdelcerro
        this.pickerDisplaySize.set(descriptor.getDisplaySize());
1017 44678 jjdelcerro
        if( dataType.supportPrecision() ) {
1018
          this.pickerPrecision.set(descriptor.getPrecision());
1019
        } else {
1020
          this.pickerPrecision.set(null);
1021
        }
1022
        if( dataType.supportScale()) {
1023
          this.pickerScale.set(descriptor.getScale());
1024
        } else {
1025
          this.pickerScale.set(null);
1026
        }
1027 44077 jjdelcerro
        this.chkAllowNulls.setSelected(descriptor.allowNull());
1028
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
1029
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
1030 44085 jjdelcerro
1031 44505 jjdelcerro
        this.pickerVirtualField.setEnabled(true);
1032 44077 jjdelcerro
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
1033 44085 jjdelcerro
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
1034 44077 jjdelcerro
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
1035 44505 jjdelcerro
            this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL);
1036 44077 jjdelcerro
            this.chkVirtualField.setSelected(true);
1037
            this.pickerVirtualField.set(expression);
1038 44085 jjdelcerro
        } else if (descriptor.isComputed()) {
1039
            this.chkVirtualField.setEnabled(false);
1040 44077 jjdelcerro
            this.chkVirtualField.setSelected(true);
1041
            this.pickerVirtualField.set(null);
1042
        } else {
1043 44505 jjdelcerro
            this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL);
1044 44077 jjdelcerro
            this.chkVirtualField.setSelected(false);
1045
            this.pickerVirtualField.set(null);
1046
        }
1047 44085 jjdelcerro
1048 44077 jjdelcerro
        this.pickerCRS.set(descriptor.getSRS());
1049 44085 jjdelcerro
1050
        if (descriptor.getGeomType() != null) {
1051 44079 jjdelcerro
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
1052
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
1053
        }
1054 44740 jjdelcerro
        ListElement.setSelected(cboFieldType, dataType.getType());
1055
        if( ListElement.getSelected(cboFieldType)==null ) {
1056
          cboFieldType.addItem(new ListElement<>(dataType.getName(), dataType.getType()));
1057
          ListElement.setSelected(cboFieldType, dataType.getType());
1058
        }
1059
1060
        ListElement.setSelected(cboRelationType, descriptor.getRelationType());
1061 44085 jjdelcerro
1062 44128 jjdelcerro
        String profile = descriptor.getDataProfileName();
1063 44262 jjdelcerro
        if (StringUtils.isBlank(profile)) {
1064
            this.cboDataProfile.setSelectedIndex(-1);
1065 44128 jjdelcerro
        } else {
1066 44262 jjdelcerro
            ListElement.setSelected(this.cboDataProfile, profile);
1067 44128 jjdelcerro
        }
1068 44202 jjdelcerro
1069
        this.cboGroup.setModel(groupModel);
1070 44262 jjdelcerro
        this.cboGroup.setSelectedItem(StringUtils.defaultIfBlank(descriptor.getGroup(), ""));
1071 44202 jjdelcerro
        this.pickerOrder.set(descriptor.getOder());
1072
        this.chkHidden.setSelected(descriptor.isHidden());
1073 44578 omartinez
        if (descriptor.hasLabel()) {
1074
            this.txtLabel.setText(StringUtils.defaultIfBlank(descriptor.getLabel(), ""));
1075
        } else {
1076
            this.txtLabel.setText("");
1077
        }
1078
        if (descriptor.hasDescription()) {
1079
            this.txtDescription.setText(StringUtils.defaultIfBlank(descriptor.getDescription(), ""));
1080
        } else {
1081
            this.txtDescription.setText("");
1082
        }
1083 44202 jjdelcerro
        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
1084
        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
1085 44719 jjdelcerro
        if( descriptor.hasConstantAvailableValues() ) {
1086
          this.availableValuesController.set(descriptor.getAvailableValues());
1087
        } else {
1088
          this.availableValuesController.clean();
1089
        }
1090 44253 jjdelcerro
        this.tagsController.set(descriptor.getTags());
1091 44202 jjdelcerro
1092 44262 jjdelcerro
        this.foreingKeyController.put(descriptor.getForeingKey());
1093 44505 jjdelcerro
1094
        if (!(descriptor instanceof EditableFeatureAttributeDescriptor)) {
1095
            this.setMode(FeatureTypePanel.MODE_SHOW_ONLY);
1096
        }
1097
        this.updateEditableStates();
1098 44077 jjdelcerro
    }
1099
1100 44673 jjdelcerro
    private DataType getDataType() {
1101
      Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
1102
      if (fieldType == null) {
1103
          return null;
1104
      }
1105
      DataType dataType = ToolsLocator.getDataTypesManager().get(fieldType);
1106
      return dataType;
1107
    }
1108
1109 44085 jjdelcerro
    private void doFieldTypeChanged() {
1110 44673 jjdelcerro
      try {
1111
        DataType dataType = this.getDataType();
1112 44262 jjdelcerro
1113 44673 jjdelcerro
        if( dataType.supportSize() ) {
1114
            this.pickerSize.setEditable(this.mode == MODE_EDIT_ALL);
1115
        } else {
1116
            this.pickerSize.setEditable(false);
1117
            this.pickerSize.set(null);
1118
        }
1119 44947 jjdelcerro
        this.pickerDisplaySize.setEditable(this.mode == MODE_EDIT_ALL);
1120 44678 jjdelcerro
        if( dataType.supportPrecision() ) {
1121
          if( dataType.isPredefinedPrecision() ) {
1122
            this.pickerPrecision.setEditable(false);
1123
          } else {
1124 44673 jjdelcerro
            this.pickerPrecision.setEditable(this.mode == MODE_EDIT_ALL);
1125 44678 jjdelcerro
          }
1126 44673 jjdelcerro
        } else {
1127
            this.pickerPrecision.setEditable(false);
1128
            this.pickerPrecision.set(null);
1129
        }
1130
        if( dataType.supportScale()) {
1131
            this.pickerScale.setEditable(this.mode == MODE_EDIT_ALL);
1132
        } else {
1133
            this.pickerScale.setEditable(false);
1134
            this.pickerScale.set(null);
1135
        }
1136
        switch (dataType.getType()) {
1137
          case DataTypes.GEOMETRY:
1138
            this.cboGeometryType.setEnabled(this.mode == MODE_EDIT_ALL);
1139
            this.cboGeometrySubtype.setEnabled(this.mode == MODE_EDIT_ALL);
1140
            this.pickerCRS.setEditable(this.mode == MODE_EDIT_ALL);
1141
            this.cboDateFormat.setEnabled(false);
1142
            this.pickerIntervalStart.setEditable(false);
1143
            this.pickerIntervalEnd.setEditable(false);
1144
            this.tabAditionalFields.setEnabledAt(1, true);
1145
            this.tabAditionalFields.setEnabledAt(2, false);
1146
            break;
1147
          case DataTypes.INSTANT:
1148
          case DataTypes.INTERVAL:
1149
          case DataTypes.DATE:
1150
          case DataTypes.TIME:
1151
          case DataTypes.TIMESTAMP:
1152
            this.cboGeometryType.setEnabled(false);
1153
            this.cboGeometrySubtype.setEnabled(false);
1154
            this.pickerCRS.setEditable(false);
1155
            this.cboDateFormat.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1156
            this.pickerIntervalStart.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1157
            this.pickerIntervalEnd.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1158
            this.tabAditionalFields.setEnabledAt(1, false);
1159
            this.tabAditionalFields.setEnabledAt(2, true);
1160
            break;
1161
          case DataTypes.BYTE:
1162
          case DataTypes.INT:
1163
          case DataTypes.LONG:
1164
          case DataTypes.STRING:
1165
          case DataTypes.FILE:
1166
          case DataTypes.URL:
1167
          case DataTypes.URI:
1168
          case DataTypes.FLOAT:
1169
          case DataTypes.DOUBLE:
1170
          case DataTypes.DECIMAL:
1171
            this.cboGeometryType.setEnabled(false);
1172
            this.cboGeometrySubtype.setEnabled(false);
1173
            this.pickerCRS.setEditable(false);
1174
            this.cboDateFormat.setEnabled(false);
1175
            this.pickerIntervalStart.setEditable(false);
1176
            this.pickerIntervalEnd.setEditable(false);
1177
            this.tabAditionalFields.setEnabledAt(1, false);
1178
            this.tabAditionalFields.setEnabledAt(2, false);
1179
            break;
1180
          default:
1181
            this.cboGeometryType.setEnabled(false);
1182
            this.cboGeometrySubtype.setEnabled(false);
1183
            this.pickerCRS.setEditable(false);
1184
            this.cboDateFormat.setEnabled(false);
1185
            this.pickerIntervalStart.setEditable(false);
1186
            this.pickerIntervalEnd.setEditable(false);
1187
            this.tabAditionalFields.setEnabledAt(1, false);
1188
            this.tabAditionalFields.setEnabledAt(2, false);
1189 44085 jjdelcerro
        }
1190 44673 jjdelcerro
      } catch (Exception ex) {
1191
        LOGGER.warn("Problems changing field type.", ex);
1192
      }
1193 44262 jjdelcerro
1194 44077 jjdelcerro
    }
1195 44673 jjdelcerro
1196 44505 jjdelcerro
    boolean isVirtualField() {
1197
        return this.chkVirtualField.isSelected();
1198
    }
1199 44085 jjdelcerro
1200 44202 jjdelcerro
    @Override
1201 44505 jjdelcerro
    public int getMode() {
1202
        return this.mode;
1203
    }
1204
1205
    @Override
1206
    public void setMode(int mode) {
1207
        this.mode = mode;
1208
        updateEditableStates();
1209
    }
1210
1211
    private void updateEditableStates() {
1212 44673 jjdelcerro
        DataType dataType = this.getDataType();
1213 44505 jjdelcerro
        switch(this.mode) {
1214
            case MODE_EDIT_ALL:
1215
                this.pickerDefaultValue.setEditable(true);
1216
                this.txtFieldName.setEditable(true);
1217
                this.pickerIntervalEnd.setEditable(true);
1218
                this.pickerIntervalStart.setEditable(true);
1219 44673 jjdelcerro
                this.pickerSize.setEditable(dataType.supportSize());
1220 44947 jjdelcerro
                this.pickerDisplaySize.setEditable(true);
1221 44677 jjdelcerro
                if( dataType.isPredefinedPrecision() ) {
1222 44673 jjdelcerro
                  this.pickerPrecision.setEditable(false);
1223
                  this.pickerPrecision.set(dataType.getMaxPrecision());
1224
                } else {
1225
                  this.pickerPrecision.setEditable(dataType.supportPrecision());
1226
                }
1227
                this.pickerScale.setEditable(dataType.supportScale());
1228 44505 jjdelcerro
                this.cboDataProfile.setEnabled(true);
1229 44085 jjdelcerro
1230 44505 jjdelcerro
                this.chkAllowNulls.setEnabled(true);
1231
                this.chkIsAutomatic.setEnabled(true);
1232
                if( this.isVirtualField() ) {
1233
                    this.chkIsPrimaryKey.setEnabled(false);
1234
                } else {
1235
                    this.chkIsPrimaryKey.setEnabled(true);
1236
                }
1237 44085 jjdelcerro
1238 44505 jjdelcerro
                this.chkVirtualField.setEnabled(true);
1239
                this.pickerVirtualField.setEditable(true);
1240 44085 jjdelcerro
1241 44505 jjdelcerro
                this.cboDateFormat.setEnabled(true);
1242
                this.cboFieldType.setEnabled(true);
1243
                this.cboGeometryType.setEnabled(true);
1244
                this.cboGeometrySubtype.setEnabled(true);
1245
                this.pickerCRS.setEditable(true);
1246 44085 jjdelcerro
1247 44505 jjdelcerro
                this.cboGroup.setEnabled(true);
1248
                this.pickerOrder.setEditable(true);
1249
                this.chkHidden.setEnabled(true);
1250
                this.txtLabel.setEditable(true);
1251
                this.txtDescription.setEditable(true);
1252
                this.txtMinValue.setEditable(false);
1253
                this.txtMaxValue.setEditable(false);
1254
                this.availableValuesController.setEditable(true);
1255
                this.tagsController.setEditable(true);
1256
                this.foreingKeyController.setEditable(true);
1257
                break;
1258
            case MODE_EDIT_ONLY_METADATA:
1259
                if( this.chkVirtualField.isSelected() ) {
1260
                    this.txtFieldName.setEditable(true);
1261 44669 jjdelcerro
                    this.pickerScale.setEditable(true);
1262 44505 jjdelcerro
                    this.pickerSize.setEditable(true);
1263
                    this.pickerVirtualField.setEditable(true);
1264
                    this.cboFieldType.setEnabled(true);
1265
                    this.cboGeometryType.setEnabled(true);
1266
                    this.cboGeometrySubtype.setEnabled(true);
1267
                    this.pickerCRS.setEditable(true);
1268
                } else {
1269
                    this.txtFieldName.setEditable(false);
1270 44673 jjdelcerro
                    this.pickerPrecision.setEditable(false);
1271 44669 jjdelcerro
                    this.pickerScale.setEditable(false);
1272 44505 jjdelcerro
                    this.pickerSize.setEditable(false);
1273
                    this.pickerVirtualField.setEditable(false);
1274
                    this.cboFieldType.setEnabled(false);
1275
                    this.cboGeometryType.setEnabled(false);
1276
                    this.cboGeometrySubtype.setEnabled(false);
1277
                    this.pickerCRS.setEditable(false);
1278
                }
1279
1280
                this.pickerDefaultValue.setEditable(true);
1281
                this.pickerIntervalEnd.setEditable(true);
1282
                this.pickerIntervalStart.setEditable(true);
1283
1284
                this.cboDataProfile.setEnabled(true);
1285
1286 44947 jjdelcerro
                this.pickerDisplaySize.setEditable(false);
1287 44505 jjdelcerro
                this.chkAllowNulls.setEnabled(false);
1288
                this.chkIsAutomatic.setEnabled(false);
1289
                if( this.isVirtualField() ) {
1290
                    this.chkIsPrimaryKey.setEnabled(false);
1291
                } else {
1292
                    this.chkIsPrimaryKey.setEnabled(true);
1293
                }
1294
1295
                this.chkVirtualField.setEnabled(false);
1296
1297
                this.cboDateFormat.setEnabled(true);
1298
1299
                this.cboGroup.setEnabled(true);
1300
                this.pickerOrder.setEditable(true);
1301
                this.chkHidden.setEnabled(true);
1302
                this.txtLabel.setEditable(true);
1303
                this.txtDescription.setEditable(true);
1304
                this.txtMinValue.setEditable(false);
1305
                this.txtMaxValue.setEditable(false);
1306
                this.availableValuesController.setEditable(true);
1307
                this.tagsController.setEditable(true);
1308
                this.foreingKeyController.setEditable(true);
1309
                break;
1310
            case MODE_SHOW_ONLY:
1311
                this.pickerDefaultValue.setEditable(false);
1312
                this.txtFieldName.setEditable(false);
1313
                this.pickerIntervalEnd.setEditable(false);
1314
                this.pickerIntervalStart.setEditable(false);
1315 44673 jjdelcerro
                this.pickerPrecision.setEditable(false);
1316 44669 jjdelcerro
                this.pickerScale.setEditable(false);
1317 44505 jjdelcerro
                this.pickerSize.setEditable(false);
1318 44947 jjdelcerro
                this.pickerDisplaySize.setEditable(false);
1319 44505 jjdelcerro
                this.cboDataProfile.setEnabled(false);
1320
1321
                this.chkAllowNulls.setEnabled(false);
1322
                this.chkIsAutomatic.setEnabled(false);
1323
                this.chkIsPrimaryKey.setEnabled(false);
1324
1325
                this.chkVirtualField.setEnabled(false);
1326
                this.pickerVirtualField.setEditable(false);
1327
1328
                this.cboDateFormat.setEnabled(false);
1329
                this.cboFieldType.setEnabled(false);
1330
                this.cboGeometryType.setEnabled(false);
1331
                this.cboGeometrySubtype.setEnabled(false);
1332
                this.pickerCRS.setEditable(false);
1333
1334
                this.cboGroup.setEnabled(false);
1335
                this.pickerOrder.setEditable(false);
1336
                this.chkHidden.setEnabled(false);
1337
                this.txtLabel.setEditable(false);
1338
                this.txtDescription.setEditable(false);
1339
                this.txtMinValue.setEditable(false);
1340
                this.txtMaxValue.setEditable(false);
1341
                this.availableValuesController.setEditable(false);
1342
                this.tagsController.setEditable(false);
1343
                this.foreingKeyController.setEditable(false);
1344
                break;
1345
        }
1346 44085 jjdelcerro
    }
1347 44262 jjdelcerro
1348 44669 jjdelcerro
    private void doCheckPrecisionAndScale() {
1349 44673 jjdelcerro
      DataType dataType = this.getDataType();
1350
1351
      Integer precision = this.pickerPrecision.get();
1352
      if( precision==null ) {
1353
        precision = 0;
1354
      }
1355
      Integer scale = this.pickerScale.get();
1356
      if( scale == null ) {
1357
        scale = 0;
1358
      }
1359
      NumberPrecisionAndScale r = dataType.fixPrecisionAndScale(precision, scale);
1360
      if( r.getPrecision()!=precision || r.getScale()!=scale ) {
1361
        this.pickerPrecision.setWarning(true, "The precision/scale are not valids");
1362
        this.pickerScale.setWarning(true, "The precision/scale are not valids");
1363
      } else {
1364
        this.pickerPrecision.setWarning(false);
1365
        this.pickerScale.setWarning(false);
1366
      }
1367 44100 jjdelcerro
    }
1368
1369 44128 jjdelcerro
    @Override
1370
    public void setNameAsNew(FeatureType featureType) {
1371 44498 omartinez
        EditableFeatureType cloneFeatureType = featureType.getCopy().getEditable();
1372
        EditableFeatureAttributeDescriptor newAttributeDescriptor = cloneFeatureType.add(
1373
                cloneFeatureType.getNewFieldName(),
1374
                DataTypes.STRING);
1375
        this.put(newAttributeDescriptor);
1376 44128 jjdelcerro
    }
1377
1378
    @Override
1379
    public String getName() {
1380
        return StringUtils.defaultIfBlank(this.txtFieldName.getText(), null);
1381
    }
1382 44262 jjdelcerro
1383 44740 jjdelcerro
    @Override
1384
    public ImageIcon loadImage(String imageName) {
1385
        String name = FilenameUtils.getBaseName(imageName);
1386
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
1387
        if (theme.exists(name)) {
1388
            return theme.get(name);
1389
        }
1390
        URL url = this.getClass().getResource(name + ".png");
1391
        if (url == null) {
1392
            return null;
1393
        }
1394
        return new ImageIcon(url);
1395
    }
1396
1397 44713 jjdelcerro
  public static void selfRegister() {
1398 44740 jjdelcerro
    String[][] iconNames = new String[][]{
1399
      new String[]{"dalswing", "picker-datatype"},};
1400
    IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
1401
    for (String[] icon : iconNames) {
1402
      URL url = DefaultFeatureAttributeSelectionPanel.class.getResource(icon[1] + ".png");
1403
      theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
1404
    }
1405 44713 jjdelcerro
1406
  }
1407
1408 44077 jjdelcerro
}