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 @ 38555
History | View | Annotate | Download (40 KB)
1 | 36022 | fdiaz | package org.gvsig.newlayer.impl; |
---|---|---|---|
2 | |||
3 | import java.awt.BorderLayout; |
||
4 | 36721 | fdiaz | import java.awt.Component; |
5 | 38533 | jldominguez | import java.awt.GridBagConstraints; |
6 | import java.awt.GridBagLayout; |
||
7 | import java.awt.Insets; |
||
8 | 36721 | fdiaz | import java.awt.event.ActionEvent; |
9 | import java.awt.event.ActionListener; |
||
10 | 38533 | jldominguez | import java.awt.event.ItemEvent; |
11 | import java.awt.event.ItemListener; |
||
12 | 36022 | fdiaz | import java.util.ArrayList; |
13 | import java.util.Iterator; |
||
14 | 36220 | fdiaz | import java.util.List; |
15 | 36022 | fdiaz | |
16 | 36721 | fdiaz | import javax.swing.ComboBoxModel; |
17 | 36022 | fdiaz | import javax.swing.DefaultCellEditor; |
18 | import javax.swing.JButton; |
||
19 | 36721 | fdiaz | import javax.swing.JCheckBox; |
20 | 36022 | fdiaz | import javax.swing.JComboBox; |
21 | import javax.swing.JLabel; |
||
22 | 38533 | jldominguez | import javax.swing.JOptionPane; |
23 | 36022 | fdiaz | import javax.swing.JPanel; |
24 | import javax.swing.JScrollPane; |
||
25 | import javax.swing.JTable; |
||
26 | 38533 | jldominguez | import javax.swing.JTextField; |
27 | 36022 | fdiaz | import javax.swing.ListSelectionModel; |
28 | 36721 | fdiaz | import javax.swing.UIManager; |
29 | import javax.swing.event.ListDataListener; |
||
30 | 36022 | fdiaz | import javax.swing.event.ListSelectionEvent; |
31 | import javax.swing.event.ListSelectionListener; |
||
32 | 37807 | jpiera | import javax.swing.event.TableModelEvent; |
33 | import javax.swing.event.TableModelListener; |
||
34 | 38533 | jldominguez | import javax.swing.table.DefaultTableCellRenderer; |
35 | 36022 | fdiaz | import javax.swing.table.DefaultTableModel; |
36 | 36721 | fdiaz | import javax.swing.table.TableCellRenderer; |
37 | 36022 | fdiaz | import javax.swing.table.TableColumn; |
38 | 38533 | jldominguez | import javax.swing.table.TableModel; |
39 | 36022 | fdiaz | |
40 | 36721 | fdiaz | import org.cresques.cts.IProjection; |
41 | 37807 | jpiera | import org.slf4j.Logger; |
42 | import org.slf4j.LoggerFactory; |
||
43 | |||
44 | 36721 | fdiaz | 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 | 38533 | jldominguez | import org.gvsig.fmap.dal.DataStoreProviderFactory; |
49 | 36022 | fdiaz | import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor; |
50 | import org.gvsig.fmap.dal.feature.EditableFeatureType; |
||
51 | import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
||
52 | 37333 | fdiaz | import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory; |
53 | 38533 | jldominguez | import org.gvsig.fmap.dal.feature.FeatureType; |
54 | 38534 | jldominguez | import org.gvsig.fmap.geom.DataTypes; |
55 | 36721 | fdiaz | import org.gvsig.fmap.geom.Geometry; |
56 | 38533 | jldominguez | import org.gvsig.fmap.geom.GeometryLocator; |
57 | import org.gvsig.fmap.geom.GeometryManager; |
||
58 | import org.gvsig.fmap.geom.type.GeometryType; |
||
59 | 36022 | fdiaz | import org.gvsig.gui.beans.wizard.panel.NotContinueWizardException; |
60 | import org.gvsig.gui.beans.wizard.panel.OptionPanel; |
||
61 | import org.gvsig.i18n.Messages; |
||
62 | 36721 | fdiaz | 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 | 36022 | fdiaz | |
67 | 36721 | fdiaz | public class FeatureTypePanel extends JPanel implements OptionPanel { |
68 | 37807 | jpiera | 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 | 36022 | fdiaz | private static final long serialVersionUID = 263541873998597624L; |
78 | 38533 | jldominguez | |
79 | private FeatureType defaultFeatType = null; |
||
80 | |||
81 | 38555 | jldominguez | private NewLayerService newLayer_Service = null; |
82 | 38533 | jldominguez | 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 | 36721 | fdiaz | private static final Logger logger = LoggerFactory |
89 | .getLogger(FeatureTypePanel.class); |
||
90 | 36022 | fdiaz | |
91 | private JLabel jLabel = null; |
||
92 | private JScrollPane jScrollPane = null; |
||
93 | protected JTable jTable = null; |
||
94 | private JPanel jPanelEast = null; |
||
95 | 38533 | jldominguez | private JButton addFieldButton = null; |
96 | private JButton deleteFieldButton = null; |
||
97 | 36022 | fdiaz | protected int MAX_FIELD_LENGTH = 254; |
98 | 38367 | jldominguez | |
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 | 36022 | fdiaz | |
104 | 38533 | jldominguez | // private DataServerExplorer explorer = null;
|
105 | 36022 | fdiaz | |
106 | 38533 | jldominguez | public FeatureTypePanel(NewLayerService new_layer_service) {
|
107 | |||
108 | /*
|
||
109 | service.getFeatureType(),
|
||
110 | service.getStoreName(),
|
||
111 | service.getMapContext().getProjection();
|
||
112 | */
|
||
113 | 38555 | jldominguez | 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 | 38533 | jldominguez | } |
123 | |||
124 | 38555 | jldominguez | 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 | 36022 | fdiaz | } |
147 | |||
148 | 36721 | fdiaz | 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 | 38533 | jldominguez | this.add(getJPanelSouth(), java.awt.BorderLayout.SOUTH);
|
156 | 36022 | fdiaz | |
157 | 36721 | fdiaz | } |
158 | |||
159 | 36022 | fdiaz | /**
|
160 | * This method initializes jScrollPane
|
||
161 | 36721 | fdiaz | *
|
162 | 36022 | fdiaz | * @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 | 36721 | fdiaz | *
|
175 | 36022 | fdiaz | * @return javax.swing.JTable
|
176 | */
|
||
177 | private JTable getJTable() { |
||
178 | if (jTable == null) { |
||
179 | 37807 | jpiera | jTable = new JTable(){ |
180 | 38533 | jldominguez | public boolean isCellEditable(int row,int column){ |
181 | 37807 | jpiera | |
182 | 38533 | jldominguez | |
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 | 37807 | jpiera | 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 | 38533 | jldominguez | */
|
242 | 37807 | jpiera | } |
243 | }; |
||
244 | 36022 | fdiaz | |
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 | 36721 | fdiaz | 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 | 36022 | fdiaz | |
256 | 36721 | fdiaz | // Ask to be notified of selection changes.
|
257 | 36022 | fdiaz | ListSelectionModel rowSM = jTable.getSelectionModel();
|
258 | rowSM.addListSelectionListener(new ListSelectionListener() { |
||
259 | 36721 | fdiaz | public void valueChanged(ListSelectionEvent e) { |
260 | // Ignore extra messages.
|
||
261 | if (e.getValueIsAdjusting())
|
||
262 | return;
|
||
263 | 36022 | fdiaz | |
264 | 36721 | fdiaz | ListSelectionModel lsm = (ListSelectionModel) e.getSource(); |
265 | if (lsm.isSelectionEmpty()) {
|
||
266 | // no rows are selected
|
||
267 | 38533 | jldominguez | deleteFieldButton.setEnabled(false);
|
268 | 36721 | fdiaz | } else {
|
269 | 38533 | jldominguez | 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 | 36721 | fdiaz | } |
279 | 36022 | fdiaz | }); |
280 | jTable.getColumn(Messages.getText("field")).setWidth(180); |
||
281 | |||
282 | 37807 | jpiera | 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 | 38555 | jldominguez | |
291 | if (!fieldsInited) {
|
||
292 | initFields(); |
||
293 | } |
||
294 | |||
295 | 36721 | fdiaz | // Rellenado de la tabla
|
296 | 38533 | jldominguez | if (defaultFeatType != null) { |
297 | |||
298 | Iterator it = defaultFeatType.iterator();
|
||
299 | boolean some_error = false; |
||
300 | 36022 | fdiaz | while (it.hasNext()) {
|
301 | 36721 | fdiaz | FeatureAttributeDescriptor descriptor = (FeatureAttributeDescriptor) it |
302 | .next(); |
||
303 | 38533 | jldominguez | |
304 | if (!addRowToFieldTable(
|
||
305 | jTable, |
||
306 | null,
|
||
307 | inProjection, |
||
308 | descriptor)) { |
||
309 | |||
310 | some_error = true;
|
||
311 | } |
||
312 | /*
|
||
313 | 37807 | jpiera | 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 | 38533 | jldominguez | */
|
322 | 36022 | fdiaz | } |
323 | 38533 | jldominguez | |
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 | 36022 | fdiaz | } |
332 | 36721 | fdiaz | |
333 | 36022 | fdiaz | } |
334 | 37333 | fdiaz | jTable.setEnabled(allowEditableFeatureType()); |
335 | 36022 | fdiaz | return jTable;
|
336 | } |
||
337 | |||
338 | /**
|
||
339 | * This method initializes jPanelWest
|
||
340 | 36721 | fdiaz | *
|
341 | 36022 | fdiaz | * @return javax.swing.JPanel
|
342 | */
|
||
343 | 38533 | jldominguez | private JPanel getJPanelSouth() { |
344 | 36022 | fdiaz | if (jPanelEast == null) { |
345 | jPanelEast = new JPanel(); |
||
346 | 38533 | jldominguez | 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 | 36022 | fdiaz | } |
362 | return jPanelEast;
|
||
363 | } |
||
364 | |||
365 | /**
|
||
366 | * This method initializes jButtonAddField
|
||
367 | 36721 | fdiaz | *
|
368 | 36022 | fdiaz | * @return javax.swing.JButton
|
369 | */
|
||
370 | private JButton getJButtonAddField() { |
||
371 | 38533 | jldominguez | 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 | 36721 | fdiaz | .addActionListener(new java.awt.event.ActionListener() {
|
379 | public void actionPerformed(java.awt.event.ActionEvent e) { |
||
380 | DefaultTableModel tm = (DefaultTableModel) jTable |
||
381 | .getModel(); |
||
382 | 36022 | fdiaz | |
383 | 36721 | fdiaz | // Figure out a suitable field name
|
384 | ArrayList fieldNames = new ArrayList(); |
||
385 | for (int i = 0; i < jTable.getRowCount(); i++) { |
||
386 | 37807 | jpiera | fieldNames.add(tm.getValueAt(i, COLUMN_FIELD)); |
387 | 36721 | fdiaz | } |
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 | 38533 | jldominguez | if (!addRowToFieldTable(
|
410 | jTable, |
||
411 | newFieldName, |
||
412 | inProjection, |
||
413 | null)) {
|
||
414 | 37807 | jpiera | |
415 | 38533 | jldominguez | 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 | 36022 | fdiaz | } |
422 | 36721 | fdiaz | }); |
423 | 36022 | fdiaz | |
424 | 36721 | fdiaz | } |
425 | 38533 | jldominguez | addFieldButton.setEnabled(allowEditableFeatureType()); |
426 | return addFieldButton;
|
||
427 | 36721 | fdiaz | } |
428 | 37333 | fdiaz | |
429 | private boolean allowEditableFeatureType(){ |
||
430 | 38555 | jldominguez | |
431 | if (!fieldsInited) {
|
||
432 | initFields(); |
||
433 | } |
||
434 | 38533 | jldominguez | |
435 | 37333 | fdiaz | DataManager dataManager = DALLocator.getDataManager(); |
436 | 38533 | jldominguez | FeatureStoreProviderFactory factory = |
437 | (FeatureStoreProviderFactory) dataManager. |
||
438 | getStoreProviderFactory(inStoreName); |
||
439 | 37333 | fdiaz | if (factory.allowEditableFeatureType()==FeatureStoreProviderFactory.NO) {
|
440 | return false; |
||
441 | } |
||
442 | return true; |
||
443 | } |
||
444 | 36022 | fdiaz | |
445 | 36721 | fdiaz | private class ComboItemDataType { |
446 | private DataType dataType;
|
||
447 | 36022 | fdiaz | |
448 | 36721 | fdiaz | public ComboItemDataType(DataType dataType) {
|
449 | this.dataType = dataType;
|
||
450 | } |
||
451 | 36022 | fdiaz | |
452 | 36721 | fdiaz | @Override
|
453 | public String toString() { |
||
454 | return this.dataType.getName(); |
||
455 | } |
||
456 | } |
||
457 | 36022 | fdiaz | |
458 | 36721 | fdiaz | private class ComboModelDataType implements ComboBoxModel { |
459 | |||
460 | private List<ComboItemDataType> dataTypes; |
||
461 | private ComboItemDataType selected;
|
||
462 | |||
463 | 38533 | jldominguez | public ComboModelDataType(List<DataType> dataTypes, int sel_type) { |
464 | |||
465 | 36721 | fdiaz | this.dataTypes = new ArrayList<ComboItemDataType>(); |
466 | 38533 | jldominguez | ComboItemDataType item = null;
|
467 | 36721 | fdiaz | for (Iterator iterator = dataTypes.iterator(); iterator.hasNext();) { |
468 | DataType dataType = (DataType) iterator.next(); |
||
469 | 38533 | jldominguez | item = new ComboItemDataType(dataType);
|
470 | this.dataTypes.add(item);
|
||
471 | if (sel_type == dataType.getType()) {
|
||
472 | this.setSelectedItem(item);
|
||
473 | } |
||
474 | 36721 | fdiaz | } |
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 | 37807 | jpiera | class CrsRenderer extends JButton implements TableCellRenderer { |
504 | 36721 | fdiaz | private static final long serialVersionUID = -573793294070515376L; |
505 | 37807 | jpiera | private JLabel label = null; |
506 | |||
507 | public CrsRenderer() {
|
||
508 | 36721 | fdiaz | setOpaque(true);
|
509 | 37807 | jpiera | label = new JLabel(Messages.getText("not_applicable")); |
510 | 36721 | fdiaz | } |
511 | |||
512 | public Component getTableCellRendererComponent(JTable table, |
||
513 | Object value, boolean isSelected, boolean hasFocus, int row, |
||
514 | int column) {
|
||
515 | 37807 | jpiera | |
516 | 38533 | jldominguez | 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 | 37807 | jpiera | |
526 | if (dataType.getType() != DataTypes.GEOMETRY) {
|
||
527 | return label;
|
||
528 | } |
||
529 | |||
530 | if (isSelected) {
|
||
531 | 36721 | fdiaz | 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 | 37807 | jpiera | } |
541 | |||
542 | private class GeometryComboCellRenderer extends JLabel implements TableCellRenderer{ |
||
543 | 36721 | fdiaz | |
544 | 37807 | jpiera | public Component getTableCellRendererComponent(JTable table, |
545 | Object value, boolean isSelected, boolean hasFocus, int row, |
||
546 | int column) {
|
||
547 | |||
548 | 38533 | jldominguez | ComboItemDataType item = (ComboItemDataType) table.getValueAt(row, COLUMN_TYPE); |
549 | DataType dataType = item.dataType; |
||
550 | 37807 | jpiera | |
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 | 36721 | fdiaz | 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 | 36022 | fdiaz | } |
587 | }); |
||
588 | 36721 | fdiaz | } |
589 | 36022 | fdiaz | |
590 | 36721 | fdiaz | 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 | 36022 | fdiaz | } |
605 | 36721 | fdiaz | |
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 | 36022 | fdiaz | } |
629 | |||
630 | 36721 | fdiaz | private class ComboItemGeomType { |
631 | private int type; |
||
632 | private String name; |
||
633 | 36022 | fdiaz | |
634 | 36721 | fdiaz | 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 | 38533 | jldominguez | |
644 | public int getGeomType() { |
||
645 | return type;
|
||
646 | } |
||
647 | 36721 | fdiaz | } |
648 | |||
649 | private class ComboModelGeomType implements ComboBoxModel { |
||
650 | |||
651 | private List<ComboItemGeomType> geomTypes; |
||
652 | private ComboItemGeomType selected;
|
||
653 | |||
654 | 38533 | jldominguez | public ComboModelGeomType(
|
655 | List<ComboItemGeomType> geomTypes, int sel_geom_type) { |
||
656 | |||
657 | 36721 | fdiaz | this.geomTypes = geomTypes;
|
658 | 38533 | jldominguez | 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 | 36721 | fdiaz | } |
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 | 38533 | jldominguez | public CheckBoxRenderer() {
|
739 | 36721 | fdiaz | 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 | 36022 | fdiaz | /**
|
758 | * This method initializes jButton
|
||
759 | 36721 | fdiaz | *
|
760 | 36022 | fdiaz | * @return javax.swing.JButton
|
761 | */
|
||
762 | private JButton getJButtonDeleteField() { |
||
763 | 38533 | jldominguez | 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 | 36721 | fdiaz | .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 | 36022 | fdiaz | |
776 | 36721 | fdiaz | for (int i = selecteds.length - 1; i >= 0; i--) { |
777 | 38367 | jldominguez | /*
|
778 | *
|
||
779 | 36721 | fdiaz | removedFields.add((String) tm.getValueAt(i, 0));
|
780 | 38367 | jldominguez | */
|
781 | 36721 | fdiaz | tm.removeRow(selecteds[i]); |
782 | } |
||
783 | } |
||
784 | }); |
||
785 | 36022 | fdiaz | } |
786 | 38533 | jldominguez | deleteFieldButton.setEnabled(false);
|
787 | return deleteFieldButton;
|
||
788 | 36022 | fdiaz | } |
789 | |||
790 | public String getPanelTitle() { |
||
791 | return Messages.getText("fields_definitions"); |
||
792 | } |
||
793 | |||
794 | public void nextPanel() throws NotContinueWizardException { |
||
795 | 37333 | fdiaz | if (allowEditableFeatureType()){
|
796 | fillFeatureType(); |
||
797 | } |
||
798 | 36220 | fdiaz | } |
799 | 36721 | fdiaz | |
800 | 38533 | jldominguez | private void fillFeatureType() throws NotContinueWizardException { |
801 | 38555 | jldominguez | |
802 | if (!fieldsInited) {
|
||
803 | initFields(); |
||
804 | } |
||
805 | |||
806 | 36721 | fdiaz | /*
|
807 | 36220 | fdiaz | * Coge los datos del formulario y los guarda en
|
808 | 36022 | fdiaz | * this.service.getFeatureType()
|
809 | */
|
||
810 | 38533 | jldominguez | |
811 | 38555 | jldominguez | EditableFeatureType edft = newLayer_Service.getFeatureType(); |
812 | 38533 | jldominguez | |
813 | 38367 | jldominguez | // Clean and rebuild featureType everytime we click next
|
814 | 38533 | jldominguez | removeAllFields(edft); |
815 | edft.setDefaultGeometryAttributeName(null);
|
||
816 | 36721 | fdiaz | |
817 | 38533 | jldominguez | GeometryManager gm = GeometryLocator.getGeometryManager(); |
818 | 36022 | fdiaz | DefaultTableModel tm = (DefaultTableModel) jTable.getModel(); |
819 | 38533 | jldominguez | |
820 | 36721 | fdiaz | for (int i = 0; i < tm.getRowCount(); i++) { |
821 | 37807 | jpiera | DataType dataType = ((ComboItemDataType) tm.getValueAt(i, COLUMN_TYPE)).dataType; |
822 | 36022 | fdiaz | |
823 | 38533 | jldominguez | int fieldLength = 20; |
824 | if (dataTypeNeedsSize(dataType.getType())) {
|
||
825 | fieldLength = |
||
826 | Integer.parseInt((String) tm.getValueAt(i, COLUMN_LENGTH)); |
||
827 | 36721 | fdiaz | } |
828 | 38367 | jldominguez | |
829 | 38533 | jldominguez | EditableFeatureAttributeDescriptor efad1 = |
830 | edft.add( |
||
831 | 37807 | jpiera | (String) tm.getValueAt(i, COLUMN_FIELD), dataType.getType(),
|
832 | 36721 | fdiaz | fieldLength); |
833 | 38533 | jldominguez | |
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 | 36721 | fdiaz | if (dataType.getType() == DataTypes.GEOMETRY) {
|
843 | 38533 | jldominguez | |
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 | 37807 | jpiera | efad1.setIsPrimaryKey(((Boolean) tm.getValueAt(i, COLUMN_PRIMARYKEY))
|
860 | 36721 | fdiaz | .booleanValue()); |
861 | 37807 | jpiera | efad1.setAllowNull(!((Boolean) tm.getValueAt(i, COLUMN_MANDATORY))
|
862 | 36721 | fdiaz | .booleanValue()); |
863 | 37807 | jpiera | efad1.setSRS((IProjection) tm.getValueAt(i, COLUMN_CRS)); |
864 | 38533 | jldominguez | |
865 | 37804 | jpiera | //If there is not a previous default geometry field, add it
|
866 | 38533 | jldominguez | // this will set the first geometry field
|
867 | // as the default geometry field
|
||
868 | if (edft.getDefaultGeometryAttribute() == null){ |
||
869 | edft.setDefaultGeometryAttributeName(efad1.getName()); |
||
870 | 37807 | jpiera | } |
871 | 36721 | fdiaz | } |
872 | 36022 | fdiaz | } |
873 | 36220 | fdiaz | } |
874 | 36022 | fdiaz | |
875 | 38367 | jldominguez | /**
|
876 | * @param featureType
|
||
877 | */
|
||
878 | private void removeAllFields(EditableFeatureType ft) { |
||
879 | |||
880 | FeatureAttributeDescriptor[] atts = ft.getAttributeDescriptors();
|
||
881 | int len = atts.length;
|
||
882 | FeatureAttributeDescriptor item = null;
|
||
883 | for (int i=0; i<len; i++) { |
||
884 | item = atts[i]; |
||
885 | ft.remove(item.getName()); |
||
886 | } |
||
887 | } |
||
888 | |||
889 | public void lastPanel() { |
||
890 | 36220 | fdiaz | // TODO Auto-generated method stub
|
891 | logger.info("FeatureTypePanel: lastPanel");
|
||
892 | 36022 | fdiaz | } |
893 | |||
894 | 36220 | fdiaz | public void updatePanel() { |
895 | initializeComponents(); |
||
896 | 36721 | fdiaz | |
897 | 36220 | fdiaz | } |
898 | |||
899 | public JPanel getJPanel() { |
||
900 | return this; |
||
901 | } |
||
902 | 38533 | jldominguez | |
903 | /**
|
||
904 | * If fad is null, it's an addition after user has clicked on 'Add field'.
|
||
905 | * If fad is not null, it's the description of a default field and the
|
||
906 | * field name will also be taken from there.
|
||
907 | *
|
||
908 | * @param the_table
|
||
909 | * @param new_fld_name
|
||
910 | * @param the_projection
|
||
911 | * @param fad
|
||
912 | *
|
||
913 | * @return true if field was actually added, false otherwise
|
||
914 | */
|
||
915 | private boolean addRowToFieldTable( |
||
916 | JTable the_table,
|
||
917 | String new_fld_name,
|
||
918 | IProjection the_projection, |
||
919 | FeatureAttributeDescriptor fad) { |
||
920 | |||
921 | if (fad == null && new_fld_name == null) { |
||
922 | logger.info("Error: unable to add field to table (no description and no name)");
|
||
923 | return false; |
||
924 | } |
||
925 | |||
926 | DefaultTableModel the_tm = (DefaultTableModel) the_table.getModel(); |
||
927 | Object[] newRow = new Object[the_tm.getColumnCount()]; |
||
928 | |||
929 | /*
|
||
930 | tm.setValueAt(descriptor.getName(), row, COLUMN_FIELD);
|
||
931 | tm.setValueAt(descriptor.getType(), row, COLUMN_TYPE);
|
||
932 | tm.setValueAt(descriptor.getSize(), row, COLUMN_LENGTH);
|
||
933 | tm.setValueAt(descriptor.getGeometryType(), row, COLUMN_GEOMETRYTYPE);
|
||
934 | tm.setValueAt(descriptor.getGeometrySubType(), row, COLUMN_GEOMETRYSUBTYPE);
|
||
935 | tm.setValueAt(descriptor.getSRS(), row, COLUMN_CRS);
|
||
936 | tm.setValueAt(descriptor.isPrimaryKey(), row, COLUMN_PRIMARYKEY);
|
||
937 | tm.setValueAt(descriptor.isMandatory(), row, COLUMN_MANDATORY);
|
||
938 | */
|
||
939 | |||
940 | // =============================== name
|
||
941 | if (fad == null) { |
||
942 | newRow[COLUMN_FIELD] = new_fld_name; |
||
943 | } else {
|
||
944 | newRow[COLUMN_FIELD] = fad.getName(); |
||
945 | } |
||
946 | // ===================================== field type
|
||
947 | TableColumn typeColumn = the_table.getColumnModel().getColumn(COLUMN_TYPE);
|
||
948 | List supp_types = spFactory.getSupportedDataTypes();
|
||
949 | |||
950 | DataManager daman = DALLocator.getDataManager(); |
||
951 | List all_types = daman.getDataTypes();
|
||
952 | |||
953 | |||
954 | ComboModelDataType model = null;
|
||
955 | if (fad == null) { |
||
956 | |||
957 | // this is a user defined column, remove geometry if in default feattype
|
||
958 | if (defaultHasGeometry) {
|
||
959 | supp_types = removeGeometryType(supp_types); |
||
960 | all_types = removeGeometryType(all_types); |
||
961 | } |
||
962 | |||
963 | if (supp_types != null && supp_types.size() > 0) { |
||
964 | model = new ComboModelDataType(
|
||
965 | supp_types, |
||
966 | ((DataType) supp_types.get(0)).getType());
|
||
967 | } else {
|
||
968 | model = new ComboModelDataType(
|
||
969 | all_types, |
||
970 | ((DataType) all_types.get(0)).getType());
|
||
971 | } |
||
972 | } else {
|
||
973 | model = new ComboModelDataType(supp_types, fad.getType());
|
||
974 | } |
||
975 | |||
976 | JComboBox comboBox = new JComboBox(model); |
||
977 | typeColumn.setCellEditor(new DefaultCellEditor(comboBox)); |
||
978 | newRow[COLUMN_TYPE] = model.getSelectedItem(); |
||
979 | |||
980 | // ============================= width
|
||
981 | TableColumn widthColumn =
|
||
982 | the_table.getColumnModel().getColumn(COLUMN_LENGTH); |
||
983 | if (fad == null) { |
||
984 | newRow[COLUMN_LENGTH] = "20";
|
||
985 | } else {
|
||
986 | newRow[COLUMN_LENGTH] = "" + fad.getSize();
|
||
987 | } |
||
988 | |||
989 | SimpleTextCellRenderer stcr = new SimpleTextCellRenderer();
|
||
990 | widthColumn.setCellEditor(new DefaultCellEditor(new JTextField())); |
||
991 | widthColumn.setCellRenderer(stcr); |
||
992 | |||
993 | |||
994 | // ============================= geom type
|
||
995 | TableColumn geomTypeColumn =
|
||
996 | the_table.getColumnModel().getColumn(COLUMN_GEOMETRYTYPE); |
||
997 | ComboModelGeomType geomTypeModel = null;
|
||
998 | |||
999 | List<ComboItemGeomType> supptd =
|
||
1000 | leaveSupportedGeomTypes(getGeomTypes(), |
||
1001 | spFactory.getSupportedGeometryTypesSubtypes(), 0);
|
||
1002 | |||
1003 | if (fad == null) { |
||
1004 | geomTypeModel = new ComboModelGeomType(
|
||
1005 | supptd, supptd.size() > 0 ? supptd.get(0).getGeomType() : -1); |
||
1006 | } else {
|
||
1007 | geomTypeModel = new ComboModelGeomType(
|
||
1008 | supptd, fad.getGeomType().getType()); |
||
1009 | } |
||
1010 | |||
1011 | JComboBox geomTypeComboBox = new JComboBox(geomTypeModel); |
||
1012 | geomTypeColumn.setCellEditor(new DefaultCellEditor(geomTypeComboBox)); |
||
1013 | |||
1014 | GeometryComboCellRenderer gccr = new GeometryComboCellRenderer();
|
||
1015 | geomTypeColumn.setCellRenderer(gccr); |
||
1016 | newRow[COLUMN_GEOMETRYTYPE] = geomTypeModel.getSelectedItem(); |
||
1017 | |||
1018 | // ============================= geom sub type
|
||
1019 | |||
1020 | TableColumn geomSubTypeColumn =
|
||
1021 | the_table.getColumnModel().getColumn(COLUMN_GEOMETRYSUBTYPE); |
||
1022 | ComboModelGeomType geomSubTypeModel = null;
|
||
1023 | |||
1024 | supptd = |
||
1025 | leaveSupportedGeomTypes(getGeomSubtypes(), |
||
1026 | spFactory.getSupportedGeometryTypesSubtypes(), 1);
|
||
1027 | |||
1028 | if (fad == null) { |
||
1029 | geomSubTypeModel = new ComboModelGeomType(
|
||
1030 | supptd, supptd.size() > 0 ? supptd.get(0).getGeomType() : -1); |
||
1031 | } else {
|
||
1032 | geomSubTypeModel = new ComboModelGeomType(
|
||
1033 | supptd, fad.getGeomType().getSubType()); |
||
1034 | } |
||
1035 | |||
1036 | JComboBox geomSubTypeComboBox = new JComboBox(geomSubTypeModel); |
||
1037 | geomSubTypeColumn.setCellEditor(new DefaultCellEditor( |
||
1038 | geomSubTypeComboBox)); |
||
1039 | geomSubTypeColumn.setCellRenderer(new GeometryComboCellRenderer());
|
||
1040 | newRow[COLUMN_GEOMETRYSUBTYPE] = geomSubTypeModel.getSelectedItem(); |
||
1041 | |||
1042 | // ============================= CRS
|
||
1043 | |||
1044 | TableColumn crsColumn = the_table.getColumnModel().getColumn(COLUMN_CRS);
|
||
1045 | crsColumn.setCellEditor(new ButtonEditor(new JCheckBox())); |
||
1046 | CrsRenderer crsButtonRenderer = new CrsRenderer();
|
||
1047 | crsColumn.setCellRenderer(crsButtonRenderer); |
||
1048 | newRow[COLUMN_CRS] = the_projection; |
||
1049 | |||
1050 | // ============================= PK
|
||
1051 | |||
1052 | TableColumn primaryKeyColumn =
|
||
1053 | the_table.getColumnModel().getColumn(COLUMN_PRIMARYKEY); |
||
1054 | JCheckBox primaryKeyCheckBox = new JCheckBox(); |
||
1055 | |||
1056 | if (fad == null) { |
||
1057 | primaryKeyCheckBox.setSelected(false);
|
||
1058 | } else {
|
||
1059 | primaryKeyCheckBox.setSelected(fad.isPrimaryKey()); |
||
1060 | } |
||
1061 | |||
1062 | primaryKeyColumn.setCellEditor( |
||
1063 | new DefaultCellEditor(primaryKeyCheckBox)); |
||
1064 | CheckBoxRenderer primaryKeyCheckBoxRenderer = new CheckBoxRenderer();
|
||
1065 | primaryKeyColumn.setCellRenderer(primaryKeyCheckBoxRenderer); |
||
1066 | newRow[COLUMN_PRIMARYKEY] = primaryKeyCheckBox.isSelected(); |
||
1067 | |||
1068 | // ================================== mandatory
|
||
1069 | |||
1070 | TableColumn mandatoryColumn =
|
||
1071 | the_table.getColumnModel().getColumn(COLUMN_MANDATORY); |
||
1072 | JCheckBox mandatoryCheckBox = new JCheckBox(); |
||
1073 | |||
1074 | if (fad == null) { |
||
1075 | mandatoryCheckBox.setSelected(false);
|
||
1076 | } else {
|
||
1077 | mandatoryCheckBox.setSelected(fad.isMandatory()); |
||
1078 | } |
||
1079 | |||
1080 | mandatoryColumn.setCellEditor(new DefaultCellEditor(mandatoryCheckBox)); |
||
1081 | CheckBoxRenderer mandatoryCheckBoxRenderer = new CheckBoxRenderer();
|
||
1082 | mandatoryColumn.setCellRenderer(mandatoryCheckBoxRenderer); |
||
1083 | newRow[COLUMN_MANDATORY] = mandatoryCheckBox.isSelected(); |
||
1084 | |||
1085 | // ==================================
|
||
1086 | |||
1087 | // Add a new row
|
||
1088 | the_tm.addRow(newRow); |
||
1089 | return true; |
||
1090 | } |
||
1091 | |||
1092 | /**
|
||
1093 | * @param supp_types
|
||
1094 | * @return
|
||
1095 | */
|
||
1096 | private List removeGeometryType(List dta_types) { |
||
1097 | List resp = new ArrayList(); |
||
1098 | |||
1099 | int len = dta_types.size();
|
||
1100 | Object item_o = null; |
||
1101 | DataType item_dt = null;
|
||
1102 | |||
1103 | for (int i=0; i<len; i++) { |
||
1104 | item_o = dta_types.get(i); |
||
1105 | if (item_o instanceof DataType) { |
||
1106 | item_dt = (DataType) item_o; |
||
1107 | if (item_dt.getType() != DataTypes.GEOMETRY) {
|
||
1108 | resp.add(item_dt); |
||
1109 | } |
||
1110 | } |
||
1111 | } |
||
1112 | return resp;
|
||
1113 | } |
||
1114 | |||
1115 | private List<ComboItemGeomType> leaveSupportedGeomTypes( |
||
1116 | List<ComboItemGeomType> all_types,
|
||
1117 | List<int[]> supported, |
||
1118 | int index /* 0 for geom types, 1 for geom subtypes */) { |
||
1119 | |||
1120 | List<ComboItemGeomType> resp = new ArrayList<ComboItemGeomType>(); |
||
1121 | int len = all_types.size();
|
||
1122 | ComboItemGeomType item = null;
|
||
1123 | for (int i=0; i<len; i++) { |
||
1124 | item = all_types.get(i); |
||
1125 | if (isInNthElement(item.getGeomType(), supported, index)) {
|
||
1126 | resp.add(item); |
||
1127 | } |
||
1128 | } |
||
1129 | return resp;
|
||
1130 | } |
||
1131 | |||
1132 | |||
1133 | private boolean isInNthElement(int val, List<int[]> arr_list, int index) { |
||
1134 | |||
1135 | int len = arr_list.size();
|
||
1136 | int[] item = null; |
||
1137 | for (int i=0; i<len; i++) { |
||
1138 | item = arr_list.get(i); |
||
1139 | if (item != null && item.length > index && item[index] == val) { |
||
1140 | return true; |
||
1141 | } |
||
1142 | } |
||
1143 | return false; |
||
1144 | } |
||
1145 | |||
1146 | private boolean dataTypeNeedsSize(int data_type) { |
||
1147 | |||
1148 | if (data_type == DataTypes.FLOAT
|
||
1149 | || data_type == DataTypes.INT |
||
1150 | || data_type == DataTypes.STRING) { |
||
1151 | return true; |
||
1152 | } else {
|
||
1153 | return false; |
||
1154 | } |
||
1155 | } |
||
1156 | |||
1157 | private class SimpleTextCellRenderer extends DefaultTableCellRenderer { |
||
1158 | |||
1159 | public SimpleTextCellRenderer() {
|
||
1160 | super();
|
||
1161 | } |
||
1162 | /* (non-Javadoc)
|
||
1163 | * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
|
||
1164 | */
|
||
1165 | public Component getTableCellRendererComponent( |
||
1166 | JTable table,
|
||
1167 | Object value, boolean isSelected, boolean hasFocus, int row, |
||
1168 | int column) {
|
||
1169 | |||
1170 | TableModel tm = table.getModel();
|
||
1171 | Object new_val = ""; |
||
1172 | Object type_obj = tm.getValueAt(row, COLUMN_TYPE);
|
||
1173 | if (type_obj instanceof ComboItemDataType) { |
||
1174 | ComboItemDataType type_item = (ComboItemDataType) type_obj; |
||
1175 | if (dataTypeNeedsSize(type_item.dataType.getType())) {
|
||
1176 | new_val = getCurrentOr(value, "");
|
||
1177 | } else {
|
||
1178 | new_val = Messages.getText("not_applicable");
|
||
1179 | } |
||
1180 | return super.getTableCellRendererComponent( |
||
1181 | table, new_val, isSelected, hasFocus, row, column); |
||
1182 | } else {
|
||
1183 | return super.getTableCellRendererComponent( |
||
1184 | table, value, isSelected, hasFocus, row, column); |
||
1185 | } |
||
1186 | } |
||
1187 | |||
1188 | private Object getCurrentOr(Object v, String d) { |
||
1189 | |||
1190 | if (v instanceof String) { |
||
1191 | String parse_str = (String) v; |
||
1192 | try {
|
||
1193 | Integer.parseInt(parse_str);
|
||
1194 | return v;
|
||
1195 | } catch (Exception ex) { |
||
1196 | // not a valid integer
|
||
1197 | return d;
|
||
1198 | } |
||
1199 | } else {
|
||
1200 | return v;
|
||
1201 | } |
||
1202 | } |
||
1203 | |||
1204 | } |
||
1205 | |||
1206 | private class EnableLengthItemListener implements ItemListener { |
||
1207 | |||
1208 | private TableModel theTableModel = null; |
||
1209 | private JTable theTable = null; |
||
1210 | |||
1211 | public EnableLengthItemListener(JTable t, boolean b) { |
||
1212 | theTable = t; |
||
1213 | theTableModel = t.getModel(); |
||
1214 | } |
||
1215 | |||
1216 | public void itemStateChanged(final ItemEvent e) { |
||
1217 | doUpdate(e); |
||
1218 | } |
||
1219 | |||
1220 | public void doUpdate(ItemEvent e) { |
||
1221 | |||
1222 | Object src_obj = e.getSource();
|
||
1223 | if (src_obj instanceof JComboBox) { |
||
1224 | |||
1225 | // one of the field type combos has changed
|
||
1226 | int len = theTableModel.getRowCount();
|
||
1227 | Object type_obj = null; |
||
1228 | ComboItemDataType type_item = null;
|
||
1229 | for (int i=0; i<len; i++) { |
||
1230 | type_obj = theTableModel.getValueAt(i, COLUMN_TYPE); |
||
1231 | if (type_obj instanceof ComboItemDataType) { |
||
1232 | type_item = (ComboItemDataType) type_obj; |
||
1233 | if (dataTypeNeedsSize(type_item.dataType.getType())) {
|
||
1234 | theTableModel.setValueAt( |
||
1235 | "20",
|
||
1236 | i, COLUMN_LENGTH); |
||
1237 | } else {
|
||
1238 | theTableModel.setValueAt( |
||
1239 | Messages.getText("not_applicable"),
|
||
1240 | i, COLUMN_LENGTH); |
||
1241 | } |
||
1242 | } |
||
1243 | } |
||
1244 | theTable.validate(); // .revalidate(); // .repaint();
|
||
1245 | } |
||
1246 | } |
||
1247 | |||
1248 | } |
||
1249 | |||
1250 | |||
1251 | |||
1252 | |||
1253 | |||
1254 | 36022 | fdiaz | } |