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

History | View | Annotate | Download (13.5 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.expressionevaluator.FeatureAttributeEmulatorExpression;
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.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
        
148
    public DefaultFeatureTypePanel() {
149
        this.editable = true;
150
        this.currentRow = -1;
151
        this.fieldSelectionAllowed = true;
152
        this.initComponents();
153
    }
154

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

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

    
180
        this.btnFormFieldModify.addActionListener(new ActionListener() {
181
            @Override
182
            public void actionPerformed(ActionEvent e) {
183
                doFormFieldModify();
184
            }
185
        });
186
        this.btnFormFieldDiscard.addActionListener(new ActionListener() {
187
            @Override
188
            public void actionPerformed(ActionEvent e) {
189
                doFormFieldDiscard();
190
            }
191
        });
192
        this.btnFormFieldAccept.addActionListener(new ActionListener() {
193
            @Override
194
            public void actionPerformed(ActionEvent e) {
195
                doFormFieldAccept();
196
            }
197
        });
198
        this.btnNew.addActionListener(new ActionListener() {
199
            @Override
200
            public void actionPerformed(ActionEvent e) {
201
                doNewField();
202
            }
203
        });
204
        this.btnDelete.addActionListener(new ActionListener() {
205
            @Override
206
            public void actionPerformed(ActionEvent e) {
207
                doDeleteField();
208
            }
209
        });
210
        
211
        this.setPreferredSize(new Dimension(700, 400));
212
        if( this.tblFields.getRowCount()>0 ) {
213
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
214
            doFormFieldPut();
215
        }
216
    }
217
       
218
    private boolean doFormFieldFetch() {
219
        int row = this.tblFields.getSelectedRow();
220
        if( row<0 ) {
221
            return true;
222
        }
223
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
224
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
225
            if( this.descriptorPanel.fetch((EditableFeatureAttributeDescriptor) descriptor)==null ) {
226
                return false;
227
            }
228
            this.tableModel.fireUpdateEvent();
229
        } 
230
        return true;
231
    }
232
    
233
    private void doFormFieldPut() {
234
        int row = this.tblFields.getSelectedRow();
235
        if( row<0 ) {
236
            return;
237
        }
238
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
239
        this.currentRow = row;
240
        this.descriptorPanel.put(descriptor);
241
        updateButtonState();
242
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
243
            this.btnFormFieldModify.setEnabled(this.editable);
244
        } else {
245
            this.btnFormFieldModify.setEnabled(false);
246
        }
247
    }
248
    
249
    private void updateButtonState() {
250
        this.descriptorPanel.setEnabled(true);
251
        this.descriptorPanel.setEditable(false);
252
        this.btnFormFieldAccept.setEnabled(false);
253
        this.btnFormFieldDiscard.setEnabled(false);
254
        this.btnFormFieldModify.setEnabled(this.editable);
255
        this.btnNew.setEnabled(true);
256
        this.btnDelete.setEnabled(true);
257
    }
258
    
259
    private void doFormFieldModify() {
260
        int row = this.tblFields.getSelectedRow();
261
        if( row<0 ) {
262
            return;
263
        }
264
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
265
        this.descriptorPanel.put(descriptor);
266
        this.descriptorPanel.setEnabled(true);
267
        this.btnFormFieldAccept.setEnabled(this.editable);
268
        this.btnFormFieldDiscard.setEnabled(this.editable);
269
        this.btnFormFieldModify.setEnabled(false);
270
        this.btnNew.setEnabled(false);
271
        this.btnDelete.setEnabled(false);
272
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
273
            this.descriptorPanel.setEditable(this.editable);
274
        } else {
275
            this.descriptorPanel.setEditable(false);
276
        }
277
        this.fieldSelectionAllowed = false;
278
    }
279
    
280
    private void doFormFieldAccept() {
281
        int row = this.tblFields.getSelectedRow();
282
        if( row<0 ) {
283
            return;
284
        }
285
        if( doFormFieldFetch() ) {
286
            this.updateButtonState();
287
            this.tblFields.getSelectionModel().setSelectionInterval(row, row);
288
            this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
289
            this.fieldSelectionAllowed = true;
290
        }
291
    }
292
    
293
    private void doFormFieldDiscard() {
294
        doFormFieldPut();
295
        this.updateButtonState();
296
        this.fieldSelectionAllowed = true;
297
    }
298

    
299
    private void doChangeFieldSelection() {
300
        int row = this.tblFields.getSelectedRow();
301
        if( row<0 ) {
302
            return;
303
        }
304
        if( !this.fieldSelectionAllowed ) {
305
            if( row !=this.currentRow ) {
306
                I18nManager i18n = ToolsLocator.getI18nManager();
307
                JOptionPane.showMessageDialog(
308
                    this, 
309
                    i18n.getTranslation("_Before_changing_field_accept_or_discard_the_changes"), 
310
                    i18n.getTranslation("_Warning"), 
311
                    JOptionPane.WARNING_MESSAGE
312
                );
313
                this.tblFields.getSelectionModel().setSelectionInterval(
314
                        this.currentRow, 
315
                        this.currentRow
316
                );
317
            }
318
            return;
319
        }
320
        doFormFieldPut();   
321
    }
322
    
323
    @Override
324
    public JComponent asJComponent() {
325
        return this;
326
    }
327

    
328
    public void setEditable(boolean editable) {
329
        this.editable = editable;
330
        this.btnNew.setEnabled(editable);
331
        this.btnDelete.setEnabled(editable);
332
        updateButtonState();
333
    }
334

    
335
    @Override
336
    public EditableFeatureType fetch(EditableFeatureType type) {
337
        return type;
338
    }
339

    
340
    @Override
341
    public void put(FeatureType type) {
342
        this.featureType = type;
343
        if( type == null ) {
344
            this.store = null;
345
        } else {
346
            // Nos quedamos una referencia para evitar que se destruya, ya que
347
            // el featureType se guarda solo una WeakReference.
348
            this.store = type.getStore(); 
349
        }
350
        if( !(type instanceof EditableFeatureType) ) {
351
            this.setEditable(false);
352
        }
353
        this.tableModel = new FeatureTypeTableModel(type);
354
        this.tblFields.setModel(this.tableModel);
355
        if( type!=null && !type.isEmpty() ) {
356
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
357
        }
358
        updateButtonState();
359
        doFormFieldPut();       
360
    }
361

    
362
    private void doNewField() {
363
        EditableFeatureType eft = (EditableFeatureType)this.featureType;
364
        EditableFeatureAttributeDescriptor descriptor = eft.add(
365
                getNewFieldName(this.featureType), 
366
                DataTypes.STRING,
367
                50
368
        );
369
        this.tableModel.fireUpdateEvent();
370
        int row = descriptor.getIndex();
371
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
372
        this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
373
        updateButtonState();
374
        doFormFieldModify();       
375
    }
376
    
377
    private void doDeleteField() {
378
        int row = this.tblFields.getSelectedRow();
379
        if( row<0 ) {
380
            return;
381
        }
382
//        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
383
        ((EditableFeatureType)this.featureType).remove(row);
384
        this.tableModel.fireUpdateEvent();
385
        if( row >= this.tblFields.getRowCount()) {
386
            row = this.tblFields.getRowCount()-1;
387
        }
388
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
389
        updateButtonState();
390
        doFormFieldPut();       
391
    }
392
            
393
    public static String getNewFieldName(FeatureType featureType) {
394
        I18nManager i18n = ToolsLocator.getI18nManager();
395
        String prefix = i18n.getTranslation("_Field");
396
        String fieldName;
397
        for (int i = 1; i < 1000; i++) {
398
            fieldName = prefix +"-"+i;
399
            if( featureType.get(fieldName)==null ) {
400
                return fieldName;
401
            }
402
        }
403
        fieldName = prefix + "-" + (new Date()).getTime();
404
        return fieldName;
405
    }
406

    
407
}