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

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