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

History | View | Annotate | Download (9.27 KB)

1
package org.gvsig.newlayer.impl;
2

    
3
import java.awt.BorderLayout;
4
import java.util.ArrayList;
5
import java.util.Iterator;
6
import java.util.List;
7

    
8
import javax.swing.DefaultCellEditor;
9
import javax.swing.JButton;
10
import javax.swing.JComboBox;
11
import javax.swing.JLabel;
12
import javax.swing.JPanel;
13
import javax.swing.JScrollPane;
14
import javax.swing.JTable;
15
import javax.swing.ListSelectionModel;
16
import javax.swing.event.ListSelectionEvent;
17
import javax.swing.event.ListSelectionListener;
18
import javax.swing.table.DefaultTableModel;
19
import javax.swing.table.TableColumn;
20

    
21
import org.gvsig.fmap.dal.DataServerExplorer;
22
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.feature.EditableFeatureType;
24
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
25
import org.gvsig.gui.beans.wizard.panel.NotContinueWizardException;
26
import org.gvsig.gui.beans.wizard.panel.OptionPanel;
27
import org.gvsig.i18n.Messages;
28
import org.gvsig.newlayer.NewLayerWizard;
29
import org.gvsig.tools.dataTypes.DataTypes;
30
import org.slf4j.Logger;
31
import org.slf4j.LoggerFactory;
32

    
33
public class FeatureTypePanel extends JPanel implements OptionPanel{
34

    
35
        /**
36
         * 
37
         */
38
        private static final long serialVersionUID = 263541873998597624L;
39
        private NewLayerWizard wizard;
40
        private static final  Logger logger = LoggerFactory.getLogger(FeatureTypePanel.class);
41

    
42
        private JLabel jLabel = null;
43
        private JScrollPane jScrollPane = null;
44
        protected JTable jTable = null;
45
        private JPanel jPanelEast = null;
46
        private JButton jButtonAddField = null;
47
        private JButton jButtonDeleteField = null;
48
        protected int MAX_FIELD_LENGTH = 254;
49
        private List removedFields;
50

    
51
        private DataServerExplorer explorer = null;
52

    
53
        public FeatureTypePanel(NewLayerWizard wizard){
54
                this.wizard = wizard;
55
                removedFields = new ArrayList<String>();
56
        }
57

    
58
    private void initializeComponents() {
59
        jLabel = new JLabel();
60
        jLabel.setText(Messages.getText("define_fields"));
61
        this.setLayout(new BorderLayout(5,5));
62
        this.setSize(new java.awt.Dimension(499,232));
63
        this.add(jLabel, java.awt.BorderLayout.NORTH);
64
        this.add(getJScrollPane(), java.awt.BorderLayout.CENTER);
65
        this.add(getJPanelEast(), java.awt.BorderLayout.EAST);
66
     
67
    }
68

    
69
        /**
70
         * This method initializes jScrollPane
71
         *
72
         * @return javax.swing.JScrollPane
73
         */
74
        private JScrollPane getJScrollPane() {
75
                if (jScrollPane == null) {
76
                        jScrollPane = new JScrollPane();
77
                        jScrollPane.setViewportView(getJTable());
78
                }
79
                return jScrollPane;
80
        }
81

    
82

    
83
        /**
84
         * This method initializes jTable
85
         *
86
         * @return javax.swing.JTable
87
         */
88
        private JTable getJTable() {
89
                if (jTable == null) {
90
                        jTable = new JTable();
91

    
92
                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
93
                        tm.addColumn(Messages.getText("field"));
94

    
95
                        tm.addColumn(Messages.getText("type"));
96
                        tm.addColumn(Messages.getText("length"));
97

    
98
//                        Ask to be notified of selection changes.
99
                        ListSelectionModel rowSM = jTable.getSelectionModel();
100
                        rowSM.addListSelectionListener(new ListSelectionListener() {
101
                            public void valueChanged(ListSelectionEvent e) {
102
                                //Ignore extra messages.
103
                                if (e.getValueIsAdjusting()) return;
104

    
105
                                ListSelectionModel lsm =
106
                                    (ListSelectionModel)e.getSource();
107
                                if (lsm.isSelectionEmpty()) {
108
                                    //no rows are selected
109
                                        jButtonDeleteField.setEnabled(false);
110
                                } else {
111
                                        jButtonDeleteField.setEnabled(true);
112
                                }
113
                            }
114
                        });
115
                        jTable.getColumn(Messages.getText("field")).setWidth(180);
116

    
117
                        //Rellenado de la tabla
118
                        EditableFeatureType featureType = this.wizard.getService().getFeatureType();
119
                        if( featureType != null ){
120
                                int row = 0;
121
                                int column = 0;
122
                                Iterator it = featureType.iterator();
123
                                while (it.hasNext()) {
124
                                        FeatureAttributeDescriptor descriptor = (FeatureAttributeDescriptor) it.next();
125
                                        tm.setValueAt(descriptor.getName(), row, 0);
126
                                        tm.setValueAt(descriptor.getType(), row, 1);
127
                                        tm.setValueAt(descriptor.getSize(), row, 2);
128
                                }
129
                        }
130
                        
131
                }
132
                return jTable;
133
        }
134

    
135

    
136
        /**
137
         * This method initializes jPanelWest
138
         *
139
         * @return javax.swing.JPanel
140
         */
141
        private JPanel getJPanelEast() {
142
                if (jPanelEast == null) {
143
                        jPanelEast = new JPanel();
144
                        jPanelEast.setLayout(null);
145
                        jPanelEast.setPreferredSize(new java.awt.Dimension(170,100));
146
                        jPanelEast.add(getJButtonAddField(), null);
147
                        jPanelEast.add(getJButtonDeleteField(), null);
148
                }
149
                return jPanelEast;
150
        }
151

    
152

    
153
        /**
154
         * This method initializes jButtonAddField
155
         *
156
         * @return javax.swing.JButton
157
         */
158
        private JButton getJButtonAddField() {
159
                if (jButtonAddField == null) {
160
                        jButtonAddField = new JButton();
161
                        jButtonAddField.setText(Messages.getText("add_field"));
162
                        jButtonAddField.setLocation(new java.awt.Point(7,5));
163
                        jButtonAddField.setSize(new java.awt.Dimension(145,23));
164
                        jButtonAddField.setPreferredSize(new java.awt.Dimension(100,26));
165
                        jButtonAddField.addActionListener(new java.awt.event.ActionListener() {
166
                                public void actionPerformed(java.awt.event.ActionEvent e) {
167
                                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
168

    
169
                                        // Figure out a suitable field name
170
                                        ArrayList fieldNames = new ArrayList();
171
                                        for (int i = 0; i < jTable.getRowCount(); i++) {
172
                                                fieldNames.add(tm.getValueAt(i, 0));
173
                                        }
174
                                        String[] currentFieldNames = (String[]) fieldNames.toArray(new String[0]);
175
                                        String newField = Messages.getText("field").replaceAll(" +", "_");
176
                                        int index=0;
177
                                        for (int i = 0; i < currentFieldNames.length; i++) {
178
                                                if (currentFieldNames[i].startsWith(newField)) {
179
                                                        try {
180
                                                                index = Integer.parseInt(currentFieldNames[i].replaceAll(newField,""));
181
                                                        } catch (Exception ex) { /* we don't care */}
182
                                                }
183
                                        }
184
                                        String newFieldName = newField+(++index);
185

    
186

    
187
                                        // Add a new row
188
                                        Object[] newRow = new Object[tm.getColumnCount()];
189
                                        newRow[0] = newFieldName;
190
                                        newRow[1] = "String";
191
                                        newRow[2] = "20";
192
                                        tm.addRow(newRow);
193

    
194
                                        // Esto lo a?ado aqu? porque si no tiene registros, no hace caso. (Por eso no
195
                                        // lo pongo en getJTable()
196
                                        TableColumn typeColumn = jTable.getColumnModel().getColumn(1);
197
                                        JComboBox comboBox = new JComboBox();
198
                                        comboBox.addItem("Boolean");
199
                                        comboBox.addItem("Date");
200
                                        comboBox.addItem("Integer");
201
                                        comboBox.addItem("Double");
202
                                        comboBox.addItem("String");
203
                                        typeColumn.setCellEditor(new DefaultCellEditor(comboBox));
204

    
205
                                        TableColumn widthColumn = jTable.getColumnModel().getColumn(2);
206

    
207
                                        // tm.setValueAt("NewField", tm.getRowCount()-1, 0);
208
                                }
209
                        });
210

    
211
                }
212
                return jButtonAddField;
213
        }
214

    
215

    
216
        /**
217
         * This method initializes jButton
218
         *
219
         * @return javax.swing.JButton
220
         */
221
        private JButton getJButtonDeleteField() {
222
                if (jButtonDeleteField == null) {
223
                        jButtonDeleteField = new JButton();
224
                        jButtonDeleteField.setText(Messages.getText("delete_field"));
225
                        jButtonDeleteField.setLocation(new java.awt.Point(7,33));
226
                        jButtonDeleteField.setSize(new java.awt.Dimension(145,23));
227
                        jButtonDeleteField.setEnabled(false);
228
                        jButtonDeleteField.addActionListener(new java.awt.event.ActionListener() {
229
                                public void actionPerformed(java.awt.event.ActionEvent e) {
230
                                        int[] selecteds = jTable.getSelectedRows();
231
                                        DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
232

    
233
                                        for (int i=selecteds.length-1; i >=0; i--){
234
                                                removedFields.add((String) tm.getValueAt(i,0));
235
                                                tm.removeRow(selecteds[i]);
236
                                        }
237
                                }
238
                        });
239
                }
240
                return jButtonDeleteField;
241
        }
242

    
243

    
244

    
245
        public String getPanelTitle() {
246
                return Messages.getText("fields_definitions");
247
        }
248

    
249
        public void nextPanel() throws NotContinueWizardException {
250
                fillFeatureType();
251
        }
252
        
253
        private void fillFeatureType() {
254
                /* 
255
                 * Coge los datos del formulario y los guarda en
256
                 * this.service.getFeatureType()
257
                 */
258
                EditableFeatureType featureType = this.wizard.getService().getFeatureType();
259
                
260
                for (Iterator iterator = removedFields.iterator(); iterator.hasNext();) {
261
                        String name = (String) iterator.next();
262
                        featureType.remove(name);
263
                }
264
                removedFields.clear();
265
                
266
                DefaultTableModel tm = (DefaultTableModel) jTable.getModel();
267
                for (int i=0; i < tm.getRowCount(); i++)
268
                {
269
                        int dataType=0;
270
                        String strType = (String) tm.getValueAt(i,1);
271

    
272
                        if (strType.equals("String"))
273
                                dataType=DataTypes.STRING;
274
                        else if (strType.equals("Double"))
275
                                dataType=DataTypes.DOUBLE;
276
                        else if (strType.equals("Integer"))
277
                                dataType=DataTypes.INT;
278
                        else if (strType.equals("Boolean"))
279
                                dataType=DataTypes.BOOLEAN;
280
                        else if (strType.equals("Date"))
281
                                dataType=DataTypes.DATE;
282

    
283
                        int fieldLength = Integer.parseInt((String) tm.getValueAt(i,2));
284
                        // TODO: HACERLO BIEN
285
                        if (strType.equals("Double"))
286
                                fieldLength=5;
287
                        //FIXME: Arreglar lo que pasa si en el siguiente panel volvemos hacia atras, y en este volvemos a ir hacia adelante
288
                        String fieldName = (String) tm.getValueAt(i,0);
289
                        EditableFeatureAttributeDescriptor attrDescriptor = (EditableFeatureAttributeDescriptor) featureType.getAttributeDescriptor(fieldName);
290
                        if (attrDescriptor != null) {
291
                                featureType.remove(attrDescriptor);
292
                        }
293
                        EditableFeatureAttributeDescriptor efad1 = featureType.add((String) tm.getValueAt(i,0), dataType, fieldLength);
294
                }
295
        }
296

    
297
        public void lastPanel() {
298
                // TODO Auto-generated method stub
299
                logger.info("FeatureTypePanel: lastPanel");
300
        }
301

    
302
        public void updatePanel() {
303
                initializeComponents();
304
                
305
        }
306

    
307
        public JPanel getJPanel() {
308
                return this;
309
        }
310

    
311
}