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

History | View | Annotate | Download (19.4 KB)

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

    
3
import com.vividsolutions.jts.operation.distance.GeometryLocation;
4
import java.awt.event.ItemEvent;
5
import java.awt.event.ItemListener;
6
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
import javax.swing.JOptionPane;
12
import javax.swing.SwingUtilities;
13
import javax.swing.event.ChangeEvent;
14
import javax.swing.event.ChangeListener;
15
import org.cresques.cts.IProjection;
16
import org.gvsig.expressionevaluator.Expression;
17
import org.gvsig.expressionevaluator.swing.CalculatorController;
18
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
19
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
20
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
21
import org.gvsig.fmap.dal.DALLocator;
22
import org.gvsig.fmap.dal.DataManager;
23
import org.gvsig.fmap.dal.DataTypes;
24
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
25
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
26
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
27
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
28
import org.gvsig.fmap.dal.swing.DALSwingLocator;
29
import org.gvsig.fmap.dal.swing.DataSwingManager;
30
import org.gvsig.fmap.geom.Geometry;
31
import org.gvsig.fmap.geom.GeometryLocator;
32
import org.gvsig.fmap.geom.GeometryManager;
33
import org.gvsig.fmap.geom.type.GeometryType;
34
import org.gvsig.timesupport.RelativeInterval;
35
import org.gvsig.tools.ToolsLocator;
36
import org.gvsig.tools.dataTypes.DataTypesManager;
37
import org.gvsig.tools.swing.api.ListElement;
38
import org.gvsig.tools.swing.api.ToolsSwingLocator;
39
import org.gvsig.tools.swing.api.ToolsSwingManager;
40
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
41
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
42
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
43

    
44
/**
45
 *
46
 * @author jjdelcerro
47
 */
48
@SuppressWarnings("UseSpecificCatch")
49
public class DefaultFeatureTypeAttributePanel
50
        extends FeatureTypeAttributePanelView
51
        implements FeatureTypeAttributePanel {
52

    
53
    private final List<ListElement<Integer>> fieldTypes;
54
    private final List<ListElement<Integer>> geometryTypes;
55
    private final List<ListElement<Integer>> geometrySubtypes;
56

    
57
    private DatePickerController pickerIntervalEnd;
58
    private DatePickerController pickerIntervalStart;
59
    private CalculatorController<Integer> pickerSize;
60
    private CalculatorController<Integer> pickerPrecision;
61
    private CalculatorController<Object> pickerDefaultValue;
62
    private CalculatorController<String> pickerFieldName;
63
    private PickerController<IProjection> pickerCRS;
64
    private ExpressionPickerController pickerVirtualField;
65

    
66
    private boolean editable;
67

    
68
    public DefaultFeatureTypeAttributePanel() {
69
        this.editable = true;
70
        DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
71
        this.fieldTypes = new ArrayList<>();
72
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.BOOLEAN), DataTypes.BOOLEAN));
73
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.DATE), DataTypes.DATE));
74
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.TIME), DataTypes.TIME));
75
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.TIMESTAMP), DataTypes.TIMESTAMP));
76
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INT), DataTypes.INT));
77
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.DOUBLE), DataTypes.DOUBLE));
78
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.LONG), DataTypes.LONG));
79
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INTERVAL), DataTypes.INTERVAL));
80
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.INSTANT), DataTypes.INSTANT));
81
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.STRING), DataTypes.STRING));
82
        this.fieldTypes.add(new ListElement<>(dataManager.getTypeName(DataTypes.GEOMETRY), DataTypes.GEOMETRY));
83
        this.fieldTypes.sort(new Comparator<ListElement<Integer>>() {
84
            @Override
85
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
86
                return o1.toString().compareTo(o2.toString());
87
            }
88
        });
89

    
90
        this.geometryTypes = new ArrayList<>();
91
        this.geometryTypes.add(new ListElement("Point", Geometry.TYPES.POINT));
92
        this.geometryTypes.add(new ListElement("Line", Geometry.TYPES.LINE));
93
        this.geometryTypes.add(new ListElement("Polygon", Geometry.TYPES.POLYGON));
94
        this.geometryTypes.add(new ListElement("MultiPoint", Geometry.TYPES.MULTIPOINT));
95
        this.geometryTypes.add(new ListElement("MultiLine", Geometry.TYPES.MULTILINE));
96
        this.geometryTypes.add(new ListElement("MultiPolygon", Geometry.TYPES.MULTIPOLYGON));
97
        this.geometryTypes.sort(new Comparator<ListElement<Integer>>() {
98
            @Override
99
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
100
                return o1.toString().compareTo(o2.toString());
101
            }
102
        });
103

    
104
        this.geometrySubtypes = new ArrayList<>();
105
        this.geometrySubtypes.add(new ListElement("2D", Geometry.SUBTYPES.GEOM2D));
106
        this.geometrySubtypes.add(new ListElement("2DM", Geometry.SUBTYPES.GEOM3D));
107
        this.geometrySubtypes.add(new ListElement("3D", Geometry.SUBTYPES.GEOM2DM));
108
        this.geometrySubtypes.add(new ListElement("3DM", Geometry.SUBTYPES.GEOM3DM));
109
        this.geometrySubtypes.sort(new Comparator<ListElement<Integer>>() {
110
            @Override
111
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
112
                return o1.toString().compareTo(o2.toString());
113
            }
114
        });
115

    
116
        this.initComponents();
117
    }
118

    
119
    private void initComponents() {
120
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
121
        ExpressionEvaluatorSwingManager evaluatorManager = ExpressionEvaluatorSwingLocator.getManager();
122

    
123
        DefaultComboBoxModel<ListElement<Integer>> modelTypes = new DefaultComboBoxModel<>();
124
        for (ListElement<Integer> element : fieldTypes) {
125
            modelTypes.addElement(element);
126
        }
127
        this.cboFieldType.setModel(modelTypes);
128

    
129
        DefaultComboBoxModel<ListElement<Integer>> modelGeomTypes = new DefaultComboBoxModel<>();
130
        for (ListElement<Integer> element : this.geometryTypes) {
131
            modelGeomTypes.addElement(element);
132
        }
133
        this.cboGeometryType.setModel(modelGeomTypes);
134

    
135
        DefaultComboBoxModel<ListElement<Integer>> modelGeomSubtypes = new DefaultComboBoxModel<>();
136
        for (ListElement<Integer> element : this.geometrySubtypes) {
137
            modelGeomSubtypes.addElement(element);
138
        }
139

    
140
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
141

    
142
        swingManager.addClearButton(this.txtDefaultValue);
143
        swingManager.addClearButton(this.txtFieldName);
144
        swingManager.addClearButton(this.txtIntervalEnd);
145
        swingManager.addClearButton(this.txtIntervalStart);
146
        swingManager.addClearButton(this.txtPrecision);
147
        swingManager.addClearButton(this.txtSize);
148

    
149
        swingManager.setDefaultPopupMenu(this.txtDefaultValue);
150
        swingManager.setDefaultPopupMenu(this.txtFieldName);
151
        swingManager.setDefaultPopupMenu(this.txtIntervalEnd);
152
        swingManager.setDefaultPopupMenu(this.txtIntervalStart);
153
        swingManager.setDefaultPopupMenu(this.txtPrecision);
154
        swingManager.setDefaultPopupMenu(this.txtSize);
155
        swingManager.setDefaultPopupMenu(this.cboDateFormat);
156
        swingManager.setDefaultPopupMenu(this.cboFieldType);
157
        swingManager.setDefaultPopupMenu(this.cboGeometrySubtype);
158
        swingManager.setDefaultPopupMenu(this.cboGeometryType);
159

    
160
        this.pickerIntervalEnd = swingManager.createDatePickerController(
161
                this.txtIntervalEnd,
162
                this.btnIntervalEnd
163
        );
164
        this.pickerIntervalStart = swingManager.createDatePickerController(
165
                this.txtIntervalStart,
166
                this.btnIntervalStart
167
        );
168
        this.pickerSize = evaluatorManager.createCalculatorController(
169
                this.txtSize, DataTypes.INT
170
        );
171
        this.pickerPrecision = evaluatorManager.createCalculatorController(
172
                this.txtPrecision, DataTypes.INT
173
        );
174
        this.pickerFieldName = evaluatorManager.createCalculatorController(
175
                this.txtFieldName, DataTypes.STRING
176
        );
177
        this.pickerDefaultValue = evaluatorManager.createCalculatorController(
178
                this.txtDefaultValue, DataTypes.OBJECT
179
        );
180

    
181
        this.btnVirtualField.setText("");
182
        this.pickerVirtualField = ExpressionEvaluatorSwingLocator.getManager()
183
                .createExpressionPickerController(txtVirtualField, btnVirtualField);
184

    
185
        this.pickerCRS = DALSwingLocator.getSwingManager()
186
                .createProjectionPickerController(this.txtCRS, this.btnCRS);
187

    
188
        this.cboFieldType.addItemListener(new ItemListener() {
189
            @Override
190
            public void itemStateChanged(ItemEvent e) {
191
                SwingUtilities.invokeLater(new Runnable() {
192
                    @Override
193
                    public void run() {
194
                        doFieldTypeChanged();
195
                    }
196
                });
197

    
198
            }
199
        });
200

    
201
        this.chkVirtualField.addChangeListener(new ChangeListener() {
202
            @Override
203
            public void stateChanged(ChangeEvent e) {
204
                if (chkVirtualField.isSelected()) {
205
                    pickerVirtualField.setEnabled(editable);
206
                } else {
207
                    pickerVirtualField.setEnabled(false);
208
                }
209
            }
210
        });
211
    }
212

    
213
    @Override
214
    public JComponent asJComponent() {
215
        return this;
216
    }
217

    
218
    @Override
219
    public EditableFeatureAttributeDescriptor fetch(EditableFeatureAttributeDescriptor descriptor) {
220
        try {
221
            descriptor.setDataType((int) ListElement.getSelected(this.cboFieldType));
222
            descriptor.setName(this.txtFieldName.getText());
223
            descriptor.setAllowNull(this.chkAllowNulls.isSelected());
224
            descriptor.setIsPrimaryKey(this.chkIsPrimaryKey.isSelected());
225
            descriptor.setIsAutomatic(this.chkIsAutomatic.isSelected());
226
            descriptor.setSize(this.pickerSize.get());
227
            descriptor.setPrecision(this.pickerPrecision.get());
228
            descriptor.setDefaultValue(this.pickerDefaultValue.get());
229
            switch (descriptor.getType()) {
230
                case DataTypes.GEOMETRY:
231
                    GeometryManager geomManager = GeometryLocator.getGeometryManager();
232
                    GeometryType geomType = geomManager.getGeometryType(
233
                            (int) ListElement.getSelected(this.cboGeometryType),
234
                            (int) ListElement.getSelected(this.cboGeometrySubtype)
235
                    );
236
                    descriptor.setGeometryType(geomType);
237
                    descriptor.setSRS(this.pickerCRS.get());
238
                    break;
239
                case DataTypes.INSTANT:
240
                case DataTypes.INTERVAL:
241
                case DataTypes.DATE:
242
                case DataTypes.TIME:
243
                case DataTypes.TIMESTAMP:
244
                    // FIXME
245
                    break;
246
                default:
247
                    break;
248
            }
249
            if( this.chkVirtualField.isSelected() && this.pickerVirtualField.isEnabled() ) {
250
                Expression expression = this.pickerVirtualField.get();
251
                if( expression==null ) {
252
                    descriptor.setFeatureAttributeEmulator(null);
253
                } else {
254
                    DataManager dataManager = DALLocator.getDataManager();
255
                    FeatureAttributeEmulatorExpression emulator = dataManager.createFeatureAttributeEmulatorExpression(
256
                            descriptor.getFeatureType(),
257
                            expression
258
                    );
259
                    descriptor.setFeatureAttributeEmulator(emulator);
260
                }
261
            }
262
        } catch (Exception ex) {
263
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
264
            dialogs.messageDialog(
265
                    "Can't retrieve information from user form.", 
266
                    "Warning", 
267
                    JOptionPane.WARNING_MESSAGE
268
            );
269
        }
270
        return descriptor;
271
    }
272

    
273
    public void clean() {
274
        this.pickerDefaultValue.set(null);
275
        this.pickerFieldName.set(null);
276
        this.pickerIntervalEnd.set(null);
277
        this.pickerIntervalStart.set(null);
278
        this.pickerPrecision.set(null);
279
        this.pickerSize.set(null);
280

    
281
        this.chkAllowNulls.setSelected(false);
282
        this.chkIsAutomatic.setSelected(false);
283
        this.chkIsPrimaryKey.setSelected(false);
284

    
285
        this.chkVirtualField.setSelected(false);
286
        this.chkVirtualField.setEnabled(editable);
287
        this.pickerVirtualField.setEnabled(false);
288
        this.pickerVirtualField.set(null);
289

    
290
        ListElement.setSelected(cboGeometryType, null);
291
        ListElement.setSelected(cboGeometrySubtype, null);
292

    
293
        ListElement.setSelected(cboFieldType, DataTypes.STRING);
294
    }
295

    
296
    @Override
297
    public void put(FeatureAttributeDescriptor descriptor) {
298
        if (descriptor == null) {
299
            this.clean();
300
            return;
301
        }
302
        if (!(descriptor instanceof EditableFeatureAttributeDescriptor)) {
303
            this.setEditable(false);
304
        }
305
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
306
        this.pickerVirtualField = ExpressionEvaluatorSwingLocator.getManager()
307
                .createExpressionPickerController(txtVirtualField, btnVirtualField);
308
        if( descriptor.getFeatureType()!=null && descriptor.getFeatureType().getStore()!=null ) {
309
            this.pickerVirtualField.addElement(
310
                expressionSwingManager.createElement(
311
                        DataSwingManager.FEATURE_STORE_EXPRESSION_ELEMENT,
312
                        this.pickerVirtualField,
313
                        descriptor.getFeatureType().getStore()
314
                )
315
            );
316
        }
317
                
318
        this.pickerDefaultValue.set(descriptor.getDefaultValue());
319
        this.pickerFieldName.set(descriptor.getName());
320
        RelativeInterval interval = (RelativeInterval) descriptor.getInterval();
321
        if (interval == null) {
322
            this.pickerIntervalEnd.set(null);
323
            this.pickerIntervalStart.set(null);
324
        } else {
325
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
326
            this.pickerIntervalStart.set(interval.getStart().toDate());
327
        }
328
        this.pickerPrecision.set(descriptor.getPrecision());
329
        this.pickerSize.set(descriptor.getSize());
330

    
331
        this.chkAllowNulls.setSelected(descriptor.allowNull());
332
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
333
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
334

    
335
        FeatureAttributeEmulator attrEmulator = descriptor.getFeatureAttributeEmulator();
336
        if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
337
            Expression expression = ((FeatureAttributeEmulatorExpression) attrEmulator).getExpression();
338
            this.chkVirtualField.setEnabled(editable);
339
            this.chkVirtualField.setSelected(true);
340
            this.pickerVirtualField.setEnabled(editable);
341
            this.pickerVirtualField.set(expression);
342
        } else if (descriptor.isComputed()) {
343
            this.chkVirtualField.setEnabled(false);
344
            this.chkVirtualField.setSelected(true);
345
            this.pickerVirtualField.setEnabled(false);
346
            this.pickerVirtualField.set(null);
347
        } else {
348
            this.chkVirtualField.setEnabled(editable);
349
            this.chkVirtualField.setSelected(false);
350
            this.pickerVirtualField.setEnabled(false);
351
            this.pickerVirtualField.set(null);
352
        }
353

    
354
        this.pickerCRS.set(descriptor.getSRS());
355

    
356
        if (descriptor.getGeomType() != null) {
357
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
358
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
359
        }
360
        ListElement.setSelected(cboFieldType, descriptor.getType());
361

    
362
    }
363

    
364
    private void doFieldTypeChanged() {
365
        try {
366
            Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
367
            if (fieldType == null) {
368
                fieldType = DataTypes.UNKNOWN;
369
            }
370
            switch (fieldType) {
371
                case DataTypes.GEOMETRY:
372
                    this.cboGeometryType.setEnabled(editable);
373
                    this.cboGeometrySubtype.setEnabled(editable);
374
                    this.pickerCRS.setEnabled(editable);
375
                    this.cboDateFormat.setEnabled(false);
376
                    this.pickerIntervalStart.setEnabled(false);
377
                    this.pickerIntervalEnd.setEditable(false);
378
                    this.tabAditionalFields.setEnabledAt(1, true);
379
                    this.tabAditionalFields.setEnabledAt(2, false);
380
                    break;
381
                case DataTypes.INSTANT:
382
                case DataTypes.INTERVAL:
383
                case DataTypes.DATE:
384
                case DataTypes.TIME:
385
                case DataTypes.TIMESTAMP:
386
                    this.cboGeometryType.setEnabled(false);
387
                    this.cboGeometrySubtype.setEnabled(false);
388
                    this.pickerCRS.setEnabled(false);
389
                    this.cboDateFormat.setEnabled(editable);
390
                    this.pickerIntervalStart.setEnabled(editable);
391
                    this.pickerIntervalEnd.setEditable(editable);
392
                    this.tabAditionalFields.setEnabledAt(1, false);
393
                    this.tabAditionalFields.setEnabledAt(2, true);
394
                    break;
395
                default:
396
                    this.cboGeometryType.setEnabled(false);
397
                    this.cboGeometrySubtype.setEnabled(false);
398
                    this.pickerCRS.setEnabled(false);
399
                    this.cboDateFormat.setEnabled(false);
400
                    this.pickerIntervalStart.setEnabled(false);
401
                    this.pickerIntervalEnd.setEditable(false);
402
                    this.tabAditionalFields.setEnabledAt(1, false);
403
                    this.tabAditionalFields.setEnabledAt(2, false);
404
            }
405
        } catch (Exception ex) {
406

    
407
        }
408
    }
409

    
410
    public void setEditable(boolean editable) {
411
        this.editable = editable;
412
        this.pickerDefaultValue.setEditable(editable);
413
        this.pickerFieldName.setEditable(editable);
414
        this.pickerIntervalEnd.setEditable(editable);
415
        this.pickerIntervalStart.setEditable(editable);
416
        this.pickerPrecision.setEditable(editable);
417
        this.pickerSize.setEditable(editable);
418

    
419
        this.chkAllowNulls.setEnabled(editable);
420
        this.chkIsAutomatic.setEnabled(editable);
421
        this.chkIsPrimaryKey.setEnabled(editable);
422

    
423
        this.chkVirtualField.setEnabled(editable);
424
        this.pickerVirtualField.setEditable(editable);
425

    
426
        this.cboDateFormat.setEnabled(editable);
427
        this.cboFieldType.setEnabled(editable);
428
        this.cboGeometryType.setEnabled(editable);
429
        this.cboGeometrySubtype.setEnabled(editable);
430

    
431
    }
432
}