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

History | View | Annotate | Download (15.9 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.Date;
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.fmap.dal.feature.EditableFeatureAttributeDescriptor;
19
import org.gvsig.fmap.dal.feature.EditableFeatureType;
20
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
21
import org.gvsig.fmap.dal.feature.FeatureStore;
22
import org.gvsig.fmap.dal.feature.FeatureType;
23
import org.gvsig.tools.ToolsLocator;
24
import org.gvsig.tools.dataTypes.DataTypes;
25
import org.gvsig.tools.dynobject.DynStruct_v2;
26
import org.gvsig.tools.i18n.I18nManager;
27
import org.gvsig.tools.swing.api.ChangeListenerHelper;
28
import org.gvsig.tools.swing.api.ToolsSwingLocator;
29
import org.gvsig.tools.swing.api.ToolsSwingManager;
30
import org.slf4j.Logger;
31
import org.slf4j.LoggerFactory;
32

    
33
/**
34
 *
35
 * @author jjdelcerro
36
 */
37
public class DefaultFeatureTypePanel 
38
        extends FeatureTypePanelView
39
        implements FeatureTypePanel
40
    {
41

    
42
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypePanel.class);
43

    
44
    private class FeatureTypeTableModel extends AbstractTableModel {
45

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

    
80
        @Override
81
        public int getColumnCount() {
82
            if( this.featureType==null ) {
83
                return 0;
84
            }
85
            return this.columnNames.length;
86
        }
87

    
88
        @Override
89
        public String getColumnName(int columnIndex) {
90
            if( this.featureType==null ) {
91
                return "";
92
            }
93
            return this.columnNames[columnIndex];
94
        }
95

    
96
        @Override
97
        public Class<?> getColumnClass(int columnIndex) {
98
            if( this.featureType==null ) {
99
                return String.class;
100
            }
101
            return this.columnClasses[columnIndex];
102
        }
103

    
104
        @Override
105
        public boolean isCellEditable(int rowIndex, int columnIndex) {
106
            return false;
107
        }
108

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

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

    
159
    @SuppressWarnings("Convert2Lambda")
160
    private void initComponents() {
161
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
162

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

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

    
232
        
233
        this.setPreferredSize(new Dimension(700, 500));
234
        if( this.tblFields.getRowCount()>0 ) {
235
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
236
            doFormFieldPut();
237
        }
238
    }
239
       
240
    private boolean doFormFieldFetch() {
241
        int row = this.tblFields.getSelectedRow();
242
        if( row<0 ) {
243
            return true;
244
        }
245
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
246
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
247
            if( this.descriptorPanel.fetch((EditableFeatureAttributeDescriptor) descriptor)==null ) {
248
                return false;
249
            }
250
            this.tableModel.fireUpdateEvent();
251
        } 
252
        return true;
253
    }
254
    
255
    private void doFormFieldPut() {
256
        int row = this.tblFields.getSelectedRow();
257
        if( row<0 ) {
258
            return;
259
        }
260
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
261
        this.currentRow = row;
262
        this.descriptorPanel.put(descriptor);
263
        updateButtonState();
264
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
265
            this.btnFormFieldModify.setEnabled(this.editable);
266
        } else {
267
            this.btnFormFieldModify.setEnabled(false);
268
        }
269
    }
270
    
271
    private void updateButtonState() {
272
        this.descriptorPanel.setEnabled(true);
273
        this.descriptorPanel.setEditable(false);
274
        this.btnFormFieldAccept.setEnabled(false);
275
        this.btnFormFieldDiscard.setEnabled(false);
276
        this.btnFormFieldModify.setEnabled(this.editable);
277
        this.btnNew.setEnabled(this.editable);
278
        this.btnDelete.setEnabled(this.editable);
279
    }
280
    
281
    private void doFormFieldModify() {
282
        int row = this.tblFields.getSelectedRow();
283
        if( row<0 ) {
284
            return;
285
        }
286
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
287
        this.descriptorPanel.put(descriptor);
288
        this.descriptorPanel.setEnabled(true);
289
        this.btnFormFieldAccept.setEnabled(this.editable);
290
        this.btnFormFieldDiscard.setEnabled(this.editable);
291
        this.btnFormFieldModify.setEnabled(false);
292
        this.btnNew.setEnabled(false);
293
        this.btnDelete.setEnabled(false);
294
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
295
            this.descriptorPanel.setEditable(this.editable);
296
        } else {
297
            this.descriptorPanel.setEditable(false);
298
        }
299
        this.fieldSelectionAllowed = false;
300
        this.changeListenerHelper.fireEvent();
301
    }
302
    
303
    @Override
304
    public boolean isModifyingAField() {
305
        return btnFormFieldAccept.isEnabled();
306
    }
307
    
308
    private void doFormFieldAccept() {
309
        int row = this.tblFields.getSelectedRow();
310
        if( row<0 ) {
311
            return;
312
        }
313
        if( doFormFieldFetch() ) {
314
            this.updateButtonState();
315
            this.tblFields.getSelectionModel().setSelectionInterval(row, row);
316
            this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
317
            this.fieldSelectionAllowed = true;
318
        }
319
        this.changeListenerHelper.fireEvent();
320
    }
321
    
322
    private void doFormFieldDiscard() {
323
        doFormFieldPut();
324
        this.updateButtonState();
325
        this.fieldSelectionAllowed = true;
326
        this.changeListenerHelper.fireEvent();
327
    }
328

    
329
    private void doChangeFieldSelection() {
330
        int row = this.tblFields.getSelectedRow();
331
        if( row<0 ) {
332
            return;
333
        }
334
        if( !this.fieldSelectionAllowed ) {
335
            if( row !=this.currentRow ) {
336
                I18nManager i18n = ToolsLocator.getI18nManager();
337
                JOptionPane.showMessageDialog(
338
                    this, 
339
                    i18n.getTranslation("_Before_changing_field_accept_or_discard_the_changes"), 
340
                    i18n.getTranslation("_Warning"), 
341
                    JOptionPane.WARNING_MESSAGE
342
                );
343
                this.tblFields.getSelectionModel().setSelectionInterval(
344
                        this.currentRow, 
345
                        this.currentRow
346
                );
347
            }
348
            return;
349
        }
350
        doFormFieldPut();   
351
    }
352
    
353
    @Override
354
    public JComponent asJComponent() {
355
        return this;
356
    }
357

    
358
    @Override
359
    public void setEditable(boolean editable) {
360
        this.editable = editable;
361
        this.btnNew.setEnabled(editable);
362
        this.btnDelete.setEnabled(editable);
363
        updateButtonState();
364
    }
365

    
366
    @Override
367
    public EditableFeatureType fetch(EditableFeatureType type) {
368
        ((DynStruct_v2)type).setLabel(
369
                StringUtils.defaultIfBlank(this.txtLabel.getText(), null)
370
        );
371
        ((DynStruct_v2)type).setDescription(
372
                StringUtils.defaultIfBlank(this.txtDescription.getText(), null)
373
        );
374
        this.tagsController.fetch(((DynStruct_v2)type).getTags());
375
        return type;
376
    }
377

    
378
    @Override
379
    public void put(FeatureType type) {
380
        this.featureType = type;
381
        if( type == null ) {
382
            this.store = null;
383
        } else {
384
            // Nos quedamos una referencia para evitar que se destruya, ya que
385
            // el featureType se guarda solo una WeakReference.
386
            this.store = type.getStore(); 
387
            this.txtLabel.setText(
388
                StringUtils.defaultIfBlank(((DynStruct_v2)type).getLabel(), "")
389
            );
390
            this.txtDescription.setText(
391
                StringUtils.defaultIfBlank(((DynStruct_v2)type).getDescription(), "")
392
            );
393
            this.tagsController.set(((DynStruct_v2)type).getTags());
394
        }
395
        if( !(type instanceof EditableFeatureType) ) {
396
            this.setEditable(false);
397
        }
398
        this.tableModel = new FeatureTypeTableModel(type);
399
        this.tblFields.setModel(this.tableModel);
400
        if( type!=null && !type.isEmpty() ) {
401
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
402
        }
403
        updateButtonState();
404
        doFormFieldPut();       
405
    }
406

    
407
    private void doNewField() {
408
        EditableFeatureType eft = (EditableFeatureType)this.featureType;
409
        EditableFeatureAttributeDescriptor descriptor = eft.add(
410
                getNewFieldName(this.featureType), 
411
                DataTypes.STRING,
412
                50
413
        );
414
        this.tableModel.fireUpdateEvent();
415
        int row = descriptor.getIndex();
416
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
417
        this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
418
        updateButtonState();
419
        doFormFieldModify();    
420
        this.changeListenerHelper.fireEvent();
421
    }
422
    
423
    private void doDeleteField() {
424
        int row = this.tblFields.getSelectedRow();
425
        if( row<0 ) {
426
            return;
427
        }
428
//        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
429
        ((EditableFeatureType)this.featureType).remove(row);
430
        this.tableModel.fireUpdateEvent();
431
        if( row >= this.tblFields.getRowCount()) {
432
            row = this.tblFields.getRowCount()-1;
433
        }
434
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
435
        updateButtonState();
436
        doFormFieldPut();       
437
        this.changeListenerHelper.fireEvent();
438
    }
439
            
440
    public static String getNewFieldName(FeatureType featureType) {
441
        I18nManager i18n = ToolsLocator.getI18nManager();
442
        String prefix = i18n.getTranslation("_Field");
443
        String fieldName;
444
        for (int i = 1; i < 1000; i++) {
445
            fieldName = prefix +"-"+i;
446
            if( featureType.get(fieldName)==null ) {
447
                return fieldName;
448
            }
449
        }
450
        fieldName = prefix + "-" + (new Date()).getTime();
451
        return fieldName;
452
    }
453

    
454
    @Override
455
    public void addChangeListener(ChangeListener listener) {
456
        this.changeListenerHelper.addChangeListener(listener);
457
    }
458

    
459
    @Override
460
    public ChangeListener[] getChangeListeners() {
461
        return this.changeListenerHelper.getChangeListeners();
462
    }
463

    
464
    @Override
465
    public void removeChangeListener(ChangeListener listener) {
466
        this.changeListenerHelper.removeChangeListener(listener);
467
    }
468

    
469
    @Override
470
    public void removeAllChangeListener() {
471
        this.changeListenerHelper.removeAllChangeListener();
472
    }
473

    
474
    @Override
475
    public boolean hasChangeListeners() {
476
        return this.changeListenerHelper.hasChangeListeners();
477
    }
478
    
479
}