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

History | View | Annotate | Download (67.5 KB)

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

    
3
import java.awt.Component;
4
import java.awt.event.ActionEvent;
5
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypeAttributePanel;
6
import java.awt.event.ItemEvent;
7
import java.net.URL;
8
import java.util.ArrayList;
9
import java.util.Collections;
10
import java.util.List;
11
import java.util.Objects;
12
import javax.swing.DefaultComboBoxModel;
13
import javax.swing.DefaultListCellRenderer;
14
import javax.swing.DefaultListModel;
15
import javax.swing.ImageIcon;
16
import javax.swing.JButton;
17
import javax.swing.JCheckBox;
18
import javax.swing.JComboBox;
19
import javax.swing.JComponent;
20
import javax.swing.JLabel;
21
import javax.swing.JList;
22
import javax.swing.JOptionPane;
23
import javax.swing.JScrollPane;
24
import javax.swing.JTextField;
25
import javax.swing.ListModel;
26
import javax.swing.SwingUtilities;
27
import javax.swing.event.ChangeEvent;
28
import javax.swing.event.ListSelectionEvent;
29
import javax.swing.text.JTextComponent;
30
import org.apache.commons.io.FilenameUtils;
31
import org.apache.commons.lang3.StringUtils;
32
import org.cresques.cts.IProjection;
33
import org.gvsig.expressionevaluator.Expression;
34
import org.gvsig.expressionevaluator.ExpressionUtils;
35
import org.gvsig.expressionevaluator.swing.CalculatorController;
36
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
37
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
38
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
39
import org.gvsig.fmap.dal.DALLocator;
40
import org.gvsig.fmap.dal.DataManager;
41
import org.gvsig.fmap.dal.DataStore;
42
import org.gvsig.fmap.dal.DataStoreProviderFactory;
43
import org.gvsig.fmap.dal.DataTypes;
44
import org.gvsig.fmap.dal.StoresRepository;
45
import org.gvsig.fmap.dal.complements.Search;
46
import org.gvsig.fmap.dal.exception.DataException;
47
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
48
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
49
import org.gvsig.fmap.dal.feature.DataProfile;
50
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
51
import org.gvsig.fmap.dal.feature.EditableFeatureType;
52
import org.gvsig.fmap.dal.feature.EditableForeingKey;
53
import org.gvsig.fmap.dal.feature.Feature;
54
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
55
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
56
import org.gvsig.fmap.dal.feature.FeatureStore;
57
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
58
import org.gvsig.fmap.dal.feature.FeatureType;
59
import org.gvsig.fmap.dal.feature.ForeingKey;
60
import org.gvsig.fmap.dal.swing.DALSwingLocator;
61
import org.gvsig.fmap.dal.swing.DataSwingManager;
62
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
63
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel;
64
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_EDIT_ALL;
65
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_EDIT_ONLY_METADATA;
66
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_SHOW_ONLY;
67
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.Tag;
68
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.TagController;
69
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.TagsModel;
70
import org.gvsig.fmap.geom.Geometry;
71
import org.gvsig.fmap.geom.GeometryLocator;
72
import org.gvsig.fmap.geom.GeometryManager;
73
import org.gvsig.fmap.geom.type.GeometryType;
74
import org.gvsig.timesupport.RelativeInterval;
75
import org.gvsig.tools.ToolsLocator;
76
import org.gvsig.tools.dataTypes.DataType;
77
import org.gvsig.tools.dataTypes.DataType.NumberPrecisionAndScale;
78
import org.gvsig.tools.dataTypes.DataTypesManager;
79
import org.gvsig.tools.dynobject.DynField;
80
import org.gvsig.tools.dynobject.DynObjectValueItem;
81
import org.gvsig.tools.i18n.I18nManager;
82
import org.gvsig.tools.locator.ReferenceNotRegisteredException;
83
import org.gvsig.tools.swing.api.ListElement;
84
import org.gvsig.tools.swing.api.ToolsSwingLocator;
85
import org.gvsig.tools.swing.api.ToolsSwingManager;
86
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
87
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
88
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
89
import org.gvsig.tools.swing.api.windowmanager.Dialog;
90
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
91
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
92
import org.gvsig.tools.swing.icontheme.IconTheme;
93
import org.slf4j.Logger;
94
import org.slf4j.LoggerFactory;
95

    
96
/**
97
 *
98
 * @author jjdelcerro
99
 */
100
@SuppressWarnings({"UseSpecificCatch"})
101
public class DefaultFeatureAttributePanel
102
        extends DefaultFeatureAttributePanelView
103
        implements FeatureTypeAttributePanel {
104

    
105
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureAttributePanel.class);
106
    
107
    // ----
108
    // Los he eliminado del GUI pero los mantengo aqui por si decido rescatarlos
109
    private final JTextComponent txtMaxValue = new JTextField();
110
    private final JTextComponent txtMinValue = new JTextField();
111
    private final JComponent lblMinValue = new JLabel();
112
    private final JComponent lblMaxValue = new JLabel();
113
    // ----
114
    private Feature sampleFeature;
115

    
116
    private static class ForeingKeyController {
117

    
118
        private final JCheckBox chkIsForeingKey;
119
        private final JCheckBox chkIsClosedList;
120
        private final JComboBox cboTable;
121
        private final JComboBox cboCode;
122
        private final JTextField txtFormula;
123
        private final JButton btnFormula;
124
        private final JButton btnFormulaHistory;
125
        private final JButton btnFormulaBokkmarks;
126
        private ExpressionPickerController pickerFormula;
127
        private boolean editable;
128
        private ForeingKey foreingKey;
129
        
130
        public ForeingKeyController(
131
                JCheckBox chkIsForeingKey,
132
                JCheckBox chkIsClosedList,
133
                JComboBox cboTable,
134
                JComboBox cboCode,
135
                JTextField txtFormula,
136
                JButton btnFormula,
137
                JButton btnFormulaBokkmarks,
138
                JButton btnFormulaHistory
139
        ) {
140
            this.chkIsForeingKey = chkIsForeingKey;
141
            this.chkIsClosedList = chkIsClosedList;
142
            this.cboTable = cboTable;
143
            this.cboCode = cboCode;
144
            this.txtFormula = txtFormula;
145
            this.btnFormula = btnFormula;
146
            this.btnFormulaHistory = btnFormulaHistory;
147
            this.btnFormulaBokkmarks = btnFormulaBokkmarks;
148
            this.initComponents();
149
        }
150

    
151
        private void initComponents() {
152
            DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
153
    
154
            this.editable = true;
155
            
156
            DefaultComboBoxModel<String> model = new DefaultComboBoxModel();
157
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
158
            List<String> tableNames = new ArrayList<>();
159
            for (String tableName : repository.keySet()) {
160
                tableNames.add(tableName);
161
            }
162
            Collections.sort(tableNames);
163
            for (String tableName : tableNames) {
164
                model.addElement(tableName);
165
            }
166
            this.cboTable.setModel(model);
167
            this.cboTable.addItemListener((ItemEvent e) -> {
168
              if (e.getStateChange() != ItemEvent.SELECTED) {
169
                return;
170
              }
171
              Thread th = new Thread(() -> {
172
                doPopulateComboCode();
173
              }, "FeatureTypePanelForeingKeyPopulateComboCode");
174
              th.start();
175
            });
176
            this.btnFormula.setText("");
177
            this.btnFormulaBokkmarks.setText("");
178
            this.btnFormulaHistory.setText("");
179
            this.pickerFormula = ExpressionEvaluatorSwingLocator.getManager()
180
                    .createExpressionPickerController(txtFormula, btnFormula, btnFormulaBokkmarks, btnFormulaHistory);
181
        }
182

    
183
        private void doPopulateComboCode() {
184
            String tableName = (String) this.cboTable.getSelectedItem();
185
            if( StringUtils.isBlank(tableName) ) {
186
                return;
187
            }
188
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
189
            DataStore store = repository.getStore(tableName);
190
            if( !(store instanceof FeatureStore) ) {
191
                return;
192
            }
193
            FeatureType featureType;
194
            try {
195
                featureType = ((FeatureStore)store).getDefaultFeatureType();
196
            } catch (DataException ex) {
197
                return;
198
            }
199
            
200
            DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
201
            dataSwingManager.resetExpressionBuilder(this.pickerFormula.getConfig());
202
            dataSwingManager.addToExpressionBuilder(this.pickerFormula.getConfig(), (FeatureStore) store, "foreigntable");
203
            
204
            Search search = (Search) ToolsLocator.getComplementsManager().get(
205
                    Search.COMPLEMENT_MANE, featureType
206
            );
207
            List<Search.OrderedAttribute> attributes = search.getOrderedAttributes(
208
                    Search.BASIC_TYPES_FILTER,
209
                    Search.LABEL_ORDER, 
210
                    -1
211
            );
212
            final DefaultComboBoxModel model = new DefaultComboBoxModel();
213
            for (Search.OrderedAttribute attribute : attributes) {
214
                model.addElement(attribute.getDescriptor().getName());
215
            }
216
            SwingUtilities.invokeLater(() -> {
217
              cboCode.setModel(model);
218
              cboCode.setSelectedItem(foreingKey.getCodeName());
219
            });
220
        }
221

    
222
        public void setEditable(boolean editable) {
223
            this.chkIsForeingKey.setEnabled(editable);
224
            this.chkIsClosedList.setEnabled(editable);
225
            this.cboTable.setEnabled(editable);
226
            this.cboCode.setEnabled(editable);
227
            this.pickerFormula.setEditable(editable);
228
            this.editable = editable;
229
        }
230
        
231
        public void setEnabled(boolean enabled) {
232
            if( !editable ) {
233
                enabled =  false;
234
            }
235
            this.chkIsForeingKey.setEnabled(enabled);
236
            this.chkIsClosedList.setEnabled(enabled);
237
            this.cboTable.setEnabled(enabled);
238
            this.cboCode.setEnabled(enabled);
239
            this.pickerFormula.setEditable(editable);
240
        }
241
        
242
        public void clean() {
243
            this.chkIsForeingKey.setSelected(false);
244
            this.chkIsClosedList.setSelected(false);
245
            this.cboTable.setSelectedItem("");
246
            this.cboCode.setSelectedItem("");
247
            this.pickerFormula.set(null);
248
        }
249
        
250
        public void put(ForeingKey foreingKey) {
251
            if( foreingKey==null ) {
252
                this.clean();
253
                return;
254
            }
255
            this.foreingKey = foreingKey;
256
            this.chkIsForeingKey.setSelected(foreingKey.isForeingKey());
257
            this.chkIsClosedList.setSelected(foreingKey.isClosedList());
258
            this.cboTable.setSelectedItem(foreingKey.getTableName());
259
            this.cboCode.setSelectedItem(foreingKey.getCodeName());
260
            this.pickerFormula.set(foreingKey.getLabelExpression(null));
261
        }
262
        
263
        public void fetch(EditableForeingKey foreingKey) {
264
            if( foreingKey==null ) {
265
                return;
266
            }
267
            foreingKey.setForeingKey(this.chkIsForeingKey.isSelected());
268
            foreingKey.setClosedList(this.chkIsClosedList.isSelected());
269
            foreingKey.setTableName((String) this.cboTable.getSelectedItem());
270
            foreingKey.setCodeName((String) this.cboCode.getSelectedItem());
271
            Expression exp = this.pickerFormula.get();
272
            if( ExpressionUtils.isPhraseEmpty(exp) ) {
273
                foreingKey.setLabelFormula("");
274
            } else {
275
                foreingKey.setLabelFormula(exp.getPhrase());
276
            }
277
        }
278
    }
279
    
280

    
281
    private static class AvailableValuesController {
282

    
283
        private final JList lstValues;
284
        private final JTextComponent txtLabel;
285
        private final JTextComponent txtValue;
286
        private final JButton btnAdd;
287
        private final JButton btnUpdate;
288
        private final JButton btnRemove;
289
        private final JButton btnRemoveAll;
290

    
291
        public AvailableValuesController(
292
                JList lstValues,
293
                JTextComponent txtLabel,
294
                JTextComponent txtValue,
295
                JButton btnAdd,
296
                JButton btnUpdate,
297
                JButton btnRemove,
298
                JButton btnRemoveAll
299
        ) {
300
            this.lstValues = lstValues;
301
            this.txtLabel = txtLabel;
302
            this.txtValue = txtValue;
303
            this.btnAdd = btnAdd;
304
            this.btnUpdate = btnUpdate;
305
            this.btnRemove = btnRemove;
306
            this.btnRemoveAll = btnRemoveAll;
307

    
308
            this.lstValues.addListSelectionListener((ListSelectionEvent e) -> {
309
              doValuesChanged();
310
            });
311
            this.btnAdd.addActionListener((ActionEvent e) -> {
312
              doAdd();
313
            });
314
            this.btnUpdate.addActionListener((ActionEvent e) -> {
315
              doUpdate();
316
            });
317
            this.btnRemove.addActionListener((ActionEvent e) -> {
318
              doRemove();
319
            });
320
            this.btnRemoveAll.addActionListener((ActionEvent e) -> {
321
              doRemoveAll();
322
            });
323
        }
324

    
325
        public void clean() {
326
            this.lstValues.setModel(new DefaultListModel());
327
            this.txtLabel.setText("");
328
            this.txtValue.setText("");
329
            this.lstValues.setSelectedIndex(-1);
330
        }
331

    
332
        public DynObjectValueItem[] get() {
333
            ListModel<DynObjectValueItem> model = this.lstValues.getModel();
334
            if( model.getSize()==0 ) {
335
              return null;
336
            }
337
            DynObjectValueItem[] values = new DynObjectValueItem[model.getSize()];
338
            for (int i = 0; i < model.getSize(); i++) {
339
                values[i] = model.getElementAt(i);
340
            }
341
            return values;
342
        }
343

    
344
        public void set(DynObjectValueItem[] availableValues) {
345
            DefaultListModel model = new DefaultListModel();
346
            if (availableValues != null) {
347
                for (DynObjectValueItem availableValue : availableValues) {
348
                    model.addElement(availableValue);
349
                }
350
            }
351
            this.lstValues.setModel(model);
352
            if (model.getSize() > 0) {
353
                this.lstValues.setSelectedIndex(0);
354
            } else {
355
                this.lstValues.setSelectedIndex(-1);
356
            }
357
        }
358

    
359
        public void setEditable(boolean editable) {
360
            this.lstValues.setEnabled(editable);
361
            this.txtLabel.setEditable(editable);
362
            this.txtValue.setEditable(editable);
363
            this.btnAdd.setEnabled(editable);
364
            this.btnUpdate.setEnabled(editable);
365
            this.btnRemove.setEnabled(editable);
366
            this.btnRemoveAll.setEnabled(editable);
367
        }
368

    
369
        private void doValuesChanged() {
370
            DynObjectValueItem value = (DynObjectValueItem) this.lstValues.getSelectedValue();
371
            if (value == null) {
372
                this.txtLabel.setText("");
373
                this.txtValue.setText("");
374
                this.btnAdd.setEnabled(true);
375
                this.btnUpdate.setEnabled(false);
376
                this.btnRemove.setEnabled(false);
377
                return;
378
            }
379
            this.txtLabel.setText(value.getLabel());
380
            this.txtValue.setText(Objects.toString(value.getValue(), ""));
381
            this.btnAdd.setEnabled(true);
382
            this.btnUpdate.setEnabled(true);
383
            this.btnRemove.setEnabled(true);
384
        }
385

    
386
        private void doAdd() {
387
            DynObjectValueItem value = new DynObjectValueItem("Value", "Label");
388
            DefaultListModel model = (DefaultListModel) this.lstValues.getModel();
389
            model.addElement(value);
390
            this.lstValues.setSelectedIndex(model.getSize() - 1);
391
        }
392

    
393
        private void doUpdate() {
394
            DynObjectValueItem value = (DynObjectValueItem) this.lstValues.getSelectedValue();
395
            if (value == null) {
396
                return; // EEhh?? esto no deberia pasar
397
            }
398
            value.setLabel(this.txtLabel.getText());
399
            value.setValue(this.txtValue.getText());
400
        }
401

    
402
        private void doRemove() {
403
            int n = this.lstValues.getSelectedIndex();
404
            if (n < 0) {
405
                return; // EEhh?? esto no deberia pasar
406
            }
407
            DefaultListModel model = (DefaultListModel) this.lstValues.getModel();
408
            model.removeElementAt(n);
409
            if (--n < 0) {
410
                n = 0;
411
            }
412
            this.lstValues.setSelectedIndex(n);
413
        }
414

    
415
        private void doRemoveAll() {
416
            DefaultListModel model = new DefaultListModel();
417
            this.lstValues.setModel(model);
418
            this.lstValues.setSelectedIndex(-1);
419
        }
420

    
421
    }
422

    
423
    private final List<ListElement<Integer>> fieldTypes;
424
    private final List<ListElement<Integer>> geometryTypes;
425
    private final List<ListElement<Integer>> geometrySubtypes;
426

    
427
    private DatePickerController pickerIntervalEnd;
428
    private DatePickerController pickerIntervalStart;
429
    private CalculatorController<Integer> pickerSize;
430
    private CalculatorController<Integer> pickerDisplaySize;
431
    private CalculatorController<Integer> pickerPrecision;
432
    private CalculatorController<Integer> pickerScale;
433
    private PickerController<IProjection> pickerCRS;
434
    private ExpressionPickerController pickerVirtualFieldGetter;
435
    private ExpressionPickerController pickerVirtualFieldSetter;
436
    private ExpressionPickerController pickerDefaultFormat;
437
    private CalculatorController<Integer> pickerOrder;
438
    private AvailableValuesController availableValuesController;
439
    private AggregateController<Tag> tagsController;
440
    private ForeingKeyController foreingKeyController;
441
    private ExpressionPickerController pickerValuesFilter;
442

    
443
    private int mode;
444
    private FeatureStoreElement featureStoreElement;
445

    
446
    public DefaultFeatureAttributePanel() {
447
        this.mode = FeatureTypePanel.MODE_SHOW_ONLY;
448
        DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
449
        // se deber?a de utilizar el datatypepicker
450
        this.fieldTypes = new ArrayList<>();
451
        fieldTypes.add( new ListElement<>("Decimal", DataTypes.DECIMAL) );
452
        fieldTypes.add( new ListElement<>("Integer", DataTypes.INTEGER) );
453
        fieldTypes.add( new ListElement<>("String", DataTypes.STRING) );
454
        fieldTypes.add( new ListElement<>("Boolean", DataTypes.BOOLEAN) );
455
        fieldTypes.add( new ListElement<>("Date", DataTypes.DATE) );
456
        fieldTypes.add( new ListElement<>("Date/Time (Timestamp)", DataTypes.TIMESTAMP) );
457
//        for (DataType dataType : dataManager) {
458
//            fieldTypes.add( new ListElement<>(dataType.getName(), dataType.getType()) );
459
//        }
460
        fieldTypes.sort((ListElement<Integer> o1, ListElement<Integer> o2) -> 
461
                o1.toString().compareTo(o2.toString())
462
        );
463

    
464
        this.geometryTypes = new ArrayList<>();
465
        this.geometryTypes.add(new ListElement("Point", Geometry.TYPES.POINT));
466
        this.geometryTypes.add(new ListElement("Line", Geometry.TYPES.LINE));
467
        this.geometryTypes.add(new ListElement("Polygon", Geometry.TYPES.POLYGON));
468
        this.geometryTypes.add(new ListElement("MultiPoint", Geometry.TYPES.MULTIPOINT));
469
        this.geometryTypes.add(new ListElement("MultiLine", Geometry.TYPES.MULTILINE));
470
        this.geometryTypes.add(new ListElement("MultiPolygon", Geometry.TYPES.MULTIPOLYGON));
471
        this.geometryTypes.sort((ListElement<Integer> o1, ListElement<Integer> o2) -> 
472
                  o1.toString().compareTo(o2.toString())
473
        );
474

    
475
        this.geometrySubtypes = new ArrayList<>();
476
        this.geometrySubtypes.add(new ListElement("2D", Geometry.SUBTYPES.GEOM2D));
477
        this.geometrySubtypes.add(new ListElement("2DM", Geometry.SUBTYPES.GEOM3D));
478
        this.geometrySubtypes.add(new ListElement("3D", Geometry.SUBTYPES.GEOM2DM));
479
        this.geometrySubtypes.add(new ListElement("3DM", Geometry.SUBTYPES.GEOM3DM));
480
        this.geometrySubtypes.sort((ListElement<Integer> o1, ListElement<Integer> o2) -> 
481
                o1.toString().compareTo(o2.toString())
482
        );
483

    
484
        this.initComponents();
485
    }
486

    
487
    private void initComponents() {
488
        final ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
489
        final ExpressionEvaluatorSwingManager evaluatorSwingManager = ExpressionEvaluatorSwingLocator.getManager();
490
        final DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
491
        final I18nManager i18n = ToolsLocator.getI18nManager();
492
        final DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
493

    
494
        DefaultComboBoxModel<ListElement<Integer>> modelTypes = new DefaultComboBoxModel<>();
495
        for (ListElement<Integer> element : fieldTypes) {
496
            modelTypes.addElement(element);
497
        }
498
        this.cboFieldType.setModel(modelTypes);
499
        this.cboFieldType.setRenderer(new DefaultListCellRenderer() {
500
          @Override
501
          public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
502
              JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
503
              label.setIcon(null);
504
              try {
505
                DataType dataType = dataTypeManager.get((int) value);
506
                IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
507
                if (theme.exists(dataType.getIconName())) {
508
                    label.setIcon(theme.get(dataType.getIconName()));
509
                }
510
              } catch(Exception ex) {
511
                // Do nothing, ignore
512
              }
513
              return label;
514
          }
515
        });
516

    
517
        DefaultComboBoxModel<ListElement<Integer>> modelGeomTypes = new DefaultComboBoxModel<>();
518
        for (ListElement<Integer> element : this.geometryTypes) {
519
            modelGeomTypes.addElement(element);
520
        }
521
        this.cboGeometryType.setModel(modelGeomTypes);
522

    
523
        DefaultComboBoxModel<ListElement<Integer>> modelGeomSubtypes = new DefaultComboBoxModel<>();
524
        for (ListElement<Integer> element : this.geometrySubtypes) {
525
            modelGeomSubtypes.addElement(element);
526
        }
527

    
528
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
529

    
530
        swingManager.translate(this.lblAllowNulls);
531
        swingManager.translate(this.lblCRS);
532
        swingManager.translate(this.lblDataProfile);
533
        swingManager.translate(this.lblDateFormat);
534
        swingManager.translate(this.lblDefaultValue);
535
        swingManager.translate(this.lblDefaultFormat);
536
        swingManager.translate(this.lblFieldName);
537
        swingManager.translate(this.lblFieldType);
538
        swingManager.translate(this.lblGeometrySubtype);
539
        swingManager.translate(this.lblGeometryType);
540
        swingManager.translate(this.lblInterval);
541
        swingManager.translate(this.lblIntervalEnd);
542
        swingManager.translate(this.lblIntervalStart);
543
        swingManager.translate(this.lblIsAutomatic);
544
        swingManager.translate(this.lblIsIndexed);
545
        swingManager.translate(this.lblIsReadOnly);
546
        swingManager.translate(this.lblIsPrimaryKey);
547
        swingManager.translate(this.lblPrecision);
548
        swingManager.translate(this.lblScale);
549
        swingManager.translate(this.lblSize);
550
        swingManager.translate(this.lblDisplaySize);
551
        swingManager.translate(this.chkVirtualField);
552
        swingManager.translate(this.lblVirtualField);
553
        swingManager.translate(this.lblVirtualFieldSep);
554
        swingManager.translate(this.lblVirtualFieldGetter);
555
        swingManager.translate(this.lblVirtualFieldSetter);
556
        swingManager.translate(this.tabAditionalFields);
557
        swingManager.translate(this.tabLayout);
558
        swingManager.translate(this.lblGroup);
559
        swingManager.translate(this.lblOrder);
560
        swingManager.translate(this.lblHidden);
561
        swingManager.translate(this.lblLabel);
562
        swingManager.translate(this.lblDescription);
563
        swingManager.translate(this.lblMinValue);
564
        swingManager.translate(this.lblMaxValue);
565
        swingManager.translate(this.lblAvailableValues);
566
        swingManager.translate(this.lblAvailableValuesLabel);
567
        swingManager.translate(this.lblAvailableValuesValue);
568
        swingManager.translate(this.lblRelationType);
569
        swingManager.translate(this.btnAvailableValuesAdd);
570
        swingManager.translate(this.btnAvailableValuesUpdate);
571
        swingManager.translate(this.btnAvailableValuesRemove);
572
        swingManager.translate(this.btnAvailableValuesRemoveAll);
573
        swingManager.translate(this.lblAttrTagsItemName);
574
        swingManager.translate(this.lblAttrTagsItemValue);
575
        swingManager.translate(this.lblAttrTagsItemNotes);
576
        swingManager.translate(this.lblValuesFilter);
577

    
578
        swingManager.translate(this.lblForeingKeyCodeName);
579
        swingManager.translate(this.lblForeingKeyLabelFormula);
580
        swingManager.translate(this.lblForeingKeyTableName);
581
        swingManager.translate(this.lblIsClosedList);
582
        swingManager.translate(this.chkIsForeingKey);
583

    
584
        swingManager.translate(this.txtDisplaySize);
585
        swingManager.translate(this.txtPrecision);
586
        swingManager.translate(this.txtScale);
587
        swingManager.translate(this.txtScale);
588

    
589
        swingManager.addClearButton(this.txtDefaultValue);
590
        swingManager.addClearButton(this.txtDefaultFormat);
591
        swingManager.addClearButton(this.txtFieldName);
592
        swingManager.addClearButton(this.txtIntervalEnd);
593
        swingManager.addClearButton(this.txtIntervalStart);
594
        swingManager.addClearButton(this.txtScale);
595
        swingManager.addClearButton(this.txtSize);
596
        swingManager.addClearButton(this.txtDisplaySize);
597
        swingManager.addClearButton(this.txtLabel);
598
        swingManager.addClearButton(this.txtDescription);
599
        swingManager.addClearButton(this.cboGroup);
600
        swingManager.addClearButton(this.txtMaxValue);
601
        swingManager.addClearButton(this.txtMinValue);
602
        swingManager.addClearButton(this.txtAvailableValuesLabel);
603
        swingManager.addClearButton(this.txtAvailableValuesValue);
604

    
605
        swingManager.setDefaultPopupMenu(this.txtDefaultValue);
606
        swingManager.setDefaultPopupMenu(this.txtDefaultFormat);
607
        swingManager.setDefaultPopupMenu(this.txtFieldName);
608
        swingManager.setDefaultPopupMenu(this.txtIntervalEnd);
609
        swingManager.setDefaultPopupMenu(this.txtIntervalStart);
610
        swingManager.setDefaultPopupMenu(this.txtScale);
611
        swingManager.setDefaultPopupMenu(this.txtSize);
612
        swingManager.setDefaultPopupMenu(this.txtDisplaySize);
613
        swingManager.setDefaultPopupMenu(this.cboDateFormat);
614
        swingManager.setDefaultPopupMenu(this.cboFieldType);
615
        swingManager.setDefaultPopupMenu(this.cboGeometrySubtype);
616
        swingManager.setDefaultPopupMenu(this.cboGeometryType);
617
        swingManager.setDefaultPopupMenu(this.cboDataProfile);
618

    
619
        swingManager.setDefaultPopupMenu(this.cboForeingKeyCodeName);
620
        swingManager.setDefaultPopupMenu(this.cboForeingKeyTableName);
621

    
622
        swingManager.setDefaultPopupMenu(this.cboGroup);
623
        swingManager.setDefaultPopupMenu(this.txtOrder);
624
        swingManager.setDefaultPopupMenu(this.txtLabel);
625
        swingManager.setDefaultPopupMenu(this.txtDescription);
626
        swingManager.setDefaultPopupMenu(this.txtMinValue);
627
        swingManager.setDefaultPopupMenu(this.txtMaxValue);
628
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesLabel);
629
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesValue);
630

    
631
        this.foreingKeyController = new ForeingKeyController(
632
                chkIsForeingKey, 
633
                chkIsClosedList, 
634
                cboForeingKeyTableName, 
635
                cboForeingKeyCodeName, 
636
                txtForeingKeyFormula, 
637
                btnForeingKeyFormula,
638
                btnForeingKeyFormulaBookmarks,
639
                btnForeingKeyFormulaHistory
640
        );
641
        this.pickerIntervalEnd = swingManager.createDatePickerController(
642
                this.txtIntervalEnd,
643
                this.btnIntervalEnd
644
        );
645
        this.pickerIntervalStart = swingManager.createDatePickerController(
646
                this.txtIntervalStart,
647
                this.btnIntervalStart
648
        );
649
        this.pickerSize = evaluatorSwingManager.createCalculatorController(
650
                this.txtSize, DataTypes.INT
651
        );
652
        this.pickerDisplaySize = evaluatorSwingManager.createCalculatorController(this.txtDisplaySize, DataTypes.INT
653
        );
654
        this.pickerPrecision = evaluatorSwingManager.createCalculatorController(
655
                this.txtPrecision, DataTypes.INT
656
        );
657
        this.pickerScale = evaluatorSwingManager.createCalculatorController(
658
                this.txtScale, DataTypes.INT
659
        );
660
        this.txtDefaultValue.getComponentPopupMenu().add(evaluatorSwingManager.createJExpressionBuilderAction(txtDefaultValue));
661
        this.pickerOrder = evaluatorSwingManager.createCalculatorController(
662
                this.txtOrder, DataTypes.INT
663
        );
664

    
665
        this.availableValuesController = new AvailableValuesController(
666
                lstAvailableValues,
667
                txtAvailableValuesLabel,
668
                txtAvailableValuesValue,
669
                btnAvailableValuesAdd,
670
                btnAvailableValuesUpdate,
671
                btnAvailableValuesRemove,
672
                btnAvailableValuesRemoveAll
673
        );
674
        
675
        this.tagsController = new DefaultAggregateController<>(
676
                this.tblAttrTagsItems,
677
                this.btnAttrTagsModify,
678
                this.btnAttrTagsDiscard,
679
                this.btnAttrTagsAccept,
680
                this.btnAttrTagsNew,
681
                this.btnAttrTagsDelete,
682
                new TagController(
683
                        this.cboAttrTagsItemName,
684
                        this.cboAttrTagsItemValue,
685
                        this.lblAttrTagsItemNotesValue
686
                )
687
        );        
688
        this.txtMinValue.setEnabled(false);
689
        this.txtMaxValue.setEnabled(false);
690

    
691
        this.btnVirtualFieldGetter.setText("");
692
        this.featureStoreElement = dataSwingManager.createFeatureStoreElement();
693
        this.pickerVirtualFieldGetter = evaluatorSwingManager.createExpressionPickerController(
694
                txtVirtualFieldGetter, btnVirtualFieldGetter, btnVirtualFieldBookmarksGetter, btnVirtualFieldHistoryGetter
695
        );
696
        this.pickerVirtualFieldGetter.getConfig().addElement(this.featureStoreElement);
697
        this.pickerVirtualFieldSetter = evaluatorSwingManager.createExpressionPickerController(
698
                txtVirtualFieldSetter, btnVirtualFieldSetter, btnVirtualFieldBookmarksSetter, btnVirtualFieldHistorySetter
699
        );
700
        this.pickerVirtualFieldSetter.getConfig().addElement(this.featureStoreElement);
701
        
702
        this.chkVirtualField.addChangeListener((ChangeEvent e) -> {
703
          if (chkVirtualField.isSelected()) {
704
            pickerVirtualFieldGetter.setEditable(mode==MODE_EDIT_ALL || mode==MODE_EDIT_ONLY_METADATA);
705
            pickerVirtualFieldSetter.setEditable(false);
706
          } else {
707
            pickerVirtualFieldGetter.setEditable(false);
708
            pickerVirtualFieldSetter.setEditable(false);
709
          }
710
        });
711

    
712
        this.pickerCRS = dataSwingManager.createProjectionPickerController(
713
                this.txtCRS, this.btnCRS
714
        );
715

    
716
        this.cboFieldType.addItemListener((ItemEvent e) -> {
717
          SwingUtilities.invokeLater(() -> {
718
            doFieldTypeChanged();
719
          });
720
        });
721

    
722
        this.pickerPrecision.addChangeListener((ChangeEvent e) -> {
723
          doCheckPrecisionAndScale();
724
        });
725
        this.pickerScale.addChangeListener((ChangeEvent e) -> {
726
          doCheckPrecisionAndScale();
727
        });
728

    
729
        DefaultComboBoxModel dataProfilesModel = new DefaultComboBoxModel<>();
730
        dataProfilesModel.addElement(new ListElement<>("", null));
731
        for (DataProfile profile : DALLocator.getDataManager().getDataProfiles()) {
732
            dataProfilesModel.addElement(new ListElement<>(profile.getName(), profile.getID()));
733
        }
734
        this.cboDataProfile.setModel(dataProfilesModel);
735
        
736
        this.btnFieldType.addActionListener((ActionEvent e) -> {
737
          doDataTypeSelection();
738
        });
739
        
740
        DefaultComboBoxModel<ListElement<Integer>> relationTypeModel = new DefaultComboBoxModel<>();
741
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_None"),DynField.RELATION_TYPE_NONE));
742
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Identity_1_1"),DynField.RELATION_TYPE_IDENTITY));
743
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Collaboration_1_1"),DynField.RELATION_TYPE_COLLABORATION));
744
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Composition_1_N"),DynField.RELATION_TYPE_COMPOSITION));
745
        relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Aggregate_1_N"),DynField.RELATION_TYPE_AGGREGATE));
746
        this.cboRelationType.setModel(relationTypeModel);
747

    
748

    
749
        this.pickerValuesFilter = evaluatorSwingManager.createExpressionPickerController(
750
                txtValuesFilter, btnValuesFilter, btnValuesFilterBookmarks, btnValuesFilterHistory
751
        );
752
        this.pickerValuesFilter.getConfig().addElement(this.featureStoreElement);
753

    
754
    }
755

    
756
    @Override
757
    public JComponent asJComponent() {
758
        return this;
759
    }
760
    
761
    private void doDataTypeSelection() {
762
        final DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
763
        final I18nManager i18n = ToolsLocator.getI18nManager();
764
        List<ListElement<Integer>> types = new ArrayList<>();
765
        for (DataType dataType : dataManager) {
766
            types.add( new ListElement<>(dataType.getName(), dataType.getType()) );
767
        }
768
        types.sort((ListElement<Integer> o1, ListElement<Integer> o2) -> 
769
                o1.toString().compareTo(o2.toString())
770
        );
771
        
772
        DefaultListModel<ListElement<Integer>> modelTypes = new DefaultListModel<>();
773
        for (ListElement<Integer> element : types) {
774
            modelTypes.addElement(element);
775
        }
776
        final JList list = new JList();
777
        list.setCellRenderer(new DefaultListCellRenderer() {
778
          @Override
779
          public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
780
              JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
781
              label.setIcon(null);
782
              try {
783
                DataType dataType = dataManager.get((int) value);
784
                IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
785
                if (theme.exists(dataType.getIconName())) {
786
                    label.setIcon(theme.get(dataType.getIconName()));
787
                }
788
              } catch(Exception ex) {
789
                // Do nothing, ignore
790
              }
791
              return label;
792
          }
793
        });
794
        list.setModel(modelTypes);
795
        final JScrollPane scrollpanel = new JScrollPane(list);
796
        WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
797
        Dialog dialog = winManager.createDialog(
798
              scrollpanel, 
799
              i18n.getTranslation("_Data_type_selection"),
800
              i18n.getTranslation("_Select_the_data_type"),
801
              WindowManager_v2.BUTTONS_OK_CANCEL
802
        );
803
        dialog.addActionListener((ActionEvent e) -> {
804
          if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
805
            Integer type = (Integer) ListElement.getSelected(list);
806
            if( type!=null ) {
807
              ListElement.setSelected(cboFieldType, type);
808
              if( ListElement.getSelected(cboFieldType)==null ) {
809
                DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
810
                DataType dataType = dataTypeManager.get(type);
811
                cboFieldType.addItem(new ListElement<>(dataType.getName(), dataType.getType()));
812
                ListElement.setSelected(cboFieldType, dataType.getType());
813
              }
814
            }
815
          }
816
        });
817
        dialog.show(WindowManager.MODE.DIALOG);
818
    }
819
    
820
    private int getMaxAttributeSize(EditableFeatureAttributeDescriptor descriptor) {
821
        FeatureStore store = descriptor.getStore();
822
        if(store == null){
823
            return -1;
824
        }
825
        DataStoreProviderFactory providerFactory = store.getProviderFactory();
826
        if(providerFactory == null){
827
            return -1;
828
        }
829
        return ((FeatureStoreProviderFactory)providerFactory).getMaxAttributeNameSize();
830
    }
831

    
832
    @Override
833
    public EditableFeatureAttributeDescriptor fetch(EditableFeatureAttributeDescriptor descriptor) {
834
        I18nManager i18n = ToolsLocator.getI18nManager();
835
        try {
836
            if (!this.chkAllowNulls.isSelected()) {
837
                if (descriptor.allowNull()) {
838
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
839
                    dialogs.messageDialog(
840
                            i18n.getTranslation("_You_have_marked_not_allow_nulls") + "\n"
841
                            + i18n.getTranslation("If_you_are_not_fully_aware_of_the_repercussions_of_this_it_is_advisable_to_allow_nulls"),
842
                            null,
843
                            i18n.getTranslation("_Warning"),
844
                            JOptionPane.INFORMATION_MESSAGE,
845
                            "AllowNullsInFeatureTypeEditing"
846
                    );
847
                }
848
            }
849
            descriptor.setDataType((int) ListElement.getSelected(this.cboFieldType));
850
            int maxAttributeNameSize = getMaxAttributeSize(descriptor);
851
            String attrName = this.txtFieldName.getText();
852
            if(maxAttributeNameSize > -1 && StringUtils.length(attrName) > maxAttributeNameSize){
853
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
854
                    dialogs.messageDialog(
855
                            i18n.getTranslation("_Attribute_name_is_too_long") + "\n"
856
                            + i18n.getTranslation("_max_size_allowed_for_this_table_is_{0}",new String[]{String.valueOf(maxAttributeNameSize)}),
857
                            null,
858
                            i18n.getTranslation("_Warning"),
859
                            JOptionPane.WARNING_MESSAGE
860
                    );
861
                    return null;
862
            }
863
            descriptor.setName(attrName);
864
            descriptor.setAllowNull(this.chkAllowNulls.isSelected());
865
            descriptor.setIsPrimaryKey(this.chkIsPrimaryKey.isSelected());
866
            descriptor.setIsAutomatic(this.chkIsAutomatic.isSelected());
867
            descriptor.setIsReadOnly(this.chkIsReadOnly.isSelected());
868
            descriptor.setIsIndexed(this.chkIsIndexed.isSelected());
869
            descriptor.setSize(this.pickerSize.get(0));
870
            descriptor.setDisplaySize(this.pickerDisplaySize.get(0));
871
            descriptor.setPrecision(this.pickerPrecision.get(0));
872
            descriptor.setScale(this.pickerScale.get(0));
873
            descriptor.setDefaultValue(this.txtDefaultValue.getText());
874
            descriptor.setDefaultFormat(this.txtDefaultFormat.getText());
875
            descriptor.setDataProfileName((String) ListElement.getSelected(this.cboDataProfile));
876
            descriptor.setRelationType((int) ListElement.getSelected(this.cboRelationType));
877
            switch (descriptor.getType()) {
878
                case DataTypes.GEOMETRY:
879
                    GeometryManager geomManager = GeometryLocator.getGeometryManager();
880
                    GeometryType geomType = geomManager.getGeometryType(
881
                            (int) ListElement.getSelected(this.cboGeometryType),
882
                            (int) ListElement.getSelected(this.cboGeometrySubtype)
883
                    );
884
                    descriptor.setGeometryType(geomType);
885
                    descriptor.setSRS(this.pickerCRS.get());
886
                    break;
887
                case DataTypes.INSTANT:
888
                case DataTypes.INTERVAL:
889
                case DataTypes.DATE:
890
                case DataTypes.TIME:
891
                case DataTypes.TIMESTAMP:
892
                    // FIXME
893
                    break;
894
                default:
895
                    break;
896
            }
897
            descriptor.setDataProfileName(
898
                    StringUtils.defaultIfBlank((String) ListElement.getSelected(cboDataProfile), null)
899
            );
900

    
901
            if (this.chkVirtualField.isSelected() ) { //&& this.pickerVirtualField.isEnabled()) {
902
                Expression expression = this.pickerVirtualFieldGetter.get();
903
                if (expression == null) {
904
                    descriptor.setFeatureAttributeEmulator((String) null);
905
                } else {
906
                    DataManager dataManager = DALLocator.getDataManager();
907
                    FeatureAttributeEmulatorExpression emulator = dataManager.createFeatureAttributeEmulatorExpression(
908
                            descriptor.getFeatureType(),
909
                            expression
910
                    );
911
                    if (!emulator.isValid()) {
912
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
913
                        dialogs.messageDialog(
914
                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+"\n"
915
                                + "\n"
916
                                + emulator.getErrorMessage(),
917
                                i18n.getTranslation("_Warning"),
918
                                JOptionPane.WARNING_MESSAGE
919
                        );
920
                        return null;
921
                    }
922
                    for (String requiredFieldName : emulator.getRequiredFieldNames()) {
923
                        if (StringUtils.equalsIgnoreCase(requiredFieldName, descriptor.getName())) {
924
                            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
925
                            dialogs.messageDialog(
926
                                    i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")
927
                                    + "\n\n"
928
                                    + i18n.getTranslation("_The_expression_contains_a_reference_to_itself"),
929
                                    i18n.getTranslation("_Warning"),
930
                                    JOptionPane.WARNING_MESSAGE
931
                            );
932
                            return null;
933
                        }
934
                    }
935
                    List<String> undefinedSymbols = emulator.getUndefinedSymbols();
936
                    if( undefinedSymbols!=null && !undefinedSymbols.isEmpty() ) {
937
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
938
                        dialogs.messageDialog(
939
                                i18n.getTranslation("_The_expression_has_undefined_symbols_at_this_moment")+"\n"
940
                                + i18n.getTranslation("_This_may_not_be_a_mistake")+"\n"
941
                                + "\n"
942
                                + "("+StringUtils.join(undefinedSymbols,",")+")",
943
                                i18n.getTranslation("_Warning"),
944
                                JOptionPane.WARNING_MESSAGE
945
                        );
946
                    }
947
                    //
948
                    // No se porque esto de abajo no funciona.
949
                    // Nunca se lanza la excepcion en el get(Feature) de
950
                    // DefaultFeatureAttributeEmulatorExpression.
951
                    //
952
                    try {
953
                        emulator.setEnableExceptions(true);
954
//                        descriptor.setFeatureAttributeEmulator(emulator);
955
                        emulator.get(this.sampleFeature);
956
                    } catch(Throwable ex) {
957
//                        emulator.setEnableExceptions(false);
958
//                        descriptor.setFeatureAttributeEmulator(null);
959
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
960
                        dialogs.messageDialog(
961
                                i18n.getTranslation("_The_expression_can_not_be_evaluated_right_now_It_could_be_valid_when_all_changes_has_been_applied")+
962
                                    "\n"+
963
                                    ex.getMessage(), 
964
                                i18n.getTranslation("_Warning"), 
965
                                JOptionPane.WARNING_MESSAGE
966
                        );
967
//                        return null;
968
                    } finally {
969
                        emulator.setEnableExceptions(false);
970
                    }
971
                    descriptor.setFeatureAttributeEmulator(emulator);
972
                }
973
            }
974
        } catch (Exception ex) {
975
            LOGGER.warn("Can't retrieve information from user form.", ex);
976
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
977
            dialogs.messageDialog(
978
                    i18n.getTranslation("_Cant_retrieve_information_from_user_form")
979
                    + "\n"
980
                    + i18n.getTranslation("_See_log_for_details"),
981
                    i18n.getTranslation("_Warning"),
982
                    JOptionPane.WARNING_MESSAGE
983
            );
984
            return null;
985
        }
986

    
987
        descriptor.setGroup(StringUtils.defaultIfBlank((String) this.cboGroup.getSelectedItem(), null));
988
        descriptor.setOrder(this.pickerOrder.get(0));
989
        descriptor.setHidden(this.chkHidden.isSelected());
990
        descriptor.setLabel(StringUtils.defaultIfBlank(this.txtLabel.getText(), null));
991
        descriptor.setDescription(StringUtils.defaultIfBlank(this.txtDescription.getText(), null));
992

    
993
//        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
994
//        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
995
        Expression valuesFilter = this.pickerValuesFilter.get();
996
        
997
        descriptor.setAvailableValues(this.availableValuesController.get());
998

    
999
        this.tagsController.getModel().fetch(descriptor.getTags());
1000
        this.foreingKeyController.fetch(descriptor.getForeingKey());
1001
        return descriptor;
1002
    }
1003

    
1004
    @Override
1005
    public void clean() {
1006
        this.txtDefaultValue.setText("");
1007
        this.txtDefaultFormat.setText("");
1008
        this.txtFieldName.setText("");
1009
//        this.pickerFieldName.set(null);
1010
        this.pickerIntervalEnd.set(null);
1011
        this.pickerIntervalStart.set(null);
1012
        this.pickerScale.set(null);
1013
        this.pickerSize.set(null);
1014
        this.pickerDisplaySize.set(null);
1015

    
1016
        this.chkAllowNulls.setSelected(false);
1017
        this.chkIsAutomatic.setSelected(false);
1018
        this.chkIsReadOnly.setSelected(false);
1019
        this.chkIsIndexed.setSelected(false);
1020
        this.chkIsPrimaryKey.setSelected(false);
1021

    
1022
        this.chkVirtualField.setSelected(false);
1023
        this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
1024
        this.pickerVirtualFieldGetter.setEditable(false);
1025
        this.pickerVirtualFieldGetter.set(null);
1026

    
1027
        ListElement.setSelected(cboGeometryType, null);
1028
        ListElement.setSelected(cboGeometrySubtype, null);
1029

    
1030
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
1031

    
1032
        this.cboDataProfile.setSelectedIndex(-1);
1033

    
1034
        this.cboGroup.setSelectedIndex(-1);
1035
        this.pickerOrder.set(null);
1036
        this.chkHidden.setSelected(false);
1037
        this.txtLabel.setText("");
1038
        this.txtDescription.setText("");
1039
        this.txtMinValue.setText("");
1040
        this.txtMaxValue.setText("");
1041
        this.availableValuesController.clean();
1042
        this.tagsController.clean();
1043
        this.foreingKeyController.clean();
1044
    }
1045

    
1046
    @Override
1047
    public void put(FeatureAttributeDescriptor descriptor) {
1048
        if (descriptor == null) {
1049
            this.clean();
1050
            return;
1051
        }
1052
        DataType dataType = descriptor.getDataType();
1053
        FeatureType featureType = descriptor.getFeatureType();
1054
        DefaultComboBoxModel groupModel = new DefaultComboBoxModel();
1055

    
1056
        if (featureType != null) {
1057
            FeatureStore store = descriptor.getFeatureType().getStore();
1058
            this.featureStoreElement.setFeatureStore(store);
1059
            if (store != null) {
1060
                this.sampleFeature = store.getSampleFeature();
1061
                if (sampleFeature != null) {
1062
                    FeatureSymbolTable featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable();
1063
                    featureSymbolTable.setFeature(sampleFeature);
1064
                    this.pickerVirtualFieldGetter.getConfig().setPreviewSymbolTable(featureSymbolTable.createParent());
1065
                    this.pickerValuesFilter.getConfig().setPreviewSymbolTable(featureSymbolTable.createParent());
1066
                }
1067
            }
1068
            List<String> groups = new ArrayList<>();
1069
            for (FeatureAttributeDescriptor otherdesc : featureType) {
1070
                String group = otherdesc.getGroup();
1071
                if (!StringUtils.isBlank(group) && !groups.contains(group)) {
1072
                    groups.add(group);
1073
                }
1074
            }
1075
            for (String group : groups) {
1076
                groupModel.addElement(group);
1077
            }
1078
        }
1079

    
1080
        this.txtDefaultValue.setText(Objects.toString(descriptor.getDefaultValue(),""));
1081
        this.txtDefaultFormat.setText(Objects.toString(descriptor.getDefaultFormat(),""));
1082
        this.txtFieldName.setText(descriptor.getName());
1083
        RelativeInterval interval = (RelativeInterval) descriptor.getInterval();
1084
        if (interval == null) {
1085
            this.pickerIntervalEnd.set(null);
1086
            this.pickerIntervalStart.set(null);
1087
        } else {
1088
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
1089
            this.pickerIntervalStart.set(interval.getStart().toDate());
1090
        }
1091
        if( dataType.supportSize() ) {
1092
          this.pickerSize.set(descriptor.getSize());
1093
        } else {
1094
          this.pickerSize.set(null);
1095
        }
1096
        this.pickerDisplaySize.set(descriptor.getDisplaySize());
1097
        if( dataType.supportPrecision() ) {
1098
          this.pickerPrecision.set(descriptor.getPrecision());
1099
        } else {
1100
          this.pickerPrecision.set(null);
1101
        }
1102
        if( dataType.supportScale()) {
1103
          this.pickerScale.set(descriptor.getScale());
1104
        } else {
1105
          this.pickerScale.set(null);
1106
        }
1107
        this.chkAllowNulls.setSelected(descriptor.allowNull());
1108
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
1109
        this.chkIsReadOnly.setSelected(descriptor.isReadOnly());
1110
        this.chkIsIndexed.setSelected(descriptor.isIndexed());
1111
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
1112

    
1113
        this.pickerVirtualFieldGetter.setEnabled(true);
1114
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
1115
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
1116
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
1117
            this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL);
1118
            this.chkVirtualField.setSelected(true);
1119
            this.pickerVirtualFieldGetter.set(expression);
1120
        } else if (descriptor.isComputed()) {
1121
            this.chkVirtualField.setEnabled(false);
1122
            this.chkVirtualField.setSelected(true);
1123
            this.pickerVirtualFieldGetter.set(null);
1124
        } else {
1125
            this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL);
1126
            this.chkVirtualField.setSelected(false);
1127
            this.pickerVirtualFieldGetter.set(null);
1128
        }
1129
        this.pickerVirtualFieldGetter.setEnabled(true);
1130

    
1131
        Expression expression = descriptor.getAvailableValuesFilter();
1132
        this.pickerValuesFilter.set(expression);
1133

    
1134
        this.pickerCRS.set(descriptor.getSRS());
1135

    
1136
        if (descriptor.getGeomType() != null) {
1137
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
1138
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
1139
        }
1140
        ListElement.setSelected(cboFieldType, dataType.getType());
1141
        if( ListElement.getSelected(cboFieldType)==null ) {
1142
          cboFieldType.addItem(new ListElement<>(dataType.getName(), dataType.getType()));
1143
          ListElement.setSelected(cboFieldType, dataType.getType());
1144
        }
1145
 
1146
        ListElement.setSelected(cboRelationType, descriptor.getRelationType());
1147

    
1148
        String profile = descriptor.getDataProfileName();
1149
        if (StringUtils.isBlank(profile)) {
1150
            this.cboDataProfile.setSelectedIndex(-1);
1151
        } else {
1152
            ListElement.setSelected(this.cboDataProfile, profile);
1153
        }
1154

    
1155
        this.cboGroup.setModel(groupModel);
1156
        this.cboGroup.setSelectedItem(StringUtils.defaultIfBlank(descriptor.getGroup(), ""));
1157
        this.pickerOrder.set(descriptor.getOder());
1158
        this.chkHidden.setSelected(descriptor.isHidden());
1159
        if (descriptor.hasLabel()) {
1160
            this.txtLabel.setText(StringUtils.defaultIfBlank(descriptor.getLabel(), ""));
1161
        } else {
1162
            this.txtLabel.setText("");
1163
        }
1164
        if (descriptor.hasDescription()) {
1165
            this.txtDescription.setText(StringUtils.defaultIfBlank(descriptor.getDescription(), ""));
1166
        } else {
1167
            this.txtDescription.setText("");
1168
        }
1169
        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
1170
        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
1171
        if( descriptor.hasConstantAvailableValues() ) {
1172
          this.availableValuesController.set(descriptor.getAvailableValues());
1173
        } else {
1174
          this.availableValuesController.clean();
1175
        }
1176
        this.tagsController.setModel(new TagsModel(descriptor.getTags()));
1177

    
1178
        this.foreingKeyController.put(descriptor.getForeingKey());
1179
        
1180
        if (!(descriptor instanceof EditableFeatureAttributeDescriptor)) {
1181
            this.setMode(FeatureTypePanel.MODE_SHOW_ONLY);
1182
        }
1183
        this.updateEditableStates();
1184
    }
1185

    
1186
    private DataType getDataType() {
1187
      Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
1188
      if (fieldType == null) {
1189
          return null;
1190
      }
1191
      DataType dataType = ToolsLocator.getDataTypesManager().get(fieldType);
1192
      return dataType;
1193
    }
1194

    
1195
    private void doFieldTypeChanged() {
1196
      try {
1197
        DataType dataType = this.getDataType();
1198

    
1199
        if( dataType.supportSize() ) {
1200
            this.pickerSize.setEditable(this.mode == MODE_EDIT_ALL);
1201
        } else {
1202
            this.pickerSize.setEditable(false);
1203
            this.pickerSize.set(null);
1204
        }        
1205
        this.pickerDisplaySize.setEditable(this.mode == MODE_EDIT_ALL);
1206
        if( dataType.supportPrecision() ) {
1207
          if( dataType.isPredefinedPrecision() ) {
1208
            this.pickerPrecision.setEditable(false);
1209
          } else {
1210
            this.pickerPrecision.setEditable(this.mode == MODE_EDIT_ALL);
1211
          }
1212
        } else {
1213
            this.pickerPrecision.setEditable(false);
1214
            this.pickerPrecision.set(null);
1215
        }        
1216
        if( dataType.supportScale()) {
1217
            this.pickerScale.setEditable(this.mode == MODE_EDIT_ALL);
1218
        } else {
1219
            this.pickerScale.setEditable(false);
1220
            this.pickerScale.set(null);
1221
        }        
1222
        switch (dataType.getType()) {
1223
          case DataTypes.GEOMETRY:
1224
            this.cboGeometryType.setEnabled(this.mode == MODE_EDIT_ALL);
1225
            this.cboGeometrySubtype.setEnabled(this.mode == MODE_EDIT_ALL);
1226
            this.pickerCRS.setEditable(this.mode == MODE_EDIT_ALL);
1227
            this.cboDateFormat.setEnabled(false);
1228
            this.pickerIntervalStart.setEditable(false);
1229
            this.pickerIntervalEnd.setEditable(false);
1230
            this.tabAditionalFields.setEnabledAt(1, true);
1231
            this.tabAditionalFields.setEnabledAt(2, false);
1232
            break;
1233
          case DataTypes.INSTANT:
1234
          case DataTypes.INTERVAL:
1235
          case DataTypes.DATE:
1236
          case DataTypes.TIME:
1237
          case DataTypes.TIMESTAMP:
1238
            this.cboGeometryType.setEnabled(false);
1239
            this.cboGeometrySubtype.setEnabled(false);
1240
            this.pickerCRS.setEditable(false);
1241
            this.cboDateFormat.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1242
            this.pickerIntervalStart.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1243
            this.pickerIntervalEnd.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1244
            this.tabAditionalFields.setEnabledAt(1, false);
1245
            this.tabAditionalFields.setEnabledAt(2, true);
1246
            break;
1247
          case DataTypes.BYTE:
1248
          case DataTypes.INT:
1249
          case DataTypes.LONG:
1250
          case DataTypes.STRING:
1251
          case DataTypes.FILE:
1252
          case DataTypes.URL:
1253
          case DataTypes.URI:
1254
          case DataTypes.FLOAT:
1255
          case DataTypes.DOUBLE:
1256
          case DataTypes.DECIMAL:
1257
            this.cboGeometryType.setEnabled(false);
1258
            this.cboGeometrySubtype.setEnabled(false);
1259
            this.pickerCRS.setEditable(false);
1260
            this.cboDateFormat.setEnabled(false);
1261
            this.pickerIntervalStart.setEditable(false);
1262
            this.pickerIntervalEnd.setEditable(false);
1263
            this.tabAditionalFields.setEnabledAt(1, false);
1264
            this.tabAditionalFields.setEnabledAt(2, false);
1265
            break;
1266
          default:
1267
            this.cboGeometryType.setEnabled(false);
1268
            this.cboGeometrySubtype.setEnabled(false);
1269
            this.pickerCRS.setEditable(false);
1270
            this.cboDateFormat.setEnabled(false);
1271
            this.pickerIntervalStart.setEditable(false);
1272
            this.pickerIntervalEnd.setEditable(false);
1273
            this.tabAditionalFields.setEnabledAt(1, false);
1274
            this.tabAditionalFields.setEnabledAt(2, false);
1275
        }
1276
      } catch (Exception ex) {
1277
        LOGGER.warn("Problems changing field type.", ex);
1278
      }
1279

    
1280
    }
1281
    
1282
    boolean isVirtualField() {
1283
        return this.chkVirtualField.isSelected();
1284
    }
1285

    
1286
    @Override
1287
    public int getMode() {
1288
        return this.mode;
1289
    }
1290
    
1291
    @Override
1292
    public void setMode(int mode) {
1293
        this.mode = mode;
1294
        updateEditableStates();
1295
    }
1296
    
1297
    private void updateEditableStates() {
1298
        DataType dataType = this.getDataType();
1299
        switch(this.mode) {
1300
            case MODE_EDIT_ALL:
1301
                this.cboRelationType.setEnabled(true);
1302
                this.txtDefaultValue.setEditable(true);
1303
                this.txtDefaultFormat.setEditable(true);
1304
                this.txtFieldName.setEditable(true);
1305
                this.pickerIntervalEnd.setEditable(true);
1306
                this.pickerIntervalStart.setEditable(true);
1307
                this.pickerSize.setEditable(dataType.supportSize());
1308
                this.pickerDisplaySize.setEditable(true);
1309
                if( dataType.isPredefinedPrecision() ) {
1310
                  this.pickerPrecision.setEditable(false);
1311
                  this.pickerPrecision.set(dataType.getMaxPrecision());
1312
                } else {
1313
                  this.pickerPrecision.setEditable(dataType.supportPrecision());
1314
                }
1315
                this.pickerScale.setEditable(dataType.supportScale());
1316
                this.cboDataProfile.setEnabled(true);
1317

    
1318
                this.chkAllowNulls.setEnabled(true);
1319
                this.chkIsAutomatic.setEnabled(true);
1320
                this.chkIsReadOnly.setEnabled(true);
1321
                this.chkIsIndexed.setEnabled(true);
1322
                if( this.isVirtualField() ) {
1323
                    this.chkIsPrimaryKey.setEnabled(true);
1324
                } else {
1325
                    this.chkIsPrimaryKey.setEnabled(false);
1326
                }
1327

    
1328
                this.chkVirtualField.setEnabled(true);
1329
                this.pickerVirtualFieldGetter.setEditable(true);
1330

    
1331
                this.cboDateFormat.setEnabled(true);
1332
                this.cboFieldType.setEnabled(true);
1333
                this.btnFieldType.setEnabled(true);
1334
                this.cboGeometryType.setEnabled(true);
1335
                this.cboGeometrySubtype.setEnabled(true);
1336
                this.pickerCRS.setEditable(true);
1337

    
1338
                this.cboGroup.setEnabled(true);
1339
                this.pickerOrder.setEditable(true);
1340
                this.chkHidden.setEnabled(true);
1341
                this.txtLabel.setEditable(true);
1342
                this.txtDescription.setEditable(true);
1343
                this.txtMinValue.setEditable(false);
1344
                this.txtMaxValue.setEditable(false);
1345
                this.pickerValuesFilter.setEditable(true);
1346
                this.availableValuesController.setEditable(true);
1347
                this.tagsController.setEnabled(true);
1348
                this.foreingKeyController.setEditable(true);
1349
                break;
1350
            case MODE_EDIT_ONLY_METADATA:
1351
                if( this.chkVirtualField.isSelected() ) {
1352
                    this.txtFieldName.setEditable(true);
1353
                    this.pickerScale.setEditable(true);
1354
                    this.pickerSize.setEditable(true);
1355
                    this.pickerVirtualFieldGetter.setEditable(true);
1356
                    this.cboFieldType.setEnabled(true);
1357
                    this.btnFieldType.setEnabled(true);
1358
                    this.cboGeometryType.setEnabled(true);
1359
                    this.cboGeometrySubtype.setEnabled(true);
1360
                    this.pickerCRS.setEditable(true);
1361
                } else {
1362
                    this.txtFieldName.setEditable(false);
1363
                    this.pickerPrecision.setEditable(false);
1364
                    this.pickerScale.setEditable(false);
1365
                    this.pickerSize.setEditable(false);
1366
                    this.pickerVirtualFieldGetter.setEditable(false);
1367
                    this.cboFieldType.setEnabled(false);
1368
                    this.btnFieldType.setEnabled(false);
1369
                    this.cboGeometryType.setEnabled(false);
1370
                    this.cboGeometrySubtype.setEnabled(false);
1371
                    this.pickerCRS.setEditable(false);
1372
                }
1373

    
1374
                this.cboRelationType.setEnabled(true);
1375
                this.txtDefaultValue.setEditable(true);
1376
                this.txtDefaultFormat.setEditable(true);
1377
                this.pickerIntervalEnd.setEditable(true);
1378
                this.pickerIntervalStart.setEditable(true);
1379

    
1380
                this.cboDataProfile.setEnabled(true);
1381

    
1382
                this.pickerDisplaySize.setEditable(false);
1383
                this.chkAllowNulls.setEnabled(false);
1384
                this.chkIsAutomatic.setEnabled(false);
1385
                this.chkIsReadOnly.setEnabled(false);
1386
                this.chkIsIndexed.setEnabled(false);
1387
                if( this.isVirtualField() ) {
1388
                    this.chkIsPrimaryKey.setEnabled(true);
1389
                } else {
1390
                    this.chkIsPrimaryKey.setEnabled(false);
1391
                }
1392

    
1393
                this.chkVirtualField.setEnabled(false);
1394

    
1395
                this.cboDateFormat.setEnabled(true);
1396

    
1397
                this.cboGroup.setEnabled(true);
1398
                this.pickerOrder.setEditable(true);
1399
                this.chkHidden.setEnabled(true);
1400
                this.txtLabel.setEditable(true);
1401
                this.txtDescription.setEditable(true);
1402
                this.txtMinValue.setEditable(false);
1403
                this.txtMaxValue.setEditable(false);
1404
                this.pickerValuesFilter.setEditable(true);
1405
                this.availableValuesController.setEditable(true);
1406
                this.tagsController.setEnabled(true);
1407
                this.foreingKeyController.setEditable(true);
1408
                break;
1409
            case MODE_SHOW_ONLY:
1410
                this.cboRelationType.setEnabled(false);
1411
                this.txtDefaultValue.setEditable(false);
1412
                this.txtDefaultFormat.setEditable(false);
1413
                this.txtFieldName.setEditable(false);
1414
                this.pickerIntervalEnd.setEditable(false);
1415
                this.pickerIntervalStart.setEditable(false);
1416
                this.pickerPrecision.setEditable(false);
1417
                this.pickerScale.setEditable(false);
1418
                this.pickerSize.setEditable(false);
1419
                this.pickerDisplaySize.setEditable(false);
1420
                this.cboDataProfile.setEnabled(false);
1421

    
1422
                this.chkAllowNulls.setEnabled(false);
1423
                this.chkIsAutomatic.setEnabled(false);
1424
                this.chkIsReadOnly.setEnabled(false);
1425
                this.chkIsIndexed.setEnabled(false);
1426
                this.chkIsPrimaryKey.setEnabled(false);
1427

    
1428
                this.chkVirtualField.setEnabled(false);
1429
                this.pickerVirtualFieldGetter.setEditable(false);
1430

    
1431
                this.cboDateFormat.setEnabled(false);
1432
                this.cboFieldType.setEnabled(false);
1433
                this.btnFieldType.setEnabled(false);
1434
                this.cboGeometryType.setEnabled(false);
1435
                this.cboGeometrySubtype.setEnabled(false);
1436
                this.pickerCRS.setEditable(false);
1437

    
1438
                this.cboGroup.setEnabled(false);
1439
                this.pickerOrder.setEditable(false);
1440
                this.chkHidden.setEnabled(false);
1441
                this.txtLabel.setEditable(false);
1442
                this.txtDescription.setEditable(false);
1443
                this.txtMinValue.setEditable(false);
1444
                this.txtMaxValue.setEditable(false);
1445
                this.pickerValuesFilter.setEditable(false);
1446
                this.availableValuesController.setEditable(false);
1447
                this.tagsController.setEnabled(false);
1448
                this.foreingKeyController.setEditable(false);
1449
                break;
1450
        }
1451
    }
1452

    
1453
    private void doCheckPrecisionAndScale() {
1454
      DataType dataType = this.getDataType();
1455
      
1456
      Integer precision = this.pickerPrecision.get();
1457
      if( precision==null ) {
1458
        precision = 0;
1459
      }
1460
      Integer scale = this.pickerScale.get();
1461
      if( scale == null ) {
1462
        scale = 0;
1463
      }      
1464
      NumberPrecisionAndScale r = dataType.fixPrecisionAndScale(precision, scale);
1465
      if( r.getPrecision()!=precision || r.getScale()!=scale ) {
1466
        this.pickerPrecision.setWarning(true, "The precision/scale are not valids");
1467
        this.pickerScale.setWarning(true, "The precision/scale are not valids");
1468
      } else {
1469
        this.pickerPrecision.setWarning(false);
1470
        this.pickerScale.setWarning(false);
1471
      }
1472
    }
1473

    
1474
    @Override
1475
    public void setNameAsNew(FeatureType featureType) {
1476
        EditableFeatureType cloneFeatureType = featureType.getCopy().getEditable();
1477
        EditableFeatureAttributeDescriptor newAttributeDescriptor = cloneFeatureType.add(
1478
                cloneFeatureType.getNewFieldName(), 
1479
                DataTypes.STRING,
1480
                50);
1481
        this.put(newAttributeDescriptor);
1482
    }
1483

    
1484
    @Override
1485
    public String getName() {
1486
        return StringUtils.defaultIfBlank(this.txtFieldName.getText(), null);
1487
    }
1488

    
1489
    @Override
1490
    public ImageIcon loadImage(String imageName) {
1491
        String name = FilenameUtils.getBaseName(imageName);
1492
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
1493
        if (theme.exists(name)) {
1494
            return theme.get(name);
1495
        }
1496
        URL url = this.getClass().getResource(name + ".png");
1497
        if (url == null) {
1498
            return null;
1499
        }
1500
        return new ImageIcon(url);
1501
    }
1502

    
1503
  public static void selfRegister() {
1504
    IconTheme theme;
1505
    try {
1506
        theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
1507
    } catch(ReferenceNotRegisteredException ex) {
1508
        return;
1509
    }
1510
    String[][] iconNames = new String[][]{
1511
      new String[]{"dalswing", "picker-datatype"},};
1512
    for (String[] icon : iconNames) {
1513
      URL url = DefaultFeatureAttributeSelectionPanel.class.getResource(icon[1] + ".png");
1514
      theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
1515
    }
1516
    
1517
  }
1518

    
1519
}