Statistics
| Revision:

root / tags / v2_0_0_Build_2050 / libraries / org.gvsig.newlayer / org.gvsig.newlayer.lib / org.gvsig.newlayer.lib.impl / src / main / java / org / gvsig / newlayer / impl / FeatureTypePanel.java @ 38695

History | View | Annotate | Download (40.2 KB)

1
package org.gvsig.newlayer.impl;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Component;
5
import java.awt.GridBagConstraints;
6
import java.awt.GridBagLayout;
7
import java.awt.Insets;
8
import java.awt.event.ActionEvent;
9
import java.awt.event.ActionListener;
10
import java.awt.event.ItemEvent;
11
import java.awt.event.ItemListener;
12
import java.util.ArrayList;
13
import java.util.Iterator;
14
import java.util.List;
15

    
16
import javax.swing.ComboBoxModel;
17
import javax.swing.DefaultCellEditor;
18
import javax.swing.JButton;
19
import javax.swing.JCheckBox;
20
import javax.swing.JComboBox;
21
import javax.swing.JLabel;
22
import javax.swing.JOptionPane;
23
import javax.swing.JPanel;
24
import javax.swing.JScrollPane;
25
import javax.swing.JTable;
26
import javax.swing.JTextField;
27
import javax.swing.ListSelectionModel;
28
import javax.swing.UIManager;
29
import javax.swing.event.ListDataListener;
30
import javax.swing.event.ListSelectionEvent;
31
import javax.swing.event.ListSelectionListener;
32
import javax.swing.event.TableModelEvent;
33
import javax.swing.event.TableModelListener;
34
import javax.swing.table.DefaultTableCellRenderer;
35
import javax.swing.table.DefaultTableModel;
36
import javax.swing.table.TableCellRenderer;
37
import javax.swing.table.TableColumn;
38
import javax.swing.table.TableModel;
39

    
40
import org.cresques.cts.IProjection;
41
import org.slf4j.Logger;
42
import org.slf4j.LoggerFactory;
43

    
44
import org.gvsig.app.gui.panels.CRSSelectPanel;
45
import org.gvsig.app.gui.panels.crs.ISelectCrsPanel;
46
import org.gvsig.fmap.dal.DALLocator;
47
import org.gvsig.fmap.dal.DataManager;
48
import org.gvsig.fmap.dal.DataStoreProviderFactory;
49
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
50
import org.gvsig.fmap.dal.feature.EditableFeatureType;
51
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
52
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
53
import org.gvsig.fmap.dal.feature.FeatureType;
54
import org.gvsig.fmap.geom.DataTypes;
55
import org.gvsig.fmap.geom.Geometry;
56
import org.gvsig.fmap.geom.GeometryLocator;
57
import org.gvsig.fmap.geom.GeometryManager;
58
import org.gvsig.fmap.geom.type.GeometryType;
59
import org.gvsig.gui.beans.wizard.panel.NotContinueWizardException;
60
import org.gvsig.gui.beans.wizard.panel.OptionPanel;
61
import org.gvsig.i18n.Messages;
62
import org.gvsig.newlayer.NewLayerService;
63
import org.gvsig.tools.dataTypes.DataType;
64
import org.gvsig.tools.swing.api.ToolsSwingLocator;
65
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
66

    
67
public class FeatureTypePanel extends JPanel implements OptionPanel {
68
    private static final int COLUMN_FIELD = 0;
69
    private static final int COLUMN_TYPE = 1;
70
    private static final int COLUMN_LENGTH = 2;
71
    private static final int COLUMN_GEOMETRYTYPE = 3;
72
    private static final int COLUMN_GEOMETRYSUBTYPE = 4;
73
    private static final int COLUMN_CRS = 5;
74
    private static final int COLUMN_PRIMARYKEY = 6;
75
    private static final int COLUMN_MANDATORY = 7;
76
 
77
        private static final long serialVersionUID = 263541873998597624L;
78
        
79
    private FeatureType defaultFeatType = null;
80
    
81
    private NewLayerService newLayer_Service = null;
82
    private int inDefaultFeatTypeFieldCount = 0;
83
        private String inStoreName = null;
84
        private IProjection inProjection = null;
85
        private FeatureStoreProviderFactory spFactory = null;
86
        private boolean defaultHasGeometry = false;
87
        
88
        private static final Logger logger = LoggerFactory
89
                        .getLogger(FeatureTypePanel.class);
90

    
91
        private JLabel jLabel = null;
92
        private JScrollPane jScrollPane = null;
93
        protected JTable jTable = null;
94
        private JPanel jPanelEast = null;
95
        private JButton addFieldButton = null;
96
        private JButton deleteFieldButton = null;
97
        protected int MAX_FIELD_LENGTH = 254;
98
        
99
        // we dont need this list
100
        // we'll clear and rebuild featureType each time
101
        // the user clicks next
102
        // private List removedFields;
103

    
104
        // private DataServerExplorer explorer = null;
105

    
106
        public FeatureTypePanel(NewLayerService new_layer_service) {
107
            
108
            /*
109
            service.getFeatureType(),
110
        service.getStoreName(),
111
        service.getMapContext().getProjection();
112
        */
113
            newLayer_Service = new_layer_service;
114
        }
115
        
116
        private boolean fieldsInited = false;
117
        
118
        private void initFields() {
119
            
120
            if (newLayer_Service == null) {
121
                return;
122
            }
123
            
124
            fieldsInited = true;
125
            
126
        inStoreName = newLayer_Service.getStoreName();
127
        inProjection = newLayer_Service.getMapContext().getProjection();
128
        
129
        DataStoreProviderFactory dspf =
130
                DALLocator.getDataManager().getStoreProviderFactory(inStoreName);
131
        spFactory = (FeatureStoreProviderFactory) dspf;
132
        defaultFeatType = spFactory.createDefaultFeatureType();
133
        if (defaultFeatType != null) {
134
            inDefaultFeatTypeFieldCount =
135
                defaultFeatType.getAttributeDescriptors().length; 
136
            int def_geom_fld_index = defaultFeatType.getDefaultGeometryAttributeIndex(); 
137
            if (def_geom_fld_index >= 0 &&
138
                def_geom_fld_index < inDefaultFeatTypeFieldCount &&
139
                defaultFeatType.
140
                getAttributeDescriptor(def_geom_fld_index).
141
                getDataType().getType() == DataTypes.GEOMETRY) {
142
                
143
                defaultHasGeometry = true;
144
            }
145
        }
146
        }
147

    
148
        private void initializeComponents() {
149
                jLabel = new JLabel();
150
                jLabel.setText(Messages.getText("define_fields"));
151
                this.setLayout(new BorderLayout(5, 5));
152
                this.setSize(new java.awt.Dimension(499, 232));
153
                this.add(jLabel, java.awt.BorderLayout.NORTH);
154
                this.add(getJScrollPane(), java.awt.BorderLayout.CENTER);
155
                this.add(getJPanelSouth(), java.awt.BorderLayout.SOUTH);
156

    
157
        }
158

    
159
        /**
160
         * This method initializes jScrollPane
161
         * 
162
         * @return javax.swing.JScrollPane
163
         */
164
        private JScrollPane getJScrollPane() {
165
                if (jScrollPane == null) {
166
                        jScrollPane = new JScrollPane();
167
                        jScrollPane.setViewportView(getJTable());
168
                }
169
                return jScrollPane;
170
        }
171

    
172
        /**
173
         * This method initializes jTable
174
         * 
175
         * @return javax.swing.JTable
176
         */
177
        private JTable getJTable() {
178
                if (jTable == null) {
179
                        jTable = new JTable(){
180
                            public boolean isCellEditable(int row,int column){
181
                                
182
                                
183
                                if (row < inDefaultFeatTypeFieldCount) {
184
                                    // default fields
185
                                    Object o = getValueAt(row,COLUMN_TYPE);  
186
                                    if (o instanceof ComboItemDataType) {
187
                                        
188
                                        ComboItemDataType ot = (ComboItemDataType) o;
189
                                        return (ot.dataType.getType() == DataTypes.GEOMETRY)
190
                                            &&
191
                                            (column == COLUMN_GEOMETRYTYPE ||
192
                                        column == COLUMN_GEOMETRYSUBTYPE);
193
                                        
194
                                    } else {
195
                                        return false;
196
                                    }
197
                                    
198
                                } else {
199
                                    // fields added by user
200
                                    if (column == COLUMN_PRIMARYKEY) {
201
                                        return spFactory.allowsPrimaryKeyAttributes();
202
                                    }
203

    
204
                                    if (column == COLUMN_MANDATORY) {
205
                                        return spFactory.allowsMandatoryAttributes();
206
                                    }
207
                                    
208
                                    if (column == COLUMN_LENGTH) {
209
                                        
210
                                        Object o = getValueAt(row,COLUMN_TYPE);  
211
                                if (o instanceof ComboItemDataType) {
212
                                    
213
                                    ComboItemDataType ot = (ComboItemDataType) o;
214
                                    return dataTypeNeedsSize(ot.dataType.getType());
215
                                    
216
                                } else {
217
                                    return false;
218
                                }
219
                                        
220
                                    }
221

    
222
                                    if (defaultHasGeometry &&
223
                                        (column == COLUMN_GEOMETRYTYPE
224
                            || column == COLUMN_GEOMETRYSUBTYPE
225
                            || column == COLUMN_CRS)) {
226
                                        // geom-related columns not editable
227
                                        return false;
228
                                    } else {
229
                                return true;
230
                                    }
231
                                }
232

    
233
                                /*
234
                                if ((column == COLUMN_GEOMETRYTYPE) ||
235
                                    (column == COLUMN_GEOMETRYSUBTYPE) ||
236
                                    (column == COLUMN_CRS)) {
237
                                    DataType dataType = 
238
                                        ((ComboItemDataType) getValueAt(row, COLUMN_TYPE)).dataType;                                   
239
                                    return dataType.getType() == DataTypes.GEOMETRY;
240
                                }
241
                                */
242
                            }  
243
                        };
244

    
245
                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
246
                        tm.addColumn(Messages.getText("field"));
247

    
248
                        tm.addColumn(Messages.getText("type"));
249
                        tm.addColumn(Messages.getText("length"));
250
                        tm.addColumn(Messages.getText("geomType"));
251
                        tm.addColumn(Messages.getText("geomSubtype"));
252
                        tm.addColumn(Messages.getText("CRS"));
253
                        tm.addColumn(Messages.getText("primaryKey"));
254
                        tm.addColumn(Messages.getText("mandatory"));
255

    
256
                        // Ask to be notified of selection changes.
257
                        ListSelectionModel rowSM = jTable.getSelectionModel();
258
                        rowSM.addListSelectionListener(new ListSelectionListener() {
259
                                public void valueChanged(ListSelectionEvent e) {
260
                                        // Ignore extra messages.
261
                                        if (e.getValueIsAdjusting())
262
                                                return;
263

    
264
                                        ListSelectionModel lsm = (ListSelectionModel) e.getSource();
265
                                        if (lsm.isSelectionEmpty()) {
266
                                                // no rows are selected
267
                                                deleteFieldButton.setEnabled(false);
268
                                        } else {
269
                                            int min_sele = lsm.getMinSelectionIndex(); 
270
                            if (min_sele > -1 &&
271
                                min_sele < inDefaultFeatTypeFieldCount) {
272
                                deleteFieldButton.setEnabled(false);
273
                            } else {
274
                                deleteFieldButton.setEnabled(allowEditableFeatureType());
275
                            }
276
                                        }                
277
                                        
278
                                }
279
                        });
280
                        jTable.getColumn(Messages.getText("field")).setWidth(180);
281

    
282
                        jTable.getModel().addTableModelListener(new TableModelListener() {                
283
                public void tableChanged(TableModelEvent e) {
284
                    if (e.getColumn() == COLUMN_TYPE){
285
                        jTable.repaint();
286
                    }                    
287
                }
288
            });
289
                        
290

    
291
                        if (!fieldsInited) {
292
                            initFields();
293
                        }
294

    
295
                        // Rellenado de la tabla
296
                        if (defaultFeatType != null) {
297

    
298
                                Iterator it = defaultFeatType.iterator();
299
                                boolean some_error = false;
300
                                while (it.hasNext()) {
301
                                        FeatureAttributeDescriptor descriptor = (FeatureAttributeDescriptor) it
302
                                                        .next();
303

    
304
                    if (!addRowToFieldTable(
305
                        jTable,
306
                        null,
307
                        inProjection,
308
                        descriptor)) {
309
                        
310
                        some_error = true;
311
                    }
312
                    /*
313
                                        tm.setValueAt(descriptor.getName(), row, COLUMN_FIELD);
314
                                        tm.setValueAt(descriptor.getType(), row, COLUMN_TYPE);
315
                                        tm.setValueAt(descriptor.getSize(), row, COLUMN_LENGTH);
316
                                        tm.setValueAt(descriptor.getGeometryType(), row, COLUMN_GEOMETRYTYPE);
317
                                        tm.setValueAt(descriptor.getGeometrySubType(), row, COLUMN_GEOMETRYSUBTYPE);
318
                                        tm.setValueAt(descriptor.getSRS(), row, COLUMN_CRS);
319
                                        tm.setValueAt(descriptor.isPrimaryKey(), row, COLUMN_PRIMARYKEY);
320
                                        tm.setValueAt(descriptor.isMandatory(), row, COLUMN_MANDATORY);
321
                                        */
322
                                }
323
                                
324
                                if (some_error) {
325
                    String tit = Messages.getText("_Default_fields");
326
                    String msg = Messages.getText("_Unable_to_add_fields");
327
                    JOptionPane.showMessageDialog(
328
                        jTable, msg, tit,
329
                        JOptionPane.ERROR_MESSAGE);
330
                                }
331
                        }
332

    
333
                }
334
                jTable.setEnabled(allowEditableFeatureType());
335
                return jTable;
336
        }
337

    
338
        /**
339
         * This method initializes jPanelWest
340
         * 
341
         * @return javax.swing.JPanel
342
         */
343
        private JPanel getJPanelSouth() {
344
                if (jPanelEast == null) {
345
                        jPanelEast = new JPanel();
346
                        jPanelEast.setLayout(new BorderLayout());
347
                        
348
                        JPanel south_east = new JPanel(new GridBagLayout());
349
                        // south_east.setPreferredSize(new java.awt.Dimension(170, 50));
350
                        GridBagConstraints c = new GridBagConstraints();
351
                        c.fill = GridBagConstraints.HORIZONTAL;
352
                        c.insets = new Insets(8,10,8,0);  //top padding
353
                        c.gridx = 0;       
354
                        c.gridwidth = 1;   
355
                        c.gridy = 0;       
356
                        south_east.add(getJButtonAddField(), c);
357
            c.gridx = 1;       
358
                        south_east.add(getJButtonDeleteField(), c);
359
                        
360
                        jPanelEast.add(south_east, BorderLayout.EAST);
361
                }
362
                return jPanelEast;
363
        }
364

    
365
        /**
366
         * This method initializes jButtonAddField
367
         * 
368
         * @return javax.swing.JButton
369
         */
370
        private JButton getJButtonAddField() {
371
                if (addFieldButton == null) {
372
                    addFieldButton = new JButton();
373
                    addFieldButton.setText(Messages.getText("add_field"));
374
                    addFieldButton.setLocation(new java.awt.Point(7, 5));
375
                    addFieldButton.setSize(new java.awt.Dimension(145, 23));
376
                    addFieldButton.setPreferredSize(new java.awt.Dimension(100, 23));
377
                    addFieldButton
378
                                        .addActionListener(new java.awt.event.ActionListener() {
379
                                                public void actionPerformed(java.awt.event.ActionEvent e) {
380
                                                        DefaultTableModel tm = (DefaultTableModel) jTable
381
                                                                        .getModel();
382

    
383
                                                        // Figure out a suitable field name
384
                                                        ArrayList fieldNames = new ArrayList();
385
                                                        for (int i = 0; i < jTable.getRowCount(); i++) {
386
                                                                fieldNames.add(tm.getValueAt(i, COLUMN_FIELD));
387
                                                        }
388
                                                        String[] currentFieldNames = (String[]) fieldNames
389
                                                                        .toArray(new String[0]);
390
                                                        String newField = Messages.getText("field")
391
                                                                        .replaceAll(" +", "_");
392
                                                        int index = 0;
393
                                                        for (int i = 0; i < currentFieldNames.length; i++) {
394
                                                                if (currentFieldNames[i].startsWith(newField)) {
395
                                                                        try {
396
                                                                                index = Integer
397
                                                                                                .parseInt(currentFieldNames[i]
398
                                                                                                                .replaceAll(newField,
399
                                                                                                                                ""));
400
                                                                        } catch (Exception ex) { /* we don't care */
401
                                                                        }
402
                                                                }
403
                                                        }
404
                                                        String newFieldName = newField + (++index);
405

    
406
                                                        // Esto lo a?ado aqu? porque si no tiene registros,
407
                                                        // no hace caso. (Por eso no
408
                                                        // lo pongo en getJTable()
409
                                                        if (!addRowToFieldTable(
410
                                                            jTable,
411
                                                            newFieldName,
412
                                                            inProjection,
413
                                                            null)) {
414
                                                            
415
                                    String tit = Messages.getText("_Default_fields");
416
                                    String msg = Messages.getText("_Unable_to_add_fields");
417
                                    JOptionPane.showMessageDialog(
418
                                        jTable, msg, tit,
419
                                        JOptionPane.ERROR_MESSAGE);
420
                                                        }
421
                                                }
422
                                        });
423

    
424
                }
425
                addFieldButton.setEnabled(allowEditableFeatureType());
426
                return addFieldButton;
427
        }
428
        
429
        private boolean allowEditableFeatureType(){
430
            
431
            if (!fieldsInited) {
432
                initFields();
433
            }
434

    
435
                DataManager dataManager = DALLocator.getDataManager();
436
                FeatureStoreProviderFactory factory =
437
                    (FeatureStoreProviderFactory) dataManager.
438
                    getStoreProviderFactory(inStoreName);
439
                if (factory.allowEditableFeatureType()==FeatureStoreProviderFactory.NO) {
440
                        return false;
441
                }
442
                return true;
443
        }
444

    
445
        private class ComboItemDataType {
446
                private DataType dataType;
447

    
448
                public ComboItemDataType(DataType dataType) {
449
                        this.dataType = dataType;
450
                }
451

    
452
                @Override
453
                public String toString() {
454
                        return this.dataType.getName();
455
                }
456
        }
457

    
458
        private class ComboModelDataType implements ComboBoxModel {
459

    
460
                private List<ComboItemDataType> dataTypes;
461
                private ComboItemDataType selected;
462

    
463
                public ComboModelDataType(List<DataType> dataTypes, int sel_type) {
464
                    
465
                        this.dataTypes = new ArrayList<ComboItemDataType>();
466
                        ComboItemDataType item = null;
467
                        for (Iterator iterator = dataTypes.iterator(); iterator.hasNext();) {
468
                                DataType dataType = (DataType) iterator.next();
469
                                item = new ComboItemDataType(dataType);
470
                                this.dataTypes.add(item);
471
                                if (sel_type == dataType.getType()) {
472
                                    this.setSelectedItem(item);
473
                                }
474
                        }
475
                }
476

    
477
                public void addListDataListener(ListDataListener arg0) {
478
                        // DO NOTHING
479
                }
480

    
481
                public Object getElementAt(int arg0) {
482
                        return this.dataTypes.get(arg0);
483
                }
484

    
485
                public int getSize() {
486
                        return this.dataTypes.size();
487
                }
488

    
489
                public void removeListDataListener(ListDataListener arg0) {
490
                        // DO NOTHING
491
                }
492

    
493
                public Object getSelectedItem() {
494
                        return this.selected;
495
                }
496

    
497
                public void setSelectedItem(Object anItem) {
498
                        this.selected = (ComboItemDataType) anItem;
499
                }
500

    
501
        }
502

    
503
        class CrsRenderer extends JButton implements TableCellRenderer {
504
                private static final long serialVersionUID = -573793294070515376L;
505
                private JLabel label = null;
506
                
507
                public CrsRenderer() {
508
                        setOpaque(true);
509
                        label = new JLabel(Messages.getText("not_applicable"));
510
                }
511

    
512
                public Component getTableCellRendererComponent(JTable table,
513
                                Object value, boolean isSelected, boolean hasFocus, int row,
514
                                int column) {
515
                        
516
                    ComboItemDataType item =
517
                        (ComboItemDataType) table.getValueAt(row, COLUMN_TYPE);
518
                    
519
                    if (item == null) {
520
                        // happens sometimes. perhaps an early rendering?
521
                        return new JLabel();
522
                    }
523
                    
524
                    DataType dataType = item.dataType;                       
525
                        
526
            if (dataType.getType() != DataTypes.GEOMETRY) {                
527
                return label;
528
            }
529
                    
530
                    if (isSelected) {
531
                                setForeground(table.getSelectionForeground());
532
                                setBackground(table.getSelectionBackground());
533
                        } else {
534
                                setForeground(table.getForeground());
535
                                setBackground(UIManager.getColor("Button.background"));
536
                        }
537
                        setText((value == null) ? "" : ((IProjection) value).getFullCode());
538
                        return this;
539
                }
540
        }        
541
           
542
    private class GeometryComboCellRenderer extends JLabel implements TableCellRenderer{
543

    
544
        public Component getTableCellRendererComponent(JTable table,
545
            Object value, boolean isSelected, boolean hasFocus, int row,
546
            int column) {                     
547

    
548
            ComboItemDataType item = (ComboItemDataType) table.getValueAt(row, COLUMN_TYPE);
549
            DataType dataType = item.dataType;                       
550
                        
551
            if (dataType.getType() == DataTypes.GEOMETRY) {
552
                ComboItemGeomType geomType = (ComboItemGeomType)value;
553
                if (geomType != null) {            
554
                    this.setText(geomType.toString());
555
                }
556
            } else {
557
               this.setText(Messages.getText("not_applicable"));
558
            }
559
            
560
            return this;
561
        }
562
        
563
    }
564

    
565
        class ButtonEditor extends DefaultCellEditor {
566
                /**
567
                 * 
568
                 */
569
                private static final long serialVersionUID = -2820892672026188802L;
570

    
571
                protected JButton button;
572

    
573
                private String label;
574

    
575
                private boolean isPushed;
576

    
577
                private Object value;
578

    
579
                public ButtonEditor(JCheckBox checkBox) {
580
                        super(checkBox);
581
                        button = new JButton();
582
                        button.setOpaque(true);
583
                        button.addActionListener(new ActionListener() {
584
                                public void actionPerformed(ActionEvent e) {
585
                                        fireEditingStopped();
586
                                }
587
                        });
588
                }
589

    
590
                public Component getTableCellEditorComponent(JTable table,
591
                                Object value, boolean isSelected, int row, int column) {
592
                        if (isSelected) {
593
                                button.setForeground(table.getSelectionForeground());
594
                                button.setBackground(table.getSelectionBackground());
595
                        } else {
596
                                button.setForeground(table.getForeground());
597
                                button.setBackground(table.getBackground());
598
                        }
599
                        label = (value == null) ? "" : ((IProjection) value).getFullCode();// .toString();
600
                        button.setText(label);
601
                        isPushed = true;
602
                        this.value = value;
603
                        return button;
604
                }
605

    
606
                public Object getCellEditorValue() {
607
                        IProjection curProj = (IProjection) this.value;
608
                        if (isPushed) {
609
                                ISelectCrsPanel csSelect = CRSSelectPanel.getUIFactory()
610
                                                .getSelectCrsPanel(curProj, true);
611
                                WindowManager wm = ToolsSwingLocator.getWindowManager();
612
                                wm.showWindow((JPanel) csSelect, "Projection",
613
                                                WindowManager.MODE.DIALOG);
614
                                curProj = csSelect.getProjection();
615
                        }
616
                        isPushed = false;
617
                        return curProj;
618
                }
619

    
620
                public boolean stopCellEditing() {
621
                        isPushed = false;
622
                        return super.stopCellEditing();
623
                }
624

    
625
                protected void fireEditingStopped() {
626
                        super.fireEditingStopped();
627
                }
628
        }
629

    
630
        private class ComboItemGeomType {
631
                private int type;
632
                private String name;
633

    
634
                public ComboItemGeomType(String name, int type) {
635
                        this.type = type;
636
                        this.name = name;
637
                }
638

    
639
                @Override
640
                public String toString() {
641
                        return this.name;
642
                }
643
                
644
                public int getGeomType() {
645
                    return type;
646
                }
647
        }
648

    
649
        private class ComboModelGeomType implements ComboBoxModel {
650

    
651
                private List<ComboItemGeomType> geomTypes;
652
                private ComboItemGeomType selected;
653

    
654
                public ComboModelGeomType(
655
                    List<ComboItemGeomType> geomTypes, int sel_geom_type) {
656
                    
657
                        this.geomTypes = geomTypes;
658
                        int len = geomTypes.size();
659
                        ComboItemGeomType item = null;
660
                        for (int i=0; i<len; i++) {
661
                            item = geomTypes.get(i);
662
                            if (item.getGeomType() == sel_geom_type) {
663
                                setSelectedItem(item);
664
                            }
665
                        }
666
                }
667

    
668
                public void addListDataListener(ListDataListener arg0) {
669
                        // DO NOTHING
670
                }
671

    
672
                public Object getElementAt(int arg0) {
673
                        return this.geomTypes.get(arg0);
674
                }
675

    
676
                public int getSize() {
677
                        return this.geomTypes.size();
678
                }
679

    
680
                public void removeListDataListener(ListDataListener arg0) {
681
                        // DO NOTHING
682
                }
683

    
684
                public Object getSelectedItem() {
685
                        return this.selected;
686
                }
687

    
688
                public void setSelectedItem(Object anItem) {
689
                        this.selected = (ComboItemGeomType) anItem;
690
                }
691

    
692
        }
693

    
694
        private List<ComboItemGeomType> getGeomTypes() {
695
                List<ComboItemGeomType> geomTypes = new ArrayList<ComboItemGeomType>();
696
                geomTypes
697
                                .add(new ComboItemGeomType("GEOMETRY", Geometry.TYPES.GEOMETRY));
698
                geomTypes.add(new ComboItemGeomType("POINT", Geometry.TYPES.POINT));
699
                geomTypes.add(new ComboItemGeomType("CURVE", Geometry.TYPES.CURVE));
700
                geomTypes.add(new ComboItemGeomType("SURFACE", Geometry.TYPES.SURFACE));
701
                geomTypes.add(new ComboItemGeomType("SOLID", Geometry.TYPES.SOLID));
702
                geomTypes.add(new ComboItemGeomType("AGGREGATE",
703
                                Geometry.TYPES.AGGREGATE));
704
                geomTypes.add(new ComboItemGeomType("MULTIPOINT",
705
                                Geometry.TYPES.MULTIPOINT));
706
                geomTypes.add(new ComboItemGeomType("MULTICURVE",
707
                                Geometry.TYPES.MULTICURVE));
708
                geomTypes.add(new ComboItemGeomType("MULTISURFACE",
709
                                Geometry.TYPES.MULTISURFACE));
710
                geomTypes.add(new ComboItemGeomType("MULTISOLID",
711
                                Geometry.TYPES.MULTISOLID));
712

    
713
                return geomTypes;
714
        }
715

    
716
        private List<ComboItemGeomType> getGeomSubtypes() {
717
                List<ComboItemGeomType> geomSubtypes = new ArrayList<ComboItemGeomType>();
718
                geomSubtypes.add(new ComboItemGeomType("GEOM2D",
719
                                Geometry.SUBTYPES.GEOM2D));
720
                geomSubtypes.add(new ComboItemGeomType("GEOM2DM",
721
                                Geometry.SUBTYPES.GEOM2DM));
722
                geomSubtypes.add(new ComboItemGeomType("GEOM3D",
723
                                Geometry.SUBTYPES.GEOM3D));
724
                geomSubtypes.add(new ComboItemGeomType("GEOM3DM",
725
                                Geometry.SUBTYPES.GEOM3DM));
726
                geomSubtypes.add(new ComboItemGeomType("UNKNOWN",
727
                                Geometry.SUBTYPES.UNKNOWN));
728
                return geomSubtypes;
729
        }
730

    
731
        class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
732

    
733
                /**
734
                 * 
735
                 */
736
                private static final long serialVersionUID = 5093448776058027505L;
737

    
738
                public CheckBoxRenderer() {
739
                        setHorizontalAlignment(JLabel.CENTER);
740
                }
741

    
742
                public Component getTableCellRendererComponent(JTable table,
743
                                Object value, boolean isSelected, boolean hasFocus, int row,
744
                                int column) {
745
                        if (isSelected) {
746
                                setForeground(table.getSelectionForeground());
747
                                setBackground(table.getSelectionBackground());
748
                        } else {
749
                                setForeground(table.getForeground());
750
                                setBackground(table.getBackground());
751
                        }
752
                        setSelected((value != null && ((Boolean) value).booleanValue()));
753
                        return this;
754
                }
755
        }
756

    
757
        /**
758
         * This method initializes jButton
759
         * 
760
         * @return javax.swing.JButton
761
         */
762
        private JButton getJButtonDeleteField() {
763
                if (deleteFieldButton == null) {
764
                    deleteFieldButton = new JButton();
765
                    deleteFieldButton.setText(Messages.getText("delete_field"));
766
                    deleteFieldButton.setLocation(new java.awt.Point(7, 33));
767
                    deleteFieldButton.setSize(new java.awt.Dimension(145, 23));
768
                    deleteFieldButton.setEnabled(false);
769
                    deleteFieldButton
770
                                        .addActionListener(new java.awt.event.ActionListener() {
771
                                                public void actionPerformed(java.awt.event.ActionEvent e) {
772
                                                        int[] selecteds = jTable.getSelectedRows();
773
                                                        DefaultTableModel tm = (DefaultTableModel) jTable
774
                                                                        .getModel();
775

    
776
                                                        for (int i = selecteds.length - 1; i >= 0; i--) {
777
                                                            /*
778
                                                             * 
779
                                                                removedFields.add((String) tm.getValueAt(i, 0));
780
                                 */
781
                                                                tm.removeRow(selecteds[i]);
782
                                                        }
783
                                                }
784
                                        });
785
                }
786
                deleteFieldButton.setEnabled(false);
787
                return deleteFieldButton;
788
        }
789

    
790
        public String getPanelTitle() {
791
                return Messages.getText("fields_definitions");
792
        }
793

    
794
        public void nextPanel() throws NotContinueWizardException {
795
                if (allowEditableFeatureType()){
796
                        fillFeatureType();
797
                }
798
        }
799

    
800
        private void fillFeatureType() throws NotContinueWizardException {
801
            
802
            if (!fieldsInited) {
803
                initFields();
804
            }
805

    
806
                /*
807
                 * Coge los datos del formulario y los guarda en
808
                 * this.service.getFeatureType()
809
                 */
810

    
811
            EditableFeatureType edft = newLayer_Service.getFeatureType();
812

    
813
                // Clean and rebuild featureType everytime we click next
814
                removeAllFields(edft);
815
                edft.setDefaultGeometryAttributeName(null);
816

    
817
                GeometryManager gm = GeometryLocator.getGeometryManager();
818
                DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
819
                
820
                for (int i = 0; i < tm.getRowCount(); i++) {
821
                        DataType dataType = ((ComboItemDataType) tm.getValueAt(i, COLUMN_TYPE)).dataType;
822

    
823
                        int fieldLength = 20;
824
                        if (dataTypeNeedsSize(dataType.getType())) {
825
                    fieldLength = 
826
                        Integer.parseInt((String) tm.getValueAt(i, COLUMN_LENGTH));
827
                        }
828

    
829
                        EditableFeatureAttributeDescriptor efad1 =
830
                            edft.add(
831
                                        (String) tm.getValueAt(i, COLUMN_FIELD), dataType.getType(),
832
                                        fieldLength);
833

    
834
                        if (dataType.getType() == DataTypes.DOUBLE ||
835
                            dataType.getType() == DataTypes.FLOAT) {
836
                            // TODO Improve this?
837
                            // Half of the size dedicated
838
                            // to precision (at least 1) 
839
                    efad1.setPrecision(Math.max(1, fieldLength/2));
840
                        }
841

    
842
                        if (dataType.getType() == DataTypes.GEOMETRY) {
843
                            
844
                int g_type = ((ComboItemGeomType) tm.getValueAt(i, COLUMN_GEOMETRYTYPE)).type;
845
                int g_subtype = ((ComboItemGeomType) tm.getValueAt(i, COLUMN_GEOMETRYSUBTYPE)).type;
846
                            
847
                            GeometryType gty = null;
848
                            
849
                            try {
850
                    gty = gm.getGeometryType(g_type, g_subtype);
851
                    efad1.setGeometryType(gty);
852
                    // efad1.setGeometryType(g_type);
853
                            } catch (Exception ex) {
854
                    String _msg = Messages.getText("_Invalid_geometry_type")
855
                        + " (" + g_type + ", " + g_subtype + ")";
856
                                throw new NotContinueWizardException(_msg, ex, this);
857
                            }
858
                                
859
                                efad1.setSRS((IProjection) tm.getValueAt(i, COLUMN_CRS));
860
                                
861
                                //If there is not a previous default geometry field, add it
862
                                // this will set the first geometry field
863
                                // as the default geometry field
864
                                if (edft.getDefaultGeometryAttribute() == null){
865
                                    edft.setDefaultGeometryAttributeName(efad1.getName());
866
                                }        
867
                        }
868
                        
869
                        // pk and mandatory
870
            efad1.setIsPrimaryKey(((Boolean) tm.getValueAt(i, COLUMN_PRIMARYKEY))
871
                .booleanValue());
872
            efad1.setAllowNull(!((Boolean) tm.getValueAt(i, COLUMN_MANDATORY))
873
                .booleanValue());
874

    
875
                }
876
        }
877

    
878
        /**
879
     * @param featureType
880
     */
881
    private void removeAllFields(EditableFeatureType ft) {
882
        
883
        FeatureAttributeDescriptor[] atts =  ft.getAttributeDescriptors();
884
        int len = atts.length;
885
        FeatureAttributeDescriptor item = null;
886
        for (int i=0; i<len; i++) {
887
            item = atts[i];
888
            ft.remove(item.getName());
889
        }
890
    }
891

    
892
    public void lastPanel() {
893
                // TODO Auto-generated method stub
894
                logger.info("FeatureTypePanel: lastPanel");
895
        }
896

    
897
        public void updatePanel() {
898
                initializeComponents();
899

    
900
        }
901

    
902
        public JPanel getJPanel() {
903
                return this;
904
        }
905
        
906
        /**
907
         * If fad is null, it's an addition after user has clicked on 'Add field'.
908
         * If fad is not null, it's the description of a default field and the
909
         * field name will also be taken from there.
910
         * 
911
         * @param the_table
912
         * @param new_fld_name
913
         * @param the_projection
914
         * @param fad
915
         * 
916
         * @return true if field was actually added, false otherwise
917
         */
918
    private boolean addRowToFieldTable(
919
        JTable the_table,
920
        String new_fld_name,
921
        IProjection the_projection,
922
        FeatureAttributeDescriptor fad) {
923
        
924
        if (fad == null && new_fld_name == null) {
925
            logger.info("Error: unable to add field to table (no description and no name)");
926
            return false;
927
        }
928
        
929
        DefaultTableModel the_tm = (DefaultTableModel) the_table.getModel();
930
        Object[] newRow = new Object[the_tm.getColumnCount()];
931
        
932
        /*
933
        tm.setValueAt(descriptor.getName(), row, COLUMN_FIELD);
934
        tm.setValueAt(descriptor.getType(), row, COLUMN_TYPE);
935
        tm.setValueAt(descriptor.getSize(), row, COLUMN_LENGTH);
936
        tm.setValueAt(descriptor.getGeometryType(), row, COLUMN_GEOMETRYTYPE);
937
        tm.setValueAt(descriptor.getGeometrySubType(), row, COLUMN_GEOMETRYSUBTYPE);
938
        tm.setValueAt(descriptor.getSRS(), row, COLUMN_CRS);
939
        tm.setValueAt(descriptor.isPrimaryKey(), row, COLUMN_PRIMARYKEY);
940
        tm.setValueAt(descriptor.isMandatory(), row, COLUMN_MANDATORY);
941
        */
942
        
943
        // =============================== name
944
        if (fad == null) {
945
            newRow[COLUMN_FIELD] = new_fld_name;
946
        } else {
947
            newRow[COLUMN_FIELD] = fad.getName();
948
        }
949
        // ===================================== field type
950
        TableColumn typeColumn = the_table.getColumnModel().getColumn(COLUMN_TYPE);
951
        List supp_types = spFactory.getSupportedDataTypes();
952
        
953
        DataManager daman = DALLocator.getDataManager();
954
        List all_types = daman.getDataTypes();
955
        
956
        
957
        ComboModelDataType model = null;
958
        if (fad == null) {
959

    
960
            // this is a user defined column, remove geometry if in default feattype 
961
            if (defaultHasGeometry) {
962
                supp_types = removeGeometryType(supp_types);
963
                all_types = removeGeometryType(all_types);
964
            }
965
            
966
            if (supp_types != null && supp_types.size() > 0) {
967
                model = new ComboModelDataType(
968
                    supp_types,
969
                    ((DataType) supp_types.get(0)).getType());
970
            } else {
971
                model = new ComboModelDataType(
972
                    all_types,
973
                    ((DataType) all_types.get(0)).getType());
974
            }
975
        } else {
976
            model = new ComboModelDataType(supp_types, fad.getType());
977
        }
978
        
979
        JComboBox comboBox = new JComboBox(model);
980
        typeColumn.setCellEditor(new DefaultCellEditor(comboBox));
981
        newRow[COLUMN_TYPE] = model.getSelectedItem();
982
        
983
        // ============================= width
984
        TableColumn widthColumn =
985
            the_table.getColumnModel().getColumn(COLUMN_LENGTH);
986
        if (fad == null) {
987
            newRow[COLUMN_LENGTH] = "20";
988
        } else {
989
            newRow[COLUMN_LENGTH] = "" + fad.getSize();
990
        }
991
        
992
        SimpleTextCellRenderer stcr = new SimpleTextCellRenderer();
993
        widthColumn.setCellEditor(new DefaultCellEditor(new JTextField()));
994
        widthColumn.setCellRenderer(stcr);
995
        
996
        
997
        // ============================= geom type
998
        TableColumn geomTypeColumn =
999
            the_table.getColumnModel().getColumn(COLUMN_GEOMETRYTYPE);
1000
        ComboModelGeomType geomTypeModel = null;
1001
        
1002
        List<ComboItemGeomType> supptd =
1003
            leaveSupportedGeomTypes(getGeomTypes(),
1004
                spFactory.getSupportedGeometryTypesSubtypes(), 0);
1005
        
1006
        if (fad == null) {
1007
            geomTypeModel = new ComboModelGeomType(
1008
                supptd, supptd.size() > 0 ? supptd.get(0).getGeomType() : -1);
1009
        } else {
1010
            geomTypeModel = new ComboModelGeomType(
1011
                supptd, fad.getGeomType().getType());
1012
        }
1013
        
1014
        JComboBox geomTypeComboBox = new JComboBox(geomTypeModel);
1015
        geomTypeColumn.setCellEditor(new DefaultCellEditor(geomTypeComboBox));
1016
        
1017
        GeometryComboCellRenderer gccr = new GeometryComboCellRenderer();
1018
        geomTypeColumn.setCellRenderer(gccr);
1019
        newRow[COLUMN_GEOMETRYTYPE] = geomTypeModel.getSelectedItem();
1020
        
1021
        // ============================= geom sub type
1022

    
1023
        TableColumn geomSubTypeColumn =
1024
            the_table.getColumnModel().getColumn(COLUMN_GEOMETRYSUBTYPE);
1025
        ComboModelGeomType geomSubTypeModel = null;
1026

    
1027
        supptd =
1028
            leaveSupportedGeomTypes(getGeomSubtypes(),
1029
                spFactory.getSupportedGeometryTypesSubtypes(), 1);
1030
        
1031
        if (fad == null) {
1032
            geomSubTypeModel = new ComboModelGeomType(
1033
                supptd, supptd.size() > 0 ? supptd.get(0).getGeomType() : -1);
1034
        } else {
1035
            geomSubTypeModel = new ComboModelGeomType(
1036
                supptd, fad.getGeomType().getSubType());
1037
        }
1038
        
1039
        JComboBox geomSubTypeComboBox = new JComboBox(geomSubTypeModel);
1040
        geomSubTypeColumn.setCellEditor(new DefaultCellEditor(
1041
            geomSubTypeComboBox));
1042
        geomSubTypeColumn.setCellRenderer(new GeometryComboCellRenderer());
1043
        newRow[COLUMN_GEOMETRYSUBTYPE] = geomSubTypeModel.getSelectedItem();
1044

    
1045
        // ============================= CRS
1046

    
1047
        TableColumn crsColumn = the_table.getColumnModel().getColumn(COLUMN_CRS);
1048
        crsColumn.setCellEditor(new ButtonEditor(new JCheckBox()));
1049
        CrsRenderer crsButtonRenderer = new CrsRenderer();
1050
        crsColumn.setCellRenderer(crsButtonRenderer);
1051
        newRow[COLUMN_CRS] = the_projection;
1052

    
1053
        // ============================= PK
1054

    
1055
        TableColumn primaryKeyColumn =
1056
            the_table.getColumnModel().getColumn(COLUMN_PRIMARYKEY);
1057
        JCheckBox primaryKeyCheckBox = new JCheckBox();
1058
        
1059
        if (fad == null) {
1060
            primaryKeyCheckBox.setSelected(false);
1061
        } else {
1062
            primaryKeyCheckBox.setSelected(fad.isPrimaryKey());
1063
        }
1064

    
1065
        primaryKeyColumn.setCellEditor(
1066
            new DefaultCellEditor(primaryKeyCheckBox));
1067
        CheckBoxRenderer primaryKeyCheckBoxRenderer = new CheckBoxRenderer();
1068
        primaryKeyColumn.setCellRenderer(primaryKeyCheckBoxRenderer);
1069
        newRow[COLUMN_PRIMARYKEY] = primaryKeyCheckBox.isSelected();
1070
            
1071
        // ================================== mandatory
1072
        
1073
        TableColumn mandatoryColumn =
1074
            the_table.getColumnModel().getColumn(COLUMN_MANDATORY);
1075
        JCheckBox mandatoryCheckBox = new JCheckBox();
1076
        
1077
        if (fad == null) {
1078
            mandatoryCheckBox.setSelected(false);
1079
        } else {
1080
            mandatoryCheckBox.setSelected(fad.isMandatory());
1081
        }
1082
        
1083
        mandatoryColumn.setCellEditor(new DefaultCellEditor(mandatoryCheckBox));
1084
        CheckBoxRenderer mandatoryCheckBoxRenderer = new CheckBoxRenderer();
1085
        mandatoryColumn.setCellRenderer(mandatoryCheckBoxRenderer);
1086
        newRow[COLUMN_MANDATORY] = mandatoryCheckBox.isSelected();
1087

    
1088
        // ==================================
1089
        
1090
        // Add a new row
1091
        the_tm.addRow(newRow);
1092
        return true;
1093
    }
1094

    
1095
    /**
1096
     * @param supp_types
1097
     * @return
1098
     */
1099
    private List removeGeometryType(List dta_types) {
1100
        List resp = new ArrayList();
1101
        
1102
        int len = dta_types.size();
1103
        Object item_o = null;
1104
        DataType item_dt = null;
1105
        
1106
        for (int i=0; i<len; i++) {
1107
            item_o = dta_types.get(i);
1108
            if (item_o instanceof DataType) {
1109
                item_dt = (DataType) item_o;
1110
                if (item_dt.getType() != DataTypes.GEOMETRY) {
1111
                    resp.add(item_dt);
1112
                }
1113
            }
1114
        }
1115
        return resp;
1116
    }
1117

    
1118
    private List<ComboItemGeomType> leaveSupportedGeomTypes(
1119
        List<ComboItemGeomType> all_types,
1120
        List<int[]> supported,
1121
        int index /* 0 for geom types, 1 for geom subtypes */) {
1122
        
1123
        if (supported == null) {
1124
            // all supported
1125
            return all_types;
1126
        }
1127
        
1128
        List<ComboItemGeomType> resp = new ArrayList<ComboItemGeomType>();
1129
        int len = all_types.size();
1130
        ComboItemGeomType item = null;
1131
        for (int i=0; i<len; i++) {
1132
            item = all_types.get(i);
1133
            if (isInNthElement(item.getGeomType(), supported, index)) {
1134
                resp.add(item);
1135
            }
1136
        }
1137
        return resp;
1138
    }
1139

    
1140

    
1141
    private boolean isInNthElement(int val, List<int[]> arr_list, int index) {
1142
        
1143
        int len = arr_list.size();
1144
        int[] item = null;
1145
        for (int i=0; i<len; i++) {
1146
            item = arr_list.get(i);
1147
            if (item != null && item.length > index && item[index] == val) {
1148
                return true;
1149
            }
1150
        }
1151
        return false;
1152
    }
1153
    
1154
    private boolean dataTypeNeedsSize(int data_type) {
1155
        
1156
        if (data_type == DataTypes.FLOAT
1157
            || data_type == DataTypes.INT
1158
            || data_type == DataTypes.STRING) {
1159
            return true;
1160
        } else {
1161
            return false;
1162
        }
1163
    }
1164
    
1165
    private class SimpleTextCellRenderer extends DefaultTableCellRenderer {
1166

    
1167
        public SimpleTextCellRenderer() {
1168
            super();
1169
        }
1170
        /* (non-Javadoc)
1171
         * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
1172
         */
1173
        public Component getTableCellRendererComponent(
1174
            JTable table,
1175
            Object value, boolean isSelected, boolean hasFocus, int row,
1176
            int column) {
1177
            
1178
            TableModel tm = table.getModel();
1179
            Object new_val = "";            
1180
            Object type_obj = tm.getValueAt(row, COLUMN_TYPE);
1181
            if (type_obj instanceof ComboItemDataType) {
1182
                ComboItemDataType type_item = (ComboItemDataType) type_obj;
1183
                if (dataTypeNeedsSize(type_item.dataType.getType())) {
1184
                    new_val = getCurrentOr(value, "");
1185
                } else {
1186
                    new_val = Messages.getText("not_applicable");
1187
                }
1188
                return super.getTableCellRendererComponent(
1189
                    table, new_val, isSelected, hasFocus, row, column);
1190
            } else {
1191
                return super.getTableCellRendererComponent(
1192
                    table, value, isSelected, hasFocus, row, column);
1193
            }
1194
        }
1195
        
1196
        private Object getCurrentOr(Object v, String d) {
1197
            
1198
            if (v instanceof String) {
1199
                String parse_str = (String) v;
1200
                try {
1201
                    Integer.parseInt(parse_str);
1202
                    return v;
1203
                } catch (Exception ex) {
1204
                    // not a valid integer
1205
                    return d;
1206
                }
1207
            } else {
1208
                return v;
1209
            }
1210
        }
1211

    
1212
    }
1213

    
1214
    private class EnableLengthItemListener implements ItemListener {
1215
        
1216
        private TableModel theTableModel = null;
1217
        private JTable theTable = null;
1218
        
1219
        public EnableLengthItemListener(JTable t, boolean b) {
1220
            theTable = t;
1221
            theTableModel = t.getModel();
1222
        }
1223
        
1224
        public void itemStateChanged(final ItemEvent e) {
1225
            doUpdate(e);
1226
        }
1227

    
1228
        public void doUpdate(ItemEvent e) {
1229
            
1230
            Object src_obj = e.getSource();
1231
            if (src_obj instanceof JComboBox) {
1232
                
1233
                // one of the field type combos has changed
1234
                int len = theTableModel.getRowCount();
1235
                Object type_obj = null;
1236
                ComboItemDataType type_item = null;
1237
                for (int i=0; i<len; i++) {
1238
                    type_obj = theTableModel.getValueAt(i, COLUMN_TYPE);
1239
                    if (type_obj instanceof ComboItemDataType) {
1240
                        type_item = (ComboItemDataType) type_obj;
1241
                        if (dataTypeNeedsSize(type_item.dataType.getType())) {
1242
                            theTableModel.setValueAt(
1243
                                "20",
1244
                                i, COLUMN_LENGTH);
1245
                        } else {
1246
                            theTableModel.setValueAt(
1247
                                Messages.getText("not_applicable"),
1248
                                i, COLUMN_LENGTH);
1249
                        }
1250
                    }
1251
                }
1252
                theTable.validate(); // .revalidate(); // .repaint();
1253
            }
1254
        }
1255

    
1256
    }
1257
    
1258
    
1259
    
1260
    
1261
    
1262
}