Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app.document.table.app / org.gvsig.app.document.table.app.mainplugin / src / main / java / org / gvsig / app / project / documents / table / gui / CreateNewAttributePanel.java @ 43978

History | View | Annotate | Download (21.8 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.app.project.documents.table.gui;
25

    
26
import java.awt.BorderLayout;
27
import java.awt.GridBagConstraints;
28
import java.awt.GridBagLayout;
29
import java.awt.GridLayout;
30
import java.awt.LayoutManager;
31
import java.awt.event.ActionEvent;
32
import java.awt.event.ActionListener;
33
import java.awt.event.KeyEvent;
34
import java.awt.event.KeyListener;
35
import java.text.ParseException;
36
import javax.swing.ButtonGroup;
37
import javax.swing.JButton;
38

    
39
import javax.swing.JComboBox;
40
import javax.swing.JLabel;
41
import javax.swing.JOptionPane;
42
import javax.swing.JPanel;
43
import javax.swing.JRadioButton;
44
import javax.swing.JTextField;
45

    
46
import org.gvsig.andami.PluginServices;
47
import org.gvsig.andami.messages.NotificationManager;
48
import org.gvsig.andami.ui.mdiManager.IWindow;
49
import org.gvsig.andami.ui.mdiManager.WindowInfo;
50
import org.gvsig.fmap.dal.DataTypes;
51
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
52
import org.gvsig.fmap.dal.feature.EditableFeatureType;
53
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
54
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
55
import org.gvsig.gui.beans.AcceptCancelPanel;
56
import org.gvsig.i18n.Messages;
57
import org.gvsig.tools.ToolsLocator;
58
import org.gvsig.tools.dataTypes.DataTypesManager;
59

    
60
/**
61
 * To create new FeatureAttributeDescriptor from the interface.
62
 *
63
 * @author Vicente Caballero Navarro
64
 *
65
 */
66
public class CreateNewAttributePanel extends JPanel implements IWindow, ActionListener {
67

    
68
    /**
69
         *
70
         */
71
    private static final long serialVersionUID = 6447641307779709964L;
72
    private static final String DEFAULT_FIELD_LENGTH = "50";
73
    private JLabel jLblFieldName = null;
74
    private JTextField jTxtFieldName = null;
75
    private JLabel jLblFieldType = null;
76
    private JComboBox jCboFieldType = null;
77
    private JLabel jLblFieldLength = null;
78
    private JTextField jTxtFieldLength = null;
79
    private JLabel jLblFieldPrecision = null;
80
    private JTextField jTxtFieldPrecision = null;
81
    private JLabel jLblDefaultValue = null;
82
    private JTextField jTxtDefaultValue = null;
83
    private JLabel jLblExpression = null;
84
    private JTextField jTxtExpression = null;
85
    private JRadioButton jRdbFieldReal = null;
86
    private JRadioButton jRdbFieldVirtual = null;    
87
    private JButton jBtnExpression = null;
88
    private WindowInfo viewInfo;
89
    private JPanel jPanel = null;
90
    private AcceptCancelPanel jPanelOkCancel = null;
91
    private JPanel jPnlFields = null;
92
    private int maxAttributeNameSize=-1;
93
    private KeyListener checkInt = new KeyListener() {
94

    
95
        public void keyPressed(KeyEvent e) {
96
            // do nothing
97
        }
98

    
99
        public void keyReleased(KeyEvent e) {
100
            JTextField component = (JTextField) e.getComponent();
101

    
102
            try {
103
                component.setText(String.valueOf(Integer.parseInt(component
104
                    .getText())));
105

    
106
            } catch (Exception ex) {
107
                String text = component.getText();
108
                text =
109
                    (text.length() <= 1) ? "0" : text.substring(0,
110
                        text.length() - 1);
111
                component.setText(text);
112
            }
113
        }
114

    
115
        public void keyTyped(KeyEvent e) {
116
            // do nothing
117
        }
118
    };
119
    private String[] currentFieldNames;
120

    
121
    public CreateNewAttributePanel() {
122
        super();
123
        initialize();
124
    }
125

    
126
    public CreateNewAttributePanel(boolean isDoubleBuffered) {
127
        super(isDoubleBuffered);
128
        initialize();
129
    }
130

    
131
    public CreateNewAttributePanel(LayoutManager layout) {
132
        super(layout);
133
        initialize();
134
    }
135

    
136
    public CreateNewAttributePanel(LayoutManager layout,
137
        boolean isDoubleBuffered) {
138
        super(layout, isDoubleBuffered);
139
        initialize();
140
    }
141

    
142
    public WindowInfo getWindowInfo() {
143
        if (viewInfo == null) {
144
            viewInfo = new WindowInfo(WindowInfo.MODALDIALOG);
145
            viewInfo.setWidth(this.getWidth() + 8);
146
            viewInfo.setHeight(this.getHeight());
147
            viewInfo.setTitle(PluginServices.getText(this,
148
                "new_field_properties"));
149
        }
150
        return viewInfo;
151
    }
152

    
153
    /**
154
     * This method initializes this
155
     *
156
     * @return void
157
     */
158
    private void initialize() {
159
        this.setLayout(new BorderLayout());
160
        this.setSize(300, 310);
161
        this.setPreferredSize(new java.awt.Dimension(300, 310));
162
        this.add(getJPanel(), java.awt.BorderLayout.CENTER);
163
        this.add(getJPanelOkCancel(), java.awt.BorderLayout.SOUTH);
164
    }
165

    
166
    /**
167
     * This method initializes jTxtFieldName
168
     *
169
     * @return javax.swing.JTextField
170
     */
171
    private JTextField getJTxtFieldName() {
172
        if (jTxtFieldName == null) {
173
            jTxtFieldName = new JTextField();
174
            jTxtFieldName.setBounds(new java.awt.Rectangle(147, 15, 138, 22));
175
        }
176
        return jTxtFieldName;
177
    }
178

    
179
    /**
180
     * This method initializes jCboFieldType
181
     *
182
     * @return javax.swing.JComboBox
183
     */
184
    private JComboBox getJCboFieldType() {
185
        DataTypesManager manager = ToolsLocator.getDataTypesManager();
186
        if (jCboFieldType == null) {
187
            jCboFieldType = new JComboBox();
188
            jCboFieldType.setBounds(new java.awt.Rectangle(147, 52, 138, 22));
189
            jCboFieldType.addItem(manager.getTypeName(DataTypes.BOOLEAN));
190
            jCboFieldType.addItem(manager.getTypeName(DataTypes.DATE));
191
            jCboFieldType.addItem(manager.getTypeName(DataTypes.INT));
192
            jCboFieldType.addItem(manager.getTypeName(DataTypes.DOUBLE));
193
            jCboFieldType.addItem(manager.getTypeName(DataTypes.STRING));
194

    
195
            jCboFieldType.setSelectedIndex(4);
196
            jCboFieldType
197
                .addActionListener(new java.awt.event.ActionListener() {
198

    
199
                    public void actionPerformed(java.awt.event.ActionEvent e) {
200
                        DataTypesManager manager =
201
                            ToolsLocator.getDataTypesManager();
202
                        String strType =
203
                            (String) getJCboFieldType().getModel()
204
                                .getSelectedItem();
205
                        if (strType == manager.getTypeName(DataTypes.DOUBLE)) {
206
                            getJTxtFieldPrecision().setEnabled(true);
207
                            if (getJTxtFieldPrecision().getText().equals("")) {
208
                                getJTxtFieldPrecision().setText("3");
209
                            } else {
210
                                try {
211
                                    Integer.parseInt(getJTxtFieldPrecision()
212
                                        .getText());
213
                                } catch (NumberFormatException e1) {
214
                                    getJTxtFieldPrecision().setText("3");
215
                                }
216
                            }
217
                        } else {
218
                            getJTxtFieldPrecision().setEnabled(false);
219
                        }
220
                        if (strType == manager.getTypeName(DataTypes.BOOLEAN)) {
221
                            getJTxtFieldLength().setText("0");
222
                            getJTxtFieldLength().setEnabled(false);
223
                        } else {
224
                            getJTxtFieldLength().setEnabled(true);
225
                        }
226

    
227
                    }
228
                });
229

    
230
        }
231
        return jCboFieldType;
232
    }
233

    
234
    /**
235
     * This method initializes jTxtFieldLength
236
     *
237
     * @return javax.swing.JTextField
238
     */
239
    private JTextField getJTxtFieldLength() {
240
        if (jTxtFieldLength == null) {
241
            jTxtFieldLength = new JTextField();
242
            jTxtFieldLength.setBounds(new java.awt.Rectangle(147, 89, 138, 22));
243
            jTxtFieldLength.setText(DEFAULT_FIELD_LENGTH);
244
            jTxtFieldLength.addKeyListener(checkInt);
245
        }
246
        return jTxtFieldLength;
247
    }
248

    
249
    /**
250
     * This method initializes jTxtFieldPrecision
251
     *
252
     * @return javax.swing.JTextField
253
     */
254
    private JTextField getJTxtFieldPrecision() {
255
        if (jTxtFieldPrecision == null) {
256
            jTxtFieldPrecision = new JTextField();
257
            jTxtFieldPrecision.setBounds(new java.awt.Rectangle(147, 126, 138,
258
                22));
259
            jTxtFieldPrecision.setEnabled(false);
260
            jTxtFieldPrecision.addKeyListener(checkInt);
261
        }
262
        return jTxtFieldPrecision;
263
    }
264

    
265
    /**
266
     * This method initializes jTxtDefaultValue
267
     *
268
     * @return javax.swing.JTextField
269
     */
270
    private JTextField getJTxtDefaultValue() {
271
        if (jTxtDefaultValue == null) {
272
            jTxtDefaultValue = new JTextField();
273
            jTxtDefaultValue
274
                .setBounds(new java.awt.Rectangle(147, 200, 138, 22));
275
        }
276
        return jTxtDefaultValue;
277
    }
278

    
279
    public EditableFeatureAttributeDescriptor loadFieldDescription(
280
        EditableFeatureType featureType) throws ParseException {
281
        String nameAttr = "";
282
        int typeAttr = DataTypes.STRING;
283
        int sizeAttr = 0;
284
        int precisionAttr = 0;
285
        Object defaultValueAttr = "";
286

    
287
        nameAttr = getJTxtFieldName().getText();
288

    
289
        if (nameAttr == null || nameAttr.length() == 0) {
290

    
291
            JOptionPane.showMessageDialog(
292
                    this,
293
                    Messages.getText("_No_input_name"),
294
                    Messages.getText("_Rename_column"),
295
                    JOptionPane.ERROR_MESSAGE);
296
            return null;
297
        }
298

    
299
        if (maxAttributeNameSize>0){
300
            if (nameAttr.length()>maxAttributeNameSize){
301
                JOptionPane.showMessageDialog(
302
                    this,
303
                    Messages.getText("_Name_too_long"),
304
                    Messages.getText("_Rename_column"),
305
                    JOptionPane.ERROR_MESSAGE);
306
            return null;
307
            }
308
        }
309

    
310
        String strType =
311
            (String) getJCboFieldType().getModel().getSelectedItem();
312
        typeAttr = ToolsLocator.getDataTypesManager().getType(strType);
313
        try {
314
            int fieldLength = Integer.parseInt(getJTxtFieldLength().getText());
315
            sizeAttr = fieldLength;
316
        } catch (Exception e) {
317
            throw new ParseException(e.getMessage(), 0);
318
        }
319

    
320
        if (typeAttr == DataTypes.DOUBLE) {
321
            try {
322
                precisionAttr =
323
                    Integer.parseInt(getJTxtFieldPrecision().getText());
324
            } catch (NumberFormatException e) {
325
                precisionAttr = 3;
326
            }
327
        }
328

    
329
        if (featureType.getIndex(nameAttr) != -1) {
330
            NotificationManager.showMessageInfo(
331
                PluginServices.getText(this, "field_already_exists"), null);
332
            return null;
333
        }
334
        EditableFeatureAttributeDescriptor ead;
335
        if (getJRdbFieldVirtual().isSelected()) {
336
            String code = getJTxtExpression().getText();
337
            FeatureAttributeDescriptor[] descriptors = 
338
                    featureType.getAttributeDescriptors();
339
            String[] fields = new String[descriptors.length];
340
            for (int i = 0; i < descriptors.length; i++) {
341
                FeatureAttributeDescriptor descriptor = descriptors[i];
342
                fields[i] = descriptor.getName();
343
            }
344
            FeatureAttributeEmulator myEmulated = 
345
                    new EmulatedFieldExpression(
346
                            fields,
347
                            code);
348
            ead = featureType.add(nameAttr, typeAttr, myEmulated)
349
                    .setSize(sizeAttr);
350
        } else {
351
            defaultValueAttr = getJTxtDefaultValue().getText();
352
            if (defaultValueAttr.equals("")) {
353
                defaultValueAttr = null;
354
            }
355
            ead = featureType.add(nameAttr, typeAttr, sizeAttr);
356
            ead.setPrecision(precisionAttr);
357
            ead.setDefaultValue(defaultValueAttr);
358
        }
359
        
360
        return ead;
361
    }
362

    
363
    public void setOkAction(ActionListener okAction) {
364
        getJPanelOkCancel().setOkButtonActionListener(okAction);
365

    
366
    }
367

    
368
    /**
369
     * This method initializes jPanel
370
     *
371
     * @return javax.swing.JPanel
372
     */
373
    private JPanel getJPanel() {
374
        if (jPanel == null) {
375
            jPanel = new JPanel();
376
            jPanel.setLayout(null);
377

    
378
            jPanel.add(getJPnlFields(), null);
379
        }
380
        return jPanel;
381
    }
382

    
383
    /**
384
     * This method initializes jPanelOkCancel
385
     *
386
     * @return javax.swing.JPanel
387
     */
388
    private AcceptCancelPanel getJPanelOkCancel() {
389
        if (jPanelOkCancel == null) {
390
            jPanelOkCancel = new AcceptCancelPanel();
391
            jPanelOkCancel.setCancelButtonActionListener(new ActionListener() {
392

    
393
                public void actionPerformed(java.awt.event.ActionEvent e) {
394
                    PluginServices.getMDIManager().closeWindow(
395
                        CreateNewAttributePanel.this);
396
                }
397
            });
398
            jPanelOkCancel.setPreferredSize(new java.awt.Dimension(10, 50));
399
        }
400
        return jPanelOkCancel;
401
    }
402

    
403
    /**
404
     * This method initializes jPnlFields
405
     *
406
     * @return javax.swing.JPanel
407
     */
408
    private JPanel getJPnlFields() {
409
        if (jPnlFields == null) {
410
            GridLayout gridLayout = new GridLayout();
411
            gridLayout.setRows(8);
412
            gridLayout.setVgap(3);
413
            gridLayout.setHgap(5);
414
            gridLayout.setColumns(2);
415
            jPnlFields = new JPanel();
416
            jPnlFields.setLayout(gridLayout);
417
            jPnlFields.setBounds(new java.awt.Rectangle(5, 12, 290, 200));
418
//            jLblFieldReal  = new JLabel();
419
//            jLblFieldReal.setBounds(14, 237, 125, 22);
420
//            jLblFieldReal.setText(PluginServices.getText(this,
421
//                "default_value"));
422
//            jLblEmulated = new JLabel();
423
//            jLblEmulated
424
//                .setBounds(new java.awt.Rectangle(14, 200, 125, 22));
425
//            jLblEmulated.setText(PluginServices.getText(this,
426
//                "emulated"));
427
            jLblExpression = new JLabel();
428
            jLblExpression
429
                .setBounds(new java.awt.Rectangle(14, 272, 125, 22));
430
            jLblExpression.setText(PluginServices.getText(this,
431
                "expression"));
432
            jLblDefaultValue = new JLabel();
433
            jLblDefaultValue
434
                .setBounds(new java.awt.Rectangle(14, 200, 125, 22));
435
            jLblDefaultValue.setText(PluginServices.getText(this,
436
                "default_value"));
437
            jLblFieldPrecision = new JLabel();
438
            jLblFieldPrecision.setBounds(new java.awt.Rectangle(14, 126, 112,
439
                22));
440
            jLblFieldPrecision.setText(PluginServices
441
                .getText(this, "precision"));
442
            jLblFieldLength = new JLabel();
443
            jLblFieldLength.setBounds(new java.awt.Rectangle(14, 89, 99, 22));
444
            jLblFieldLength.setText(PluginServices
445
                .getText(this, "field_length"));
446
            jLblFieldType = new JLabel();
447
            jLblFieldType.setBounds(new java.awt.Rectangle(14, 52, 94, 22));
448
            jLblFieldType.setText(PluginServices.getText(this, "field_type"));
449
            jLblFieldName = new JLabel();
450
            jLblFieldName.setText(PluginServices.getText(this, "field_name"));
451
            jLblFieldName.setBounds(new java.awt.Rectangle(14, 15, 99, 22));
452
            jPnlFields.add(jLblFieldName, null);
453
            jPnlFields.add(getJTxtFieldName(), null);
454
            jPnlFields.add(jLblFieldType, null);
455
            jPnlFields.add(getJCboFieldType(), null);
456
            jPnlFields.add(jLblFieldLength, null);
457
            jPnlFields.add(getJTxtFieldLength(), null);
458
            jPnlFields.add(jLblFieldPrecision, null);
459
            jPnlFields.add(getJTxtFieldPrecision(), null);
460
            
461
            
462
            
463
            jPnlFields.add(getJRdbFieldReal(), null);
464
            jRdbFieldReal.addActionListener(this);
465
            jPnlFields.add(new JLabel(), null);
466
            //JPanel panelReal = new JPanel();
467
            jPnlFields.add(jLblDefaultValue, null);
468
            jPnlFields.add(getJTxtDefaultValue(), null);            
469
            //jPnlFields.add(panelReal);
470
                  
471
            jPnlFields.add(getJRdbFieldVirtual(), null);
472
            jRdbFieldVirtual.addActionListener(this);
473
            
474
            jPnlFields.add(new JLabel(), null);
475
            jPnlFields.add(jLblExpression, null);
476
            JPanel panelVirtual = new JPanel();
477
//            panelVirtual.setLayout(new GridLayout(1, 2));
478
            GridBagLayout grid = new GridBagLayout();
479
            GridBagConstraints gbc = new GridBagConstraints();
480
            gbc.gridx = 0;
481
            gbc.gridy = 0;
482
            gbc.gridwidth = 3;
483
            gbc.gridheight = 1;
484
            gbc.weightx = 1.0;
485
            gbc.fill = GridBagConstraints.HORIZONTAL;
486
            panelVirtual.setLayout(grid);
487
            
488
            panelVirtual.add(getJTxtExpression(), gbc);
489
            gbc.gridx = 4;
490
            gbc.gridy = 0;
491
            gbc.gridwidth = 1;
492
            gbc.gridheight = 1;
493
            gbc.weightx = 0.0;
494
            gbc.weighty = 0.0;
495
            gbc.fill = GridBagConstraints.NONE;
496
            panelVirtual.add(getJBtnExpression(), gbc);
497
            jPnlFields.add(panelVirtual);
498

    
499
            //jPnlFields.add(jLblFieldVirtual, null);
500
            ButtonGroup defaultGroup = new ButtonGroup();
501
            defaultGroup.add(jRdbFieldReal);
502
            defaultGroup.add(jRdbFieldVirtual);
503
            
504
            // init visible
505
            jLblDefaultValue.setEnabled(true);
506
            jTxtDefaultValue.setEnabled(true);   
507
            jLblExpression.setEnabled(false);
508
            jTxtExpression.setEnabled(false);
509
            jBtnExpression.setEnabled(false);
510
            
511
        }
512
        return jPnlFields;
513
    }
514

    
515
    public void setCurrentFieldNames(String[] fieldNames) {
516
        currentFieldNames = fieldNames;
517
        String newField =
518
            PluginServices.getText(this, "field").replaceAll(" +", "_");
519
        int index = 0;
520
        for (int i = 0; i < currentFieldNames.length; i++) {
521
            if (currentFieldNames[i].startsWith(newField)) {
522
                try {
523
                    index =
524
                        Integer.parseInt(currentFieldNames[i].replaceAll(
525
                            newField, ""));
526
                } catch (Exception e) { /* we don't care */
527
                }
528
            }
529
        }
530
        jTxtFieldName.setText(newField + (++index));
531
    }
532

    
533
    public Object getWindowProfile() {
534
        return WindowInfo.DIALOG_PROFILE;
535
    }
536

    
537
    public void setMaxAttributeNameSize(int maxAttributeNameSize) {
538
        this.maxAttributeNameSize = maxAttributeNameSize;
539
    }
540

    
541
    private JTextField getJTxtExpression() {
542
        if (jTxtExpression == null) {
543
            jTxtExpression = new JTextField();
544
            jTxtExpression.setBounds(new java.awt.Rectangle(147, 200, 125, 22));
545
            jTxtExpression.setColumns(4);
546
        }
547
        return jTxtExpression;
548
    }
549
    
550
    private JRadioButton getJRdbFieldReal() {
551
        if (jRdbFieldReal == null) {
552
            jRdbFieldReal = new JRadioButton(PluginServices.getText(this, "_Real_field")); //"real_value"));
553
            jRdbFieldReal.setBounds(new java.awt.Rectangle(14, 163, 125, 22));
554
            jRdbFieldReal.setSelected(true);
555
        }
556
        return jRdbFieldReal;
557
    }
558
    private JRadioButton getJRdbFieldVirtual() {
559
        if (jRdbFieldVirtual == null) {
560
            jRdbFieldVirtual = new JRadioButton(PluginServices.getText(this, "_Virtual_field"));//"virtual_value"));
561
            jRdbFieldVirtual.setBounds(new java.awt.Rectangle(14, 237, 125, 22));
562
        }
563
        return jRdbFieldVirtual;
564
    }
565
    
566
    private JButton getJBtnExpression() {
567
        if (jBtnExpression == null) {
568
            jBtnExpression = new JButton();
569
            jBtnExpression.setText("...");
570
            //jBtnExpression.setBounds(new java.awt.Rectangle(147, 200, 125, 22));
571
            //jBtnExpression.setColumns(4);
572
        }
573
        return jBtnExpression;
574
    }
575
    @Override
576
    public void actionPerformed(ActionEvent e) {
577
        if (e.getSource()==jRdbFieldReal) {
578
            jLblDefaultValue.setEnabled(true);
579
            jTxtDefaultValue.setEnabled(true);   
580
            jLblExpression.setEnabled(false);
581
            jTxtExpression.setEnabled(false);
582
            jBtnExpression.setEnabled(false);
583
            
584
        } else if (e.getSource()==jRdbFieldVirtual) {
585
            jLblDefaultValue.setEnabled(false);
586
            jTxtDefaultValue.setEnabled(false);
587
            jLblExpression.setEnabled(true);
588
            jTxtExpression.setEnabled(true);   
589
            jBtnExpression.setEnabled(true);
590
            
591
        }
592
    }
593
    
594
}