Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.exportto / org.gvsig.exportto.swing / org.gvsig.exportto.swing.impl / src / main / java / org / gvsig / export / swing / impl / panels / SelectAttributesPanel.java @ 44419

History | View | Annotate | Download (18.1 KB)

1
package org.gvsig.export.swing.impl.panels;
2

    
3
import java.awt.Component;
4
import java.awt.Font;
5
import java.awt.event.ActionEvent;
6
import java.awt.event.ActionListener;
7
import java.awt.event.KeyAdapter;
8
import java.awt.event.KeyEvent;
9
import java.net.URL;
10
import java.util.ArrayList;
11
import java.util.Comparator;
12
import java.util.Iterator;
13
import java.util.List;
14
import java.util.Objects;
15
import javax.swing.DefaultCellEditor;
16
import javax.swing.DefaultComboBoxModel;
17
import javax.swing.DefaultListCellRenderer;
18
import javax.swing.ImageIcon;
19
import javax.swing.JButton;
20
import javax.swing.JCheckBox;
21
import javax.swing.JComboBox;
22
import javax.swing.JComponent;
23
import javax.swing.JLabel;
24
import javax.swing.JList;
25
import javax.swing.JOptionPane;
26
import javax.swing.JTable;
27
import javax.swing.table.AbstractTableModel;
28
import javax.swing.table.TableCellRenderer;
29
import javax.swing.table.TableColumnModel;
30
import javax.swing.table.TableModel;
31
import javax.swing.text.JTextComponent;
32
import org.apache.commons.io.FilenameUtils;
33
import org.apache.commons.lang.StringUtils;
34
import org.gvsig.export.ExportAttributes;
35
import org.gvsig.export.ExportAttributes.ExportAttribute;
36
import org.gvsig.export.ExportParameters;
37
import org.gvsig.export.swing.JExportProcessPanel;
38
import org.gvsig.export.swing.spi.ExportPanel;
39
import org.gvsig.export.swing.spi.ExportPanelValidationException;
40
import org.gvsig.export.swing.spi.ExportPanelsManager;
41
import org.gvsig.fmap.dal.DataTypes;
42
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
43
import org.gvsig.fmap.dal.feature.FeatureType;
44
import org.gvsig.tools.ToolsLocator;
45
import org.gvsig.tools.dataTypes.DataType;
46
import org.gvsig.tools.dataTypes.DataTypesManager;
47
import org.gvsig.tools.i18n.I18nManager;
48
import org.gvsig.tools.swing.api.FilteredTableModel;
49
import org.gvsig.tools.swing.api.ListElement;
50
import org.gvsig.tools.swing.api.ToolsSwingLocator;
51
import org.gvsig.tools.swing.api.ToolsSwingManager;
52
import org.gvsig.tools.swing.icontheme.IconTheme;
53
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55

    
56
/**
57
 *
58
 * @author jjdelcerro
59
 */
60
@SuppressWarnings("UseSpecificCatch")
61
public class SelectAttributesPanel
62
        extends SelectAttributesPanelView
63
        implements ExportPanel {
64

    
65
    private static final Logger LOGGER = LoggerFactory.getLogger(SelectAttributesPanel.class);
66

    
67
    private static final int COLUMN_FIELD_EXPORT = 0;
68
    private static final int COLUMN_FIELD_TYPE = 1;
69
    private static final int COLUMN_FIELD_SIZE = 2;
70
    private static final int COLUMN_FIELD_NAME = 3;
71
    private static final int COLUMN_FIELD_NEW_NAME = 4;
72

    
73
    private static final int COLUMN_FIELD_COUNT = 5;
74

    
75
    private static class AttributesTableModel
76
            extends AbstractTableModel
77
            implements TableModel {
78

    
79
        final private ExportAttributes attributes;
80
        private final String[] columnNames = new String[COLUMN_FIELD_COUNT];
81
        private final Class[] columnClases = new Class[COLUMN_FIELD_COUNT];
82
        private final DataTypesManager dataManager;
83

    
84
        public AttributesTableModel(ExportAttributes attributes) {
85
            this.attributes = attributes;
86
            this.dataManager = ToolsLocator.getDataTypesManager();
87
            I18nManager i18nManager = ToolsLocator.getI18nManager();
88
            columnNames[COLUMN_FIELD_NAME] = i18nManager.getTranslation("_name");
89
            columnNames[COLUMN_FIELD_NEW_NAME] = i18nManager.getTranslation("_new_name");
90
            columnNames[COLUMN_FIELD_TYPE] = i18nManager.getTranslation("_type");
91
            columnNames[COLUMN_FIELD_SIZE] = i18nManager.getTranslation("_size");
92
            columnNames[COLUMN_FIELD_EXPORT] = "";
93

    
94
            columnClases[COLUMN_FIELD_NAME] = String.class;
95
            columnClases[COLUMN_FIELD_NEW_NAME] = String.class;
96
            columnClases[COLUMN_FIELD_TYPE] = String.class;
97
            columnClases[COLUMN_FIELD_SIZE] = Integer.class;
98
            columnClases[COLUMN_FIELD_EXPORT] = Boolean.class;
99
        }
100

    
101
        @Override
102
        public int getRowCount() {
103
            return this.attributes.size();
104
        }
105

    
106
        @Override
107
        public int getColumnCount() {
108
            return COLUMN_FIELD_COUNT;
109
        }
110

    
111
        @Override
112
        public String getColumnName(int columnIndex) {
113
            return this.columnNames[columnIndex];
114
        }
115

    
116
        @Override
117
        public Class<?> getColumnClass(int columnIndex) {
118
            return this.columnClases[columnIndex];
119
        }
120

    
121
        @Override
122
        public boolean isCellEditable(int rowIndex, int columnIndex) {
123
            switch (columnIndex) {
124
                case COLUMN_FIELD_NAME:
125
                    return false;
126
                default:
127
                    return true;
128
            }
129
        }
130

    
131
        @Override
132
        public Object getValueAt(int rowIndex, int columnIndex) {
133
            ExportAttribute attr = this.attributes.get(rowIndex);
134
            switch (columnIndex) {
135
                case COLUMN_FIELD_NAME:
136
                    return attr.getName();
137
                case COLUMN_FIELD_NEW_NAME:
138
                    return attr.getNewName();
139
                case COLUMN_FIELD_TYPE:
140
                    return dataManager.getTypeName(attr.getNewDataType());
141
                case COLUMN_FIELD_SIZE:
142
                    return attr.getSize();
143
                case COLUMN_FIELD_EXPORT:
144
                    return attr.isExported();
145
                default:
146
                    return null;
147
            }
148
        }
149

    
150
        @Override
151
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
152
            ExportAttribute attr = this.attributes.get(rowIndex);
153
            switch (columnIndex) {
154
                case COLUMN_FIELD_NAME:
155
                    break;
156
                case COLUMN_FIELD_NEW_NAME:
157
                    attr.setNewName(Objects.toString(aValue, attr.getName()));
158
                    break;
159
                case COLUMN_FIELD_TYPE:
160
                    attr.setNewType(dataManager.getType(Objects.toString(aValue)));
161
                    break;
162
                case COLUMN_FIELD_SIZE:
163
                    try {
164
                        attr.setSize(Integer.parseInt(Objects.toString(aValue)));
165
                    } catch (Exception ex) {
166
                        LOGGER.warn("Not been able to set size value of attribute " + attr.getName() + " (" + Objects.toString(aValue) + ").", ex);
167
                    }
168
                    break;
169
                case COLUMN_FIELD_EXPORT:
170
                    try {
171
                        attr.setExported((boolean) dataManager.get(DataTypes.BOOLEAN).coerce(aValue));
172
                    } catch (Exception ex) {
173
                        LOGGER.warn("Not been able to set exported value of attribute " + attr.getName() + " (" + Objects.toString(aValue) + ").", ex);
174
                    }
175
                    break;
176
                default:
177
                    break;
178
            }
179
            this.fireTableCellUpdated(rowIndex, columnIndex);
180
        }
181
    }
182

    
183
    private static class TableFilterController {
184

    
185
        private final JTable jtable;
186
        private final JTextComponent jtext;
187
        private final JButton btnFilter;
188
        private final int filterColumn;
189

    
190
        private FilteredTableModel tableModel;
191

    
192
        public TableFilterController(JTable jtable, JTextComponent jtext, JButton btnFilter, int filterColumn) {
193
            this.jtable = jtable;
194
            this.filterColumn = filterColumn;
195
            this.btnFilter = btnFilter;
196
            this.jtext = jtext;
197
            this.tableModel = null;
198
            ToolsSwingLocator.getToolsSwingManager().setDefaultPopupMenu(jtext);
199
            ToolsSwingLocator.getToolsSwingManager().addClearButton(jtext, new ActionListener() {
200
                @Override
201
                public void actionPerformed(ActionEvent e) {
202
                    if (tableModel != null) {
203
                        tableModel.setFilter(null);
204
                        jtext.setText("");
205
                    }
206
                }
207
            });
208
            this.jtext.addKeyListener(new KeyAdapter() {
209
                @Override
210
                public void keyPressed(KeyEvent e) {
211
                    if (e.getKeyChar() == '\n') {
212
                        if (tableModel != null) {
213
                            tableModel.setFilter(jtext.getText());
214
                        }
215
                    }
216
                }
217
            });
218
            this.btnFilter.addActionListener(new ActionListener() {
219
                @Override
220
                public void actionPerformed(ActionEvent e) {
221
                    if (tableModel != null) {
222
                        tableModel.setFilter(jtext.getText());
223
                    }
224
                }
225
            });
226
        }
227

    
228
        public void setModel(TableModel tableModel) {
229
            this.tableModel = ToolsSwingLocator.getToolsSwingManager().createFilteredTableModel(
230
                    tableModel,
231
                    this.filterColumn
232
            );
233
            this.jtable.setModel(this.tableModel);
234
        }
235
    }
236

    
237
    private class DataTypeCellRenderer
238
            extends JLabel
239
            implements TableCellRenderer {
240

    
241
        public DataTypeCellRenderer() {
242
        }
243

    
244
        @Override
245
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
246
            if (value != null) {
247
                String name = (String) table.getModel().getValueAt(row, COLUMN_FIELD_NAME);
248
                this.setText(value.toString());
249
                Font f = this.getFont();
250
                if (isOriginalType(row, value.toString())) {
251
                    this.setFont(f.deriveFont(f.getStyle() & ~Font.BOLD));
252
                } else {
253
                    this.setFont(f.deriveFont(f.getStyle() | Font.BOLD));
254
                }
255
            } else {
256
                this.setText("");
257
            }
258
            return this;
259
        }
260
    }
261

    
262
    private class DataTypeCellEditor extends DefaultCellEditor {
263

    
264
        private int currentRow = -1;
265

    
266
        private class DataTypeListCellRenderer extends DefaultListCellRenderer {
267

    
268
            @Override
269
            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
270
                JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
271
                if (value != null) {
272
                    label.setText(value.toString());
273
                    Font f = label.getFont();
274
                    if (isOriginalType(currentRow, value.toString())) {
275
                        label.setFont(f.deriveFont(f.getStyle() | Font.BOLD));
276
                    } else {
277
                        label.setFont(f.deriveFont(f.getStyle() & ~Font.BOLD));
278
                    }
279
                }
280
                return label;
281
            }
282
        }
283

    
284
        public DataTypeCellEditor() {
285
            super(new JComboBox());
286
            JComboBox combo = (JComboBox) this.getComponent();
287
            combo.setRenderer(new DataTypeListCellRenderer());
288
            combo.setModel(this.getDataTypeComboModel());
289
        }
290

    
291
        @Override
292
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
293
            this.currentRow = row;
294
            JComboBox combo = (JComboBox) super.getTableCellEditorComponent(table, value, isSelected, row, column);
295
            ListElement.setSelected(combo, value);
296
            return combo;
297
        }
298

    
299
        private DefaultComboBoxModel getDataTypeComboModel() {
300
            DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
301
            List<ListElement<Integer>> fieldTypes = new ArrayList<>();
302
            Iterator<DataType> it = dataManager.iterator();
303
            while (it.hasNext()) {
304
                DataType dataType = it.next();
305
                fieldTypes.add( new ListElement<>(dataType.getName(), dataType.getType()) );
306
            }
307
            fieldTypes.sort(new Comparator<ListElement<Integer>>() {
308
                @Override
309
                public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
310
                    return o1.toString().compareTo(o2.toString());
311
                }
312
            });
313

    
314
            DefaultComboBoxModel<ListElement<Integer>> model = new DefaultComboBoxModel<>();
315
            for (ListElement<Integer> element : fieldTypes) {
316
                model.addElement(element);
317
            }
318
            return model;
319
        }
320
    }
321

    
322
    private final ExportParameters parameters;
323
    private final JExportProcessPanel processPanel;
324

    
325
//    private Map<String, String> fieldAttributeTypes;
326
//    private FilteredTableModel filteredTableModel;
327
    private TableModel tableModel;
328
    private TableFilterController tableFilterController;
329
    private FeatureType targetFeatureType ;
330
    
331
    public SelectAttributesPanel(
332
            JExportProcessPanel processPanel,
333
            ExportParameters parameters
334
    ) {
335
        this.processPanel = processPanel;
336
        this.parameters = parameters;
337
        this.parameters.getExportAttributes().setActive(true);
338
        this.initComponents();
339
    }
340

    
341
    @Override
342
    public String getIdPanel() {
343
        return ExportPanelsManager.PANEL_ATTRIBUTES_SELECTION;
344
    }
345

    
346
    @Override
347
    public String getTitlePanel() {
348
        I18nManager i18n = ToolsLocator.getI18nManager();
349
        return i18n.getTranslation("_Attribute_Selection");
350
    }
351

    
352
    @Override
353
    public boolean validatePanel() throws ExportPanelValidationException {
354
        ExportAttributes expAttrs = this.parameters.getExportAttributes();
355
        if (!expAttrs.isAttributeNamesValid()) {
356
            I18nManager i18nManager = ToolsLocator.getI18nManager();
357
            int as = JOptionPane.showConfirmDialog(
358
                    this,
359
                    i18nManager.getTranslation("_Not_valid_attribute_names_Do_you_want_a_suggest_names?"),
360
                    i18nManager.getTranslation("_Not_valid_attriute_names"),
361
                    JOptionPane.YES_NO_OPTION
362
            );
363
            if (as == JOptionPane.YES_OPTION) {
364
                expAttrs.fixAttributeNames();
365
                this.fillTableWithAttributes();
366
            } else if (as == JOptionPane.NO_OPTION) {
367

    
368
            }
369
            return false;
370
        }
371
        return true;
372
    }
373

    
374
    @Override
375
    public void enterPanel() {
376
        this.fillTableWithAttributes();
377
    }
378

    
379
    @Override
380
    public void previousPanel() {
381
        this.fillTableWithAttributes();
382
    }
383

    
384
    @Override
385
    public void nextPanel() {
386
        //get params are in the validate method
387
    }
388

    
389
    @Override
390
    public JComponent asJComponent() {
391
        return this;
392
    }
393

    
394
    private boolean isOriginalType(int row, String type) {
395
        try {
396
            if( this.targetFeatureType==null ) {
397
                return true;
398
            }
399
            TableModel model = this.tblAttributes.getModel();
400
            String name = (String) model.getValueAt(row, COLUMN_FIELD_NAME);
401
            FeatureAttributeDescriptor attr = this.targetFeatureType.getAttributeDescriptor(name);
402
            if (attr == null) {
403
                return true;
404
            }
405
            return StringUtils.equalsIgnoreCase(type, attr.getDataTypeName());
406
        } catch (Exception ex) {
407
            return true;
408
        }
409

    
410
    }
411

    
412
    private ExportAttributes getExportAttributes() {
413
        ExportAttributes attributes = this.parameters.getExportAttributes();
414
        return attributes;
415
    }
416

    
417
    private void fillTableWithAttributes() {
418
        ExportAttributes attributes = this.getExportAttributes();
419
        if( this.targetFeatureType == null ) {
420
            this.targetFeatureType = this.getExportAttributes().getTargetFeatureType();
421
        }
422

    
423
        
424
        this.tableModel = new AttributesTableModel(attributes);
425
        this.tblAttributes.setModel(this.tableModel);
426
        this.tableFilterController.setModel(this.tableModel);
427

    
428
        TableColumnModel columnModel = this.tblAttributes.getColumnModel();
429
        columnModel.getColumn(COLUMN_FIELD_TYPE).setCellEditor(new DataTypeCellEditor());
430
        columnModel.getColumn(COLUMN_FIELD_TYPE).setCellRenderer(new DataTypeCellRenderer());
431
        
432
        columnModel.getColumn(COLUMN_FIELD_EXPORT).setPreferredWidth( new JCheckBox().getPreferredSize().width*2);
433
        columnModel.getColumn(COLUMN_FIELD_TYPE).setPreferredWidth( new JLabel("XXIntegerXX").getPreferredSize().width);
434
        columnModel.getColumn(COLUMN_FIELD_SIZE).setPreferredWidth( new JLabel("00000").getPreferredSize().width);
435

    
436
    }
437

    
438
    private void initComponents() {
439

    
440
        this.tblAttributes.setAutoCreateRowSorter(true);
441
        this.tblAttributes.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
442
                
443
        this.tableFilterController = new TableFilterController(
444
                this.tblAttributes,
445
                this.txtFilter,
446
                this.btnFilter,
447
                COLUMN_FIELD_NAME
448
        );
449
        this.btnCheckAll.addActionListener(new ActionListener() {
450
            @Override
451
            public void actionPerformed(ActionEvent e) {
452
                doCheckAll();
453
            }
454
        });
455
        this.btnUncheckAll.addActionListener(new ActionListener() {
456
            @Override
457
            public void actionPerformed(ActionEvent e) {
458
                doUncheckAll();
459
            }
460
        });
461

    
462
        this.translate();
463
    }
464

    
465
    private void doUncheckAll() {
466
        TableModel model = this.tblAttributes.getModel();
467
        for (int row = 0; row < model.getRowCount(); row++) {
468
            model.setValueAt(false, row, COLUMN_FIELD_EXPORT);
469
        }
470
    }
471

    
472
    private void doCheckAll() {
473
        TableModel model = this.tblAttributes.getModel();
474
        for (int row = 0; row < model.getRowCount(); row++) {
475
            model.setValueAt(true, row, COLUMN_FIELD_EXPORT);
476
        }
477
    }
478

    
479
    private void translate() {
480
        ToolsSwingManager manager = ToolsSwingLocator.getToolsSwingManager();
481
        manager.translate(this.lblHeader);
482
    }
483

    
484
    @Override
485
    public ImageIcon loadImage(String imageName) {
486
        String name = FilenameUtils.getBaseName(imageName);
487
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
488
        if (theme.exists(name)) {
489
            return theme.get(name);
490
        }
491
        URL url = this.getClass().getResource(name + ".png");
492
        if (url == null) {
493
            return null;
494
        }
495
        return new ImageIcon(url);
496
    }
497

    
498
}