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

History | View | Annotate | Download (19.5 KB)

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

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

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

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

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

    
67
    private boolean editable;
68

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

    
91
        this.geometryTypes = new ArrayList<>();
92
        this.geometryTypes.add(new ListElement("Point", Geometry.TYPES.POINT));
93
        this.geometryTypes.add(new ListElement("Line", Geometry.TYPES.LINE));
94
        this.geometryTypes.add(new ListElement("Polygon", Geometry.TYPES.POLYGON));
95
        this.geometryTypes.add(new ListElement("MultiPoint", Geometry.TYPES.MULTIPOINT));
96
        this.geometryTypes.add(new ListElement("MultiLine", Geometry.TYPES.MULTILINE));
97
        this.geometryTypes.add(new ListElement("MultiPolygon", Geometry.TYPES.MULTIPOLYGON));
98
        this.geometryTypes.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.geometrySubtypes = new ArrayList<>();
106
        this.geometrySubtypes.add(new ListElement("2D", Geometry.SUBTYPES.GEOM2D));
107
        this.geometrySubtypes.add(new ListElement("2DM", Geometry.SUBTYPES.GEOM3D));
108
        this.geometrySubtypes.add(new ListElement("3D", Geometry.SUBTYPES.GEOM2DM));
109
        this.geometrySubtypes.add(new ListElement("3DM", Geometry.SUBTYPES.GEOM3DM));
110
        this.geometrySubtypes.sort(new Comparator<ListElement<Integer>>() {
111
            @Override
112
            public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
113
                return o1.toString().compareTo(o2.toString());
114
            }
115
        });
116

    
117
        this.initComponents();
118
    }
119

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

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

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

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

    
141
        this.cboGeometrySubtype.setModel(modelGeomSubtypes);
142

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

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

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

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

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

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

    
199
            }
200
        });
201

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

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

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

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

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

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

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

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

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

    
335
        this.chkAllowNulls.setSelected(descriptor.allowNull());
336
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
337
        this.chkIsPrimaryKey.setSelected(descriptor.isPrimaryKey());
338

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

    
358
        this.pickerCRS.set(descriptor.getSRS());
359

    
360
        if (descriptor.getGeomType() != null) {
361
            ListElement.setSelected(cboGeometryType, descriptor.getGeomType().getType());
362
            ListElement.setSelected(cboGeometrySubtype, descriptor.getGeomType().getSubType());
363
        }
364
        ListElement.setSelected(cboFieldType, descriptor.getType());
365

    
366
    }
367

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

    
411
        }
412
    }
413

    
414
    public void setEditable(boolean editable) {
415
        this.editable = editable;
416
        this.pickerDefaultValue.setEditable(editable);
417
        this.pickerFieldName.setEditable(editable);
418
        this.pickerIntervalEnd.setEditable(editable);
419
        this.pickerIntervalStart.setEditable(editable);
420
        this.pickerPrecision.setEditable(editable);
421
        this.pickerSize.setEditable(editable);
422

    
423
        this.chkAllowNulls.setEnabled(editable);
424
        this.chkIsAutomatic.setEnabled(editable);
425
        this.chkIsPrimaryKey.setEnabled(editable);
426

    
427
        this.chkVirtualField.setEnabled(editable);
428
        this.pickerVirtualField.setEditable(editable);
429

    
430
        this.cboDateFormat.setEnabled(editable);
431
        this.cboFieldType.setEnabled(editable);
432
        this.cboGeometryType.setEnabled(editable);
433
        this.cboGeometrySubtype.setEnabled(editable);
434

    
435
    }
436
}