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

History | View | Annotate | Download (92.2 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.JSplitPane;
25
import javax.swing.JTable;
26
import javax.swing.JTextField;
27
import javax.swing.ListModel;
28
import javax.swing.SwingUtilities;
29
import javax.swing.event.ChangeEvent;
30
import javax.swing.event.ListSelectionEvent;
31
import javax.swing.text.JTextComponent;
32
import org.apache.commons.io.FilenameUtils;
33
import org.apache.commons.lang3.StringUtils;
34
import org.apache.commons.lang3.tuple.ImmutablePair;
35
import org.apache.commons.lang3.tuple.Pair;
36
import org.cresques.cts.IProjection;
37
import org.gvsig.expressionevaluator.Code;
38
import org.gvsig.expressionevaluator.Code.Callable;
39
import org.gvsig.expressionevaluator.Code.Constant;
40
import org.gvsig.expressionevaluator.Code.Identifier;
41
import org.gvsig.expressionevaluator.Codes;
42
import org.gvsig.expressionevaluator.Expression;
43
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_GETATTR;
44
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_EQ;
45
import org.gvsig.expressionevaluator.ExpressionUtils;
46
import org.gvsig.expressionevaluator.swing.CalculatorController;
47
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
48
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
49
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
50
import org.gvsig.fmap.dal.DALLocator;
51
import org.gvsig.fmap.dal.DataManager;
52
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT;
53
import org.gvsig.fmap.dal.DataStore;
54
import org.gvsig.fmap.dal.DataStoreProviderFactory;
55
import org.gvsig.fmap.dal.DataTypes;
56
import org.gvsig.fmap.dal.SQLBuilder;
57
import org.gvsig.fmap.dal.StoresRepository;
58
import org.gvsig.fmap.dal.exception.DataException;
59
import org.gvsig.fmap.dal.expressionevaluator.DALExpressionBuilder;
60
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
61
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
62
import org.gvsig.fmap.dal.feature.DataProfile;
63
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
64
import org.gvsig.fmap.dal.feature.EditableFeatureType;
65
import org.gvsig.fmap.dal.feature.EditableForeingKey;
66
import org.gvsig.fmap.dal.feature.Feature;
67
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
68
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
69
import org.gvsig.fmap.dal.feature.FeatureStore;
70
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
71
import org.gvsig.fmap.dal.feature.FeatureType;
72
import org.gvsig.fmap.dal.feature.ForeingKey;
73
import org.gvsig.fmap.dal.swing.DALSwingLocator;
74
import org.gvsig.fmap.dal.swing.DataSwingManager;
75
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
76
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorAndExpressionPickerController;
77
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
78
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel;
79
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_EDIT_ALL;
80
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_EDIT_ONLY_METADATA;
81
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_SHOW_ONLY;
82
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.Tag;
83
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.TagController;
84
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.TagsModel;
85
import org.gvsig.fmap.geom.Geometry;
86
import org.gvsig.fmap.geom.GeometryLocator;
87
import org.gvsig.fmap.geom.GeometryManager;
88
import org.gvsig.fmap.geom.type.GeometryType;
89
import org.gvsig.timesupport.RelativeInterval;
90
import org.gvsig.tools.ToolsLocator;
91
import org.gvsig.tools.dataTypes.DataType;
92
import org.gvsig.tools.dataTypes.DataType.NumberPrecisionAndScale;
93
import org.gvsig.tools.dataTypes.DataTypesManager;
94
import org.gvsig.tools.dynobject.DynField;
95
import org.gvsig.tools.dynobject.DynObjectValueItem;
96
import org.gvsig.tools.i18n.I18nManager;
97
import org.gvsig.tools.locator.ReferenceNotRegisteredException;
98
import org.gvsig.tools.swing.api.ListElement;
99
import org.gvsig.tools.swing.api.ToolsSwingLocator;
100
import org.gvsig.tools.swing.api.ToolsSwingManager;
101
import org.gvsig.tools.swing.api.ToolsSwingUtils;
102
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
103
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
104
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
105
import org.gvsig.tools.swing.api.windowmanager.Dialog;
106
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
107
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
108
import org.gvsig.tools.swing.icontheme.IconTheme;
109
import org.gvsig.tools.util.LabeledValue;
110
import org.gvsig.tools.util.LabeledValueImpl;
111
import org.slf4j.Logger;
112
import org.slf4j.LoggerFactory;
113

    
114
/**
115
 *
116
 * @author jjdelcerro
117
 */
118
@SuppressWarnings({"UseSpecificCatch"})
119
public class DefaultFeatureAttributePanel
120
        extends DefaultFeatureAttributePanelView
121
        implements FeatureTypeAttributePanel {
122

    
123
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureAttributePanel.class);
124
    
125
    // ----
126
    // Los he eliminado del GUI pero los mantengo aqui por si decido rescatarlos
127
    private final JTextComponent txtMaxValue = new JTextField();
128
    private final JTextComponent txtMinValue = new JTextField();
129
    private final JComponent lblMinValue = new JLabel();
130
    private final JComponent lblMaxValue = new JLabel();
131
    // ----
132
    private Feature sampleFeature;
133
    private String previousDefaultValue;
134
    private ToManyController toManyController;
135
    private JSplitPane splAttrTags;
136

    
137
    private static class ToOneController {
138

    
139
        private final JTextComponent txtMyFieldName;
140
        private final JComboBox cboRelationType;
141
        private final JCheckBox chkIsClosedList;
142
        private final JComboBox cboTable;
143
        private final JComboBox cboForeignField;
144
        private final JComboBox cboFormula;
145
        private final JButton btnFormula;
146
        private final JButton btnFormulaHistory;
147
        private final JButton btnFormulaBokkmarks;
148
        private AttributeDescriptorAndExpressionPickerController pickerFormula;
149
        private AttributeDescriptorPickerController pickerCode;
150
        private boolean editable;
151
        private ForeingKey foreingKey;
152
        
153
        public ToOneController(
154
                JTextComponent txtMyFieldName,
155
                JComboBox cboRelationType,
156
                JCheckBox chkIsClosedList,
157
                JComboBox cboTable,
158
                JComboBox cboCode,
159
                JComboBox cboFormula,
160
                JButton btnFormula,
161
                JButton btnFormulaBokkmarks,
162
                JButton btnFormulaHistory
163
        ) {
164
            this.txtMyFieldName = txtMyFieldName;
165
            this.cboRelationType = cboRelationType;
166
            this.chkIsClosedList = chkIsClosedList;
167
            this.cboTable = cboTable;
168
            this.cboForeignField = cboCode;
169
            this.cboFormula = cboFormula;
170
            this.btnFormula = btnFormula;
171
            this.btnFormulaHistory = btnFormulaHistory;
172
            this.btnFormulaBokkmarks = btnFormulaBokkmarks;
173
            this.initComponents();
174
        }
175

    
176
        private void initComponents() {
177
            DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
178
            I18nManager i18n = ToolsLocator.getI18nManager();
179
    
180
            this.editable = true;
181
            DefaultComboBoxModel<ListElement<Integer>> relationTypeModel = new DefaultComboBoxModel<>();
182
//            relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_None"),DynField.RELATION_TYPE_NONE));
183
            relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Identity_1_1"),DynField.RELATION_TYPE_IDENTITY));
184
            relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Collaboration_1_1"),DynField.RELATION_TYPE_COLLABORATION));
185
//            relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Composition_1_N"),DynField.RELATION_TYPE_COMPOSITION));
186
//            relationTypeModel.addElement(new ListElement<>(i18n.getTranslation("_Aggregate_1_N"),DynField.RELATION_TYPE_AGGREGATE));
187
            this.cboRelationType.setModel(relationTypeModel);
188
        
189
            DefaultComboBoxModel<String> model = new DefaultComboBoxModel();
190
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
191
            List<String> tableNames = new ArrayList<>();
192
            for (String tableName : repository.keySet()) {
193
                tableNames.add(tableName);
194
            }
195
            Collections.sort(tableNames);
196
            for (String tableName : tableNames) {
197
                model.addElement(tableName);
198
            }
199
            this.cboTable.setEditable(false);
200
            this.cboTable.setModel(model);
201
            this.cboTable.addItemListener((ItemEvent e) -> {
202
              if (e.getStateChange() != ItemEvent.SELECTED) {
203
                return;
204
              }
205
              Thread th = new Thread(() -> {
206
                doTableChanged();
207
              }, "FeatureTypePanelToOneChangeTable");
208
              th.start();
209
            });
210
            this.pickerCode = dataSwingManager.createAttributeDescriptorPickerController(cboForeignField);
211
            
212
            this.btnFormula.setText("");
213
            this.btnFormulaBokkmarks.setText("");
214
            this.btnFormulaHistory.setText("");
215
            this.pickerFormula = dataSwingManager.createExpressionPickerController(
216
                    null, 
217
                    cboFormula, 
218
                    btnFormula, 
219
                    btnFormulaBokkmarks, 
220
                    btnFormulaHistory
221
            );
222
            this.pickerFormula.setAllowNull(true);
223
        }
224

    
225
        private void doTableChanged() {
226
            String tableName = (String) this.cboTable.getSelectedItem();
227
            if( StringUtils.isBlank(tableName) ) {
228
                return;
229
            }
230
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
231
            DataStore store = repository.getStore(tableName);
232
            if( !(store instanceof FeatureStore) ) {
233
                return;
234
            }
235
            FeatureType featureType;
236
            try {
237
                featureType = ((FeatureStore)store).getDefaultFeatureType();
238
            } catch (DataException ex) {
239
                return;
240
            }
241
            DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
242
            
243
            this.pickerCode.setAllowNull(true);
244
            this.pickerCode.setFeatureType(featureType);
245
            if (featureType == null) {
246
                return;
247
            }
248
            dataSwingManager.configureExpressionBuilder(this.pickerFormula.getConfig(), ((FeatureStore)store));
249
            SwingUtilities.invokeLater(() -> {
250
              cboForeignField.setSelectedItem(foreingKey.getCodeName());
251
            });
252
        }
253

    
254
        public void setEditable(boolean editable) {
255
            this.cboRelationType.setEnabled(editable);
256
            this.chkIsClosedList.setEnabled(editable);
257
            this.cboTable.setEnabled(editable);
258
            this.cboForeignField.setEnabled(editable);
259
            this.pickerFormula.setEditable(editable);
260
            this.editable = editable;
261
        }
262
        
263
        public void setEnabled(boolean enabled) {
264
            if( !editable ) {
265
                enabled =  false;
266
            }
267
            this.cboRelationType.setEnabled(enabled);
268
            this.chkIsClosedList.setEnabled(enabled);
269
            this.cboTable.setEnabled(enabled);
270
            this.cboForeignField.setEnabled(enabled);
271
            this.pickerFormula.setEditable(enabled);
272
        }
273
        
274
        public void clean() {
275
            this.txtMyFieldName.setText("");
276
            this.cboRelationType.setSelectedIndex(-1);
277
            this.chkIsClosedList.setSelected(false);
278
            this.cboTable.setSelectedItem("");
279
            this.cboForeignField.setSelectedItem("");
280
            this.pickerFormula.set(null);
281
        }
282
        
283
        public void put(FeatureAttributeDescriptor descriptor) {
284
            if( descriptor == null ) {
285
                this.clean();
286
                return;
287
            }
288
            ForeingKey foreingKey = descriptor.getForeingKey();
289
            if( foreingKey==null ) {
290
                this.clean();
291
                return;
292
            }
293
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
294
            this.pickerFormula.setFeatureType(repository.getFeatureType(foreingKey.getTableName()));
295
            this.foreingKey = foreingKey;
296
            ListElement.setSelected(this.cboRelationType,descriptor.getRelationType());
297
            this.chkIsClosedList.setSelected(foreingKey.isClosedList());
298
            this.cboTable.setSelectedItem(foreingKey.getTableName()); 
299
            doTableChanged();
300
            this.pickerCode.set(foreingKey.getCodeName());
301
            this.pickerFormula.set(foreingKey.getLabelExpression(null));
302
            this.txtMyFieldName.setText(descriptor.getName());
303
        }
304
        
305
        public void fetch(EditableFeatureAttributeDescriptor descriptor) {
306
            if( descriptor == null ) {
307
                this.clean();
308
                return;
309
            }
310
            EditableForeingKey foreingKey = descriptor.getForeingKey();
311
            if( foreingKey==null ) {
312
                return;
313
            }
314
//            foreingKey.setForeingKey(this.chkIsForeingKey.isSelected());
315
            foreingKey.setClosedList(this.chkIsClosedList.isSelected());
316
            foreingKey.setTableName((String) this.cboTable.getSelectedItem());
317
            foreingKey.setCodeName(this.pickerCode.getName());
318
            Expression exp = this.pickerFormula.get();
319
            if( ExpressionUtils.isPhraseEmpty(exp) ) {
320
                foreingKey.setLabelFormula("");
321
            } else {
322
                foreingKey.setLabelFormula(exp.getPhrase());
323
            }
324
        }
325

    
326
        public int getRelationType() {
327
            Object n = this.cboRelationType.getSelectedItem();
328
            if( n == null ) {
329
                return DynField.RELATION_TYPE_NONE;
330
            }
331
            return ((LabeledValue<Integer>)n).getValue();
332
        }
333
    }
334
    
335
    private static class ToManyController {
336

    
337
        private final JComboBox cboRelationType;
338
        private final JComboBox cboMyField;
339
        private final JComboBox cboTable;
340
        private final JComboBox cboForeignField;
341
        private final JTextField txtExpression;
342
        private final JButton btnExpression;
343
        private final JButton btnExpressionHistory;
344
        private final JButton btnExpressionBokkmarks;
345
        private ExpressionPickerController pickerExpression;
346
        private AttributeDescriptorPickerController pickerForeignField;
347
        private AttributeDescriptorPickerController pickerMyField;
348
        private boolean editable;
349
        private boolean disableEvents;
350
        
351
        public ToManyController(
352
                JComboBox cboRelationType,
353
                JComboBox cboMyField,
354
                JComboBox cboTable,
355
                JComboBox cboForeignField,
356
                JTextField txtExpression,
357
                JButton btnExpression,
358
                JButton btnExpressionBokkmarks,
359
                JButton btnExpressionHistory
360
        ) {
361
            this.disableEvents = false;
362
            this.cboRelationType = cboRelationType;
363
            this.cboMyField = cboMyField;
364
            this.cboTable = cboTable;
365
            this.cboForeignField = cboForeignField;
366
            this.txtExpression = txtExpression;
367
            this.btnExpression = btnExpression;
368
            this.btnExpressionHistory = btnExpressionHistory;
369
            this.btnExpressionBokkmarks = btnExpressionBokkmarks;
370
            this.initComponents();
371
        }
372

    
373
        private void initComponents() {
374
            DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
375
            I18nManager i18n = ToolsLocator.getI18nManager();
376
    
377
            this.editable = true;
378
            DefaultComboBoxModel<LabeledValueImpl<Integer>> relationTypeModel = new DefaultComboBoxModel<>();
379
//            relationTypeModel.addElement(new LabeledValueImpl<>(i18n.getTranslation("_None"),DynField.RELATION_TYPE_NONE));
380
//            relationTypeModel.addElement(new LabeledValueImpl<>(i18n.getTranslation("_Identity_1_1"),DynField.RELATION_TYPE_IDENTITY));
381
//            relationTypeModel.addElement(new LabeledValueImpl<>(i18n.getTranslation("_Collaboration_1_1"),DynField.RELATION_TYPE_COLLABORATION));
382
            relationTypeModel.addElement(new LabeledValueImpl<>(i18n.getTranslation("_Composition_1_N"),DynField.RELATION_TYPE_COMPOSITION));
383
            relationTypeModel.addElement(new LabeledValueImpl<>(i18n.getTranslation("_Aggregate_1_N"),DynField.RELATION_TYPE_AGGREGATE));
384
            this.cboRelationType.setModel(relationTypeModel);
385
        
386
            this.pickerMyField = dataSwingManager.createAttributeDescriptorPickerController(cboMyField);
387
            this.pickerMyField.setAllowNull(true);
388
            this.pickerMyField.addChangeListener((ChangeEvent e) -> {
389
                if( disableEvents ) {
390
                    return;
391
                }
392
                doUpdateExpression();
393
            });
394
            DefaultComboBoxModel<String> model = new DefaultComboBoxModel();
395
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
396
            List<String> tableNames = new ArrayList<>();
397
            for (String tableName : repository.keySet()) {
398
                tableNames.add(tableName);
399
            }
400
            Collections.sort(tableNames);
401
            for (String tableName : tableNames) {
402
                model.addElement(tableName);
403
            }
404
            this.cboTable.setEditable(false);
405
            this.cboTable.setModel(model);
406
            this.cboTable.addItemListener((ItemEvent e) -> {
407
              if( disableEvents ) {
408
                  return;
409
              }
410
              if (e.getStateChange() != ItemEvent.SELECTED) {
411
                return;
412
              }
413
              Thread th = new Thread(() ->
414
                  { doTableChanged(); },
415
                "FeatureTypePanelToManyTableChanged"
416
              );
417
              th.start();
418
            });
419
            this.pickerForeignField = dataSwingManager.createAttributeDescriptorPickerController(cboForeignField);
420
            this.pickerForeignField.setAllowNull(true);
421
            this.pickerForeignField.addChangeListener((ChangeEvent e) -> {
422
                if( disableEvents ) {
423
                    return;
424
                }
425
                doUpdateExpression();
426
            });
427
            
428
            this.pickerExpression = ExpressionEvaluatorSwingLocator.getManager().createExpressionPickerController(
429
                    txtExpression, 
430
                    btnExpression, 
431
                    btnExpressionBokkmarks, 
432
                    btnExpressionHistory
433
            );
434
        }
435

    
436
        private void doTableChanged() {
437
            String tableName = (String) this.cboTable.getSelectedItem();
438
            if( StringUtils.isBlank(tableName) ) {
439
                return;
440
            }
441
            StoresRepository repository = DALLocator.getDataManager().getStoresRepository();
442
            DataStore store = repository.getStore(tableName);
443
            if( !(store instanceof FeatureStore) ) {
444
                return;
445
            }
446
            FeatureStore featureStore = (FeatureStore) store;
447
            FeatureType featureType;
448
            try {
449
                featureType = featureStore.getDefaultFeatureType();
450
            } catch (DataException ex) {
451
                return;
452
            }
453
            DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
454
            
455
            this.pickerForeignField.setFeatureType(featureType);
456
            if (featureType == null) {
457
                return;
458
            }
459
            dataSwingManager.configureExpressionBuilder(this.pickerExpression.getConfig(), featureStore);
460
        }
461
        
462
        private void doUpdateExpression() {
463
            String myField = this.pickerMyField.getName();
464
            if( StringUtils.isBlank(myField) ) {
465
                this.pickerExpression.set(null);
466
                return;
467
            }
468
            String foreignField = this.pickerForeignField.getName();
469
            if( StringUtils.isBlank(foreignField) ) {
470
                this.pickerExpression.set(null);
471
                return;
472
            }
473
            String tableName = this.getTableName();
474
            if( StringUtils.isBlank(tableName) ) {
475
                this.pickerExpression.set(null);
476
                return;
477
            }
478
            DataManager dataManager = DALLocator.getDataManager();
479
            DALExpressionBuilder builder = dataManager.createDALExpressionBuilder();
480
            SQLBuilder.SelectBuilder select = builder.select();
481
            select.from().table().name(tableName);
482
            select.column().all();
483
            select.where().set(builder.expression().eq(
484
                    builder.expression().column(myField),
485
                    builder.expression().getattr(tableName, foreignField)
486
                )
487
            );
488
            this.pickerExpression.set(ExpressionUtils.createExpression(select.toString()));
489
        }
490
        
491
        private String[] getFieldsAndTable(Expression expression) {
492
            if (ExpressionUtils.isEmpty(expression)) {
493
                return null;
494
            }
495
            try {
496
                Code code = expression.getCode();
497
                if( !StringUtils.equalsIgnoreCase(Callable.name(code),FUNCTION_SELECT) ) {
498
                    return null;
499
                }
500
                Code.Callable callable = (Code.Callable) code;
501
                String tableName;
502
                Codes args = callable.parameters();
503
                Code storeName_code = (Code) args.get(1);
504
                if (storeName_code instanceof Code.Identifier) {
505
                    tableName = ((Code.Identifier) storeName_code).name();
506
                } else if (storeName_code instanceof Code.Constant) {
507
                    Code.Constant storeName_const = (Code.Constant) storeName_code;
508
                    if (storeName_const.value() instanceof CharSequence) {
509
                        tableName = storeName_const.value().toString();
510
                    } else {
511
                        return null;
512
                    }
513
                } else {
514
                    return null;
515
                }
516
                if (StringUtils.isBlank(tableName)) {
517
                    return null;
518
                }
519
                String foreignColumnName = null;
520
                String myColumnName = null;
521
                Code where = callable.parameters().get(2); // WHERE
522
                Code myFieldCode = getCode(
523
                        where,
524
                        new ImmutablePair<>(OPERATOR_EQ, 0)
525
                );
526
                if( myFieldCode != null ) {
527
                    myColumnName = Objects.toString(Identifier.name(myFieldCode), null);
528
                }
529
                Code foreingFieldCode = getCode(
530
                        where,
531
                        new ImmutablePair<>(OPERATOR_EQ, 1),
532
                        new ImmutablePair<>(FUNCTION_GETATTR, 1)
533
                );
534
                if( foreingFieldCode != null ) {
535
                    foreignColumnName = Objects.toString(Constant.value(foreingFieldCode), null);
536
                }
537
                return new String[] { myColumnName, tableName,foreignColumnName };
538
            } catch(Throwable t) {
539
                LOGGER.warn("Can't get table and code from expression '"+expression.getPhrase()+"' in toMany controller",t);
540
                return null;
541
            }
542
        }
543
        
544
        private Code getCode(Code code, Pair<String,Integer>... args) {
545
            for (Pair<String, Integer> arg : args) {
546
                if( !StringUtils.equalsIgnoreCase(Callable.name(code),arg.getLeft()) ) {
547
                    return null;
548
                }
549
                code = Callable.parameters(code).get(arg.getRight());
550
            }
551
            return code;
552
        }
553

    
554
        private String getTableName() {
555
            String s = (String) this.cboTable.getSelectedItem();
556
            if( StringUtils.isBlank(s) ) {
557
                return null;
558
            }
559
            return s;
560
        }
561
        
562
        public void setEditable(boolean editable) {
563
            this.cboRelationType.setEnabled(editable);
564
            this.pickerMyField.setEditable(editable);
565
            this.cboTable.setEnabled(editable);
566
            this.pickerForeignField.setEditable(editable);
567
            this.pickerExpression.setEditable(editable);
568
            this.editable = editable;
569
        }
570
        
571
        public void setEnabled(boolean enabled) {
572
            if( !editable ) {
573
                enabled =  false;
574
            }
575
            this.cboRelationType.setEnabled(enabled);
576
            this.pickerMyField.setEnabled(enabled);
577
            this.cboTable.setEnabled(enabled);
578
            this.pickerForeignField.setEnabled(enabled);
579
            this.pickerExpression.setEditable(enabled);
580
        }
581
        
582
        public void clean() {
583
            this.cboRelationType.setSelectedIndex(-1);
584
            this.pickerMyField.clean();
585
            this.cboTable.setSelectedIndex(-1);
586
            this.pickerForeignField.clean();
587
            this.pickerExpression.set(null);
588
        }
589
        
590
        public void put(FeatureAttributeDescriptor descriptor) {
591
            if (descriptor == null) {
592
                this.clean();
593
                return;
594
            }
595
            boolean prevDisableEvents = this.disableEvents;
596
            try {
597
                this.disableEvents = true;
598
                this.pickerMyField.setFeatureType(descriptor.getFeatureType());
599
                ListElement.setSelected(this.cboRelationType, descriptor.getRelationType());
600
                FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
601
                if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
602
                    Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
603
                    String[] fieldsAndTable = this.getFieldsAndTable(expression);
604
                    if (fieldsAndTable == null) {
605
                        this.cboTable.setSelectedIndex(-1);
606
                        this.pickerForeignField.clean();
607
                        return;
608
                    }
609
                    this.pickerMyField.set(fieldsAndTable[0]);
610
                    this.cboTable.setSelectedItem(fieldsAndTable[1]);
611
                    doTableChanged();
612
                    this.pickerForeignField.set(fieldsAndTable[2]);
613
                    this.pickerExpression.set(expression);
614
                }
615
            } catch (Throwable t) {
616
                LOGGER.warn("Can't set attribute descriptor in toMany controller",t);
617
            } finally {
618
                this.disableEvents = prevDisableEvents;
619
            }
620
        }
621

    
622
        public void fetch(EditableFeatureAttributeDescriptor descriptor) {
623
            if( descriptor == null ) {
624
                this.clean();
625
                return;
626
            }
627
            Expression exp = this.pickerExpression.get();
628
            if( ExpressionUtils.isPhraseEmpty(exp) ) {
629
                descriptor.setFeatureAttributeEmulator((Expression)null);
630
            } else {
631
                descriptor.setFeatureAttributeEmulator(exp);
632
            }
633
        }
634
        
635
        public int getRelationType() {
636
            Object n = this.cboRelationType.getSelectedItem();
637
            if( n == null ) {
638
                return DynField.RELATION_TYPE_NONE;
639
            }
640
            return ((LabeledValue<Integer>)n).getValue();
641
        }
642
    }
643
    
644

    
645
    private static class AvailableValuesController {
646

    
647
        private final JList lstValues;
648
        private final JTextComponent txtLabel;
649
        private final JTextComponent txtValue;
650
        private final JButton btnAdd;
651
        private final JButton btnUpdate;
652
        private final JButton btnRemove;
653
        private final JButton btnRemoveAll;
654

    
655
        public AvailableValuesController(
656
                JList lstValues,
657
                JTextComponent txtLabel,
658
                JTextComponent txtValue,
659
                JButton btnAdd,
660
                JButton btnUpdate,
661
                JButton btnRemove,
662
                JButton btnRemoveAll
663
        ) {
664
            this.lstValues = lstValues;
665
            this.txtLabel = txtLabel;
666
            this.txtValue = txtValue;
667
            this.btnAdd = btnAdd;
668
            this.btnUpdate = btnUpdate;
669
            this.btnRemove = btnRemove;
670
            this.btnRemoveAll = btnRemoveAll;
671

    
672
            this.lstValues.addListSelectionListener((ListSelectionEvent e) -> {
673
              doValuesChanged();
674
            });
675
            this.btnAdd.addActionListener((ActionEvent e) -> {
676
              doAdd();
677
            });
678
            this.btnUpdate.addActionListener((ActionEvent e) -> {
679
              doUpdate();
680
            });
681
            this.btnRemove.addActionListener((ActionEvent e) -> {
682
              doRemove();
683
            });
684
            this.btnRemoveAll.addActionListener((ActionEvent e) -> {
685
              doRemoveAll();
686
            });
687
        }
688

    
689
        public void clean() {
690
            this.lstValues.setModel(new DefaultListModel());
691
            this.txtLabel.setText("");
692
            this.txtValue.setText("");
693
            this.lstValues.setSelectedIndex(-1);
694
        }
695

    
696
        public DynObjectValueItem[] get() {
697
            ListModel<DynObjectValueItem> model = this.lstValues.getModel();
698
            if( model.getSize()==0 ) {
699
              return null;
700
            }
701
            DynObjectValueItem[] values = new DynObjectValueItem[model.getSize()];
702
            for (int i = 0; i < model.getSize(); i++) {
703
                values[i] = model.getElementAt(i);
704
            }
705
            return values;
706
        }
707

    
708
        public void set(DynObjectValueItem[] availableValues) {
709
            DefaultListModel model = new DefaultListModel();
710
            if (availableValues != null) {
711
                for (DynObjectValueItem availableValue : availableValues) {
712
                    model.addElement(availableValue);
713
                }
714
            }
715
            this.lstValues.setModel(model);
716
            if (model.getSize() > 0) {
717
                this.lstValues.setSelectedIndex(0);
718
            } else {
719
                this.lstValues.setSelectedIndex(-1);
720
            }
721
        }
722

    
723
        public void setEditable(boolean editable) {
724
            this.lstValues.setEnabled(editable);
725
            this.txtLabel.setEditable(editable);
726
            this.txtValue.setEditable(editable);
727
            this.btnAdd.setEnabled(editable);
728
            this.btnUpdate.setEnabled(editable);
729
            this.btnRemove.setEnabled(editable);
730
            this.btnRemoveAll.setEnabled(editable);
731
        }
732

    
733
        private void doValuesChanged() {
734
            DynObjectValueItem value = (DynObjectValueItem) this.lstValues.getSelectedValue();
735
            if (value == null) {
736
                this.txtLabel.setText("");
737
                this.txtValue.setText("");
738
                this.btnAdd.setEnabled(true);
739
                this.btnUpdate.setEnabled(false);
740
                this.btnRemove.setEnabled(false);
741
                return;
742
            }
743
            this.txtLabel.setText(value.getLabel());
744
            this.txtValue.setText(Objects.toString(value.getValue(), ""));
745
            this.btnAdd.setEnabled(true);
746
            this.btnUpdate.setEnabled(true);
747
            this.btnRemove.setEnabled(true);
748
        }
749

    
750
        private void doAdd() {
751
            DynObjectValueItem value = new DynObjectValueItem("Value", "Label");
752
            DefaultListModel model = (DefaultListModel) this.lstValues.getModel();
753
            model.addElement(value);
754
            this.lstValues.setSelectedIndex(model.getSize() - 1);
755
        }
756

    
757
        private void doUpdate() {
758
            DynObjectValueItem value = (DynObjectValueItem) this.lstValues.getSelectedValue();
759
            if (value == null) {
760
                return; // EEhh?? esto no deberia pasar
761
            }
762
            value.setLabel(this.txtLabel.getText());
763
            value.setValue(this.txtValue.getText());
764
        }
765

    
766
        private void doRemove() {
767
            int n = this.lstValues.getSelectedIndex();
768
            if (n < 0) {
769
                return; // EEhh?? esto no deberia pasar
770
            }
771
            DefaultListModel model = (DefaultListModel) this.lstValues.getModel();
772
            model.removeElementAt(n);
773
            if (--n < 0) {
774
                n = 0;
775
            }
776
            this.lstValues.setSelectedIndex(n);
777
        }
778

    
779
        private void doRemoveAll() {
780
            DefaultListModel model = new DefaultListModel();
781
            this.lstValues.setModel(model);
782
            this.lstValues.setSelectedIndex(-1);
783
        }
784

    
785
    }
786

    
787
    private final List<ListElement<Integer>> fieldTypes;
788
    private final List<ListElement<Integer>> geometryTypes;
789
    private final List<ListElement<Integer>> geometrySubtypes;
790

    
791
    private DatePickerController pickerIntervalEnd;
792
    private DatePickerController pickerIntervalStart;
793
    private CalculatorController<Integer> pickerSize;
794
    private CalculatorController<Integer> pickerDisplaySize;
795
    private CalculatorController<Integer> pickerPrecision;
796
    private CalculatorController<Integer> pickerScale;
797
    private PickerController<IProjection> pickerCRS;
798
    private ExpressionPickerController pickerVirtualFieldGetter;
799
    private ExpressionPickerController pickerVirtualFieldSetter;
800
    private ExpressionPickerController pickerDefaultFormat;
801
    private CalculatorController<Integer> pickerOrder;
802
    private AvailableValuesController availableValuesController;
803
    private AggregateController<Tag> tagsController;
804
    private ToOneController toOneController;
805
    private ExpressionPickerController pickerValuesFilter;
806

    
807
    private int mode;
808
    private FeatureStoreElement featureStoreElement;
809

    
810
    public DefaultFeatureAttributePanel() {
811
        this.mode = FeatureTypePanel.MODE_SHOW_ONLY;
812
        DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
813
        // se deber?a de utilizar el datatypepicker
814
        this.fieldTypes = new ArrayList<>();
815
        fieldTypes.add( new ListElement<>("Decimal", DataTypes.DECIMAL) );
816
        fieldTypes.add( new ListElement<>("Integer", DataTypes.INTEGER) );
817
        fieldTypes.add( new ListElement<>("Long", DataTypes.LONG) );
818
        fieldTypes.add( new ListElement<>("String", DataTypes.STRING) );
819
        fieldTypes.add( new ListElement<>("Boolean", DataTypes.BOOLEAN) );
820
        fieldTypes.add( new ListElement<>("Date", DataTypes.DATE) );
821
        fieldTypes.add( new ListElement<>("Date/Time (Timestamp)", DataTypes.TIMESTAMP) );
822
//        for (DataType dataType : dataManager) {
823
//            fieldTypes.add( new ListElement<>(dataType.getName(), dataType.getType()) );
824
//        }
825
        fieldTypes.sort((ListElement<Integer> o1, ListElement<Integer> o2) -> 
826
                o1.toString().compareTo(o2.toString())
827
        );
828

    
829
        this.geometryTypes = new ArrayList<>();
830
        this.geometryTypes.add(new ListElement("Point", Geometry.TYPES.POINT));
831
        this.geometryTypes.add(new ListElement("Line", Geometry.TYPES.LINE));
832
        this.geometryTypes.add(new ListElement("Polygon", Geometry.TYPES.POLYGON));
833
        this.geometryTypes.add(new ListElement("MultiPoint", Geometry.TYPES.MULTIPOINT));
834
        this.geometryTypes.add(new ListElement("MultiLine", Geometry.TYPES.MULTILINE));
835
        this.geometryTypes.add(new ListElement("MultiPolygon", Geometry.TYPES.MULTIPOLYGON));
836
        this.geometryTypes.sort((ListElement<Integer> o1, ListElement<Integer> o2) -> 
837
                  o1.toString().compareTo(o2.toString())
838
        );
839

    
840
        this.geometrySubtypes = new ArrayList<>();
841
        this.geometrySubtypes.add(new ListElement("2D", Geometry.SUBTYPES.GEOM2D));
842
        this.geometrySubtypes.add(new ListElement("2DM", Geometry.SUBTYPES.GEOM3D));
843
        this.geometrySubtypes.add(new ListElement("3D", Geometry.SUBTYPES.GEOM2DM));
844
        this.geometrySubtypes.add(new ListElement("3DM", Geometry.SUBTYPES.GEOM3DM));
845
        this.geometrySubtypes.sort((ListElement<Integer> o1, ListElement<Integer> o2) -> 
846
                o1.toString().compareTo(o2.toString())
847
        );
848

    
849
        this.initComponents();
850
    }
851

    
852
    private void initComponents() {
853
        final ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
854
        final ExpressionEvaluatorSwingManager evaluatorSwingManager = ExpressionEvaluatorSwingLocator.getManager();
855
        final DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
856
        final I18nManager i18n = ToolsLocator.getI18nManager();
857
        final DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
858

    
859
//        ToolsSwingUtils.ensureMaxRows(this.tblAttrTagsItems,19);
860
        ToolsSwingUtils.ensureMaxRows(this.gridAttrTagsTable, 10);
861
        this.splAttrTags = ToolsSwingUtils.createVerticalSplit(
862
                this.grdAttrTags,
863
                this.gridAttrTagsTable, false,
864
                this.gridAttrTagsItem, true
865
        );
866
        
867
        DefaultComboBoxModel<ListElement<Integer>> modelTypes = new DefaultComboBoxModel<>();
868
        for (ListElement<Integer> element : fieldTypes) {
869
            modelTypes.addElement(element);
870
        }
871
        this.cboFieldType.setModel(modelTypes);
872
        this.cboFieldType.setRenderer(new DefaultListCellRenderer() {
873
          @Override
874
          public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
875
              JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
876
              label.setIcon(null);
877
              try {
878
                DataType dataType = dataTypeManager.get((int) value);
879
                IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
880
                if (theme.exists(dataType.getIconName())) {
881
                    label.setIcon(theme.get(dataType.getIconName()));
882
                }
883
              } catch(Exception ex) {
884
                // Do nothing, ignore
885
              }
886
              return label;
887
          }
888
        });
889

    
890
        DefaultComboBoxModel<ListElement<Integer>> modelGeomTypes = new DefaultComboBoxModel<>();
891
        for (ListElement<Integer> element : this.geometryTypes) {
892
            modelGeomTypes.addElement(element);
893
        }
894
        this.cboGeometryType.setModel(modelGeomTypes);
895

    
896
        DefaultComboBoxModel<ListElement<Integer>> modelGeomSubtypes = new DefaultComboBoxModel<>();
897
        for (ListElement<Integer> element : this.geometrySubtypes) {
898
            modelGeomSubtypes.addElement(element);
899
        }
900

    
901
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
902

    
903
        swingManager.translate(this.lblAllowNulls);
904
        swingManager.translate(this.lblCRS);
905
        swingManager.translate(this.lblDataProfile);
906
        swingManager.translate(this.lblDateFormat);
907
        swingManager.translate(this.lblDefaultValue);
908
        swingManager.translate(this.lblDefaultFormat);
909
        swingManager.translate(this.lblFieldName);
910
        swingManager.translate(this.lblFieldType);
911
        swingManager.translate(this.lblGeometrySubtype);
912
        swingManager.translate(this.lblGeometryType);
913
        swingManager.translate(this.lblInterval);
914
        swingManager.translate(this.lblIntervalEnd);
915
        swingManager.translate(this.lblIntervalStart);
916
        swingManager.translate(this.lblIsAutomatic);
917
        swingManager.translate(this.lblIsIndexed);
918
        swingManager.translate(this.lblIsReadOnly);
919
        swingManager.translate(this.lblIsPrimaryKey);
920
        swingManager.translate(this.lblPrecision);
921
        swingManager.translate(this.lblScale);
922
        swingManager.translate(this.lblSize);
923
        swingManager.translate(this.lblDisplaySize);
924
        swingManager.translate(this.chkVirtualField);
925
        swingManager.translate(this.lblVirtualField);
926
        swingManager.translate(this.lblVirtualFieldSep);
927
        swingManager.translate(this.lblVirtualFieldGetter);
928
        swingManager.translate(this.lblVirtualFieldSetter);
929
        swingManager.translate(this.tabAditionalFields);
930
        swingManager.translate(this.tabLayout);
931
        swingManager.translate(this.lblGroup);
932
        swingManager.translate(this.lblOrder);
933
        swingManager.translate(this.lblHidden);
934
        swingManager.translate(this.lblLabel);
935
        swingManager.translate(this.lblDescription);
936
        swingManager.translate(this.lblMinValue);
937
        swingManager.translate(this.lblMaxValue);
938
        swingManager.translate(this.lblAvailableValues);
939
        swingManager.translate(this.lblAvailableValuesLabel);
940
        swingManager.translate(this.lblAvailableValuesValue);
941
        swingManager.translate(this.btnAvailableValuesAdd);
942
        swingManager.translate(this.btnAvailableValuesUpdate);
943
        swingManager.translate(this.btnAvailableValuesRemove);
944
        swingManager.translate(this.btnAvailableValuesRemoveAll);
945
        swingManager.translate(this.lblAttrTagsItemName);
946
        swingManager.translate(this.lblAttrTagsItemValue);
947
        swingManager.translate(this.lblAttrTagsItemNotes);
948
        swingManager.translate(this.lblValuesFilter);
949

    
950
        swingManager.translate(this.lblRelationRepository);
951

    
952
        swingManager.translate(this.lblRelationNone);
953
        swingManager.translate(this.lblRelationToOne);
954
        swingManager.translate(this.lblRelationToMany);
955
        
956
        swingManager.translate(this.lblRelationToOneType);
957
        swingManager.translate(this.lblRelationToOneCondition);
958
        swingManager.translate(this.lblRelationToOneLabelFormula);
959
        swingManager.translate(this.lblRelationToOneIsClosedList);
960

    
961
        swingManager.translate(this.lblRelationToManyType);
962
        swingManager.translate(this.lblRelationToManyExpression);
963
        swingManager.translate(this.lblRelationToManyCondition);
964

    
965
//        swingManager.translate(this.chkIsForeingKey);
966

    
967
        swingManager.translate(this.txtDisplaySize);
968
        swingManager.translate(this.txtPrecision);
969
        swingManager.translate(this.txtScale);
970
        swingManager.translate(this.txtScale);
971

    
972
        swingManager.addClearButton(this.txtDefaultValue);
973
        swingManager.addClearButton(this.txtDefaultFormat);
974
        swingManager.addClearButton(this.txtFieldName);
975
        swingManager.addClearButton(this.txtIntervalEnd);
976
        swingManager.addClearButton(this.txtIntervalStart);
977
        swingManager.addClearButton(this.txtScale);
978
        swingManager.addClearButton(this.txtSize);
979
        swingManager.addClearButton(this.txtDisplaySize);
980
        swingManager.addClearButton(this.txtLabel);
981
        swingManager.addClearButton(this.txtDescription);
982
        swingManager.addClearButton(this.cboGroup);
983
        swingManager.addClearButton(this.txtMaxValue);
984
        swingManager.addClearButton(this.txtMinValue);
985
        swingManager.addClearButton(this.txtAvailableValuesLabel);
986
        swingManager.addClearButton(this.txtAvailableValuesValue);
987

    
988
        swingManager.setDefaultPopupMenu(this.txtDefaultValue);
989
        swingManager.setDefaultPopupMenu(this.txtDefaultFormat);
990
        swingManager.setDefaultPopupMenu(this.txtFieldName);
991
        swingManager.setDefaultPopupMenu(this.txtIntervalEnd);
992
        swingManager.setDefaultPopupMenu(this.txtIntervalStart);
993
        swingManager.setDefaultPopupMenu(this.txtScale);
994
        swingManager.setDefaultPopupMenu(this.txtSize);
995
        swingManager.setDefaultPopupMenu(this.txtDisplaySize);
996
        swingManager.setDefaultPopupMenu(this.cboDateFormat);
997
        swingManager.setDefaultPopupMenu(this.cboFieldType);
998
        swingManager.setDefaultPopupMenu(this.cboGeometrySubtype);
999
        swingManager.setDefaultPopupMenu(this.cboGeometryType);
1000
        swingManager.setDefaultPopupMenu(this.cboDataProfile);
1001

    
1002
//        swingManager.setDefaultPopupMenu(this.cboRelationToOneCodeName);
1003
//        swingManager.setDefaultPopupMenu(this.cboRelationToOneTableName);
1004

    
1005
//        swingManager.setDefaultPopupMenu(this.cboRelationToManyForeignFieldName);
1006
//        swingManager.setDefaultPopupMenu(this.cboRelationToManyTableName);
1007

    
1008
        swingManager.setDefaultPopupMenu(this.cboGroup);
1009
        swingManager.setDefaultPopupMenu(this.txtOrder);
1010
        swingManager.setDefaultPopupMenu(this.txtLabel);
1011
        swingManager.setDefaultPopupMenu(this.txtDescription);
1012
        swingManager.setDefaultPopupMenu(this.txtMinValue);
1013
        swingManager.setDefaultPopupMenu(this.txtMaxValue);
1014
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesLabel);
1015
        swingManager.setDefaultPopupMenu(this.txtAvailableValuesValue);
1016

    
1017
        this.toOneController = new ToOneController(
1018
                txtRelationToOneMyFieldName,
1019
                cboRelationToOneType, 
1020
                chkRelationToOneIsClosedList, 
1021
                cboRelationToOneTableName, 
1022
                cboRelationToOneCodeName, 
1023
                cboRelationToOneFormula, 
1024
                btnRelationToOneFormula,
1025
                btnRelationToOneFormulaBookmarks,
1026
                btnRelationToOneFormulaHistory
1027
        );
1028
        this.toManyController = new ToManyController(
1029
                cboRelationToManyType, 
1030
                cboRelationToManyMyFieldName, 
1031
                cboRelationToManyTableName, 
1032
                cboRelationToManyForeignFieldName, 
1033
                
1034
                txtRelationToManyExpression, 
1035
                
1036
                btnRelationToManyExpression,
1037
                btnRelationToManyExpressionHistory,
1038
                btnRelationToManyExpressionBookmarks
1039
        );
1040
        this.pickerIntervalEnd = swingManager.createDatePickerController(
1041
                this.txtIntervalEnd,
1042
                this.btnIntervalEnd
1043
        );
1044
        this.pickerIntervalStart = swingManager.createDatePickerController(
1045
                this.txtIntervalStart,
1046
                this.btnIntervalStart
1047
        );
1048
        this.pickerSize = evaluatorSwingManager.createCalculatorController(
1049
                this.txtSize, DataTypes.INT
1050
        );
1051
        this.pickerDisplaySize = evaluatorSwingManager.createCalculatorController(this.txtDisplaySize, DataTypes.INT
1052
        );
1053
        this.pickerPrecision = evaluatorSwingManager.createCalculatorController(
1054
                this.txtPrecision, DataTypes.INT
1055
        );
1056
        this.pickerScale = evaluatorSwingManager.createCalculatorController(
1057
                this.txtScale, DataTypes.INT
1058
        );
1059
        this.txtDefaultValue.getComponentPopupMenu().add(evaluatorSwingManager.createJExpressionBuilderAction(txtDefaultValue));
1060
        this.pickerOrder = evaluatorSwingManager.createCalculatorController(
1061
                this.txtOrder, DataTypes.INT
1062
        );
1063

    
1064
        this.availableValuesController = new AvailableValuesController(
1065
                lstAvailableValues,
1066
                txtAvailableValuesLabel,
1067
                txtAvailableValuesValue,
1068
                btnAvailableValuesAdd,
1069
                btnAvailableValuesUpdate,
1070
                btnAvailableValuesRemove,
1071
                btnAvailableValuesRemoveAll
1072
        );
1073
        
1074
        this.tagsController = new DefaultAggregateController<>(
1075
                this.tblAttrTagsItems,
1076
                this.btnAttrTagsModify,
1077
                this.btnAttrTagsDiscard,
1078
                this.btnAttrTagsAccept,
1079
                this.btnAttrTagsNew,
1080
                this.btnAttrTagsDelete,
1081
                new TagController(
1082
                        this.cboAttrTagsItemName,
1083
                        this.cboAttrTagsItemValue,
1084
                        this.lblAttrTagsItemNotesValue
1085
                )
1086
        );        
1087
        this.txtMinValue.setEnabled(false);
1088
        this.txtMaxValue.setEnabled(false);
1089

    
1090
        this.btnVirtualFieldGetter.setText("");
1091
        this.featureStoreElement = dataSwingManager.createFeatureStoreElement();
1092
        this.pickerVirtualFieldGetter = evaluatorSwingManager.createExpressionPickerController(
1093
                txtVirtualFieldGetter, btnVirtualFieldGetter, btnVirtualFieldBookmarksGetter, btnVirtualFieldHistoryGetter
1094
        );
1095
        this.pickerVirtualFieldGetter.getConfig().addElement(this.featureStoreElement);
1096
        this.pickerVirtualFieldSetter = evaluatorSwingManager.createExpressionPickerController(
1097
                txtVirtualFieldSetter, btnVirtualFieldSetter, btnVirtualFieldBookmarksSetter, btnVirtualFieldHistorySetter
1098
        );
1099
        this.pickerVirtualFieldSetter.getConfig().addElement(this.featureStoreElement);
1100
        
1101
        this.chkVirtualField.addChangeListener((ChangeEvent e) -> {
1102
          if (chkVirtualField.isSelected()) {
1103
            pickerVirtualFieldGetter.setEditable(mode==MODE_EDIT_ALL || mode==MODE_EDIT_ONLY_METADATA);
1104
            pickerVirtualFieldSetter.setEditable(false);
1105
          } else {
1106
            pickerVirtualFieldGetter.setEditable(false);
1107
            pickerVirtualFieldSetter.setEditable(false);
1108
          }
1109
        });
1110

    
1111
        this.pickerCRS = dataSwingManager.createProjectionPickerController(
1112
                this.txtCRS, this.btnCRS
1113
        );
1114

    
1115
        this.cboFieldType.addItemListener((ItemEvent e) -> {
1116
          SwingUtilities.invokeLater(() -> {
1117
            doFieldTypeChanged();
1118
          });
1119
        });
1120

    
1121
        this.pickerPrecision.addChangeListener((ChangeEvent e) -> {
1122
          doCheckPrecisionAndScale();
1123
        });
1124
        this.pickerScale.addChangeListener((ChangeEvent e) -> {
1125
          doCheckPrecisionAndScale();
1126
        });
1127

    
1128
        DefaultComboBoxModel dataProfilesModel = new DefaultComboBoxModel<>();
1129
        dataProfilesModel.addElement(new ListElement<>("", null));
1130
        for (DataProfile profile : DALLocator.getDataManager().getDataProfiles()) {
1131
            dataProfilesModel.addElement(new ListElement<>(profile.getName(), profile.getID()));
1132
        }
1133
        this.cboDataProfile.setModel(dataProfilesModel);
1134
        
1135
        this.btnFieldType.addActionListener((ActionEvent e) -> {
1136
          doDataTypeSelection();
1137
        });
1138
        
1139
        this.pickerValuesFilter = evaluatorSwingManager.createExpressionPickerController(
1140
                txtValuesFilter, btnValuesFilter, btnValuesFilterBookmarks, btnValuesFilterHistory
1141
        );
1142
        this.pickerValuesFilter.getConfig().addElement(this.featureStoreElement);
1143
        
1144
        this.chkIsAutomatic.addActionListener((ActionEvent e) -> {
1145
            doIsAutomaticChanged();
1146
        });
1147

    
1148
        this.rdbRelationNone.addItemListener((ItemEvent e) -> { doChangeRelationType(); });
1149
        this.rdbRelationToOne.addItemListener((ItemEvent e) -> { doChangeRelationType(); });
1150
        this.rdbRelationToMany.addItemListener((ItemEvent e) -> { doChangeRelationType(); });
1151

    
1152
        SwingUtilities.invokeLater( () -> {
1153
                splAttrTags.setDividerLocation(0.4);
1154
            }
1155
        );
1156
        
1157
    }
1158
    
1159
    private int getRelationType() {
1160
        if( this.rdbRelationNone.isSelected() ) {
1161
            return DynField.RELATION_TYPE_NONE;
1162
        } 
1163
        if( this.rdbRelationToOne.isSelected() ) {
1164
            return this.toOneController.getRelationType();
1165
        } 
1166
        if( this.rdbRelationToMany.isSelected() ) {
1167
            return this.toManyController.getRelationType();
1168
        }
1169
        return DynField.RELATION_TYPE_NONE;
1170
    }
1171

    
1172
    private void doChangeRelationType() {
1173
        boolean enabled;
1174
        switch(this.getMode() ) {
1175
            case MODE_EDIT_ONLY_METADATA:
1176
            case MODE_EDIT_ALL:
1177
                enabled = true;
1178
                break;
1179
            case MODE_SHOW_ONLY:
1180
            default:
1181
                enabled = false;
1182
                break;
1183
        }
1184

    
1185
        if( this.rdbRelationNone.isSelected() ) {
1186
            this.pickerVirtualFieldGetter.setEnabled(enabled);
1187
            this.toOneController.setEnabled(false);
1188
            this.toManyController.setEnabled(false);
1189
            this.toManyController.setEnabled(false);
1190
        } else if( this.rdbRelationToOne.isSelected() ) {
1191
            this.pickerVirtualFieldGetter.setEnabled(enabled);
1192
            this.toManyController.setEnabled(false);
1193
            if( this.isVirtualField() ) {
1194
                this.rdbRelationNone.setSelected(true);
1195
            } else {
1196
                this.toOneController.setEnabled(enabled);
1197
            }
1198
        } else if( this.rdbRelationToMany.isSelected() ) {
1199
            if( !this.isVirtualField() || this.getDataType().getType()!=DataTypes.LIST ) {
1200
                this.rdbRelationNone.setSelected(true);
1201
            } else {
1202
                this.pickerVirtualFieldGetter.setEnabled(false);
1203
                this.toOneController.setEnabled(false);
1204
                this.toManyController.setEnabled(enabled);
1205
            }
1206
        }
1207
    }
1208
    
1209
    @Override
1210
    public JComponent asJComponent() {
1211
        return this;
1212
    }
1213
    
1214
    private void doIsAutomaticChanged() {
1215
        if( this.chkIsAutomatic.isSelected() ) {
1216
            DataType type = this.getDataType();
1217
            String defaultValue = this.txtDefaultValue.getText();
1218
            if( type.getType()!=DataTypes.LONG || StringUtils.isNotBlank(defaultValue) ) {
1219
                final I18nManager i18n = ToolsLocator.getI18nManager();
1220
                ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1221
                dialogs.messageDialog(
1222
                        i18n.getTranslation("_The_automatic_fields_must_be_of_type_long_and_do_not_support_default_values") +
1223
                            "\n" +
1224
                            i18n.getTranslation("_The_type_and_the_default_value_will_be_changed_to_adapt_them_to_these_needs"), 
1225
                        (String[])null, 
1226
                        i18n.getTranslation("_Warning"), 
1227
                        JOptionPane.INFORMATION_MESSAGE, 
1228
                        "_Automatic_field_flag_force_the_type_to_long_and_an_empty_default_value"
1229
                );
1230
                ListElement.setSelected(cboFieldType,DataTypes.LONG);
1231
                this.txtDefaultValue.setText("");
1232
            }
1233
        }
1234
        updateEditableStates();
1235
    }
1236
    
1237
    private void doDataTypeSelection() {
1238
        final DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
1239
        final I18nManager i18n = ToolsLocator.getI18nManager();
1240
        List<ListElement<Integer>> types = new ArrayList<>();
1241
        for (DataType dataType : dataManager) {
1242
            types.add( new ListElement<>(dataType.getName(), dataType.getType()) );
1243
        }
1244
        types.sort((ListElement<Integer> o1, ListElement<Integer> o2) -> 
1245
                o1.toString().compareTo(o2.toString())
1246
        );
1247
        
1248
        DefaultListModel<ListElement<Integer>> modelTypes = new DefaultListModel<>();
1249
        for (ListElement<Integer> element : types) {
1250
            modelTypes.addElement(element);
1251
        }
1252
        final JList list = new JList();
1253
        list.setCellRenderer(new DefaultListCellRenderer() {
1254
          @Override
1255
          public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
1256
              JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
1257
              label.setIcon(null);
1258
              try {
1259
                DataType dataType = dataManager.get((int) value);
1260
                IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
1261
                if (theme.exists(dataType.getIconName())) {
1262
                    label.setIcon(theme.get(dataType.getIconName()));
1263
                }
1264
              } catch(Exception ex) {
1265
                // Do nothing, ignore
1266
              }
1267
              return label;
1268
          }
1269
        });
1270
        list.setModel(modelTypes);
1271
        final JScrollPane scrollpanel = new JScrollPane(list);
1272
        WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
1273
        Dialog dialog = winManager.createDialog(
1274
              scrollpanel, 
1275
              i18n.getTranslation("_Data_type_selection"),
1276
              i18n.getTranslation("_Select_the_data_type"),
1277
              WindowManager_v2.BUTTONS_OK_CANCEL
1278
        );
1279
        dialog.addActionListener((ActionEvent e) -> {
1280
          if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
1281
            Integer type = (Integer) ListElement.getSelected(list);
1282
            if( type!=null ) {
1283
              ListElement.setSelected(cboFieldType, type);
1284
              if( ListElement.getSelected(cboFieldType)==null ) {
1285
                DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
1286
                DataType dataType = dataTypeManager.get(type);
1287
                cboFieldType.addItem(new ListElement<>(dataType.getName(), dataType.getType()));
1288
                ListElement.setSelected(cboFieldType, dataType.getType());
1289
              }
1290
            }
1291
          }
1292
        });
1293
        dialog.show(WindowManager.MODE.DIALOG);
1294
    }
1295
    
1296
    private int getMaxAttributeSize(EditableFeatureAttributeDescriptor descriptor) {
1297
        FeatureStore store = descriptor.getStore();
1298
        if(store == null){
1299
            return -1;
1300
        }
1301
        DataStoreProviderFactory providerFactory = store.getProviderFactory();
1302
        if(providerFactory == null){
1303
            return -1;
1304
        }
1305
        return ((FeatureStoreProviderFactory)providerFactory).getMaxAttributeNameSize();
1306
    }
1307

    
1308
    @Override
1309
    public EditableFeatureAttributeDescriptor fetch(EditableFeatureAttributeDescriptor descriptor) {
1310
        I18nManager i18n = ToolsLocator.getI18nManager();
1311
        try {
1312
            if (!this.chkAllowNulls.isSelected()) {
1313
                if (descriptor.allowNull()) {
1314
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1315
                    dialogs.messageDialog(
1316
                            i18n.getTranslation("_You_have_marked_not_allow_nulls") + "\n"
1317
                            + i18n.getTranslation("If_you_are_not_fully_aware_of_the_repercussions_of_this_it_is_advisable_to_allow_nulls"),
1318
                            null,
1319
                            i18n.getTranslation("_Warning"),
1320
                            JOptionPane.INFORMATION_MESSAGE,
1321
                            "AllowNullsInFeatureTypeEditing"
1322
                    );
1323
                }
1324
            }
1325
            descriptor.setDataType((int) ListElement.getSelected(this.cboFieldType));
1326
            int maxAttributeNameSize = getMaxAttributeSize(descriptor);
1327
            String attrName = this.txtFieldName.getText();
1328
            if(maxAttributeNameSize > -1 && StringUtils.length(attrName) > maxAttributeNameSize){
1329
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1330
                    dialogs.messageDialog(
1331
                            i18n.getTranslation("_Attribute_name_is_too_long") + "\n"
1332
                            + i18n.getTranslation("_max_size_allowed_for_this_table_is_{0}",new String[]{String.valueOf(maxAttributeNameSize)}),
1333
                            null,
1334
                            i18n.getTranslation("_Warning"),
1335
                            JOptionPane.WARNING_MESSAGE
1336
                    );
1337
                    return null;
1338
            }
1339
            descriptor.setName(attrName);
1340
            descriptor.setAllowNull(this.chkAllowNulls.isSelected());
1341
            descriptor.setIsPrimaryKey(this.chkIsPrimaryKey.isSelected());
1342
            descriptor.setIsAutomatic(this.chkIsAutomatic.isSelected());
1343
            descriptor.setIsReadOnly(this.chkIsReadOnly.isSelected());
1344
            descriptor.setIsIndexed(this.chkIsIndexed.isSelected());
1345
            descriptor.setSize(this.pickerSize.get(0));
1346
            descriptor.setDisplaySize(this.pickerDisplaySize.get(0));
1347
            descriptor.setPrecision(this.pickerPrecision.get(0));
1348
            descriptor.setScale(this.pickerScale.get(0));
1349
            
1350
            String defaultValue = this.txtDefaultValue.getText();
1351
            switch(this.mode) {
1352
                case MODE_EDIT_ONLY_METADATA:
1353
                    if( !ExpressionUtils.isDynamicText(defaultValue) ) {
1354
                        if( !StringUtils.equals(this.previousDefaultValue, defaultValue)) {
1355
                            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1356
                            dialogs.messageDialog(
1357
                                    i18n.getTranslation("_In_metadata_editing_only_mode_it_is_only_allowed_to_indicate_default_values_with_dynamic_expressions"),
1358
                                    null,
1359
                                    i18n.getTranslation("_Warning"),
1360
                                    JOptionPane.WARNING_MESSAGE
1361
                            );
1362
                            return null;
1363
                        }
1364
                    }
1365
                case MODE_EDIT_ALL:
1366
                case MODE_SHOW_ONLY:
1367
                    descriptor.setDefaultValue(defaultValue);
1368
                    
1369
            }
1370
            
1371
            descriptor.setDefaultFormat(this.txtDefaultFormat.getText());
1372
            descriptor.setDataProfileName((String) ListElement.getSelected(this.cboDataProfile));
1373
            switch (descriptor.getType()) {
1374
                case DataTypes.GEOMETRY:
1375
                    GeometryManager geomManager = GeometryLocator.getGeometryManager();
1376
                    GeometryType geomType = geomManager.getGeometryType(
1377
                            (int) ListElement.getSelected(this.cboGeometryType),
1378
                            (int) ListElement.getSelected(this.cboGeometrySubtype)
1379
                    );
1380
                    descriptor.setGeometryType(geomType);
1381
                    descriptor.setSRS(this.pickerCRS.get());
1382
                    break;
1383
                case DataTypes.INSTANT:
1384
                case DataTypes.INTERVAL:
1385
                case DataTypes.DATE:
1386
                case DataTypes.TIME:
1387
                case DataTypes.TIMESTAMP:
1388
                    // FIXME
1389
                    break;
1390
                default:
1391
                    break;
1392
            }
1393
            descriptor.setDataProfileName(
1394
                    StringUtils.defaultIfBlank((String) ListElement.getSelected(cboDataProfile), null)
1395
            );
1396

    
1397
            if (this.chkVirtualField.isSelected() ) { //&& this.pickerVirtualField.isEnabled()) {
1398
                Expression expression = this.pickerVirtualFieldGetter.get();
1399
                if (expression == null) {
1400
                    descriptor.setFeatureAttributeEmulator((String) null);
1401
                } else {
1402
                    DataManager dataManager = DALLocator.getDataManager();
1403
                    FeatureAttributeEmulatorExpression emulator = dataManager.createFeatureAttributeEmulatorExpression(
1404
                            descriptor.getFeatureType(),
1405
                            expression
1406
                    );
1407
                    if (!emulator.isValid()) {
1408
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1409
                        dialogs.messageDialog(
1410
                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+"\n"
1411
                                + "\n"
1412
                                + emulator.getErrorMessage(),
1413
                                i18n.getTranslation("_Warning"),
1414
                                JOptionPane.WARNING_MESSAGE
1415
                        );
1416
                        return null;
1417
                    }
1418
                    for (String requiredFieldName : emulator.getRequiredFieldNames()) {
1419
                        if (StringUtils.equalsIgnoreCase(requiredFieldName, descriptor.getName())) {
1420
                            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1421
                            dialogs.messageDialog(
1422
                                    i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")
1423
                                    + "\n\n"
1424
                                    + i18n.getTranslation("_The_expression_contains_a_reference_to_itself"),
1425
                                    i18n.getTranslation("_Warning"),
1426
                                    JOptionPane.WARNING_MESSAGE
1427
                            );
1428
                            return null;
1429
                        }
1430
                    }
1431
                    List<String> undefinedSymbols = emulator.getUndefinedSymbols();
1432
                    if( undefinedSymbols!=null && !undefinedSymbols.isEmpty() ) {
1433
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1434
                        dialogs.messageDialog(
1435
                                i18n.getTranslation("_The_expression_has_undefined_symbols_at_this_moment")+"\n"
1436
                                + i18n.getTranslation("_This_may_not_be_a_mistake")+"\n"
1437
                                + "\n"
1438
                                + "("+StringUtils.join(undefinedSymbols,",")+")",
1439
                                i18n.getTranslation("_Warning"),
1440
                                JOptionPane.WARNING_MESSAGE
1441
                        );
1442
                    }
1443
                    //
1444
                    // No se porque esto de abajo no funciona.
1445
                    // Nunca se lanza la excepcion en el get(Feature) de
1446
                    // DefaultFeatureAttributeEmulatorExpression.
1447
                    //
1448
                    try {
1449
                        emulator.setEnableExceptions(true);
1450
//                        descriptor.setFeatureAttributeEmulator(emulator);
1451
                        emulator.get(this.sampleFeature);
1452
                    } catch(Throwable ex) {
1453
//                        emulator.setEnableExceptions(false);
1454
//                        descriptor.setFeatureAttributeEmulator(null);
1455
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1456
                        dialogs.messageDialog(
1457
                                i18n.getTranslation("_The_expression_can_not_be_evaluated_right_now_It_could_be_valid_when_all_changes_has_been_applied")+
1458
                                    "\n"+
1459
                                    ex.getMessage(), 
1460
                                i18n.getTranslation("_Warning"), 
1461
                                JOptionPane.WARNING_MESSAGE
1462
                        );
1463
//                        return null;
1464
                    } finally {
1465
                        emulator.setEnableExceptions(false);
1466
                    }
1467
                    descriptor.setFeatureAttributeEmulator(emulator);
1468
                }
1469
            }
1470
        } catch (Exception ex) {
1471
            LOGGER.warn("Can't retrieve information from user form.", ex);
1472
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
1473
            dialogs.messageDialog(
1474
                    i18n.getTranslation("_Cant_retrieve_information_from_user_form")
1475
                    + "\n"
1476
                    + i18n.getTranslation("_See_log_for_details"),
1477
                    i18n.getTranslation("_Warning"),
1478
                    JOptionPane.WARNING_MESSAGE
1479
            );
1480
            return null;
1481
        }
1482

    
1483
        descriptor.setGroup(StringUtils.defaultIfBlank((String) this.cboGroup.getSelectedItem(), null));
1484
        descriptor.setOrder(this.pickerOrder.get(0));
1485
        descriptor.setHidden(this.chkHidden.isSelected());
1486
        descriptor.setLabel(StringUtils.defaultIfBlank(this.txtLabel.getText(), null));
1487
        descriptor.setDescription(StringUtils.defaultIfBlank(this.txtDescription.getText(), null));
1488

    
1489
//        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
1490
//        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
1491
        Expression valuesFilter = this.pickerValuesFilter.get();
1492
        
1493
        descriptor.setAvailableValues(this.availableValuesController.get());
1494

    
1495
        this.tagsController.getModel().fetch(descriptor.getTags());
1496

    
1497
        this.toOneController.fetch(descriptor);
1498
        this.toManyController.fetch(descriptor);
1499
        if( rdbRelationToOne.isSelected() ) {
1500
            descriptor.setRelationType(this.toOneController.getRelationType());
1501
            descriptor.getForeingKey().setForeingKey(true);
1502
        } else if( rdbRelationToMany.isSelected() ) {
1503
            descriptor.setRelationType(this.toManyController.getRelationType());
1504
            descriptor.getForeingKey().setForeingKey(false);
1505
        } else if( rdbRelationNone.isSelected() ) {
1506
            descriptor.setRelationType(DynField.RELATION_TYPE_NONE);
1507
            descriptor.getForeingKey().setForeingKey(false);
1508
        }
1509

    
1510

    
1511
        return descriptor;
1512
    }
1513

    
1514
    @Override
1515
    public void clean() {
1516
        this.txtDefaultValue.setText("");
1517
        this.txtDefaultFormat.setText("");
1518
        this.txtFieldName.setText("");
1519
//        this.pickerFieldName.set(null);
1520
        this.pickerIntervalEnd.set(null);
1521
        this.pickerIntervalStart.set(null);
1522
        this.pickerScale.set(null);
1523
        this.pickerSize.set(null);
1524
        this.pickerDisplaySize.set(null);
1525

    
1526
        this.chkAllowNulls.setSelected(false);
1527
        this.chkIsAutomatic.setSelected(false);
1528
        this.chkIsReadOnly.setSelected(false);
1529
        this.chkIsIndexed.setSelected(false);
1530
        this.chkIsPrimaryKey.setSelected(false);
1531

    
1532
        this.chkVirtualField.setSelected(false);
1533
        this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
1534
        this.pickerVirtualFieldGetter.setEditable(false);
1535
        this.pickerVirtualFieldGetter.set(null);
1536

    
1537
        ListElement.setSelected(cboGeometryType, null);
1538
        ListElement.setSelected(cboGeometrySubtype, null);
1539

    
1540
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
1541

    
1542
        this.cboDataProfile.setSelectedIndex(-1);
1543

    
1544
        this.cboGroup.setSelectedIndex(-1);
1545
        this.pickerOrder.set(null);
1546
        this.chkHidden.setSelected(false);
1547
        this.txtLabel.setText("");
1548
        this.txtDescription.setText("");
1549
        this.txtMinValue.setText("");
1550
        this.txtMaxValue.setText("");
1551
        this.availableValuesController.clean();
1552
        this.tagsController.clean();
1553
        this.toOneController.clean();
1554
    }
1555

    
1556
    @Override
1557
    public void put(FeatureAttributeDescriptor descriptor) {
1558
        if (descriptor == null) {
1559
            this.clean();
1560
            return;
1561
        }
1562
        DataType dataType = descriptor.getDataType();
1563
        FeatureType featureType = descriptor.getFeatureType();
1564
        DefaultComboBoxModel groupModel = new DefaultComboBoxModel();
1565

    
1566
        if (featureType != null) {
1567
            FeatureStore store = descriptor.getFeatureType().getStore();
1568
            this.featureStoreElement.setFeatureStore(store);
1569
            if (store != null) {
1570
                this.sampleFeature = store.getSampleFeature();
1571
                if (sampleFeature != null) {
1572
                    FeatureSymbolTable featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable();
1573
                    featureSymbolTable.setFeature(sampleFeature);
1574
                    this.pickerVirtualFieldGetter.getConfig().setPreviewSymbolTable(featureSymbolTable.createParent());
1575
                    this.pickerValuesFilter.getConfig().setPreviewSymbolTable(featureSymbolTable.createParent());
1576
                }
1577
            }
1578
            List<String> groups = new ArrayList<>();
1579
            for (FeatureAttributeDescriptor otherdesc : featureType) {
1580
                String group = otherdesc.getGroup();
1581
                if (!StringUtils.isBlank(group) && !groups.contains(group)) {
1582
                    groups.add(group);
1583
                }
1584
            }
1585
            for (String group : groups) {
1586
                groupModel.addElement(group);
1587
            }
1588
        }
1589

    
1590
        this.previousDefaultValue = Objects.toString(descriptor.getDefaultValue(),"");
1591
        this.txtDefaultValue.setText(this.previousDefaultValue);
1592
        this.txtDefaultFormat.setText(Objects.toString(descriptor.getDefaultFormat(),""));
1593
        this.txtFieldName.setText(descriptor.getName());
1594
        RelativeInterval interval = (RelativeInterval) descriptor.getInterval();
1595
        if (interval == null) {
1596
            this.pickerIntervalEnd.set(null);
1597
            this.pickerIntervalStart.set(null);
1598
        } else {
1599
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
1600
            this.pickerIntervalStart.set(interval.getStart().toDate());
1601
        }
1602
        if( dataType.supportSize() ) {
1603
          this.pickerSize.set(descriptor.getSize());
1604
        } else {
1605
          this.pickerSize.set(null);
1606
        }
1607
        this.pickerDisplaySize.set(descriptor.getDisplaySize());
1608
        if( dataType.supportPrecision() ) {
1609
          this.pickerPrecision.set(descriptor.getPrecision());
1610
        } else {
1611
          this.pickerPrecision.set(null);
1612
        }
1613
        if( dataType.supportScale()) {
1614
          this.pickerScale.set(descriptor.getScale());
1615
        } else {
1616
          this.pickerScale.set(null);
1617
        }
1618
        this.chkAllowNulls.setSelected(descriptor.allowNull());
1619
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
1620
        this.chkIsReadOnly.setSelected(descriptor.isReadOnly());
1621
        this.chkIsIndexed.setSelected(descriptor.isIndexed());
1622
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
1623

    
1624
        this.pickerVirtualFieldGetter.setEnabled(true);
1625
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
1626
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
1627
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
1628
            this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL);
1629
            this.chkVirtualField.setSelected(true);
1630
            this.pickerVirtualFieldGetter.set(expression);
1631
        } else if (descriptor.isComputed()) {
1632
            this.chkVirtualField.setEnabled(false);
1633
            this.chkVirtualField.setSelected(true);
1634
            this.pickerVirtualFieldGetter.set(null);
1635
        } else {
1636
            this.chkVirtualField.setEnabled(this.mode==MODE_EDIT_ALL);
1637
            this.chkVirtualField.setSelected(false);
1638
            this.pickerVirtualFieldGetter.set(null);
1639
        }
1640
        this.pickerVirtualFieldGetter.setEnabled(true);
1641

    
1642
        Expression expression = descriptor.getAvailableValuesFilter();
1643
        this.pickerValuesFilter.set(expression);
1644

    
1645
        this.pickerCRS.set(descriptor.getSRS());
1646

    
1647
        if (descriptor.getGeomType() != null) {
1648
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
1649
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
1650
        }
1651
        ListElement.setSelected(cboFieldType, dataType.getType());
1652
        if( ListElement.getSelected(cboFieldType)==null ) {
1653
          cboFieldType.addItem(new ListElement<>(dataType.getName(), dataType.getType()));
1654
          ListElement.setSelected(cboFieldType, dataType.getType());
1655
        }
1656
 
1657
        String profile = descriptor.getDataProfileName();
1658
        if (StringUtils.isBlank(profile)) {
1659
            this.cboDataProfile.setSelectedIndex(-1);
1660
        } else {
1661
            ListElement.setSelected(this.cboDataProfile, profile);
1662
        }
1663

    
1664
        this.cboGroup.setModel(groupModel);
1665
        this.cboGroup.setSelectedItem(StringUtils.defaultIfBlank(descriptor.getGroup(), ""));
1666
        this.pickerOrder.set(descriptor.getOder());
1667
        this.chkHidden.setSelected(descriptor.isHidden());
1668
        if (descriptor.hasLabel()) {
1669
            this.txtLabel.setText(StringUtils.defaultIfBlank(descriptor.getLabel(), ""));
1670
        } else {
1671
            this.txtLabel.setText("");
1672
        }
1673
        if (descriptor.hasDescription()) {
1674
            this.txtDescription.setText(StringUtils.defaultIfBlank(descriptor.getDescription(), ""));
1675
        } else {
1676
            this.txtDescription.setText("");
1677
        }
1678
        this.txtMinValue.setText(Objects.toString(descriptor.getMinValue(), ""));
1679
        this.txtMinValue.setText(Objects.toString(descriptor.getMaxValue(), ""));
1680
        if( descriptor.hasConstantAvailableValues() ) {
1681
          this.availableValuesController.set(descriptor.getAvailableValues());
1682
        } else {
1683
          this.availableValuesController.clean();
1684
        }
1685
        this.tagsController.setModel(new TagsModel(descriptor.getTags()));
1686

    
1687
        this.toOneController.put(descriptor);
1688
        this.toManyController.put(descriptor);
1689
        switch(descriptor.getRelationType()) {
1690
            case DynField.RELATION_TYPE_NONE:
1691
                this.rdbRelationNone.setSelected(true);
1692
                this.rdbRelationToOne.setSelected(false);
1693
                this.rdbRelationToMany.setSelected(false);
1694
                this.toOneController.clean();
1695
                this.toManyController.clean();
1696
                break;
1697
            case DynField.RELATION_TYPE_IDENTITY:
1698
            case DynField.RELATION_TYPE_COLLABORATION:
1699
                this.rdbRelationNone.setSelected(false);
1700
                this.rdbRelationToOne.setSelected(true);
1701
                this.rdbRelationToMany.setSelected(false);
1702
                this.toManyController.clean();
1703
                break;
1704
            case DynField.RELATION_TYPE_COMPOSITION:
1705
            case DynField.RELATION_TYPE_AGGREGATE:
1706
                this.rdbRelationNone.setSelected(false);
1707
                this.rdbRelationToOne.setSelected(false);
1708
                this.rdbRelationToMany.setSelected(true);
1709
                this.pickerVirtualFieldGetter.setEnabled(false);
1710
//                this.pickerVirtualFieldGetter.set(null);
1711
                this.toOneController.clean();
1712
                break;
1713
              
1714
        }
1715
        
1716
        if (!(descriptor instanceof EditableFeatureAttributeDescriptor)) {
1717
            this.setMode(FeatureTypePanel.MODE_SHOW_ONLY);
1718
        }
1719
        this.updateEditableStates();
1720
    }
1721

    
1722
    private DataType getDataType() {
1723
      Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
1724
      if (fieldType == null) {
1725
          return null;
1726
      }
1727
      DataType dataType = ToolsLocator.getDataTypesManager().get(fieldType);
1728
      return dataType;
1729
    }
1730

    
1731
    private void doFieldTypeChanged() {
1732
      try {
1733
        DataType dataType = this.getDataType();
1734

    
1735
        if( dataType.supportSize() ) {
1736
            this.pickerSize.setEditable(this.mode == MODE_EDIT_ALL);
1737
        } else {
1738
            this.pickerSize.setEditable(false);
1739
            this.pickerSize.set(null);
1740
        }        
1741
        this.pickerDisplaySize.setEditable(this.mode == MODE_EDIT_ALL);
1742
        if( dataType.supportPrecision() ) {
1743
          if( dataType.isPredefinedPrecision() ) {
1744
            this.pickerPrecision.setEditable(false);
1745
          } else {
1746
            this.pickerPrecision.setEditable(this.mode == MODE_EDIT_ALL);
1747
          }
1748
        } else {
1749
            this.pickerPrecision.setEditable(false);
1750
            this.pickerPrecision.set(null);
1751
        }        
1752
        if( dataType.supportScale()) {
1753
            this.pickerScale.setEditable(this.mode == MODE_EDIT_ALL);
1754
        } else {
1755
            this.pickerScale.setEditable(false);
1756
            this.pickerScale.set(null);
1757
        }        
1758
        switch (dataType.getType()) {
1759
          case DataTypes.GEOMETRY:
1760
            this.cboGeometryType.setEnabled(this.mode == MODE_EDIT_ALL);
1761
            this.cboGeometrySubtype.setEnabled(this.mode == MODE_EDIT_ALL);
1762
            this.pickerCRS.setEditable(this.mode == MODE_EDIT_ALL);
1763
            this.cboDateFormat.setEnabled(false);
1764
            this.pickerIntervalStart.setEditable(false);
1765
            this.pickerIntervalEnd.setEditable(false);
1766
            this.tabAditionalFields.setEnabledAt(1, true);
1767
            this.tabAditionalFields.setEnabledAt(2, false);
1768
            break;
1769
          case DataTypes.INSTANT:
1770
          case DataTypes.INTERVAL:
1771
          case DataTypes.DATE:
1772
          case DataTypes.TIME:
1773
          case DataTypes.TIMESTAMP:
1774
            this.cboGeometryType.setEnabled(false);
1775
            this.cboGeometrySubtype.setEnabled(false);
1776
            this.pickerCRS.setEditable(false);
1777
            this.cboDateFormat.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1778
            this.pickerIntervalStart.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1779
            this.pickerIntervalEnd.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1780
            this.tabAditionalFields.setEnabledAt(1, false);
1781
            this.tabAditionalFields.setEnabledAt(2, true);
1782
            break;
1783
          case DataTypes.BYTE:
1784
          case DataTypes.INT:
1785
          case DataTypes.LONG:
1786
          case DataTypes.STRING:
1787
          case DataTypes.FILE:
1788
          case DataTypes.URL:
1789
          case DataTypes.URI:
1790
          case DataTypes.FLOAT:
1791
          case DataTypes.DOUBLE:
1792
          case DataTypes.DECIMAL:
1793
            this.cboGeometryType.setEnabled(false);
1794
            this.cboGeometrySubtype.setEnabled(false);
1795
            this.pickerCRS.setEditable(false);
1796
            this.cboDateFormat.setEnabled(false);
1797
            this.pickerIntervalStart.setEditable(false);
1798
            this.pickerIntervalEnd.setEditable(false);
1799
            this.tabAditionalFields.setEnabledAt(1, false);
1800
            this.tabAditionalFields.setEnabledAt(2, false);
1801
            break;
1802
          default:
1803
            this.cboGeometryType.setEnabled(false);
1804
            this.cboGeometrySubtype.setEnabled(false);
1805
            this.pickerCRS.setEditable(false);
1806
            this.cboDateFormat.setEnabled(false);
1807
            this.pickerIntervalStart.setEditable(false);
1808
            this.pickerIntervalEnd.setEditable(false);
1809
            this.tabAditionalFields.setEnabledAt(1, false);
1810
            this.tabAditionalFields.setEnabledAt(2, false);
1811
        }
1812
//        updateRelationState();
1813
        doChangeRelationType();
1814
      } catch (Exception ex) {
1815
        LOGGER.warn("Problems changing field type.", ex);
1816
      }
1817

    
1818
    }
1819
    
1820
    boolean isVirtualField() {
1821
        return this.chkVirtualField.isSelected();
1822
    }
1823

    
1824
    @Override
1825
    public int getMode() {
1826
        return this.mode;
1827
    }
1828
    
1829
    @Override
1830
    public void setMode(int mode) {
1831
        this.mode = mode;
1832
        updateEditableStates();
1833
    }
1834
    
1835
    private void updateEditableStates() {
1836
        DataType dataType = this.getDataType();
1837
        switch(this.mode) {
1838
            case MODE_EDIT_ALL:
1839
                this.txtDefaultValue.setEditable(!this.chkIsAutomatic.isSelected());
1840
                this.txtDefaultFormat.setEditable(true);
1841
                this.txtFieldName.setEditable(true);
1842
                this.pickerIntervalEnd.setEditable(true);
1843
                this.pickerIntervalStart.setEditable(true);
1844
                this.pickerSize.setEditable(dataType.supportSize());
1845
                this.pickerDisplaySize.setEditable(true);
1846
                if( dataType.isPredefinedPrecision() ) {
1847
                  this.pickerPrecision.setEditable(false);
1848
                  this.pickerPrecision.set(dataType.getMaxPrecision());
1849
                } else {
1850
                  this.pickerPrecision.setEditable(dataType.supportPrecision());
1851
                }
1852
                this.pickerScale.setEditable(dataType.supportScale());
1853
                this.cboDataProfile.setEnabled(true);
1854

    
1855
                this.chkAllowNulls.setEnabled(true);
1856
                this.chkIsAutomatic.setEnabled(true);
1857
                this.chkIsReadOnly.setEnabled(true);
1858
                this.chkIsIndexed.setEnabled(true);
1859
                if( this.isVirtualField() ) {
1860
                    this.chkIsPrimaryKey.setEnabled(true);
1861
                } else {
1862
                    this.chkIsPrimaryKey.setEnabled(false);
1863
                }
1864

    
1865
                this.chkVirtualField.setEnabled(true);
1866
                this.pickerVirtualFieldGetter.setEditable(true);
1867

    
1868
                this.cboDateFormat.setEnabled(true);
1869
                this.cboFieldType.setEnabled(!this.chkIsAutomatic.isSelected());
1870
                this.btnFieldType.setEnabled(!this.chkIsAutomatic.isSelected());
1871
                this.cboGeometryType.setEnabled(true);
1872
                this.cboGeometrySubtype.setEnabled(true);
1873
                this.pickerCRS.setEditable(true);
1874

    
1875
                this.cboGroup.setEnabled(true);
1876
                this.pickerOrder.setEditable(true);
1877
                this.chkHidden.setEnabled(true);
1878
                this.txtLabel.setEditable(true);
1879
                this.txtDescription.setEditable(true);
1880
                this.txtMinValue.setEditable(false);
1881
                this.txtMaxValue.setEditable(false);
1882
                this.pickerValuesFilter.setEditable(true);
1883
                this.availableValuesController.setEditable(true);
1884
                this.tagsController.setEnabled(true);
1885
                break;
1886
            case MODE_EDIT_ONLY_METADATA:
1887
                if( this.chkVirtualField.isSelected() ) {
1888
                    this.txtFieldName.setEditable(true);
1889
                    this.pickerScale.setEditable(true);
1890
                    this.pickerSize.setEditable(true);
1891
                    this.pickerVirtualFieldGetter.setEditable(true);
1892
                    this.cboFieldType.setEnabled(true);
1893
                    this.btnFieldType.setEnabled(true);
1894
                    this.cboGeometryType.setEnabled(true);
1895
                    this.cboGeometrySubtype.setEnabled(true);
1896
                    this.pickerCRS.setEditable(true);
1897
                } else {
1898
                    this.txtFieldName.setEditable(false);
1899
                    this.pickerPrecision.setEditable(false);
1900
                    this.pickerScale.setEditable(false);
1901
                    this.pickerSize.setEditable(false);
1902
                    this.pickerVirtualFieldGetter.setEditable(false);
1903
                    this.cboFieldType.setEnabled(false);
1904
                    this.btnFieldType.setEnabled(false);
1905
                    this.cboGeometryType.setEnabled(false);
1906
                    this.cboGeometrySubtype.setEnabled(false);
1907
                    this.pickerCRS.setEditable(false);
1908
                }
1909

    
1910
                this.txtDefaultValue.setEditable(true);
1911
                this.txtDefaultFormat.setEditable(true);
1912
                this.pickerIntervalEnd.setEditable(true);
1913
                this.pickerIntervalStart.setEditable(true);
1914

    
1915
                this.cboDataProfile.setEnabled(true);
1916

    
1917
                this.pickerDisplaySize.setEditable(false);
1918
                this.chkAllowNulls.setEnabled(false);
1919
                this.chkIsAutomatic.setEnabled(false);
1920
                this.chkIsReadOnly.setEnabled(false);
1921
                this.chkIsIndexed.setEnabled(false);
1922
                if( this.isVirtualField() ) {
1923
                    this.chkIsPrimaryKey.setEnabled(true);
1924
                } else {
1925
                    this.chkIsPrimaryKey.setEnabled(false);
1926
                }
1927

    
1928
                this.chkVirtualField.setEnabled(false);
1929

    
1930
                this.cboDateFormat.setEnabled(true);
1931

    
1932
                this.cboGroup.setEnabled(true);
1933
                this.pickerOrder.setEditable(true);
1934
                this.chkHidden.setEnabled(true);
1935
                this.txtLabel.setEditable(true);
1936
                this.txtDescription.setEditable(true);
1937
                this.txtMinValue.setEditable(false);
1938
                this.txtMaxValue.setEditable(false);
1939
                this.pickerValuesFilter.setEditable(true);
1940
                this.availableValuesController.setEditable(true);
1941
                this.tagsController.setEnabled(true);
1942
                break;
1943
            case MODE_SHOW_ONLY:
1944
                this.txtDefaultValue.setEditable(false);
1945
                this.txtDefaultFormat.setEditable(false);
1946
                this.txtFieldName.setEditable(false);
1947
                this.pickerIntervalEnd.setEditable(false);
1948
                this.pickerIntervalStart.setEditable(false);
1949
                this.pickerPrecision.setEditable(false);
1950
                this.pickerScale.setEditable(false);
1951
                this.pickerSize.setEditable(false);
1952
                this.pickerDisplaySize.setEditable(false);
1953
                this.cboDataProfile.setEnabled(false);
1954

    
1955
                this.chkAllowNulls.setEnabled(false);
1956
                this.chkIsAutomatic.setEnabled(false);
1957
                this.chkIsReadOnly.setEnabled(false);
1958
                this.chkIsIndexed.setEnabled(false);
1959
                this.chkIsPrimaryKey.setEnabled(false);
1960

    
1961
                this.chkVirtualField.setEnabled(false);
1962
                this.pickerVirtualFieldGetter.setEditable(false);
1963

    
1964
                this.cboDateFormat.setEnabled(false);
1965
                this.cboFieldType.setEnabled(false);
1966
                this.btnFieldType.setEnabled(false);
1967
                this.cboGeometryType.setEnabled(false);
1968
                this.cboGeometrySubtype.setEnabled(false);
1969
                this.pickerCRS.setEditable(false);
1970

    
1971
                this.cboGroup.setEnabled(false);
1972
                this.pickerOrder.setEditable(false);
1973
                this.chkHidden.setEnabled(false);
1974
                this.txtLabel.setEditable(false);
1975
                this.txtDescription.setEditable(false);
1976
                this.txtMinValue.setEditable(false);
1977
                this.txtMaxValue.setEditable(false);
1978
                this.pickerValuesFilter.setEditable(false);
1979
                this.availableValuesController.setEditable(false);
1980
                this.tagsController.setEnabled(false);
1981
                break;
1982
        }
1983
        updateRelationState();
1984
    }
1985
    
1986
    private void updateRelationState() {
1987
        switch(this.mode) {
1988
            case MODE_EDIT_ALL:
1989
            case MODE_EDIT_ONLY_METADATA:
1990
                if( this.isVirtualField() ) {
1991
                    this.toOneController.setEditable(false);
1992
                    this.rdbRelationToOne.setEnabled(false);
1993
                    this.toManyController.setEditable(this.getDataType().getType() == DataTypes.LIST);
1994
                    this.rdbRelationToMany.setEnabled(this.getDataType().getType() == DataTypes.LIST);
1995
                } else {
1996
                    this.toOneController.setEditable(true);
1997
                    this.rdbRelationToOne.setEnabled(true);
1998
                    this.toManyController.setEditable(false);
1999
                    this.rdbRelationToMany.setEnabled(false);
2000
                }
2001
                this.rdbRelationNone.setEnabled(true);
2002
                if( this.rdbRelationToMany.isSelected() ) {
2003
                    this.pickerVirtualFieldGetter.setEnabled(false);
2004
//                    this.pickerVirtualFieldGetter.set(null);
2005
                }
2006
                break;
2007
            case MODE_SHOW_ONLY:
2008
            default:
2009
                this.toOneController.setEditable(false);
2010
                this.toManyController.setEditable(false);
2011
                this.rdbRelationToOne.setEnabled(false);
2012
                this.rdbRelationToMany.setEnabled(false);
2013
                this.rdbRelationNone.setEnabled(false);
2014
                if( this.rdbRelationToMany.isSelected() ) {
2015
                    this.pickerVirtualFieldGetter.setEnabled(false);
2016
//                    this.pickerVirtualFieldGetter.set(null);
2017
                }
2018
                break;
2019
        }
2020
    }
2021

    
2022
    private void doCheckPrecisionAndScale() {
2023
      DataType dataType = this.getDataType();
2024
      
2025
      Integer precision = this.pickerPrecision.get();
2026
      if( precision==null ) {
2027
        precision = 0;
2028
      }
2029
      Integer scale = this.pickerScale.get();
2030
      if( scale == null ) {
2031
        scale = 0;
2032
      }      
2033
      NumberPrecisionAndScale r = dataType.fixPrecisionAndScale(precision, scale);
2034
      if( r.getPrecision()!=precision || r.getScale()!=scale ) {
2035
        this.pickerPrecision.setWarning(true, "The precision/scale are not valids");
2036
        this.pickerScale.setWarning(true, "The precision/scale are not valids");
2037
      } else {
2038
        this.pickerPrecision.setWarning(false);
2039
        this.pickerScale.setWarning(false);
2040
      }
2041
    }
2042

    
2043
    @Override
2044
    public void setNameAsNew(FeatureType featureType) {
2045
        EditableFeatureType cloneFeatureType = featureType.getCopy().getEditable();
2046
        EditableFeatureAttributeDescriptor newAttributeDescriptor = cloneFeatureType.add(
2047
                cloneFeatureType.getNewFieldName(), 
2048
                DataTypes.STRING,
2049
                50);
2050
        this.put(newAttributeDescriptor);
2051
    }
2052

    
2053
    @Override
2054
    public String getName() {
2055
        return StringUtils.defaultIfBlank(this.txtFieldName.getText(), null);
2056
    }
2057

    
2058
    @Override
2059
    public ImageIcon loadImage(String imageName) {
2060
        String name = FilenameUtils.getBaseName(imageName);
2061
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
2062
        if (theme.exists(name)) {
2063
            return theme.get(name);
2064
        }
2065
        URL url = this.getClass().getResource(name + ".png");
2066
        if (url == null) {
2067
            return null;
2068
        }
2069
        return new ImageIcon(url);
2070
    }
2071

    
2072
  public static void selfRegister() {
2073
    IconTheme theme;
2074
    try {
2075
        theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
2076
    } catch(ReferenceNotRegisteredException ex) {
2077
        return;
2078
    }
2079
    String[][] iconNames = new String[][]{
2080
      new String[]{"dalswing", "picker-datatype"},};
2081
    for (String[] icon : iconNames) {
2082
      URL url = DefaultFeatureAttributeSelectionPanel.class.getResource(icon[1] + ".png");
2083
      theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
2084
    }
2085
    
2086
  }
2087

    
2088
}