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

History | View | Annotate | Download (19.6 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
          "Default value",
58
          "Calculated"
59
        };
60
        private final Class[] columnClasses = new Class[] {
61
          String.class,
62
          String.class,
63
          Integer.class,
64
          Integer.class,
65
          String.class,
66
          Boolean.class
67
        };
68
        
69
        public FeatureTypeTableModel() {
70
            this.featureType = null;
71
        }
72
        
73
        public FeatureTypeTableModel(FeatureType featureType) {
74
            this.featureType = featureType;
75
        }
76
        
77
        @Override
78
        public int getRowCount() {
79
            if( this.featureType==null ) {
80
                return 0;
81
            }
82
            return this.featureType.size();
83
        }
84

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
523
    @Override
524
    public void addChangeListener(ChangeListener listener) {
525
        this.changeListenerHelper.addChangeListener(listener);
526
    }
527

    
528
    @Override
529
    public ChangeListener[] getChangeListeners() {
530
        return this.changeListenerHelper.getChangeListeners();
531
    }
532

    
533
    @Override
534
    public void removeChangeListener(ChangeListener listener) {
535
        this.changeListenerHelper.removeChangeListener(listener);
536
    }
537

    
538
    @Override
539
    public void removeAllChangeListener() {
540
        this.changeListenerHelper.removeAllChangeListener();
541
    }
542

    
543
    @Override
544
    public boolean hasChangeListeners() {
545
        return this.changeListenerHelper.hasChangeListeners();
546
    }
547
    
548
}