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

History | View | Annotate | Download (22.2 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_ORIGIN = 3;
71
    private static final int COLUMN_FIELD_CALCULATED = 4;
72
    private static final int COLUMN_FIELD_NAME = 5;
73
    private static final int COLUMN_FIELD_NEW_NAME =6;
74
    
75
    private static final int COLUMN_FIELD_COUNT = 7;
76
    
77
    private static final int ORIGIN_REAL = 0;
78
    private static final int ORIGIN_CALCULATED = 1;
79
    private static final int ORIGIN_EXTRA = 2;
80
            
81

    
82
    private static class AttributesTableModel
83
            extends AbstractTableModel
84
            implements TableModel {
85

    
86
        final private ExportAttributes attributes;
87
        private final String[] columnNames = new String[COLUMN_FIELD_COUNT];
88
        private final Class[] columnClases = new Class[COLUMN_FIELD_COUNT];
89
        private final DataTypesManager dataManager;
90

    
91
        public AttributesTableModel(ExportAttributes attributes) {
92
            this.attributes = attributes;
93
            this.dataManager = ToolsLocator.getDataTypesManager();
94
            I18nManager i18nManager = ToolsLocator.getI18nManager();
95
            columnNames[COLUMN_FIELD_NAME] = i18nManager.getTranslation("_name");
96
            columnNames[COLUMN_FIELD_NEW_NAME] = i18nManager.getTranslation("_New_name");
97
            columnNames[COLUMN_FIELD_ORIGIN] = i18nManager.getTranslation("_Origin");
98
            columnNames[COLUMN_FIELD_TYPE] = i18nManager.getTranslation("_type");
99
            columnNames[COLUMN_FIELD_SIZE] = i18nManager.getTranslation("_Size");
100
            columnNames[COLUMN_FIELD_CALCULATED] = i18nManager.getTranslation("_Virtual");
101
            columnNames[COLUMN_FIELD_EXPORT] = "";
102

    
103
            columnClases[COLUMN_FIELD_NAME] = String.class;
104
            columnClases[COLUMN_FIELD_NEW_NAME] = String.class;
105
            columnClases[COLUMN_FIELD_ORIGIN] = String.class;
106
            columnClases[COLUMN_FIELD_TYPE] = String.class;
107
            columnClases[COLUMN_FIELD_SIZE] = Integer.class;
108
            columnClases[COLUMN_FIELD_EXPORT] = Boolean.class;
109
            columnClases[COLUMN_FIELD_CALCULATED] = Boolean.class;
110
        }
111

    
112
        @Override
113
        public int getRowCount() {
114
            return this.attributes.size();
115
        }
116

    
117
        @Override
118
        public int getColumnCount() {
119
            return COLUMN_FIELD_COUNT;
120
        }
121

    
122
        @Override
123
        public String getColumnName(int columnIndex) {
124
            return this.columnNames[columnIndex];
125
        }
126

    
127
        @Override
128
        public Class<?> getColumnClass(int columnIndex) {
129
            return this.columnClases[columnIndex];
130
        }
131

    
132
        @Override
133
        public boolean isCellEditable(int rowIndex, int columnIndex) {
134
            switch (columnIndex) {
135
                case COLUMN_FIELD_NAME:
136
                    return false;
137
                case COLUMN_FIELD_ORIGIN:
138
                    return false;
139
                case COLUMN_FIELD_CALCULATED: {
140
                    ExportAttribute attr = this.attributes.get(rowIndex);
141
                    DataType dataType = attr.getDescriptor().getDataType();
142
                    if( dataType.isContainer() ||
143
                        dataType.isObject() ||
144
                        dataType.isDynObject() ) {
145
                        return false;
146
                    }
147
                    if (attr.getDescriptor().isComputed()) {
148
                        return true;
149
                    }
150
                    return false;
151
                }
152
                default:
153
                    return true;
154
            }
155
        }
156

    
157
        @Override
158
        public Object getValueAt(int rowIndex, int columnIndex) {
159
            ExportAttribute attr = this.attributes.get(rowIndex);
160
            switch (columnIndex) {
161
                case COLUMN_FIELD_NAME:
162
                    return attr.getName();
163
                case COLUMN_FIELD_NEW_NAME:
164
                    return attr.getNewName();
165
                case COLUMN_FIELD_ORIGIN:
166
                    if (attr.getDescriptor().isComputed()) {
167
                       if (attr.getDescriptor().getFeatureType()!=null) {
168
                           return ORIGIN_CALCULATED;
169
                       } else {
170
                           return ORIGIN_EXTRA;
171
                       }
172
                    } else {
173
                        return ORIGIN_REAL;
174
                    }
175
                case COLUMN_FIELD_TYPE:
176
                    return dataManager.getTypeName(attr.getNewDataType());
177
                case COLUMN_FIELD_SIZE:
178
                    return attr.getSize();
179
                case COLUMN_FIELD_EXPORT:
180
                    return attr.isExported();
181
                case COLUMN_FIELD_CALCULATED:
182
                    return attr.isComputed();
183
                default:
184
                    return null;
185
            }
186
        }
187

    
188
        @Override
189
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
190
            ExportAttribute attr = this.attributes.get(rowIndex);
191
            switch (columnIndex) {
192
                case COLUMN_FIELD_NAME:
193
                    break;
194
                case COLUMN_FIELD_NEW_NAME:
195
                    attr.setNewName(Objects.toString(aValue, attr.getName()));
196
                    break;
197
                case COLUMN_FIELD_TYPE:
198
                    attr.setNewType(dataManager.getType(Objects.toString(aValue)));
199
                    break;
200
                case COLUMN_FIELD_SIZE:
201
                    try {
202
                        attr.setSize(Integer.parseInt(Objects.toString(aValue)));
203
                    } catch (Exception ex) {
204
                        LOGGER.warn("Not been able to set size value of attribute " + attr.getName() + " (" + Objects.toString(aValue) + ").", ex);
205
                    }
206
                    break;
207
                case COLUMN_FIELD_EXPORT:
208
                    try {
209
                        attr.setExported((boolean) dataManager.get(DataTypes.BOOLEAN).coerce(aValue));
210
                    } catch (Exception ex) {
211
                        LOGGER.warn("Not been able to set exported value of attribute " + attr.getName() + " (" + Objects.toString(aValue) + ").", ex);
212
                    }
213
                    break;
214
                case COLUMN_FIELD_CALCULATED:
215
                    try {
216
                        attr.setComputed((boolean) dataManager.get(DataTypes.BOOLEAN).coerce(aValue));
217
                    } catch (Exception ex) {
218
                        LOGGER.warn("Not been able to set calculated value of attribute " + attr.getName() + " (" + Objects.toString(aValue) + ").", ex);
219
                    }
220
                    break;
221
                default:
222
                    break;
223
            }
224
            this.fireTableCellUpdated(rowIndex, columnIndex);
225
        }
226
    }
227

    
228
    private static class TableFilterController {
229

    
230
        private final JTable jtable;
231
        private final JTextComponent jtext;
232
        private final JButton btnFilter;
233
        private final int filterColumn;
234

    
235
        private FilteredTableModel tableModel;
236

    
237
        public TableFilterController(JTable jtable, JTextComponent jtext, JButton btnFilter, int filterColumn) {
238
            this.jtable = jtable;
239
            this.filterColumn = filterColumn;
240
            this.btnFilter = btnFilter;
241
            this.jtext = jtext;
242
            this.tableModel = null;
243
            ToolsSwingLocator.getToolsSwingManager().setDefaultPopupMenu(jtext);
244
            ToolsSwingLocator.getToolsSwingManager().addClearButton(jtext, new ActionListener() {
245
                @Override
246
                public void actionPerformed(ActionEvent e) {
247
                    if (tableModel != null) {
248
                        tableModel.setFilter(null);
249
                        jtext.setText("");
250
                    }
251
                }
252
            });
253
            this.jtext.addKeyListener(new KeyAdapter() {
254
                @Override
255
                public void keyPressed(KeyEvent e) {
256
                    if (e.getKeyChar() == '\n') {
257
                        if (tableModel != null) {
258
                            tableModel.setFilter(jtext.getText());
259
                        }
260
                    }
261
                }
262
            });
263
            this.btnFilter.addActionListener(new ActionListener() {
264
                @Override
265
                public void actionPerformed(ActionEvent e) {
266
                    if (tableModel != null) {
267
                        tableModel.setFilter(jtext.getText());
268
                    }
269
                }
270
            });
271
        }
272

    
273
        public void setModel(TableModel tableModel) {
274
            this.tableModel = ToolsSwingLocator.getToolsSwingManager().createFilteredTableModel(
275
                    tableModel,
276
                    this.filterColumn
277
            );
278
            this.jtable.setModel(this.tableModel);
279
        }
280
    }
281

    
282
    
283
    private class DataTypeCellRenderer
284
            extends JLabel
285
            implements TableCellRenderer {
286

    
287
        public DataTypeCellRenderer() {
288
        }
289

    
290
        @Override
291
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
292
            if (value != null) {
293
                String name = (String) table.getModel().getValueAt(row, COLUMN_FIELD_NAME);
294
                this.setText(value.toString());
295
                Font f = this.getFont();
296
                if (isOriginalType(row, value.toString())) {
297
                    this.setFont(f.deriveFont(f.getStyle() & ~Font.BOLD));
298
                } else {
299
                    this.setFont(f.deriveFont(f.getStyle() | Font.BOLD));
300
                }
301
            } else {
302
                this.setText("");
303
            }
304
            return this;
305
        }
306
    }
307

    
308
        
309
    private class OriginCellRenderer
310
            extends JLabel
311
            implements TableCellRenderer {
312

    
313
        public OriginCellRenderer() {
314
        }
315

    
316
        @Override
317
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
318
            if (column == COLUMN_FIELD_ORIGIN) {
319
                int origin = (int) table.getModel().getValueAt(row, COLUMN_FIELD_ORIGIN);
320
                IconTheme iconManager = ToolsSwingLocator.getIconThemeManager().getDefault();
321
                I18nManager i18Manager = ToolsLocator.getI18nManager();
322
                this.setHorizontalAlignment(JLabel.CENTER);
323
                switch (origin) {
324
                    case ORIGIN_CALCULATED:
325
                        this.setToolTipText(i18Manager.getTranslation("_Calculated_field"));
326
                        this.setIcon((iconManager.get("column-calculated")));
327
                        break;
328
                    case ORIGIN_EXTRA:
329
                        this.setToolTipText(i18Manager.getTranslation("_Extra_field"));
330
                        this.setIcon((iconManager.get("column-extra")));
331
                        break;
332
                    case ORIGIN_REAL:
333
                        this.setToolTipText(i18Manager.getTranslation("_Real_field"));
334
                        this.setIcon((iconManager.get("column-true")));
335
                        break;
336
                    default:
337
                        this.setText(value.toString());
338
                        break;
339
                }
340
                return this;
341
            }
342
            return this;
343
        }
344
    }
345

    
346
    private class DataTypeCellEditor extends DefaultCellEditor {
347

    
348
        private int currentRow = -1;
349

    
350
        private class DataTypeListCellRenderer extends DefaultListCellRenderer {
351

    
352
            @Override
353
            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
354
                JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
355
                if (value != null) {
356
                    label.setText(value.toString());
357
                    Font f = label.getFont();
358
                    if (isOriginalType(currentRow, value.toString())) {
359
                        label.setFont(f.deriveFont(f.getStyle() | Font.BOLD));
360
                    } else {
361
                        label.setFont(f.deriveFont(f.getStyle() & ~Font.BOLD));
362
                    }
363
                }
364
                return label;
365
            }
366
        }
367
        
368
        public DataTypeCellEditor() {
369
            super(new JComboBox());
370
            JComboBox combo = (JComboBox) this.getComponent();
371
            combo.setRenderer(new DataTypeListCellRenderer());
372
            combo.setModel(this.getDataTypeComboModel());
373
        }
374

    
375
        @Override
376
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
377
            this.currentRow = row;
378
            JComboBox combo = (JComboBox) super.getTableCellEditorComponent(table, value, isSelected, row, column);
379
            ListElement.setSelected(combo, value);
380
            return combo;
381
        }
382

    
383
        private DefaultComboBoxModel getDataTypeComboModel() {
384
            DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
385
            List<ListElement<Integer>> fieldTypes = new ArrayList<>();
386
            Iterator<DataType> it = dataManager.iterator();
387
            while (it.hasNext()) {
388
                DataType dataType = it.next();
389
                fieldTypes.add( new ListElement<>(dataType.getName(), dataType.getType()) );
390
            }
391
            fieldTypes.sort(new Comparator<ListElement<Integer>>() {
392
                @Override
393
                public int compare(ListElement<Integer> o1, ListElement<Integer> o2) {
394
                    return o1.toString().compareTo(o2.toString());
395
                }
396
            });
397

    
398
            DefaultComboBoxModel<ListElement<Integer>> model = new DefaultComboBoxModel<>();
399
            for (ListElement<Integer> element : fieldTypes) {
400
                model.addElement(element);
401
            }
402
            return model;
403
        }
404
    }
405

    
406
    private final ExportParameters parameters;
407
    private final JExportProcessPanel processPanel;
408

    
409
//    private Map<String, String> fieldAttributeTypes;
410
//    private FilteredTableModel filteredTableModel;
411
    private TableModel tableModel;
412
    private TableFilterController tableFilterController;
413
    private FeatureType targetFeatureType ;
414
    
415
    public SelectAttributesPanel(
416
            JExportProcessPanel processPanel,
417
            ExportParameters parameters
418
    ) {
419
        this.processPanel = processPanel;
420
        this.parameters = parameters;
421
        this.parameters.getExportAttributes().setActive(true);
422
        this.initComponents();
423
    }
424

    
425
    @Override
426
    public String getIdPanel() {
427
        return ExportPanelsManager.PANEL_ATTRIBUTES_SELECTION;
428
    }
429

    
430
    @Override
431
    public String getTitlePanel() {
432
        I18nManager i18n = ToolsLocator.getI18nManager();
433
        return i18n.getTranslation("_Attribute_Selection");
434
    }
435

    
436
    @Override
437
    public boolean validatePanel() throws ExportPanelValidationException {
438
        ExportAttributes expAttrs = this.parameters.getExportAttributes();
439
        if (!expAttrs.isAttributeNamesValid()) {
440
            I18nManager i18nManager = ToolsLocator.getI18nManager();
441
            int as = JOptionPane.showConfirmDialog(
442
                    this,
443
                    i18nManager.getTranslation("_Not_valid_attribute_names_Do_you_want_a_suggest_names?"),
444
                    i18nManager.getTranslation("_Not_valid_attriute_names"),
445
                    JOptionPane.YES_NO_OPTION
446
            );
447
            if (as == JOptionPane.YES_OPTION) {
448
                expAttrs.fixAttributeNames();
449
                this.fillTableWithAttributes();
450
            } else if (as == JOptionPane.NO_OPTION) {
451

    
452
            }
453
            return false;
454
        }
455
        return true;
456
    }
457

    
458
    @Override
459
    public void enterPanel() {
460
        this.fillTableWithAttributes();
461
    }
462

    
463
    @Override
464
    public void previousPanel() {
465
        this.fillTableWithAttributes();
466
    }
467

    
468
    @Override
469
    public void nextPanel() {
470
        //get params are in the validate method
471
    }
472

    
473
    @Override
474
    public JComponent asJComponent() {
475
        return this;
476
    }
477

    
478
    private boolean isOriginalType(int row, String type) {
479
        try {
480
            if( this.targetFeatureType==null ) {
481
                return true;
482
            }
483
            TableModel model = this.tblAttributes.getModel();
484
            String name = (String) model.getValueAt(row, COLUMN_FIELD_NAME);
485
            FeatureAttributeDescriptor attr = this.targetFeatureType.getAttributeDescriptor(name);
486
            if (attr == null) {
487
                return true;
488
            }
489
            return StringUtils.equalsIgnoreCase(type, attr.getDataTypeName());
490
        } catch (Exception ex) {
491
            return true;
492
        }
493

    
494
    }
495

    
496
    private ExportAttributes getExportAttributes() {
497
        ExportAttributes attributes = this.parameters.getExportAttributes();
498
        return attributes;
499
    }
500

    
501
    private void fillTableWithAttributes() {
502
        ExportAttributes attributes = this.getExportAttributes();
503
        if( this.targetFeatureType == null ) {
504
            this.targetFeatureType = this.getExportAttributes().getTargetFeatureType();
505
        }
506

    
507
        
508
        this.tableModel = new AttributesTableModel(attributes);
509
        this.tblAttributes.setModel(this.tableModel);
510
        this.tableFilterController.setModel(this.tableModel);
511

    
512
        TableColumnModel columnModel = this.tblAttributes.getColumnModel();
513
        columnModel.getColumn(COLUMN_FIELD_ORIGIN).setCellRenderer(new OriginCellRenderer());
514
        columnModel.getColumn(COLUMN_FIELD_TYPE).setCellEditor(new DataTypeCellEditor());
515
        columnModel.getColumn(COLUMN_FIELD_TYPE).setCellRenderer(new DataTypeCellRenderer());
516
        
517
        columnModel.getColumn(COLUMN_FIELD_EXPORT).setPreferredWidth( new JCheckBox().getPreferredSize().width*2);
518
        columnModel.getColumn(COLUMN_FIELD_TYPE).setPreferredWidth( new JLabel("XIntegerX").getPreferredSize().width);
519
        columnModel.getColumn(COLUMN_FIELD_SIZE).setPreferredWidth( new JLabel("00000").getPreferredSize().width);
520
        columnModel.getColumn(COLUMN_FIELD_ORIGIN).setPreferredWidth( new JLabel("000").getPreferredSize().width);
521
        columnModel.getColumn(COLUMN_FIELD_CALCULATED).setPreferredWidth( new JLabel("000").getPreferredSize().width);
522

    
523
    }
524

    
525
    private void initComponents() {
526

    
527
        this.tblAttributes.setAutoCreateRowSorter(true);
528
        this.tblAttributes.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
529
                
530
        this.tableFilterController = new TableFilterController(
531
                this.tblAttributes,
532
                this.txtFilter,
533
                this.btnFilter,
534
                COLUMN_FIELD_NAME
535
        );
536
        this.btnCheckAll.addActionListener(new ActionListener() {
537
            @Override
538
            public void actionPerformed(ActionEvent e) {
539
                doCheckAll();
540
            }
541
        });
542
        this.btnUncheckAll.addActionListener(new ActionListener() {
543
            @Override
544
            public void actionPerformed(ActionEvent e) {
545
                doUncheckAll();
546
            }
547
        });
548

    
549
        this.translate();
550
    }
551

    
552
    private void doUncheckAll() {
553
        TableModel model = this.tblAttributes.getModel();
554
        for (int row = 0; row < model.getRowCount(); row++) {
555
            model.setValueAt(false, row, COLUMN_FIELD_EXPORT);
556
        }
557
    }
558

    
559
    private void doCheckAll() {
560
        TableModel model = this.tblAttributes.getModel();
561
        for (int row = 0; row < model.getRowCount(); row++) {
562
            model.setValueAt(true, row, COLUMN_FIELD_EXPORT);
563
        }
564
    }
565

    
566
    private void translate() {
567
        ToolsSwingManager manager = ToolsSwingLocator.getToolsSwingManager();
568
        manager.translate(this.lblHeader);
569
    }
570

    
571
    @Override
572
    public ImageIcon loadImage(String imageName) {
573
        String name = FilenameUtils.getBaseName(imageName);
574
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
575
        if (theme.exists(name)) {
576
            return theme.get(name);
577
        }
578
        URL url = this.getClass().getResource(name + ".png");
579
        if (url == null) {
580
            return null;
581
        }
582
        return new ImageIcon(url);
583
    }
584

    
585
}