Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / org.gvsig.newlayer / org.gvsig.newlayer.lib / org.gvsig.newlayer.lib.impl / src / main / java / org / gvsig / newlayer / impl / FeatureTypePanel.java @ 38367

History | View | Annotate | Download (24 KB)

1
package org.gvsig.newlayer.impl;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Component;
5
import java.awt.event.ActionEvent;
6
import java.awt.event.ActionListener;
7
import java.util.ArrayList;
8
import java.util.Iterator;
9
import java.util.List;
10

    
11
import javax.swing.ComboBoxModel;
12
import javax.swing.DefaultCellEditor;
13
import javax.swing.JButton;
14
import javax.swing.JCheckBox;
15
import javax.swing.JComboBox;
16
import javax.swing.JLabel;
17
import javax.swing.JPanel;
18
import javax.swing.JScrollPane;
19
import javax.swing.JTable;
20
import javax.swing.ListSelectionModel;
21
import javax.swing.UIManager;
22
import javax.swing.event.ListDataListener;
23
import javax.swing.event.ListSelectionEvent;
24
import javax.swing.event.ListSelectionListener;
25
import javax.swing.event.TableModelEvent;
26
import javax.swing.event.TableModelListener;
27
import javax.swing.table.DefaultTableModel;
28
import javax.swing.table.TableCellRenderer;
29
import javax.swing.table.TableColumn;
30

    
31
import org.cresques.cts.IProjection;
32
import org.slf4j.Logger;
33
import org.slf4j.LoggerFactory;
34

    
35
import org.gvsig.app.gui.panels.CRSSelectPanel;
36
import org.gvsig.app.gui.panels.crs.ISelectCrsPanel;
37
import org.gvsig.fmap.dal.DALLocator;
38
import org.gvsig.fmap.dal.DataManager;
39
import org.gvsig.fmap.dal.DataServerExplorer;
40
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
41
import org.gvsig.fmap.dal.feature.EditableFeatureType;
42
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
43
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
44
import org.gvsig.fmap.geom.DataTypes;
45
import org.gvsig.fmap.geom.Geometry;
46
import org.gvsig.gui.beans.wizard.panel.NotContinueWizardException;
47
import org.gvsig.gui.beans.wizard.panel.OptionPanel;
48
import org.gvsig.i18n.Messages;
49
import org.gvsig.newlayer.NewLayerService;
50
import org.gvsig.newlayer.NewLayerWizard;
51
import org.gvsig.tools.dataTypes.DataType;
52
import org.gvsig.tools.swing.api.ToolsSwingLocator;
53
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
54

    
55
public class FeatureTypePanel extends JPanel implements OptionPanel {
56
    private static final int COLUMN_FIELD = 0;
57
    private static final int COLUMN_TYPE = 1;
58
    private static final int COLUMN_LENGTH = 2;
59
    private static final int COLUMN_GEOMETRYTYPE = 3;
60
    private static final int COLUMN_GEOMETRYSUBTYPE = 4;
61
    private static final int COLUMN_CRS = 5;
62
    private static final int COLUMN_PRIMARYKEY = 6;
63
    private static final int COLUMN_MANDATORY = 7;
64
 
65
        private static final long serialVersionUID = 263541873998597624L;
66
        private NewLayerWizard wizard;
67
        private static final Logger logger = LoggerFactory
68
                        .getLogger(FeatureTypePanel.class);
69

    
70
        private JLabel jLabel = null;
71
        private JScrollPane jScrollPane = null;
72
        protected JTable jTable = null;
73
        private JPanel jPanelEast = null;
74
        private JButton jButtonAddField = null;
75
        private JButton jButtonDeleteField = null;
76
        protected int MAX_FIELD_LENGTH = 254;
77
        
78
        // we dont need this list
79
        // we'll clear and rebuild featureType each time
80
        // the user clicks next
81
        // private List removedFields;
82

    
83
        private DataServerExplorer explorer = null;
84

    
85
        public FeatureTypePanel(NewLayerWizard wizard) {
86
                this.wizard = wizard;
87
        }
88

    
89
        private void initializeComponents() {
90
                jLabel = new JLabel();
91
                jLabel.setText(Messages.getText("define_fields"));
92
                this.setLayout(new BorderLayout(5, 5));
93
                this.setSize(new java.awt.Dimension(499, 232));
94
                this.add(jLabel, java.awt.BorderLayout.NORTH);
95
                this.add(getJScrollPane(), java.awt.BorderLayout.CENTER);
96
                this.add(getJPanelEast(), java.awt.BorderLayout.EAST);
97

    
98
        }
99

    
100
        /**
101
         * This method initializes jScrollPane
102
         * 
103
         * @return javax.swing.JScrollPane
104
         */
105
        private JScrollPane getJScrollPane() {
106
                if (jScrollPane == null) {
107
                        jScrollPane = new JScrollPane();
108
                        jScrollPane.setViewportView(getJTable());
109
                }
110
                return jScrollPane;
111
        }
112

    
113
        /**
114
         * This method initializes jTable
115
         * 
116
         * @return javax.swing.JTable
117
         */
118
        private JTable getJTable() {
119
                if (jTable == null) {
120
                        jTable = new JTable(){
121
                            public boolean isCellEditable(int row,int column){  
122
                                Object o = getValueAt(row,column);  
123
                                
124
                                if ((column == COLUMN_GEOMETRYTYPE) ||
125
                                    (column == COLUMN_GEOMETRYSUBTYPE) ||
126
                                    (column == COLUMN_CRS)) {
127
                                    DataType dataType = 
128
                                        ((ComboItemDataType) getValueAt(row, COLUMN_TYPE)).dataType;                                   
129
                                    return dataType.getType() == DataTypes.GEOMETRY;
130
                                }
131
                                return true;                            
132
                            }  
133
                        };
134

    
135
                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
136
                        tm.addColumn(Messages.getText("field"));
137

    
138
                        tm.addColumn(Messages.getText("type"));
139
                        tm.addColumn(Messages.getText("length"));
140
                        tm.addColumn(Messages.getText("geomType"));
141
                        tm.addColumn(Messages.getText("geomSubtype"));
142
                        tm.addColumn(Messages.getText("CRS"));
143
                        tm.addColumn(Messages.getText("primaryKey"));
144
                        tm.addColumn(Messages.getText("mandatory"));
145

    
146
                        // Ask to be notified of selection changes.
147
                        ListSelectionModel rowSM = jTable.getSelectionModel();
148
                        rowSM.addListSelectionListener(new ListSelectionListener() {
149
                                public void valueChanged(ListSelectionEvent e) {
150
                                        // Ignore extra messages.
151
                                        if (e.getValueIsAdjusting())
152
                                                return;
153

    
154
                                        ListSelectionModel lsm = (ListSelectionModel) e.getSource();
155
                                        if (lsm.isSelectionEmpty()) {
156
                                                // no rows are selected
157
                                                jButtonDeleteField.setEnabled(false);
158
                                        } else {
159
                                                jButtonDeleteField.setEnabled(true);
160
                                        }                                        
161
                                }
162
                        });
163
                        jTable.getColumn(Messages.getText("field")).setWidth(180);
164

    
165
                        jTable.getModel().addTableModelListener(new TableModelListener() {                
166
                public void tableChanged(TableModelEvent e) {
167
                    if (e.getColumn() == COLUMN_TYPE){
168
                        jTable.repaint();
169
                    }                    
170
                }
171
            });
172
                        
173
                        // Rellenado de la tabla
174
                        EditableFeatureType featureType = this.wizard.getService()
175
                                        .getFeatureType();
176
                        if (featureType != null) {
177
                                int row = 0;
178
                                tm.setRowCount(featureType.size());
179
                                Iterator it = featureType.iterator();
180
                                while (it.hasNext()) {
181
                                        FeatureAttributeDescriptor descriptor = (FeatureAttributeDescriptor) it
182
                                                        .next();
183
                                        tm.setValueAt(descriptor.getName(), row, COLUMN_FIELD);
184
                                        tm.setValueAt(descriptor.getType(), row, COLUMN_TYPE);
185
                                        tm.setValueAt(descriptor.getSize(), row, COLUMN_LENGTH);
186
                                        tm.setValueAt(descriptor.getGeometryType(), row, COLUMN_GEOMETRYTYPE);
187
                                        tm.setValueAt(descriptor.getGeometrySubType(), row, COLUMN_GEOMETRYSUBTYPE);
188
                                        tm.setValueAt(descriptor.getSRS(), row, COLUMN_CRS);
189
                                        tm.setValueAt(descriptor.isPrimaryKey(), row, COLUMN_PRIMARYKEY);
190
                                        tm.setValueAt(descriptor.isMandatory(), row, COLUMN_MANDATORY);
191
                                        row++;                        
192
                                }
193
                        }
194

    
195
                }
196
                jTable.setEnabled(allowEditableFeatureType());
197
                return jTable;
198
        }
199

    
200
        /**
201
         * This method initializes jPanelWest
202
         * 
203
         * @return javax.swing.JPanel
204
         */
205
        private JPanel getJPanelEast() {
206
                if (jPanelEast == null) {
207
                        jPanelEast = new JPanel();
208
                        jPanelEast.setLayout(null);
209
                        jPanelEast.setPreferredSize(new java.awt.Dimension(170, 100));
210
                        jPanelEast.add(getJButtonAddField(), null);
211
                        jPanelEast.add(getJButtonDeleteField(), null);
212
                }
213
                return jPanelEast;
214
        }
215

    
216
        /**
217
         * This method initializes jButtonAddField
218
         * 
219
         * @return javax.swing.JButton
220
         */
221
        private JButton getJButtonAddField() {
222
                if (jButtonAddField == null) {
223
                        jButtonAddField = new JButton();
224
                        jButtonAddField.setText(Messages.getText("add_field"));
225
                        jButtonAddField.setLocation(new java.awt.Point(7, 5));
226
                        jButtonAddField.setSize(new java.awt.Dimension(145, 23));
227
                        jButtonAddField.setPreferredSize(new java.awt.Dimension(100, 26));
228
                        jButtonAddField
229
                                        .addActionListener(new java.awt.event.ActionListener() {
230
                                                public void actionPerformed(java.awt.event.ActionEvent e) {
231
                                                        DefaultTableModel tm = (DefaultTableModel) jTable
232
                                                                        .getModel();
233

    
234
                                                        // Figure out a suitable field name
235
                                                        ArrayList fieldNames = new ArrayList();
236
                                                        for (int i = 0; i < jTable.getRowCount(); i++) {
237
                                                                fieldNames.add(tm.getValueAt(i, COLUMN_FIELD));
238
                                                        }
239
                                                        String[] currentFieldNames = (String[]) fieldNames
240
                                                                        .toArray(new String[0]);
241
                                                        String newField = Messages.getText("field")
242
                                                                        .replaceAll(" +", "_");
243
                                                        int index = 0;
244
                                                        for (int i = 0; i < currentFieldNames.length; i++) {
245
                                                                if (currentFieldNames[i].startsWith(newField)) {
246
                                                                        try {
247
                                                                                index = Integer
248
                                                                                                .parseInt(currentFieldNames[i]
249
                                                                                                                .replaceAll(newField,
250
                                                                                                                                ""));
251
                                                                        } catch (Exception ex) { /* we don't care */
252
                                                                        }
253
                                                                }
254
                                                        }
255
                                                        String newFieldName = newField + (++index);
256

    
257
                                                        // Esto lo a?ado aqu? porque si no tiene registros,
258
                                                        // no hace caso. (Por eso no
259
                                                        // lo pongo en getJTable()
260
                                                        TableColumn typeColumn = jTable.getColumnModel()
261
                                                                        .getColumn(COLUMN_TYPE);
262
                                                        DataManager dataManager = DALLocator
263
                                                                        .getDataManager();
264
                                                        ComboModelDataType model = new ComboModelDataType(
265
                                                                        dataManager.getDataTypes());
266
                                                        JComboBox comboBox = new JComboBox(model);
267
                                                        typeColumn.setCellEditor(new DefaultCellEditor(
268
                                                                        comboBox));
269

    
270
                                                        TableColumn widthColumn = jTable.getColumnModel()
271
                                                                        .getColumn(COLUMN_LENGTH);
272

    
273
                                                        TableColumn geomTypeColumn = jTable
274
                                                                        .getColumnModel().getColumn(COLUMN_GEOMETRYTYPE);
275
                                                        ComboModelGeomType geomTypeModel = new ComboModelGeomType(
276
                                                                        getGeomTypes());
277
                                                        JComboBox geomTypeComboBox = new JComboBox(
278
                                                                        geomTypeModel);
279
                                                        geomTypeColumn.setCellEditor(new DefaultCellEditor(
280
                                                                        geomTypeComboBox));
281
                                                        geomTypeColumn.setCellRenderer(new GeometryComboCellRenderer());                                
282
                                                            
283

    
284
                                                        TableColumn geomSubTypeColumn = jTable
285
                                                                        .getColumnModel().getColumn(COLUMN_GEOMETRYSUBTYPE);
286
                                                        ComboModelGeomType geomSubTypeModel = new ComboModelGeomType(
287
                                                                        getGeomSubtypes());
288
                                                        JComboBox geomSubTypeComboBox = new JComboBox(
289
                                                                        geomSubTypeModel);
290
                                                        geomSubTypeColumn
291
                                                                        .setCellEditor(new DefaultCellEditor(
292
                                                                                        geomSubTypeComboBox));
293
                                                        geomSubTypeColumn.setCellRenderer(new GeometryComboCellRenderer());      
294

    
295
                                                        TableColumn crsColumn = jTable.getColumnModel()
296
                                                                        .getColumn(COLUMN_CRS);
297
                                                        crsColumn.setCellEditor(new ButtonEditor(
298
                                                                        new JCheckBox()));
299
                                                        CrsRenderer crsButtonRenderer = new CrsRenderer();
300
                                                        crsColumn.setCellRenderer(crsButtonRenderer);
301

    
302
                                                        TableColumn primaryKeyColumn = jTable
303
                                                                        .getColumnModel().getColumn(COLUMN_PRIMARYKEY);
304
                                                        JCheckBox primaryKeyCheckBox = new JCheckBox();
305
                                                        primaryKeyColumn
306
                                                                        .setCellEditor(new DefaultCellEditor(
307
                                                                                        primaryKeyCheckBox));
308
                                                        CheckBoxRenderer primaryKeyCheckBoxRenderer = new CheckBoxRenderer();
309
                                                        primaryKeyColumn
310
                                                                        .setCellRenderer(primaryKeyCheckBoxRenderer);
311

    
312
                                                        TableColumn mandatoryColumn = jTable
313
                                                                        .getColumnModel().getColumn(COLUMN_MANDATORY);
314
                                                        JCheckBox mandatoryCheckBox = new JCheckBox();
315
                                                        mandatoryColumn
316
                                                                        .setCellEditor(new DefaultCellEditor(
317
                                                                                        mandatoryCheckBox));
318
                                                        CheckBoxRenderer mandatoryCheckBoxRenderer = new CheckBoxRenderer();
319
                                                        mandatoryColumn
320
                                                                        .setCellRenderer(mandatoryCheckBoxRenderer);
321

    
322
                                                        // Add a new row
323
                                                        Object[] newRow = new Object[tm.getColumnCount()];
324
                                                        newRow[COLUMN_FIELD] = newFieldName;
325
                                                        newRow[COLUMN_TYPE] = model.getElementAt(0);
326
                                                        newRow[COLUMN_LENGTH] = "20";
327
                                                        newRow[COLUMN_GEOMETRYTYPE] = geomTypeModel.getElementAt(0);
328
                                                        newRow[COLUMN_GEOMETRYSUBTYPE] = geomSubTypeModel.getElementAt(0);
329
                                                        // Por defecto, la proyeccion de la vista
330
                                                        newRow[COLUMN_CRS] = wizard.getService().getMapContext()
331
                                                                        .getProjection();
332
                                                        newRow[COLUMN_PRIMARYKEY] = primaryKeyCheckBox.isSelected();
333
                                                        newRow[COLUMN_MANDATORY] = mandatoryCheckBox.isSelected();
334
                                                        tm.addRow(newRow);                                                   
335
                                                }
336
                                        });
337

    
338
                }
339
                jButtonAddField.setEnabled(allowEditableFeatureType());
340
                return jButtonAddField;
341
        }
342
        
343
        private boolean allowEditableFeatureType(){
344
                NewLayerService service = this.wizard.getService();
345
                DataManager dataManager = DALLocator.getDataManager();
346
                FeatureStoreProviderFactory factory = (FeatureStoreProviderFactory) dataManager.getStoreProviderFactory(service.getStoreName());
347
                if (factory.allowEditableFeatureType()==FeatureStoreProviderFactory.NO) {
348
                        return false;
349
                }
350
                return true;
351
        }
352

    
353
        private class ComboItemDataType {
354
                private DataType dataType;
355

    
356
                public ComboItemDataType(DataType dataType) {
357
                        this.dataType = dataType;
358
                }
359

    
360
                @Override
361
                public String toString() {
362
                        return this.dataType.getName();
363
                }
364
        }
365

    
366
        private class ComboModelDataType implements ComboBoxModel {
367

    
368
                private List<ComboItemDataType> dataTypes;
369
                private ComboItemDataType selected;
370

    
371
                public ComboModelDataType(List<DataType> dataTypes) {
372
                        this.dataTypes = new ArrayList<ComboItemDataType>();
373
                        for (Iterator iterator = dataTypes.iterator(); iterator.hasNext();) {
374
                                DataType dataType = (DataType) iterator.next();
375
                                this.dataTypes.add(new ComboItemDataType(dataType));
376
                        }
377
                }
378

    
379
                public void addListDataListener(ListDataListener arg0) {
380
                        // DO NOTHING
381
                }
382

    
383
                public Object getElementAt(int arg0) {
384
                        return this.dataTypes.get(arg0);
385
                }
386

    
387
                public int getSize() {
388
                        return this.dataTypes.size();
389
                }
390

    
391
                public void removeListDataListener(ListDataListener arg0) {
392
                        // DO NOTHING
393
                }
394

    
395
                public Object getSelectedItem() {
396
                        return this.selected;
397
                }
398

    
399
                public void setSelectedItem(Object anItem) {
400
                        this.selected = (ComboItemDataType) anItem;
401
                }
402

    
403
        }
404

    
405
        class CrsRenderer extends JButton implements TableCellRenderer {
406
                private static final long serialVersionUID = -573793294070515376L;
407
                private JLabel label = null;
408
                
409
                public CrsRenderer() {
410
                        setOpaque(true);
411
                        label = new JLabel(Messages.getText("not_applicable"));
412
                }
413

    
414
                public Component getTableCellRendererComponent(JTable table,
415
                                Object value, boolean isSelected, boolean hasFocus, int row,
416
                                int column) {
417
                        
418
                    DataType dataType = 
419
                ((ComboItemDataType) table.getValueAt(row, COLUMN_TYPE)).dataType;                       
420
                        
421
            if (dataType.getType() != DataTypes.GEOMETRY) {                
422
                return label;
423
            }
424
                    
425
                    if (isSelected) {
426
                                setForeground(table.getSelectionForeground());
427
                                setBackground(table.getSelectionBackground());
428
                        } else {
429
                                setForeground(table.getForeground());
430
                                setBackground(UIManager.getColor("Button.background"));
431
                        }
432
                        setText((value == null) ? "" : ((IProjection) value).getFullCode());
433
                        return this;
434
                }
435
        }        
436
           
437
    private class GeometryComboCellRenderer extends JLabel implements TableCellRenderer{
438

    
439
        public Component getTableCellRendererComponent(JTable table,
440
            Object value, boolean isSelected, boolean hasFocus, int row,
441
            int column) {                     
442

    
443
            DataType dataType = 
444
                ((ComboItemDataType) table.getValueAt(row, COLUMN_TYPE)).dataType;                       
445
                        
446
            if (dataType.getType() == DataTypes.GEOMETRY) {
447
                ComboItemGeomType geomType = (ComboItemGeomType)value;
448
                if (geomType != null) {            
449
                    this.setText(geomType.toString());
450
                }
451
            } else {
452
               this.setText(Messages.getText("not_applicable"));
453
            }
454
            
455
            return this;
456
        }
457
        
458
    }
459

    
460
        class ButtonEditor extends DefaultCellEditor {
461
                /**
462
                 * 
463
                 */
464
                private static final long serialVersionUID = -2820892672026188802L;
465

    
466
                protected JButton button;
467

    
468
                private String label;
469

    
470
                private boolean isPushed;
471

    
472
                private Object value;
473

    
474
                public ButtonEditor(JCheckBox checkBox) {
475
                        super(checkBox);
476
                        button = new JButton();
477
                        button.setOpaque(true);
478
                        button.addActionListener(new ActionListener() {
479
                                public void actionPerformed(ActionEvent e) {
480
                                        fireEditingStopped();
481
                                }
482
                        });
483
                }
484

    
485
                public Component getTableCellEditorComponent(JTable table,
486
                                Object value, boolean isSelected, int row, int column) {
487
                        if (isSelected) {
488
                                button.setForeground(table.getSelectionForeground());
489
                                button.setBackground(table.getSelectionBackground());
490
                        } else {
491
                                button.setForeground(table.getForeground());
492
                                button.setBackground(table.getBackground());
493
                        }
494
                        label = (value == null) ? "" : ((IProjection) value).getFullCode();// .toString();
495
                        button.setText(label);
496
                        isPushed = true;
497
                        this.value = value;
498
                        return button;
499
                }
500

    
501
                public Object getCellEditorValue() {
502
                        IProjection curProj = (IProjection) this.value;
503
                        if (isPushed) {
504
                                ISelectCrsPanel csSelect = CRSSelectPanel.getUIFactory()
505
                                                .getSelectCrsPanel(curProj, true);
506
                                WindowManager wm = ToolsSwingLocator.getWindowManager();
507
                                wm.showWindow((JPanel) csSelect, "Projection",
508
                                                WindowManager.MODE.DIALOG);
509
                                curProj = csSelect.getProjection();
510
                        }
511
                        isPushed = false;
512
                        return curProj;
513
                }
514

    
515
                public boolean stopCellEditing() {
516
                        isPushed = false;
517
                        return super.stopCellEditing();
518
                }
519

    
520
                protected void fireEditingStopped() {
521
                        super.fireEditingStopped();
522
                }
523
        }
524

    
525
        private class ComboItemGeomType {
526
                private int type;
527
                private String name;
528

    
529
                public ComboItemGeomType(String name, int type) {
530
                        this.type = type;
531
                        this.name = name;
532
                }
533

    
534
                @Override
535
                public String toString() {
536
                        return this.name;
537
                }
538
        }
539

    
540
        private class ComboModelGeomType implements ComboBoxModel {
541

    
542
                private List<ComboItemGeomType> geomTypes;
543
                private ComboItemGeomType selected;
544

    
545
                public ComboModelGeomType(List<ComboItemGeomType> geomTypes) {
546
                        this.geomTypes = geomTypes;
547
                }
548

    
549
                public void addListDataListener(ListDataListener arg0) {
550
                        // DO NOTHING
551
                }
552

    
553
                public Object getElementAt(int arg0) {
554
                        return this.geomTypes.get(arg0);
555
                }
556

    
557
                public int getSize() {
558
                        return this.geomTypes.size();
559
                }
560

    
561
                public void removeListDataListener(ListDataListener arg0) {
562
                        // DO NOTHING
563
                }
564

    
565
                public Object getSelectedItem() {
566
                        return this.selected;
567
                }
568

    
569
                public void setSelectedItem(Object anItem) {
570
                        this.selected = (ComboItemGeomType) anItem;
571
                }
572

    
573
        }
574

    
575
        private List<ComboItemGeomType> getGeomTypes() {
576
                List<ComboItemGeomType> geomTypes = new ArrayList<ComboItemGeomType>();
577
                geomTypes
578
                                .add(new ComboItemGeomType("GEOMETRY", Geometry.TYPES.GEOMETRY));
579
                geomTypes.add(new ComboItemGeomType("POINT", Geometry.TYPES.POINT));
580
                geomTypes.add(new ComboItemGeomType("CURVE", Geometry.TYPES.CURVE));
581
                geomTypes.add(new ComboItemGeomType("SURFACE", Geometry.TYPES.SURFACE));
582
                geomTypes.add(new ComboItemGeomType("SOLID", Geometry.TYPES.SOLID));
583
                geomTypes.add(new ComboItemGeomType("AGGREGATE",
584
                                Geometry.TYPES.AGGREGATE));
585
                geomTypes.add(new ComboItemGeomType("MULTIPOINT",
586
                                Geometry.TYPES.MULTIPOINT));
587
                geomTypes.add(new ComboItemGeomType("MULTICURVE",
588
                                Geometry.TYPES.MULTICURVE));
589
                geomTypes.add(new ComboItemGeomType("MULTISURFACE",
590
                                Geometry.TYPES.MULTISURFACE));
591
                geomTypes.add(new ComboItemGeomType("MULTISOLID",
592
                                Geometry.TYPES.MULTISOLID));
593

    
594
                return geomTypes;
595
        }
596

    
597
        private List<ComboItemGeomType> getGeomSubtypes() {
598
                List<ComboItemGeomType> geomSubtypes = new ArrayList<ComboItemGeomType>();
599
                geomSubtypes.add(new ComboItemGeomType("GEOM2D",
600
                                Geometry.SUBTYPES.GEOM2D));
601
                geomSubtypes.add(new ComboItemGeomType("GEOM2DM",
602
                                Geometry.SUBTYPES.GEOM2DM));
603
                geomSubtypes.add(new ComboItemGeomType("GEOM3D",
604
                                Geometry.SUBTYPES.GEOM3D));
605
                geomSubtypes.add(new ComboItemGeomType("GEOM3DM",
606
                                Geometry.SUBTYPES.GEOM3DM));
607
                geomSubtypes.add(new ComboItemGeomType("UNKNOWN",
608
                                Geometry.SUBTYPES.UNKNOWN));
609
                return geomSubtypes;
610
        }
611

    
612
        class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
613

    
614
                /**
615
                 * 
616
                 */
617
                private static final long serialVersionUID = 5093448776058027505L;
618

    
619
                CheckBoxRenderer() {
620
                        setHorizontalAlignment(JLabel.CENTER);
621
                }
622

    
623
                public Component getTableCellRendererComponent(JTable table,
624
                                Object value, boolean isSelected, boolean hasFocus, int row,
625
                                int column) {
626
                        if (isSelected) {
627
                                setForeground(table.getSelectionForeground());
628
                                setBackground(table.getSelectionBackground());
629
                        } else {
630
                                setForeground(table.getForeground());
631
                                setBackground(table.getBackground());
632
                        }
633
                        setSelected((value != null && ((Boolean) value).booleanValue()));
634
                        return this;
635
                }
636
        }
637

    
638
        /**
639
         * This method initializes jButton
640
         * 
641
         * @return javax.swing.JButton
642
         */
643
        private JButton getJButtonDeleteField() {
644
                if (jButtonDeleteField == null) {
645
                        jButtonDeleteField = new JButton();
646
                        jButtonDeleteField.setText(Messages.getText("delete_field"));
647
                        jButtonDeleteField.setLocation(new java.awt.Point(7, 33));
648
                        jButtonDeleteField.setSize(new java.awt.Dimension(145, 23));
649
                        jButtonDeleteField.setEnabled(false);
650
                        jButtonDeleteField
651
                                        .addActionListener(new java.awt.event.ActionListener() {
652
                                                public void actionPerformed(java.awt.event.ActionEvent e) {
653
                                                        int[] selecteds = jTable.getSelectedRows();
654
                                                        DefaultTableModel tm = (DefaultTableModel) jTable
655
                                                                        .getModel();
656

    
657
                                                        for (int i = selecteds.length - 1; i >= 0; i--) {
658
                                                            /*
659
                                                             * 
660
                                                                removedFields.add((String) tm.getValueAt(i, 0));
661
                                 */
662
                                                                tm.removeRow(selecteds[i]);
663
                                                        }
664
                                                }
665
                                        });
666
                }
667
                jButtonDeleteField.setEnabled(allowEditableFeatureType());
668
                return jButtonDeleteField;
669
        }
670

    
671
        public String getPanelTitle() {
672
                return Messages.getText("fields_definitions");
673
        }
674

    
675
        public void nextPanel() throws NotContinueWizardException {
676
                if (allowEditableFeatureType()){
677
                        fillFeatureType();
678
                }
679
        }
680

    
681
        private void fillFeatureType() {
682
                /*
683
                 * Coge los datos del formulario y los guarda en
684
                 * this.service.getFeatureType()
685
                 */
686
                NewLayerService service = this.wizard.getService();
687
                EditableFeatureType featureType = service.getFeatureType();
688
                
689
                // Clean and rebuild featureType everytime we click next
690
                removeAllFields(featureType);
691

    
692
                /*
693
                for (Iterator iterator = removedFields.iterator(); iterator.hasNext();) {
694
                        String name = (String) iterator.next();
695
                        featureType.remove(name);
696
                }
697
                removedFields.clear();
698
                */
699

    
700
                DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
701
                for (int i = 0; i < tm.getRowCount(); i++) {
702
                        DataType dataType = ((ComboItemDataType) tm.getValueAt(i, COLUMN_TYPE)).dataType;
703

    
704
                        int fieldLength = Integer.parseInt((String) tm.getValueAt(i, COLUMN_LENGTH));
705
                        // TODO: HACERLO BIEN
706
                        if (dataType.getType() == DataTypes.DOUBLE) {
707
                                fieldLength = 5;
708
                        }
709
                
710
                        // FIXME: Arreglar lo que pasa si en el siguiente panel volvemos
711
                        // hacia atras, y en este volvemos a ir hacia adelante
712
                        /*
713
                        String fieldName = (String) tm.getValueAt(i, COLUMN_FIELD);
714
                        EditableFeatureAttributeDescriptor attrDescriptor = (EditableFeatureAttributeDescriptor) featureType
715
                                        .getAttributeDescriptor(fieldName);
716

717
                        if (attrDescriptor != null) {
718
                                featureType.remove(attrDescriptor);
719
                        }
720
                        */
721
                        
722
                        EditableFeatureAttributeDescriptor efad1 = featureType.add(
723
                                        (String) tm.getValueAt(i, COLUMN_FIELD), dataType.getType(),
724
                                        fieldLength);
725
                        if (dataType.getType() == DataTypes.GEOMETRY) {
726
                                efad1.setGeometryType(((ComboItemGeomType) tm.getValueAt(i, COLUMN_GEOMETRYTYPE)).type);
727
                                efad1.setGeometrySubType(((ComboItemGeomType) tm.getValueAt(i,
728
                                    COLUMN_GEOMETRYSUBTYPE)).type);
729
                                efad1.setIsPrimaryKey(((Boolean) tm.getValueAt(i, COLUMN_PRIMARYKEY))
730
                                                .booleanValue());
731
                                efad1.setAllowNull(!((Boolean) tm.getValueAt(i, COLUMN_MANDATORY))
732
                                                .booleanValue());
733
                                efad1.setSRS((IProjection) tm.getValueAt(i, COLUMN_CRS));
734
                                //If there is not a previous default geometry field, add it
735
                                if (featureType.getDefaultGeometryAttribute() == null){
736
                                    featureType.setDefaultGeometryAttributeName(efad1.getName());
737
                                }        
738
                        }
739
                }
740
        }
741

    
742
        /**
743
     * @param featureType
744
     */
745
    private void removeAllFields(EditableFeatureType ft) {
746
        
747
        FeatureAttributeDescriptor[] atts =  ft.getAttributeDescriptors();
748
        int len = atts.length;
749
        FeatureAttributeDescriptor item = null;
750
        for (int i=0; i<len; i++) {
751
            item = atts[i];
752
            ft.remove(item.getName());
753
        }
754
    }
755

    
756
    public void lastPanel() {
757
                // TODO Auto-generated method stub
758
                logger.info("FeatureTypePanel: lastPanel");
759
        }
760

    
761
        public void updatePanel() {
762
                initializeComponents();
763

    
764
        }
765

    
766
        public JPanel getJPanel() {
767
                return this;
768
        }
769
}