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

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
    @SuppressWarnings("Convert2Lambda")
157
    private void initComponents() {
158
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
159

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

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

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

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

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

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

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

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

    
439
}