Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.swing / org.gvsig.fmap.dal.swing.impl / src / main / java / org / gvsig / fmap / dal / swing / impl / featuretype / DefaultFeatureTypeAttributePanel.java @ 44187

History | View | Annotate | Download (31.3 KB)

1 44077 jjdelcerro
package org.gvsig.fmap.dal.swing.impl.featuretype;
2
3 44096 jjdelcerro
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypeAttributePanel;
4 44085 jjdelcerro
import java.awt.event.ItemEvent;
5
import java.awt.event.ItemListener;
6 44077 jjdelcerro
import java.util.ArrayList;
7
import java.util.Comparator;
8
import java.util.List;
9
import javax.swing.DefaultComboBoxModel;
10
import javax.swing.JComponent;
11 44085 jjdelcerro
import javax.swing.JOptionPane;
12
import javax.swing.SwingUtilities;
13
import javax.swing.event.ChangeEvent;
14
import javax.swing.event.ChangeListener;
15 44154 jjdelcerro
import org.apache.commons.lang3.ArrayUtils;
16 44128 jjdelcerro
import org.apache.commons.lang3.StringUtils;
17 44077 jjdelcerro
import org.cresques.cts.IProjection;
18
import org.gvsig.expressionevaluator.Expression;
19
import org.gvsig.expressionevaluator.swing.CalculatorController;
20
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
21
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
22
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
23 44085 jjdelcerro
import org.gvsig.fmap.dal.DALLocator;
24
import org.gvsig.fmap.dal.DataManager;
25 44077 jjdelcerro
import org.gvsig.fmap.dal.DataTypes;
26 44100 jjdelcerro
import org.gvsig.fmap.dal.exception.DataException;
27 44077 jjdelcerro
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
28 44100 jjdelcerro
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
29 44128 jjdelcerro
import org.gvsig.fmap.dal.feature.DataProfile;
30 44077 jjdelcerro
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
31 44100 jjdelcerro
import org.gvsig.fmap.dal.feature.Feature;
32 44077 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
33
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
34 44100 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureStore;
35 44128 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureType;
36 44077 jjdelcerro
import org.gvsig.fmap.dal.swing.DALSwingLocator;
37 44085 jjdelcerro
import org.gvsig.fmap.dal.swing.DataSwingManager;
38 44149 jjdelcerro
import org.gvsig.fmap.dal.swing.expressionevaluator.FeatureStoreElement;
39 44077 jjdelcerro
import org.gvsig.fmap.geom.Geometry;
40 44085 jjdelcerro
import org.gvsig.fmap.geom.GeometryLocator;
41
import org.gvsig.fmap.geom.GeometryManager;
42
import org.gvsig.fmap.geom.type.GeometryType;
43 44077 jjdelcerro
import org.gvsig.timesupport.RelativeInterval;
44
import org.gvsig.tools.ToolsLocator;
45
import org.gvsig.tools.dataTypes.DataTypesManager;
46 44152 jjdelcerro
import org.gvsig.tools.i18n.I18nManager;
47 44077 jjdelcerro
import org.gvsig.tools.swing.api.ListElement;
48
import org.gvsig.tools.swing.api.ToolsSwingLocator;
49
import org.gvsig.tools.swing.api.ToolsSwingManager;
50
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
51
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
52 44085 jjdelcerro
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
53 44128 jjdelcerro
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55 44077 jjdelcerro
56
/**
57
 *
58
 * @author jjdelcerro
59
 */
60 44085 jjdelcerro
@SuppressWarnings("UseSpecificCatch")
61
public class DefaultFeatureTypeAttributePanel
62
        extends FeatureTypeAttributePanelView
63
        implements FeatureTypeAttributePanel {
64 44077 jjdelcerro
65 44128 jjdelcerro
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypeAttributePanel.class);
66
67 44077 jjdelcerro
    private final List<ListElement<Integer>> fieldTypes;
68
    private final List<ListElement<Integer>> geometryTypes;
69
    private final List<ListElement<Integer>> geometrySubtypes;
70 44085 jjdelcerro
71 44077 jjdelcerro
    private DatePickerController pickerIntervalEnd;
72
    private DatePickerController pickerIntervalStart;
73
    private CalculatorController<Integer> pickerSize;
74
    private CalculatorController<Integer> pickerPrecision;
75
    private CalculatorController<Object> pickerDefaultValue;
76
    private PickerController<IProjection> pickerCRS;
77
    private ExpressionPickerController pickerVirtualField;
78
79 44085 jjdelcerro
    private boolean editable;
80 44149 jjdelcerro
    private FeatureStoreElement featureStoreElement;
81 44077 jjdelcerro
82
    public DefaultFeatureTypeAttributePanel() {
83 44085 jjdelcerro
        this.editable = true;
84 44077 jjdelcerro
        DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
85
        this.fieldTypes = new ArrayList<>();
86
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.BOOLEAN), DataTypes.BOOLEAN));
87
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.DATE), DataTypes.DATE));
88
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.TIME), DataTypes.TIME));
89
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.TIMESTAMP), DataTypes.TIMESTAMP));
90
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INT), DataTypes.INT));
91
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.DOUBLE), DataTypes.DOUBLE));
92
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.LONG), DataTypes.LONG));
93
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INTERVAL), DataTypes.INTERVAL));
94 44085 jjdelcerro
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INSTANT), DataTypes.INSTANT));
95 44077 jjdelcerro
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.STRING), DataTypes.STRING));
96 44085 jjdelcerro
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.GEOMETRY), DataTypes.GEOMETRY));
97 44187 jjdelcerro
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.BYTEARRAY), DataTypes.BYTEARRAY));
98 44077 jjdelcerro
        this.fieldTypes.sort(new Comparator<ListElement<Integer>>() {
99
            @Override
100
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
101
                return o1.toString().compareTo(o2.toString());
102
            }
103
        });
104
105
        this.geometryTypes = new ArrayList<>();
106
        this.geometryTypes.add(new ListElement("Point", Geometry.TYPES.POINT));
107
        this.geometryTypes.add(new ListElement("Line", Geometry.TYPES.LINE));
108
        this.geometryTypes.add(new ListElement("Polygon", Geometry.TYPES.POLYGON));
109
        this.geometryTypes.add(new ListElement("MultiPoint", Geometry.TYPES.MULTIPOINT));
110
        this.geometryTypes.add(new ListElement("MultiLine", Geometry.TYPES.MULTILINE));
111
        this.geometryTypes.add(new ListElement("MultiPolygon", Geometry.TYPES.MULTIPOLYGON));
112
        this.geometryTypes.sort(new Comparator<ListElement<Integer>>() {
113
            @Override
114
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
115
                return o1.toString().compareTo(o2.toString());
116
            }
117
        });
118 44085 jjdelcerro
119 44077 jjdelcerro
        this.geometrySubtypes = new ArrayList<>();
120
        this.geometrySubtypes.add(new ListElement("2D", Geometry.SUBTYPES.GEOM2D));
121
        this.geometrySubtypes.add(new ListElement("2DM", Geometry.SUBTYPES.GEOM3D));
122
        this.geometrySubtypes.add(new ListElement("3D", Geometry.SUBTYPES.GEOM2DM));
123
        this.geometrySubtypes.add(new ListElement("3DM", Geometry.SUBTYPES.GEOM3DM));
124
        this.geometrySubtypes.sort(new Comparator<ListElement<Integer>>() {
125
            @Override
126
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
127
                return o1.toString().compareTo(o2.toString());
128
            }
129
        });
130 44085 jjdelcerro
131 44077 jjdelcerro
        this.initComponents();
132
    }
133 44085 jjdelcerro
134 44077 jjdelcerro
    private void initComponents() {
135
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
136
        ExpressionEvaluatorSwingManager evaluatorManager = ExpressionEvaluatorSwingLocator.getManager();
137 44149 jjdelcerro
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
138
139 44077 jjdelcerro
        DefaultComboBoxModel<ListElement<Integer>> modelTypes = new DefaultComboBoxModel<>();
140
        for (ListElement<Integer> element : fieldTypes) {
141
            modelTypes.addElement(element);
142
        }
143
        this.cboFieldType.setModel(modelTypes);
144
145
        DefaultComboBoxModel<ListElement<Integer>> modelGeomTypes = new DefaultComboBoxModel<>();
146
        for (ListElement<Integer> element : this.geometryTypes) {
147
            modelGeomTypes.addElement(element);
148
        }
149
        this.cboGeometryType.setModel(modelGeomTypes);
150
151
        DefaultComboBoxModel<ListElement<Integer>> modelGeomSubtypes = new DefaultComboBoxModel<>();
152
        for (ListElement<Integer> element : this.geometrySubtypes) {
153
            modelGeomSubtypes.addElement(element);
154
        }
155 44085 jjdelcerro
156
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
157
158 44128 jjdelcerro
        swingManager.translate(this.lblAllowNulls);
159
        swingManager.translate(this.lblCRS);
160
        swingManager.translate(this.lblDataProfile);
161
        swingManager.translate(this.lblDateFormat);
162
        swingManager.translate(this.lblDefaultValue);
163
        swingManager.translate(this.lblFieldName);
164
        swingManager.translate(this.lblFieldType);
165
        swingManager.translate(this.lblGeometrySubtype);
166
        swingManager.translate(this.lblGeometryType);
167
        swingManager.translate(this.lblInterval);
168
        swingManager.translate(this.lblIntervalEnd);
169
        swingManager.translate(this.lblIntervalStart);
170
        swingManager.translate(this.lblIsAutomatic);
171
        swingManager.translate(this.lblIsPrimaryKey);
172
        swingManager.translate(this.lblPrecision);
173
        swingManager.translate(this.lblSize);
174
        swingManager.translate(this.chkVirtualField);
175
        swingManager.translate(this.tabAditionalFields);
176
177 44077 jjdelcerro
        swingManager.addClearButton(this.txtDefaultValue);
178
        swingManager.addClearButton(this.txtFieldName);
179
        swingManager.addClearButton(this.txtIntervalEnd);
180
        swingManager.addClearButton(this.txtIntervalStart);
181
        swingManager.addClearButton(this.txtPrecision);
182
        swingManager.addClearButton(this.txtSize);
183 44085 jjdelcerro
184 44077 jjdelcerro
        swingManager.setDefaultPopupMenu(this.txtDefaultValue);
185
        swingManager.setDefaultPopupMenu(this.txtFieldName);
186
        swingManager.setDefaultPopupMenu(this.txtIntervalEnd);
187
        swingManager.setDefaultPopupMenu(this.txtIntervalStart);
188
        swingManager.setDefaultPopupMenu(this.txtPrecision);
189
        swingManager.setDefaultPopupMenu(this.txtSize);
190
        swingManager.setDefaultPopupMenu(this.cboDateFormat);
191
        swingManager.setDefaultPopupMenu(this.cboFieldType);
192
        swingManager.setDefaultPopupMenu(this.cboGeometrySubtype);
193
        swingManager.setDefaultPopupMenu(this.cboGeometryType);
194 44128 jjdelcerro
        swingManager.setDefaultPopupMenu(this.cboDataProfile);
195 44085 jjdelcerro
196 44077 jjdelcerro
        this.pickerIntervalEnd = swingManager.createDatePickerController(
197 44085 jjdelcerro
                this.txtIntervalEnd,
198 44077 jjdelcerro
                this.btnIntervalEnd
199
        );
200
        this.pickerIntervalStart = swingManager.createDatePickerController(
201 44085 jjdelcerro
                this.txtIntervalStart,
202 44077 jjdelcerro
                this.btnIntervalStart
203
        );
204
        this.pickerSize = evaluatorManager.createCalculatorController(
205 44085 jjdelcerro
                this.txtSize, DataTypes.INT
206 44077 jjdelcerro
        );
207
        this.pickerPrecision = evaluatorManager.createCalculatorController(
208 44085 jjdelcerro
                this.txtPrecision, DataTypes.INT
209 44077 jjdelcerro
        );
210
        this.pickerDefaultValue = evaluatorManager.createCalculatorController(
211 44085 jjdelcerro
                this.txtDefaultValue, DataTypes.OBJECT
212 44077 jjdelcerro
        );
213 44085 jjdelcerro
214 44149 jjdelcerro
215 44085 jjdelcerro
        this.btnVirtualField.setText("");
216 44077 jjdelcerro
        this.pickerVirtualField = ExpressionEvaluatorSwingLocator.getManager()
217
                .createExpressionPickerController(txtVirtualField, btnVirtualField);
218 44149 jjdelcerro
        this.featureStoreElement = dataSwingManager.createFeatureStoreElement(
219
                this.pickerVirtualField
220
        );
221
        this.pickerVirtualField.addElement(this.featureStoreElement);
222
        this.chkVirtualField.addChangeListener(new ChangeListener() {
223
            @Override
224
            public void stateChanged(ChangeEvent e) {
225
                if (chkVirtualField.isSelected()) {
226
                    pickerVirtualField.setEnabled(editable);
227
                } else {
228
                    pickerVirtualField.setEnabled(false);
229
                }
230
            }
231
        });
232 44077 jjdelcerro
233 44085 jjdelcerro
234 44149 jjdelcerro
        this.pickerCRS = dataSwingManager.createProjectionPickerController(
235
                this.txtCRS, this.btnCRS
236
        );
237
238 44085 jjdelcerro
        this.cboFieldType.addItemListener(new ItemListener() {
239
            @Override
240
            public void itemStateChanged(ItemEvent e) {
241
                SwingUtilities.invokeLater(new Runnable() {
242
                    @Override
243
                    public void run() {
244
                        doFieldTypeChanged();
245
                    }
246
                });
247
248
            }
249
        });
250
251 44100 jjdelcerro
        this.pickerPrecision.addChangeListener(new ChangeListener() {
252
            @Override
253
            public void stateChanged(ChangeEvent e) {
254
                doCheckSizeAndPrecision();
255
            }
256
        });
257
        this.pickerSize.addChangeListener(new ChangeListener() {
258
            @Override
259
            public void stateChanged(ChangeEvent e) {
260
                doCheckSizeAndPrecision();
261
            }
262
        });
263 44128 jjdelcerro
264
        DefaultComboBoxModel<String> dataProfilesModel = new DefaultComboBoxModel<>();
265
        dataProfilesModel.addElement(" ");
266
        for (DataProfile profile : DALLocator.getDataManager().getDataProfiles()) {
267
            dataProfilesModel.addElement(profile.getName());
268
        }
269
        this.cboDataProfile.setModel(dataProfilesModel);
270 44077 jjdelcerro
    }
271 44085 jjdelcerro
272 44077 jjdelcerro
    @Override
273
    public JComponent asJComponent() {
274
        return this;
275
    }
276
277
    @Override
278
    public EditableFeatureAttributeDescriptor fetch(EditableFeatureAttributeDescriptor descriptor) {
279 44152 jjdelcerro
        I18nManager i18n = ToolsLocator.getI18nManager();
280 44085 jjdelcerro
        try {
281
            descriptor.setDataType((int) ListElement.getSelected(this.cboFieldType));
282
            descriptor.setName(this.txtFieldName.getText());
283
            descriptor.setAllowNull(this.chkAllowNulls.isSelected());
284
            descriptor.setIsPrimaryKey(this.chkIsPrimaryKey.isSelected());
285
            descriptor.setIsAutomatic(this.chkIsAutomatic.isSelected());
286 44152 jjdelcerro
            descriptor.setSize(this.pickerSize.get(0));
287
            descriptor.setPrecision(this.pickerPrecision.get(0));
288 44085 jjdelcerro
            descriptor.setDefaultValue(this.pickerDefaultValue.get());
289 44187 jjdelcerro
            descriptor.setDataProfileName((String) this.cboDataProfile.getSelectedItem());
290 44085 jjdelcerro
            switch (descriptor.getType()) {
291
                case DataTypes.GEOMETRY:
292
                    GeometryManager geomManager = GeometryLocator.getGeometryManager();
293
                    GeometryType geomType = geomManager.getGeometryType(
294
                            (int) ListElement.getSelected(this.cboGeometryType),
295
                            (int) ListElement.getSelected(this.cboGeometrySubtype)
296
                    );
297
                    descriptor.setGeometryType(geomType);
298
                    descriptor.setSRS(this.pickerCRS.get());
299
                    break;
300
                case DataTypes.INSTANT:
301
                case DataTypes.INTERVAL:
302
                case DataTypes.DATE:
303
                case DataTypes.TIME:
304
                case DataTypes.TIMESTAMP:
305
                    // FIXME
306
                    break;
307
                default:
308
                    break;
309
            }
310 44154 jjdelcerro
            descriptor.setDataProfileName(
311
                StringUtils.defaultIfBlank((String) this.cboDataProfile.getSelectedItem(),null)
312
            );
313
314 44085 jjdelcerro
            if( this.chkVirtualField.isSelected() && this.pickerVirtualField.isEnabled() ) {
315
                Expression expression = this.pickerVirtualField.get();
316
                if( expression==null ) {
317
                    descriptor.setFeatureAttributeEmulator(null);
318
                } else {
319
                    DataManager dataManager = DALLocator.getDataManager();
320
                    FeatureAttributeEmulatorExpression emulator = dataManager.createFeatureAttributeEmulatorExpression(
321
                            descriptor.getFeatureType(),
322
                            expression
323
                    );
324 44154 jjdelcerro
                    if( !emulator.isValid() ) {
325
                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
326
                        dialogs.messageDialog(
327
                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+
328
                                    "\n"+
329
                                    emulator.getErrorMessage(),
330
                                i18n.getTranslation("_Warning"),
331
                                JOptionPane.WARNING_MESSAGE
332
                        );
333
                        return null;
334
                    }
335
                    for (String requiredFieldName : emulator.getRequiredFieldNames()) {
336
                        if( StringUtils.equalsIgnoreCase(requiredFieldName, descriptor.getName()) ) {
337
                            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
338
                            dialogs.messageDialog(
339
                                    i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+
340
                                        "\n\n"+
341
                                        i18n.getTranslation("_The_expression_contains_a_reference_to_itself"),
342
                                    i18n.getTranslation("_Warning"),
343
                                    JOptionPane.WARNING_MESSAGE
344
                            );
345
                            return null;
346
                        }
347
                    }
348 44155 jjdelcerro
                    descriptor.setFeatureAttributeEmulator(emulator);
349 44154 jjdelcerro
                    //
350
                    // No se porque esto de abajo no funciona.
351
                    // Nunca se lanza la excepcion en el get(Feature) de
352
                    // DefaultFeatureAttributeEmulatorExpression.
353
                    //
354
//                    try {
355
//                        emulator.setEnableExceptions(true);
356
//                        descriptor.setFeatureAttributeEmulator(emulator);
357
//                        this.pickerVirtualField.getPreviewSymbolTable().value(descriptor.getName());
358
//                    } catch(Throwable ex) {
359
//                        emulator.setEnableExceptions(false);
360
//                        descriptor.setFeatureAttributeEmulator(null);
361
//                        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
362
//                        dialogs.messageDialog(
363
//                                i18n.getTranslation("_The_expression_of_virtual_field_is_not_valid")+
364
//                                    "\n"+
365
//                                    ex.getMessage(),
366
//                                i18n.getTranslation("_Warning"),
367
//                                JOptionPane.WARNING_MESSAGE
368
//                        );
369
//                        return null;
370
//                    } finally {
371
//                        emulator.setEnableExceptions(false);
372
//                    }
373 44085 jjdelcerro
                }
374
            }
375
        } catch (Exception ex) {
376 44152 jjdelcerro
            LOGGER.warn("Can't retrieve information from user form.",ex);
377 44085 jjdelcerro
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
378
            dialogs.messageDialog(
379 44152 jjdelcerro
                    i18n.getTranslation("_Cant_retrieve_information_from_user_form")+
380
                        "\n"+
381
                        i18n.getTranslation("_See_log_for_details"),
382
                    i18n.getTranslation("_Warning"),
383 44085 jjdelcerro
                    JOptionPane.WARNING_MESSAGE
384
            );
385 44152 jjdelcerro
            return null;
386 44085 jjdelcerro
        }
387 44077 jjdelcerro
        return descriptor;
388
    }
389
390
    public void clean() {
391
        this.pickerDefaultValue.set(null);
392 44100 jjdelcerro
        this.txtFieldName.setText("");
393
//        this.pickerFieldName.set(null);
394 44077 jjdelcerro
        this.pickerIntervalEnd.set(null);
395
        this.pickerIntervalStart.set(null);
396
        this.pickerPrecision.set(null);
397
        this.pickerSize.set(null);
398
399
        this.chkAllowNulls.setSelected(false);
400
        this.chkIsAutomatic.setSelected(false);
401
        this.chkIsPrimaryKey.setSelected(false);
402 44085 jjdelcerro
403 44077 jjdelcerro
        this.chkVirtualField.setSelected(false);
404 44085 jjdelcerro
        this.chkVirtualField.setEnabled(editable);
405 44077 jjdelcerro
        this.pickerVirtualField.setEnabled(false);
406
        this.pickerVirtualField.set(null);
407
408
        ListElement.setSelected(cboGeometryType, null);
409
        ListElement.setSelected(cboGeometrySubtype, null);
410 44085 jjdelcerro
411
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
412 44128 jjdelcerro
413
        this.cboDataProfile.setSelectedIndex(-1);
414 44077 jjdelcerro
    }
415 44085 jjdelcerro
416 44077 jjdelcerro
    @Override
417
    public void put(FeatureAttributeDescriptor descriptor) {
418 44085 jjdelcerro
        if (descriptor == null) {
419 44077 jjdelcerro
            this.clean();
420
            return;
421
        }
422 44094 jjdelcerro
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
423 44100 jjdelcerro
        if( descriptor.getFeatureType()!=null ) {
424
            FeatureStore store = descriptor.getFeatureType().getStore();
425 44149 jjdelcerro
            this.featureStoreElement.setFeatureStore(store);
426
            if( store != null ) {
427 44100 jjdelcerro
                Feature sampleFeature = null;
428
                try {
429
                    sampleFeature = store.getFeatureSelection().first();
430
                    if( sampleFeature == null ) {
431
                        sampleFeature = store.first();
432
                    }
433
                } catch (DataException ex) {
434
                }
435
                if( sampleFeature!=null ) {
436
                    FeatureSymbolTable featureSymbolTable = DALLocator.getDataManager().createFeatureSymbolTable();
437
                    featureSymbolTable.setFeature(sampleFeature);
438
                    this.pickerVirtualField.setPreviewSymbolTable(featureSymbolTable.createParent());
439
                }
440
            }
441 44085 jjdelcerro
        }
442 44094 jjdelcerro
        if (!(descriptor instanceof EditableFeatureAttributeDescriptor)) {
443
            this.setEditable(false);
444
        }
445 44085 jjdelcerro
446 44077 jjdelcerro
        this.pickerDefaultValue.set(descriptor.getDefaultValue());
447 44100 jjdelcerro
        this.txtFieldName.setText(descriptor.getName());
448 44077 jjdelcerro
        RelativeInterval interval = (RelativeInterval) descriptor.getInterval();
449 44085 jjdelcerro
        if (interval == null) {
450
            this.pickerIntervalEnd.set(null);
451
            this.pickerIntervalStart.set(null);
452 44077 jjdelcerro
        } else {
453
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
454
            this.pickerIntervalStart.set(interval.getStart().toDate());
455
        }
456
        this.pickerPrecision.set(descriptor.getPrecision());
457
        this.pickerSize.set(descriptor.getSize());
458 44085 jjdelcerro
459 44077 jjdelcerro
        this.chkAllowNulls.setSelected(descriptor.allowNull());
460
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
461
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
462 44085 jjdelcerro
463 44077 jjdelcerro
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
464 44085 jjdelcerro
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
465 44077 jjdelcerro
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
466 44085 jjdelcerro
            this.chkVirtualField.setEnabled(editable);
467 44077 jjdelcerro
            this.chkVirtualField.setSelected(true);
468 44085 jjdelcerro
            this.pickerVirtualField.setEnabled(editable);
469 44077 jjdelcerro
            this.pickerVirtualField.set(expression);
470 44085 jjdelcerro
        } else if (descriptor.isComputed()) {
471
            this.chkVirtualField.setEnabled(false);
472 44077 jjdelcerro
            this.chkVirtualField.setSelected(true);
473
            this.pickerVirtualField.setEnabled(false);
474
            this.pickerVirtualField.set(null);
475
        } else {
476 44085 jjdelcerro
            this.chkVirtualField.setEnabled(editable);
477 44077 jjdelcerro
            this.chkVirtualField.setSelected(false);
478
            this.pickerVirtualField.setEnabled(false);
479
            this.pickerVirtualField.set(null);
480
        }
481 44085 jjdelcerro
482 44077 jjdelcerro
        this.pickerCRS.set(descriptor.getSRS());
483 44085 jjdelcerro
484
        if (descriptor.getGeomType() != null) {
485 44079 jjdelcerro
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
486
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
487
        }
488 44085 jjdelcerro
        ListElement.setSelected(cboFieldType, descriptor.getType());
489
490 44128 jjdelcerro
        String profile = descriptor.getDataProfileName();
491
        if( StringUtils.isBlank(profile) ) {
492
            this.cboDataProfile.setSelectedIndex(-1);
493
        } else {
494
           this.cboDataProfile.setSelectedItem(profile);
495
        }
496 44077 jjdelcerro
    }
497
498 44085 jjdelcerro
    private void doFieldTypeChanged() {
499
        try {
500
            Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
501
            if (fieldType == null) {
502
                fieldType = DataTypes.UNKNOWN;
503
            }
504 44128 jjdelcerro
            Integer size = this.pickerSize.get();
505
            if( fieldType == DataTypes.STRING ) {
506
                if( size == null ) {
507
                    this.pickerSize.set(50);
508
                }
509
            } else {
510 44100 jjdelcerro
                int maxsize = this.getMaxSizeOfType(fieldType);
511 44128 jjdelcerro
                if( size==null || (maxsize>0 && size>maxsize) ) {
512 44100 jjdelcerro
                    this.pickerSize.set(maxsize);
513
                }
514
            }
515 44128 jjdelcerro
            Integer precision = this.pickerPrecision.get();
516
            if( precision==null ) {
517
                int defaultPrecision = this.getDefaultPrecisionOfType(fieldType);
518
                if( defaultPrecision>0 ) {
519
                    this.pickerPrecision.set(defaultPrecision);
520
                }
521
            }
522
523 44085 jjdelcerro
            switch (fieldType) {
524
                case DataTypes.GEOMETRY:
525
                    this.cboGeometryType.setEnabled(editable);
526
                    this.cboGeometrySubtype.setEnabled(editable);
527
                    this.pickerCRS.setEnabled(editable);
528
                    this.cboDateFormat.setEnabled(false);
529
                    this.pickerIntervalStart.setEnabled(false);
530
                    this.pickerIntervalEnd.setEditable(false);
531
                    this.tabAditionalFields.setEnabledAt(1, true);
532
                    this.tabAditionalFields.setEnabledAt(2, false);
533 44100 jjdelcerro
                    this.pickerSize.set(null);
534
                    this.pickerPrecision.set(null);
535
                    this.pickerSize.setEnabled(false);
536
                    this.pickerPrecision.setEnabled(false);
537 44085 jjdelcerro
                    break;
538
                case DataTypes.INSTANT:
539
                case DataTypes.INTERVAL:
540
                case DataTypes.DATE:
541
                case DataTypes.TIME:
542
                case DataTypes.TIMESTAMP:
543
                    this.cboGeometryType.setEnabled(false);
544
                    this.cboGeometrySubtype.setEnabled(false);
545
                    this.pickerCRS.setEnabled(false);
546
                    this.cboDateFormat.setEnabled(editable);
547
                    this.pickerIntervalStart.setEnabled(editable);
548 44100 jjdelcerro
                    this.pickerIntervalEnd.setEnabled(editable);
549 44085 jjdelcerro
                    this.tabAditionalFields.setEnabledAt(1, false);
550
                    this.tabAditionalFields.setEnabledAt(2, true);
551 44100 jjdelcerro
                    this.pickerSize.set(null);
552
                    this.pickerPrecision.set(null);
553
                    this.pickerSize.setEnabled(false);
554
                    this.pickerPrecision.setEnabled(false);
555 44085 jjdelcerro
                    break;
556 44100 jjdelcerro
                case DataTypes.BYTE:
557
                case DataTypes.INT:
558
                case DataTypes.LONG:
559
                case DataTypes.STRING:
560
                    this.cboGeometryType.setEnabled(false);
561
                    this.cboGeometrySubtype.setEnabled(false);
562
                    this.pickerCRS.setEnabled(false);
563
                    this.cboDateFormat.setEnabled(false);
564
                    this.pickerIntervalStart.setEnabled(false);
565
                    this.pickerIntervalEnd.setEditable(false);
566
                    this.tabAditionalFields.setEnabledAt(1, false);
567
                    this.tabAditionalFields.setEnabledAt(2, false);
568
569
                    this.pickerPrecision.set(null);
570
                    this.pickerSize.setEnabled(true);
571
                    this.pickerPrecision.setEnabled(false);
572
                    break;
573
                case DataTypes.FLOAT:
574
                case DataTypes.DOUBLE:
575
                    this.cboGeometryType.setEnabled(false);
576
                    this.cboGeometrySubtype.setEnabled(false);
577
                    this.pickerCRS.setEnabled(false);
578
                    this.cboDateFormat.setEnabled(false);
579
                    this.pickerIntervalStart.setEnabled(false);
580
                    this.pickerIntervalEnd.setEditable(false);
581
                    this.tabAditionalFields.setEnabledAt(1, false);
582
                    this.tabAditionalFields.setEnabledAt(2, false);
583
584
                    this.pickerSize.setEnabled(true);
585
                    this.pickerPrecision.setEnabled(true);
586
                    break;
587 44085 jjdelcerro
                default:
588
                    this.cboGeometryType.setEnabled(false);
589
                    this.cboGeometrySubtype.setEnabled(false);
590
                    this.pickerCRS.setEnabled(false);
591
                    this.cboDateFormat.setEnabled(false);
592
                    this.pickerIntervalStart.setEnabled(false);
593
                    this.pickerIntervalEnd.setEditable(false);
594
                    this.tabAditionalFields.setEnabledAt(1, false);
595
                    this.tabAditionalFields.setEnabledAt(2, false);
596 44100 jjdelcerro
                    this.pickerSize.set(null);
597
                    this.pickerPrecision.set(null);
598
                    this.pickerSize.setEnabled(false);
599
                    this.pickerPrecision.setEnabled(false);
600 44085 jjdelcerro
            }
601
        } catch (Exception ex) {
602 44128 jjdelcerro
            LOGGER.warn("Problems changing field type.",ex);
603 44085 jjdelcerro
        }
604 44100 jjdelcerro
605 44077 jjdelcerro
    }
606 44085 jjdelcerro
607
    public void setEditable(boolean editable) {
608
        this.editable = editable;
609
        this.pickerDefaultValue.setEditable(editable);
610 44100 jjdelcerro
        this.txtFieldName.setEditable(editable);
611
//        this.pickerFieldName.setEditable(editable);
612 44085 jjdelcerro
        this.pickerIntervalEnd.setEditable(editable);
613
        this.pickerIntervalStart.setEditable(editable);
614
        this.pickerPrecision.setEditable(editable);
615
        this.pickerSize.setEditable(editable);
616 44128 jjdelcerro
        this.cboDataProfile.setEnabled(editable);
617 44085 jjdelcerro
618
        this.chkAllowNulls.setEnabled(editable);
619
        this.chkIsAutomatic.setEnabled(editable);
620
        this.chkIsPrimaryKey.setEnabled(editable);
621
622
        this.chkVirtualField.setEnabled(editable);
623
        this.pickerVirtualField.setEditable(editable);
624
625
        this.cboDateFormat.setEnabled(editable);
626
        this.cboFieldType.setEnabled(editable);
627
        this.cboGeometryType.setEnabled(editable);
628
        this.cboGeometrySubtype.setEnabled(editable);
629
630
    }
631 44100 jjdelcerro
632
    private int getMaxSizeOfType(int dataType) {
633
        switch(dataType) {
634
            case DataTypes.BOOLEAN:
635
                return 1;
636
            case DataTypes.BYTE:
637
                return 3;
638
            case DataTypes.INT:
639
                return 9;
640
            case DataTypes.LONG:
641
                return 19;
642
            case DataTypes.FLOAT:
643
                return 20;
644
            case DataTypes.DOUBLE:
645
                return 20;
646
            case DataTypes.DATE:
647
                return 8;
648
            default:
649
                return -1;
650
        }
651
    }
652
653 44128 jjdelcerro
    private int getDefaultPrecisionOfType(int dataType) {
654
        switch(dataType) {
655
            case DataTypes.FLOAT:
656
                return 6;
657
            case DataTypes.DOUBLE:
658
                return 6;
659
            default:
660
                return -1;
661
        }
662
    }
663
664 44100 jjdelcerro
    private void doCheckSizeAndPrecision() {
665
        Integer size = this.pickerSize.get();
666
        if( size == null ) {
667
            return;
668
        }
669
        int maxsize = this.getMaxSizeOfType((int) ListElement.getSelected(cboFieldType));
670
        if( size<1 || (maxsize>0 && size>maxsize) ) {
671
            this.pickerSize.setWarning(true, "The size is not valid for the selected type");
672
        } else {
673
            this.pickerSize.setWarning(false);
674
        }
675
        if( this.pickerPrecision.isEnabled() ) {
676
            Integer precision = this.pickerPrecision.get();
677
            if( precision == null ) {
678
                return ;
679
            }
680
            if( precision < 0 ) {
681
                this.pickerPrecision.setWarning(true, "the precision can not have a negative value");
682
            } else if( precision>size ) {
683
                this.pickerPrecision.setWarning(true, "the precision can not have a value greater than the size");
684
            } else {
685
                this.pickerPrecision.setWarning(false);
686
            }
687
        }
688
    }
689
690 44128 jjdelcerro
    @Override
691
    public void setNameAsNew(FeatureType featureType) {
692
        this.txtFieldName.setText(DefaultFeatureTypePanel.getNewFieldName(featureType));
693
    }
694
695
    @Override
696
    public String getName() {
697
        return StringUtils.defaultIfBlank(this.txtFieldName.getText(), null);
698
    }
699
700
701 44077 jjdelcerro
}