Revision 44080 trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.swing/org.gvsig.expressionevaluator.swing.impl/src/main/java/org/gvsig/expressionevaluator/swing/impl/DefaultCalculatorController.java

View differences:

DefaultCalculatorController.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6 1
package org.gvsig.expressionevaluator.swing.impl;
7 2

  
3
import java.awt.Color;
4
import java.awt.event.ActionEvent;
5
import java.awt.event.ActionListener;
6
import java.awt.event.FocusEvent;
7
import java.awt.event.FocusListener;
8 8
import org.gvsig.expressionevaluator.swing.CalculatorController;
9 9
import java.util.Objects;
10
import javax.swing.AbstractAction;
11
import javax.swing.Action;
12
import javax.swing.JPopupMenu;
10 13
import javax.swing.text.JTextComponent;
14
import org.apache.commons.lang3.StringUtils;
15
import org.gvsig.expressionevaluator.Expression;
11 16
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
12 17
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
13 18
import org.gvsig.expressionevaluator.MutableSymbolTable;
14 19
import org.gvsig.expressionevaluator.SymbolTable;
20
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
15 21
import org.gvsig.tools.dataTypes.DataTypes;
16 22
import org.gvsig.tools.ToolsLocator;
17 23
import org.gvsig.tools.dataTypes.CoercionException;
18 24
import org.gvsig.tools.dataTypes.DataTypesManager;
25
import org.gvsig.tools.i18n.I18nManager;
26
import org.gvsig.tools.swing.api.ToolsSwingLocator;
27
import org.gvsig.tools.swing.api.ToolsSwingManager;
28
import org.gvsig.tools.swing.api.windowmanager.Dialog;
29
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
30
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
19 31

  
20 32
/**
21 33
 *
22 34
 * @author jjdelcerro
23 35
 */
36
@SuppressWarnings("UseSpecificCatch")
24 37
class DefaultCalculatorController<T> implements CalculatorController<T> {
25 38
    
39
    private static final Color COLOR_ERROR = new Color(255,225,232);
40
    
26 41
    private final JTextComponent text;
27 42
    private final int dataType;
28 43
    private final MutableSymbolTable defaultSymbolTable;
44
    private final Color backgroundColor;
45
    private final ExpressionEvaluatorSwingManager manager;
46
    private DefaultExpressionBuilderConfig config;
47
    private Expression expression;
29 48

  
30
    public DefaultCalculatorController(JTextComponent text, int dataType) {
49
    public DefaultCalculatorController(ExpressionEvaluatorSwingManager manager, final JTextComponent text, int dataType) {
50
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
51
        I18nManager i18n = ToolsLocator.getI18nManager();
52

  
53
        this.manager = manager;
54
        this.config = null;
55
        this.expression = null;
56

  
31 57
        this.text = text;
32 58
        this.dataType = dataType;
59
        this.backgroundColor = this.text.getBackground();
33 60
        this.defaultSymbolTable = ExpressionEvaluatorLocator.getManager().createSymbolTable();
61
        this.text.addFocusListener(new FocusListener() {
62
            @Override
63
            public void focusLost(FocusEvent e) {
64
                doCalculate();
65
            }
66

  
67
            @Override
68
            public void focusGained(FocusEvent e) {
69
                doCalculate();
70
            }
71
        });
72
        swingManager.addClearButton(this.text, new ActionListener() {
73
            @Override
74
            public void actionPerformed(ActionEvent e) {
75
                set(null);
76
            }
77
        });
78
        swingManager.setDefaultPopupMenu(this.text);
79
        JPopupMenu popupMenu = this.text.getComponentPopupMenu();
80
        Action showExpressionBuilderAction = new AbstractAction(i18n.getTranslation("_Show_expression_builder")) {
81
            @Override
82
            public void actionPerformed(ActionEvent e) {
83
                doShowExpressionBuilder();
84
            }
85
        };  
86
        popupMenu.addSeparator();
87
        popupMenu.add(showExpressionBuilderAction);
34 88
    }
35 89

  
90
    private void doShowExpressionBuilder() {
91
        if( this.config == null ) {
92
            this.config = new DefaultExpressionBuilderConfig(this.manager);
93
            this.config.addSymbolTable(this.defaultSymbolTable);
94
        }
95
        if( this.expression == null ) {
96
            this.expression = ExpressionEvaluatorLocator.getManager().createExpression();
97
        }
98
        expression.setPhrase(this.text.getText());
99

  
100
        DefaultJExpressionBuilder panel = new DefaultJExpressionBuilder(this.manager, this.config);
101
        panel.setExpression(this.expression);
102
        
103
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
104
        Dialog dialog = windowManager.createDialog(
105
                panel.asJComponent(),
106
                "Expression builder",
107
                null, 
108
                WindowManager_v2.BUTTONS_OK_CANCEL
109
        );
110
        dialog.show(WindowManager.MODE.DIALOG);
111
        if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
112
            this.text.setText(panel.getExpression().getPhrase());
113
        }        
114
    }
115
    
36 116
    @Override
37 117
    public void addSymbolTable(SymbolTable symbolTable) {
38 118
        this.defaultSymbolTable.addSymbolTable(symbolTable);
......
43 123
        return this.defaultSymbolTable;
44 124
    }
45 125

  
126
    private void doCalculate() {
127
        if( !this.text.isEditable() ) {
128
            return;
129
        }
130
        String source = this.text.getText();
131
        try {
132
            if( !StringUtils.isBlank(source) ) {
133
                ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
134
                Object value = manager.evaluate(this.defaultSymbolTable, source);
135
                this.text.setText(Objects.toString(value, ""));
136
            }
137
            this.text.setBackground(this.backgroundColor);
138
        } catch (Exception ex) {
139
            this.text.setBackground(COLOR_ERROR);
140
        }
141
    }
142
    
46 143
    @Override
47 144
    public T get() {
48
        String source = this.text.getText();
145
        doCalculate();
146
        Object value = this.text.getText();
49 147
        try {
50
            ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
51
            Object value = manager.evaluate(this.defaultSymbolTable, source);
52
            if (this.dataType != DataTypes.OBJECT) {
53
                DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
54
                value = dataManager.coerce(this.dataType, value);
55
            }
148
            DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
149
            value = dataManager.coerce(this.dataType, value);
56 150
            return (T) value;
57 151
        } catch (CoercionException ex) {
58
            if (this.dataType != DataTypes.STRING) {
59
                return (T) source;
60
            }
61 152
            return null;
62 153
        }
63 154
    }
......
65 156
    @Override
66 157
    public void set(T value) {
67 158
        this.text.setText(Objects.toString(value, ""));
159
        this.text.setBackground(this.backgroundColor);
68 160
    }
69 161

  
70 162
    @Override
......
77 169
            }
78 170
        }
79 171
        this.text.setText(Objects.toString(value, ""));
172
        this.text.setBackground(this.backgroundColor);
80 173
    }
81 174

  
82 175
    @Override
......
89 182
        return this.text.isEnabled();
90 183
    }
91 184
    
185
    @Override
186
    public void setEditable(boolean editable) {
187
        this.text.setEditable(editable);
188
    }
189

  
190
    @Override
191
    public boolean isEditable() {
192
        return this.text.isEditable();
193
    }
194
    
92 195
}

Also available in: Unified diff