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 / DefaultFeatureTypePanel.java @ 44505

History | View | Annotate | Download (19.2 KB)

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

    
3
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel;
4
import java.awt.BorderLayout;
5
import java.awt.Dimension;
6
import java.awt.event.ActionEvent;
7
import java.awt.event.ActionListener;
8
import java.util.Objects;
9
import javax.swing.JComponent;
10
import javax.swing.JOptionPane;
11
import javax.swing.event.ChangeListener;
12
import javax.swing.event.ListSelectionEvent;
13
import javax.swing.event.ListSelectionListener;
14
import javax.swing.event.TableModelEvent;
15
import javax.swing.table.AbstractTableModel;
16
import org.apache.commons.lang3.StringUtils;
17
import org.gvsig.configurableactions.ConfigurableActionsMamager;
18
import org.gvsig.expressionevaluator.ExpressionUtils;
19
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
20
import org.gvsig.fmap.dal.feature.EditableFeatureType;
21
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
22
import org.gvsig.fmap.dal.feature.FeatureStore;
23
import org.gvsig.fmap.dal.feature.FeatureType;
24
import org.gvsig.tools.ToolsLocator;
25
import org.gvsig.tools.dataTypes.DataTypes;
26
import org.gvsig.tools.dynobject.DynStruct_v2;
27
import org.gvsig.tools.i18n.I18nManager;
28
import org.gvsig.tools.swing.api.ChangeListenerHelper;
29
import org.gvsig.tools.swing.api.ToolsSwingLocator;
30
import org.gvsig.tools.swing.api.ToolsSwingManager;
31
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
32
import org.gvsig.tools.util.ToolsUtilLocator;
33
import org.slf4j.Logger;
34
import org.slf4j.LoggerFactory;
35

    
36
/**
37
 *
38
 * @author jjdelcerro
39
 */
40
public class DefaultFeatureTypePanel 
41
        extends FeatureTypePanelView
42
        implements FeatureTypePanel
43
    {
44

    
45
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypePanel.class);
46
    private FeatureType originalFeatureType = null;
47

    
48
    private class FeatureTypeTableModel extends AbstractTableModel {
49

    
50
        private final FeatureType featureType;
51
        private final String[] columnNames = new String[] {
52
          "Name",
53
          "Type",
54
          "Size",
55
          "Precision",
56
          "Default value",
57
          "Calculated"
58
        };
59
        private final Class[] columnClasses = new Class[] {
60
          String.class,
61
          String.class,
62
          Integer.class,
63
          Integer.class,
64
          String.class,
65
          Boolean.class
66
        };
67
        
68
        public FeatureTypeTableModel() {
69
            this.featureType = null;
70
        }
71
        
72
        public FeatureTypeTableModel(FeatureType featureType) {
73
            this.featureType = featureType;
74
        }
75
        
76
        @Override
77
        public int getRowCount() {
78
            if( this.featureType==null ) {
79
                return 0;
80
            }
81
            return this.featureType.size();
82
        }
83

    
84
        @Override
85
        public int getColumnCount() {
86
            if( this.featureType==null ) {
87
                return 0;
88
            }
89
            return this.columnNames.length;
90
        }
91

    
92
        @Override
93
        public String getColumnName(int columnIndex) {
94
            if( this.featureType==null ) {
95
                return "";
96
            }
97
            return this.columnNames[columnIndex];
98
        }
99

    
100
        @Override
101
        public Class<?> getColumnClass(int columnIndex) {
102
            if( this.featureType==null ) {
103
                return String.class;
104
            }
105
            return this.columnClasses[columnIndex];
106
        }
107

    
108
        @Override
109
        public boolean isCellEditable(int rowIndex, int columnIndex) {
110
            return false;
111
        }
112

    
113
        @Override
114
        public Object getValueAt(int rowIndex, int columnIndex) {
115
            if( this.featureType==null ) {
116
                return "";
117
            }
118
            FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(rowIndex);
119
            switch(columnIndex) {
120
                case 0:
121
                    return descriptor.getName();
122
                case 1:
123
                    return descriptor.getDataTypeName();
124
                case 2:
125
                    return descriptor.getSize();
126
                case 3:
127
                    return descriptor.getPrecision();
128
                case 4:
129
                    return Objects.toString(descriptor.getDefaultValue(),"");
130
                case 5:
131
                    return descriptor.isComputed();
132
                default:
133
                    return "";
134
            }
135
        }
136

    
137
        @Override
138
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
139
        }
140
    
141
        public void fireUpdateEvent() {
142
            this.fireTableChanged(new TableModelEvent(this));
143
        }
144
    }
145
    
146
    private DefaultFeatureTypeAttributePanel descriptorPanel;
147
    private EditableFeatureType featureType;
148
    private int mode;
149
    private FeatureTypeTableModel tableModel;
150
    private FeatureStore store;
151
    private int currentRow;
152
    private boolean fieldSelectionAllowed;
153
    private TagsController tagsController;
154
    private ChangeListenerHelper changeListenerHelper;
155
        
156
    public DefaultFeatureTypePanel() {
157
        this.mode = MODE_SHOW_ONLY;
158
        this.currentRow = -1;
159
        this.fieldSelectionAllowed = true;
160
        this.initComponents();
161
    }
162

    
163
    @SuppressWarnings("Convert2Lambda")
164
    private void initComponents() {
165
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
166
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
167
        JComponent c = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
168
        this.pnlCfgActions.setLayout(new BorderLayout(0,0));
169
        this.pnlCfgActions.add(c, BorderLayout.CENTER);
170

    
171
        this.changeListenerHelper = swingManager.createChangeListenerHelper();
172
        
173
        swingManager.translate(this.btnDelete);
174
        swingManager.translate(this.btnFormFieldAccept);
175
        swingManager.translate(this.btnFormFieldDiscard);
176
        swingManager.translate(this.btnFormFieldModify);
177
        swingManager.translate(this.btnNew);
178
        swingManager.translate(this.lblLabel);
179
        swingManager.translate(this.lblDescription);
180
        swingManager.translate(this.lblTags);
181
        swingManager.translate(this.tabFeatureType);
182
                
183
        this.tableModel = new FeatureTypeTableModel();
184
        this.tblFields.setModel(this.tableModel);
185
        this.tblFields.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
186
            @Override
187
            public void valueChanged(ListSelectionEvent e) {
188
                if( e.getValueIsAdjusting() ) {
189
                    return;
190
                }
191
                doChangeFieldSelection();
192
            }
193
        });
194
        this.descriptorPanel = new DefaultFeatureTypeAttributePanel();
195
        this.pnlField.setLayout(new BorderLayout());
196
        this.pnlField.add(this.descriptorPanel, BorderLayout.CENTER);
197
        this.descriptorPanel.setEnabled(false);
198

    
199
        this.btnFormFieldModify.addActionListener(new ActionListener() {
200
            @Override
201
            public void actionPerformed(ActionEvent e) {
202
                doFormFieldModify();
203
            }
204
        });
205
        this.btnFormFieldDiscard.addActionListener(new ActionListener() {
206
            @Override
207
            public void actionPerformed(ActionEvent e) {
208
                doFormFieldDiscard();
209
            }
210
        });
211
        this.btnFormFieldAccept.addActionListener(new ActionListener() {
212
            @Override
213
            public void actionPerformed(ActionEvent e) {
214
                doFormFieldAccept();
215
            }
216
        });
217
        this.btnNew.addActionListener(new ActionListener() {
218
            @Override
219
            public void actionPerformed(ActionEvent e) {
220
                doNewField();
221
            }
222
        });
223
        this.btnDelete.addActionListener(new ActionListener() {
224
            @Override
225
            public void actionPerformed(ActionEvent e) {
226
                doDeleteField();
227
            }
228
        });
229
        
230
        this.tagsController = new TagsController(
231
                tblTags, 
232
                cboTagsName, 
233
                cboTagsValue, 
234
                btnTagsAdd, 
235
                btnTagsUpdate, 
236
                btnTagsRemove,
237
                lblTagsDescription
238
        );
239

    
240
        
241
        this.setPreferredSize(new Dimension(700, 500));
242
        if( this.tblFields.getRowCount()>0 ) {
243
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
244
            doFormFieldPut();
245
        }
246
    }
247
       
248
    private boolean doFormFieldFetch() {
249
        int row = this.tblFields.getSelectedRow();
250
        if (row < 0) {
251
            return true;
252
        }
253
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
254
        int previousType = descriptor.getType();
255
        if (descriptor instanceof EditableFeatureAttributeDescriptor) {
256
            if (this.descriptorPanel.fetch((EditableFeatureAttributeDescriptor) descriptor) == null) {
257
                return false;
258
            }
259
            this.tableModel.fireUpdateEvent();
260
        }
261
        FeatureAttributeDescriptor oldDescriptor = null;
262
        if (this.originalFeatureType != null) {
263
            oldDescriptor = this.originalFeatureType.getAttributeDescriptor(descriptor.getName());
264
        }
265
        if (oldDescriptor != null
266
                && oldDescriptor.getDataType() != descriptor.getDataType()
267
                && previousType != descriptor.getType()) {
268
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
269
            I18nManager i18manager = ToolsLocator.getI18nManager();
270
            StringBuilder message = new StringBuilder();
271

    
272
            String[] messageArgs = new String[]{oldDescriptor.getName()};
273
            message.append(i18manager.getTranslation("_Already_existed_a_field_named_XfieldnameX_but_with_different_data_type", messageArgs));
274
            message.append(".\n");
275
            message.append(i18manager.getTranslation("_Values_of_data_will_try_to_coerce_to_this_type"));
276
            dialogs.messageDialog(
277
                    message.toString(),
278
                    null,
279
                    i18manager.getTranslation("_Values_will_change"),
280
                    JOptionPane.INFORMATION_MESSAGE,
281
                    "feature-type-manager-field-already-exist-in-previous-schema");
282
        }
283

    
284
        return true;
285
    }
286
    
287
    private void doFormFieldPut() {
288
        int row = this.tblFields.getSelectedRow();
289
        if( row<0 ) {
290
            return;
291
        }
292
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
293
        this.currentRow = row;
294
        this.descriptorPanel.put(descriptor);
295
        updateButtonState();
296
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
297
            this.btnFormFieldModify.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
298
        } else {
299
            this.btnFormFieldModify.setEnabled(false);
300
        }
301
    }
302
    
303
    private void updateButtonState() {
304
        this.descriptorPanel.setEnabled(true);
305
        this.descriptorPanel.setMode(MODE_SHOW_ONLY);
306
        this.btnFormFieldAccept.setEnabled(false);
307
        this.btnFormFieldDiscard.setEnabled(false);
308
        
309
        switch(this.mode) {
310
            case MODE_EDIT_ALL:
311
                this.btnDelete.setEnabled(true);
312
                this.btnFormFieldModify.setEnabled(true);
313
                this.btnNew.setEnabled(true);
314
                this.tagsController.setEditable(true);
315
                this.txtLabel.setEditable(true);
316
                this.txtDescription.setEditable(true);
317
                break;
318
            case MODE_EDIT_ONLY_METADATA:
319
                this.btnDelete.setEnabled(this.descriptorPanel.isVirtualField());
320
                this.btnFormFieldModify.setEnabled(true);
321
                this.btnNew.setEnabled(true);
322
                this.tagsController.setEditable(true);
323
                this.txtLabel.setEditable(true);
324
                this.txtDescription.setEditable(true);
325
                break;
326
            case MODE_SHOW_ONLY:
327
                this.btnDelete.setEnabled(false);
328
                this.btnFormFieldModify.setEnabled(false);
329
                this.btnNew.setEnabled(false);
330
                this.tagsController.setEditable(false);
331
                this.txtLabel.setEditable(false);
332
                this.txtDescription.setEditable(false);
333
                break;
334
        }
335
    }
336
    
337
    private void doFormFieldModify() {
338
        int row = this.tblFields.getSelectedRow();
339
        if( row<0 ) {
340
            return;
341
        }
342
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
343
        this.descriptorPanel.put(descriptor);
344
        this.descriptorPanel.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
345
        this.btnFormFieldAccept.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
346
        this.btnFormFieldDiscard.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
347
        this.btnFormFieldModify.setEnabled(false);
348
        this.btnNew.setEnabled(false);
349
        this.btnDelete.setEnabled(false);
350
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
351
            this.descriptorPanel.setMode(this.mode);
352
        } else {
353
            this.descriptorPanel.setMode(MODE_SHOW_ONLY);
354
        }
355
        this.fieldSelectionAllowed = false;
356
        this.changeListenerHelper.fireEvent();
357
    }
358
    
359
    @Override
360
    public boolean isModifyingAField() {
361
        return btnFormFieldAccept.isEnabled();
362
    }
363
    
364
    private void doFormFieldAccept() {
365
        int row = this.tblFields.getSelectedRow();
366
        if( row<0 ) {
367
            return;
368
        }
369
        if( doFormFieldFetch() ) {
370
            this.updateButtonState();
371
            this.tblFields.getSelectionModel().setSelectionInterval(row, row);
372
            this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
373
            this.fieldSelectionAllowed = true;
374
        }
375
        this.changeListenerHelper.fireEvent();
376
    }
377
    
378
    private void doFormFieldDiscard() {
379
        doFormFieldPut();
380
        this.updateButtonState();
381
        this.fieldSelectionAllowed = true;
382
        this.changeListenerHelper.fireEvent();
383
    }
384

    
385
    private void doChangeFieldSelection() {
386
        int row = this.tblFields.getSelectedRow();
387
        if( row<0 ) {
388
            return;
389
        }
390
        if( !this.fieldSelectionAllowed ) {
391
            if( row !=this.currentRow ) {
392
                I18nManager i18n = ToolsLocator.getI18nManager();
393
                JOptionPane.showMessageDialog(
394
                    this, 
395
                    i18n.getTranslation("_Before_changing_field_accept_or_discard_the_changes"), 
396
                    i18n.getTranslation("_Warning"), 
397
                    JOptionPane.WARNING_MESSAGE
398
                );
399
                this.tblFields.getSelectionModel().setSelectionInterval(
400
                        this.currentRow, 
401
                        this.currentRow
402
                );
403
            }
404
            return;
405
        }
406
        doFormFieldPut();   
407
    }
408
    
409
    @Override
410
    public JComponent asJComponent() {
411
        return this;
412
    }
413

    
414
    @Override
415
    public int getMode() {
416
        return this.mode;
417
    }
418
    
419
    @Override
420
    public void setMode(int mode) {
421
        this.mode = mode;
422
        updateButtonState();
423
    }
424

    
425
    @Override
426
    public EditableFeatureType fetch(EditableFeatureType type) {
427
        if( type == null ) {
428
            type = (EditableFeatureType) this.featureType.getCopy();
429
        } else {
430
            type.removeAll();
431
            type.addAll(this.featureType);
432
        }
433
        type.setLabel(
434
            StringUtils.defaultIfBlank(this.txtLabel.getText(), null)
435
        );
436
        type.setDescription(
437
            StringUtils.defaultIfBlank(this.txtDescription.getText(), null)
438
        );
439
        this.tagsController.fetch(type.getTags());
440
        return type;
441
    }
442

    
443
    @Override
444
    public void put(FeatureType type) {
445
        this.featureType = null;
446
        this.originalFeatureType = null;
447
        if (type == null) {
448
            this.store = null;
449
        } else {
450
            FeatureType ftypeToCompare = type.getOriginalFeatureType();
451
            if (ftypeToCompare == null) {
452
                ftypeToCompare = type;
453
            }
454
            this.originalFeatureType = ftypeToCompare.getCopy();
455
            this.featureType = (EditableFeatureType) type.getCopy();
456
            // Nos quedamos una referencia para evitar que se destruya, ya que
457
            // el featureType se guarda solo una WeakReference.
458
            this.store = type.getStore();
459
            this.txtLabel.setText(
460
                    StringUtils.defaultIfBlank(((DynStruct_v2) type).getLabel(), "")
461
            );
462
            this.txtDescription.setText(
463
                    StringUtils.defaultIfBlank(((DynStruct_v2) type).getDescription(), "")
464
            );
465
            this.tagsController.set(((DynStruct_v2) type).getTags());
466
        }
467
        if( !(type instanceof EditableFeatureType) ) {
468
            this.setMode(MODE_SHOW_ONLY);
469
        }
470
        this.tableModel = new FeatureTypeTableModel(type);
471
        this.tblFields.setModel(this.tableModel);
472
        if( type!=null && !type.isEmpty() ) {
473
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
474
        }
475
        updateButtonState();
476
        doFormFieldPut();       
477
    }
478

    
479
    private void doNewField() {
480
        EditableFeatureType eft = (EditableFeatureType)this.featureType;
481
        EditableFeatureAttributeDescriptor descriptor = eft.add(
482
                this.featureType.getNewFieldName(), 
483
                DataTypes.STRING,
484
                50
485
        );
486
        if( this.mode == MODE_EDIT_ONLY_METADATA ) {
487
            descriptor.setFeatureAttributeEmulator(ExpressionUtils.createExpression("NULL"));
488
        }
489
        this.tableModel.fireUpdateEvent();
490
        int row = descriptor.getIndex();
491
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
492
        this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
493
        updateButtonState();
494
        doFormFieldModify();    
495
        this.changeListenerHelper.fireEvent();
496
    }
497
    
498
    private void doDeleteField() {
499
        int row = this.tblFields.getSelectedRow();
500
        if( row<0 ) {
501
            return;
502
        }
503
//        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
504
        ((EditableFeatureType)this.featureType).remove(row);
505
        this.tableModel.fireUpdateEvent();
506
        if( row >= this.tblFields.getRowCount()) {
507
            row = this.tblFields.getRowCount()-1;
508
        }
509
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
510
        updateButtonState();
511
        doFormFieldPut();       
512
        this.changeListenerHelper.fireEvent();
513
    }
514

    
515
    @Override
516
    public void addChangeListener(ChangeListener listener) {
517
        this.changeListenerHelper.addChangeListener(listener);
518
    }
519

    
520
    @Override
521
    public ChangeListener[] getChangeListeners() {
522
        return this.changeListenerHelper.getChangeListeners();
523
    }
524

    
525
    @Override
526
    public void removeChangeListener(ChangeListener listener) {
527
        this.changeListenerHelper.removeChangeListener(listener);
528
    }
529

    
530
    @Override
531
    public void removeAllChangeListener() {
532
        this.changeListenerHelper.removeAllChangeListener();
533
    }
534

    
535
    @Override
536
    public boolean hasChangeListeners() {
537
        return this.changeListenerHelper.hasChangeListeners();
538
    }
539
    
540
}