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

History | View | Annotate | Download (15 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.awt.event.ItemEvent;
9
import java.awt.event.ItemListener;
10
import java.util.Date;
11
import java.util.Objects;
12
import javax.swing.DefaultComboBoxModel;
13
import javax.swing.JButton;
14
import javax.swing.JCheckBox;
15
import javax.swing.JComboBox;
16
import javax.swing.JComponent;
17
import javax.swing.JOptionPane;
18
import javax.swing.JTextField;
19
import javax.swing.event.ListSelectionEvent;
20
import javax.swing.event.ListSelectionListener;
21
import javax.swing.event.TableModelEvent;
22
import javax.swing.table.AbstractTableModel;
23
import org.apache.commons.lang3.StringUtils;
24
import org.gvsig.fmap.dal.DALLocator;
25
import org.gvsig.fmap.dal.StoresRepository;
26
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
27
import org.gvsig.fmap.dal.feature.EditableFeatureType;
28
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
29
import org.gvsig.fmap.dal.feature.FeatureStore;
30
import org.gvsig.fmap.dal.feature.FeatureType;
31
import org.gvsig.tools.ToolsLocator;
32
import org.gvsig.tools.dataTypes.DataTypes;
33
import org.gvsig.tools.dynobject.DynStruct_v2;
34
import org.gvsig.tools.i18n.I18nManager;
35
import org.gvsig.tools.swing.api.ToolsSwingLocator;
36
import org.gvsig.tools.swing.api.ToolsSwingManager;
37
import org.slf4j.Logger;
38
import org.slf4j.LoggerFactory;
39

    
40
/**
41
 *
42
 * @author jjdelcerro
43
 */
44
public class DefaultFeatureTypePanel 
45
        extends FeatureTypePanelView
46
        implements FeatureTypePanel
47
    {
48

    
49
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypePanel.class);
50
    
51
    private class FeatureTypeTableModel extends AbstractTableModel {
52

    
53
        private final FeatureType featureType;
54
        private final String[] columnNames = new String[] {
55
          "Name",
56
          "Type",
57
          "Size",
58
          "Precision",
59
          "Default value",
60
          "Calculated"
61
        };
62
        private final Class[] columnClasses = new Class[] {
63
          String.class,
64
          String.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 Objects.toString(descriptor.getDefaultValue(),"");
133
                case 5:
134
                    return descriptor.isComputed();
135
                default:
136
                    return "";
137
            }
138
        }
139

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

    
165
    private void initComponents() {
166
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
167

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

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

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

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

    
353
    public void setEditable(boolean editable) {
354
        this.editable = editable;
355
        this.btnNew.setEnabled(editable);
356
        this.btnDelete.setEnabled(editable);
357
        updateButtonState();
358
    }
359

    
360
    @Override
361
    public EditableFeatureType fetch(EditableFeatureType type) {
362
        ((DynStruct_v2)type).setLabel(
363
                StringUtils.defaultIfBlank(this.txtLabel.getText(), null)
364
        );
365
        ((DynStruct_v2)type).setDescription(
366
                StringUtils.defaultIfBlank(this.txtDescription.getText(), null)
367
        );
368
        this.tagsController.fetch(((DynStruct_v2)type).getTags());
369
        return type;
370
    }
371

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

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

    
446
}