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

History | View | Annotate | Download (19.7 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.ArrayList;
9
import java.util.Objects;
10
import javax.swing.JComponent;
11
import javax.swing.JOptionPane;
12
import javax.swing.event.ChangeListener;
13
import javax.swing.event.ListSelectionEvent;
14
import javax.swing.event.ListSelectionListener;
15
import javax.swing.event.TableModelEvent;
16
import javax.swing.table.AbstractTableModel;
17
import org.apache.commons.lang3.StringUtils;
18
import org.gvsig.configurableactions.ConfigurableActionsMamager;
19
import org.gvsig.expressionevaluator.ExpressionUtils;
20
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
21
import org.gvsig.fmap.dal.feature.EditableFeatureType;
22
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.feature.FeatureStore;
24
import org.gvsig.fmap.dal.feature.FeatureType;
25
import org.gvsig.tools.ToolsLocator;
26
import org.gvsig.tools.dataTypes.DataTypes;
27
import org.gvsig.tools.dynobject.DynStruct_v2;
28
import org.gvsig.tools.i18n.I18nManager;
29
import org.gvsig.tools.swing.api.ChangeListenerHelper;
30
import org.gvsig.tools.swing.api.ToolsSwingLocator;
31
import org.gvsig.tools.swing.api.ToolsSwingManager;
32
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
33
import org.gvsig.tools.util.ToolsUtilLocator;
34
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36

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

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

    
49
    private class FeatureTypeTableModel extends AbstractTableModel {
50

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

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

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

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

    
111
        @Override
112
        public boolean isCellEditable(int rowIndex, int columnIndex) {
113
            return false;
114
        }
115

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

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

    
168
    @SuppressWarnings("Convert2Lambda")
169
    private void initComponents() {
170
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
171
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
172
        JComponent c = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
173
        this.pnlCfgActions.setLayout(new BorderLayout(0,0));
174
        this.pnlCfgActions.add(c, BorderLayout.CENTER);
175

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

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

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

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

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

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

    
419
    @Override
420
    public int getMode() {
421
        return this.mode;
422
    }
423
    
424
    @Override
425
    public void setMode(int mode) {
426
        this.mode = mode;
427
        updateButtonState();
428
    }
429

    
430
    @Override
431
    public EditableFeatureType fetch(EditableFeatureType type) {
432
        if( type == null ) {
433
            type = (EditableFeatureType) this.featureType.getCopy();
434
        } else {
435
            type.removeAll();
436
            type.copyFrom(this.featureType);
437
        }
438
        type.setLabel(
439
            StringUtils.defaultIfBlank(this.txtLabel.getText(), null)
440
        );
441
        type.setDescription(
442
            StringUtils.defaultIfBlank(this.txtDescription.getText(), null)
443
        );
444
        this.tagsController.fetch(type.getTags());
445
        return type;
446
    }
447

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

    
484
    private void doNewField() {
485
        EditableFeatureType eft = (EditableFeatureType)this.featureType;
486
        EditableFeatureAttributeDescriptor descriptor = eft.add(
487
                this.featureType.getNewFieldName(), 
488
                DataTypes.STRING,
489
                50
490
        );
491
        if( this.mode == MODE_EDIT_ONLY_METADATA ) {
492
            descriptor.setFeatureAttributeEmulator(ExpressionUtils.createExpression("NULL"));
493
        }
494
        this.tableModel.fireUpdateEvent();
495
        int row = descriptor.getIndex();
496
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
497
        this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
498
        updateButtonState();
499
        doFormFieldModify();    
500
        this.changeListenerHelper.fireEvent();
501
    }
502
    
503
    private void doDeleteField() {
504
        int row = this.tblFields.getSelectedRow();
505
        int[] rows = this.tblFields.getSelectedRows();
506
        ArrayList FeatureAttributeDescriptor;
507
        ArrayList<String> descriptors = new ArrayList<>();
508
        for (int rowDescriptor : rows) {
509
            if (rowDescriptor < 0) {
510
                continue;
511
            }
512
            descriptors.add(this.featureType.getAttributeDescriptor(rowDescriptor).getName());
513
        }
514
        for (String descriptor : descriptors) {
515
            ((EditableFeatureType)this.featureType).remove(descriptor);
516
        }
517
        this.tableModel.fireUpdateEvent();
518
        if( row >= this.tblFields.getRowCount()) {
519
            row = this.tblFields.getRowCount()-1;
520
        }
521
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
522
        updateButtonState();
523
        doFormFieldPut();       
524
        this.changeListenerHelper.fireEvent();
525
    }
526

    
527
    @Override
528
    public void addChangeListener(ChangeListener listener) {
529
        this.changeListenerHelper.addChangeListener(listener);
530
    }
531

    
532
    @Override
533
    public ChangeListener[] getChangeListeners() {
534
        return this.changeListenerHelper.getChangeListeners();
535
    }
536

    
537
    @Override
538
    public void removeChangeListener(ChangeListener listener) {
539
        this.changeListenerHelper.removeChangeListener(listener);
540
    }
541

    
542
    @Override
543
    public void removeAllChangeListener() {
544
        this.changeListenerHelper.removeAllChangeListener();
545
    }
546

    
547
    @Override
548
    public boolean hasChangeListeners() {
549
        return this.changeListenerHelper.hasChangeListeners();
550
    }
551
    
552
}