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

History | View | Annotate | Download (14.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.Date;
9
import java.util.Objects;
10
import javax.swing.JComponent;
11
import javax.swing.JOptionPane;
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.fmap.dal.feature.EditableFeatureAttributeDescriptor;
18
import org.gvsig.fmap.dal.feature.EditableFeatureType;
19
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
20
import org.gvsig.fmap.dal.feature.FeatureStore;
21
import org.gvsig.fmap.dal.feature.FeatureType;
22
import org.gvsig.tools.ToolsLocator;
23
import org.gvsig.tools.dataTypes.DataTypes;
24
import org.gvsig.tools.dynobject.DynStruct_v2;
25
import org.gvsig.tools.i18n.I18nManager;
26
import org.gvsig.tools.swing.api.ToolsSwingLocator;
27
import org.gvsig.tools.swing.api.ToolsSwingManager;
28
import org.slf4j.Logger;
29
import org.slf4j.LoggerFactory;
30

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

    
40
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypePanel.class);
41
    
42
    private class FeatureTypeTableModel extends AbstractTableModel {
43

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

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

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

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

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

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

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

    
156
    private void initComponents() {
157
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
158

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

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

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

    
315
    private void doChangeFieldSelection() {
316
        int row = this.tblFields.getSelectedRow();
317
        if( row<0 ) {
318
            return;
319
        }
320
        if( !this.fieldSelectionAllowed ) {
321
            if( row !=this.currentRow ) {
322
                I18nManager i18n = ToolsLocator.getI18nManager();
323
                JOptionPane.showMessageDialog(
324
                    this, 
325
                    i18n.getTranslation("_Before_changing_field_accept_or_discard_the_changes"), 
326
                    i18n.getTranslation("_Warning"), 
327
                    JOptionPane.WARNING_MESSAGE
328
                );
329
                this.tblFields.getSelectionModel().setSelectionInterval(
330
                        this.currentRow, 
331
                        this.currentRow
332
                );
333
            }
334
            return;
335
        }
336
        doFormFieldPut();   
337
    }
338
    
339
    @Override
340
    public JComponent asJComponent() {
341
        return this;
342
    }
343

    
344
    public void setEditable(boolean editable) {
345
        this.editable = editable;
346
        this.btnNew.setEnabled(editable);
347
        this.btnDelete.setEnabled(editable);
348
        updateButtonState();
349
    }
350

    
351
    @Override
352
    public EditableFeatureType fetch(EditableFeatureType type) {
353
        ((DynStruct_v2)type).setLabel(
354
                StringUtils.defaultIfBlank(this.txtLabel.getText(), null)
355
        );
356
        ((DynStruct_v2)type).setDescription(
357
                StringUtils.defaultIfBlank(this.txtDescription.getText(), null)
358
        );
359
        this.tagsController.fetch(((DynStruct_v2)type).getTags());
360
        return type;
361
    }
362

    
363
    @Override
364
    public void put(FeatureType type) {
365
        this.featureType = type;
366
        if( type == null ) {
367
            this.store = null;
368
        } else {
369
            // Nos quedamos una referencia para evitar que se destruya, ya que
370
            // el featureType se guarda solo una WeakReference.
371
            this.store = type.getStore(); 
372
            this.txtLabel.setText(
373
                StringUtils.defaultIfBlank(((DynStruct_v2)type).getLabel(), "")
374
            );
375
            this.txtDescription.setText(
376
                StringUtils.defaultIfBlank(((DynStruct_v2)type).getDescription(), "")
377
            );
378
            this.tagsController.set(((DynStruct_v2)type).getTags());
379
        }
380
        if( !(type instanceof EditableFeatureType) ) {
381
            this.setEditable(false);
382
        }
383
        this.tableModel = new FeatureTypeTableModel(type);
384
        this.tblFields.setModel(this.tableModel);
385
        if( type!=null && !type.isEmpty() ) {
386
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
387
        }
388
        updateButtonState();
389
        doFormFieldPut();       
390
    }
391

    
392
    private void doNewField() {
393
        EditableFeatureType eft = (EditableFeatureType)this.featureType;
394
        EditableFeatureAttributeDescriptor descriptor = eft.add(
395
                getNewFieldName(this.featureType), 
396
                DataTypes.STRING,
397
                50
398
        );
399
        this.tableModel.fireUpdateEvent();
400
        int row = descriptor.getIndex();
401
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
402
        this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
403
        updateButtonState();
404
        doFormFieldModify();       
405
    }
406
    
407
    private void doDeleteField() {
408
        int row = this.tblFields.getSelectedRow();
409
        if( row<0 ) {
410
            return;
411
        }
412
//        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
413
        ((EditableFeatureType)this.featureType).remove(row);
414
        this.tableModel.fireUpdateEvent();
415
        if( row >= this.tblFields.getRowCount()) {
416
            row = this.tblFields.getRowCount()-1;
417
        }
418
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
419
        updateButtonState();
420
        doFormFieldPut();       
421
    }
422
            
423
    public static String getNewFieldName(FeatureType featureType) {
424
        I18nManager i18n = ToolsLocator.getI18nManager();
425
        String prefix = i18n.getTranslation("_Field");
426
        String fieldName;
427
        for (int i = 1; i < 1000; i++) {
428
            fieldName = prefix +"-"+i;
429
            if( featureType.get(fieldName)==null ) {
430
                return fieldName;
431
            }
432
        }
433
        fieldName = prefix + "-" + (new Date()).getTime();
434
        return fieldName;
435
    }
436

    
437
}