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

History | View | Annotate | Download (22.5 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.app.ApplicationLocator;
51
import org.gvsig.app.ApplicationManager;
52
import org.gvsig.fmap.dal.DataTypes;
53
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
54
import org.gvsig.fmap.dal.feature.EditableFeatureType;
55
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
56
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
57
import org.gvsig.gui.beans.AcceptCancelPanel;
58
import org.gvsig.i18n.Messages;
59
import org.gvsig.tools.ToolsLocator;
60
import org.gvsig.tools.dataTypes.DataTypesManager;
61
import org.gvsig.tools.i18n.I18nManager;
62

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

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

    
98
        public void keyPressed(KeyEvent e) {
99
            // do nothing
100
        }
101

    
102
        public void keyReleased(KeyEvent e) {
103
            JTextField component = (JTextField) e.getComponent();
104

    
105
            try {
106
                component.setText(String.valueOf(Integer.parseInt(component
107
                    .getText())));
108

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

    
118
        public void keyTyped(KeyEvent e) {
119
            // do nothing
120
        }
121
    };
122
    private String[] currentFieldNames;
123

    
124
    public CreateNewAttributePanel() {
125
        super();
126
        initialize();
127
    }
128

    
129
    public CreateNewAttributePanel(boolean isDoubleBuffered) {
130
        super(isDoubleBuffered);
131
        initialize();
132
    }
133

    
134
    public CreateNewAttributePanel(LayoutManager layout) {
135
        super(layout);
136
        initialize();
137
    }
138

    
139
    public CreateNewAttributePanel(LayoutManager layout,
140
        boolean isDoubleBuffered) {
141
        super(layout, isDoubleBuffered);
142
        initialize();
143
    }
144

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

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

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

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

    
198
            jCboFieldType.setSelectedIndex(4);
199
            jCboFieldType
200
                .addActionListener(new java.awt.event.ActionListener() {
201

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

    
230
                    }
231
                });
232

    
233
        }
234
        return jCboFieldType;
235
    }
236

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

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

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

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

    
290
        nameAttr = getJTxtFieldName().getText();
291

    
292
        if (nameAttr == null || nameAttr.length() == 0) {
293

    
294
            JOptionPane.showMessageDialog(
295
                    this,
296
                    Messages.getText("_No_input_name"),
297
                    Messages.getText("_Rename_column"),
298
                    JOptionPane.ERROR_MESSAGE);
299
            return null;
300
        }
301

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

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

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

    
332
        if (featureType.getIndex(nameAttr) != -1) {
333
            NotificationManager.showMessageInfo(
334
                PluginServices.getText(this, "field_already_exists"), null);
335
            return null;
336
        }
337
        EditableFeatureAttributeDescriptor ead = null;
338
        if (getJRdbFieldVirtual().isSelected()) {
339
            String code = getJTxtExpression().getText();
340
            EmulatedFieldExpression myEmulated = 
341
                    new EmulatedFieldExpression(
342
                            featureType,
343
                            code);
344
            if (!myEmulated.isValid()) {
345
                I18nManager i18n = ToolsLocator.getI18nManager();
346
                ApplicationManager application = ApplicationLocator.getManager();
347
                int x = application.confirmDialog(
348
                        "The expression used in this field is not valid."+
349
                                "\n\n"+
350
                                myEmulated.getErrorMessage()+
351
                                "\n\n"+
352
                                "Do you want add this field anyway?", 
353
                        "Add invalid field", 
354
                        JOptionPane.YES_NO_OPTION, 
355
                        JOptionPane.QUESTION_MESSAGE,
356
                        "_AddingInvalidField.DoYouWantAddAnyway");
357
                if (x==JOptionPane.YES_OPTION) {
358
                    ead = featureType.add(nameAttr, typeAttr, myEmulated)
359
                    .setSize(sizeAttr);
360
                }
361
            } else {
362
            ead = featureType.add(nameAttr, typeAttr, myEmulated)
363
                    .setSize(sizeAttr);
364
            }
365
        } else {
366
            defaultValueAttr = getJTxtDefaultValue().getText();
367
            if (defaultValueAttr.equals("")) {
368
                defaultValueAttr = null;
369
            }
370
            ead = featureType.add(nameAttr, typeAttr, sizeAttr);
371
            ead.setPrecision(precisionAttr);
372
            ead.setDefaultValue(defaultValueAttr);
373
        }
374
        
375
        return ead;
376
    }
377

    
378
    public void setOkAction(ActionListener okAction) {
379
        getJPanelOkCancel().setOkButtonActionListener(okAction);
380

    
381
    }
382

    
383
    /**
384
     * This method initializes jPanel
385
     *
386
     * @return javax.swing.JPanel
387
     */
388
    private JPanel getJPanel() {
389
        if (jPanel == null) {
390
            jPanel = new JPanel();
391
            jPanel.setLayout(null);
392

    
393
            jPanel.add(getJPnlFields(), null);
394
        }
395
        return jPanel;
396
    }
397

    
398
    /**
399
     * This method initializes jPanelOkCancel
400
     *
401
     * @return javax.swing.JPanel
402
     */
403
    private AcceptCancelPanel getJPanelOkCancel() {
404
        if (jPanelOkCancel == null) {
405
            jPanelOkCancel = new AcceptCancelPanel();
406
            jPanelOkCancel.setCancelButtonActionListener(new ActionListener() {
407

    
408
                public void actionPerformed(java.awt.event.ActionEvent e) {
409
                    PluginServices.getMDIManager().closeWindow(
410
                        CreateNewAttributePanel.this);
411
                }
412
            });
413
            jPanelOkCancel.setPreferredSize(new java.awt.Dimension(10, 50));
414
        }
415
        return jPanelOkCancel;
416
    }
417

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

    
514
            //jPnlFields.add(jLblFieldVirtual, null);
515
            ButtonGroup defaultGroup = new ButtonGroup();
516
            defaultGroup.add(jRdbFieldReal);
517
            defaultGroup.add(jRdbFieldVirtual);
518
            
519
            // init visible
520
            jLblDefaultValue.setEnabled(true);
521
            jTxtDefaultValue.setEnabled(true);   
522
            jLblExpression.setEnabled(false);
523
            jTxtExpression.setEnabled(false);
524
            jBtnExpression.setEnabled(false);
525
            
526
        }
527
        return jPnlFields;
528
    }
529

    
530
    public void setCurrentFieldNames(String[] fieldNames) {
531
        currentFieldNames = fieldNames;
532
        String newField =
533
            PluginServices.getText(this, "field").replaceAll(" +", "_");
534
        int index = 0;
535
        for (int i = 0; i < currentFieldNames.length; i++) {
536
            if (currentFieldNames[i].startsWith(newField)) {
537
                try {
538
                    index =
539
                        Integer.parseInt(currentFieldNames[i].replaceAll(
540
                            newField, ""));
541
                } catch (Exception e) { /* we don't care */
542
                }
543
            }
544
        }
545
        jTxtFieldName.setText(newField + (++index));
546
    }
547

    
548
    public Object getWindowProfile() {
549
        return WindowInfo.DIALOG_PROFILE;
550
    }
551

    
552
    public void setMaxAttributeNameSize(int maxAttributeNameSize) {
553
        this.maxAttributeNameSize = maxAttributeNameSize;
554
    }
555

    
556
    private JTextField getJTxtExpression() {
557
        if (jTxtExpression == null) {
558
            jTxtExpression = new JTextField();
559
            jTxtExpression.setBounds(new java.awt.Rectangle(147, 200, 125, 22));
560
            jTxtExpression.setColumns(4);
561
        }
562
        return jTxtExpression;
563
    }
564
    
565
    private JRadioButton getJRdbFieldReal() {
566
        if (jRdbFieldReal == null) {
567
            jRdbFieldReal = new JRadioButton(PluginServices.getText(this, "_Real_field")); //"real_value"));
568
            jRdbFieldReal.setBounds(new java.awt.Rectangle(14, 163, 125, 22));
569
            jRdbFieldReal.setSelected(true);
570
        }
571
        return jRdbFieldReal;
572
    }
573
    private JRadioButton getJRdbFieldVirtual() {
574
        if (jRdbFieldVirtual == null) {
575
            jRdbFieldVirtual = new JRadioButton(PluginServices.getText(this, "_Virtual_field"));//"virtual_value"));
576
            jRdbFieldVirtual.setBounds(new java.awt.Rectangle(14, 237, 125, 22));
577
        }
578
        return jRdbFieldVirtual;
579
    }
580
    
581
    private JButton getJBtnExpression() {
582
        if (jBtnExpression == null) {
583
            jBtnExpression = new JButton();
584
            jBtnExpression.setText("...");
585
            //jBtnExpression.setBounds(new java.awt.Rectangle(147, 200, 125, 22));
586
            //jBtnExpression.setColumns(4);
587
        }
588
        return jBtnExpression;
589
    }
590
    @Override
591
    public void actionPerformed(ActionEvent e) {
592
        if (e.getSource()==jRdbFieldReal) {
593
            jLblDefaultValue.setEnabled(true);
594
            jTxtDefaultValue.setEnabled(true);   
595
            jLblExpression.setEnabled(false);
596
            jTxtExpression.setEnabled(false);
597
            jBtnExpression.setEnabled(false);
598
            
599
        } else if (e.getSource()==jRdbFieldVirtual) {
600
            jLblDefaultValue.setEnabled(false);
601
            jTxtDefaultValue.setEnabled(false);
602
            jLblExpression.setEnabled(true);
603
            jTxtExpression.setEnabled(true);   
604
            jBtnExpression.setEnabled(true);
605
            
606
        }
607
    }
608
    
609
}