Revision 44098 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
5 5
import java.awt.event.ActionListener;
6 6
import java.awt.event.FocusEvent;
7 7
import java.awt.event.FocusListener;
8
import java.awt.event.KeyAdapter;
9
import java.awt.event.KeyEvent;
8 10
import org.gvsig.expressionevaluator.swing.CalculatorController;
9 11
import java.util.Objects;
10 12
import javax.swing.AbstractAction;
11 13
import javax.swing.Action;
12 14
import javax.swing.JPopupMenu;
15
import javax.swing.Timer;
16
import javax.swing.event.ChangeEvent;
17
import javax.swing.event.ChangeListener;
18
import javax.swing.event.DocumentEvent;
19
import javax.swing.event.DocumentListener;
13 20
import javax.swing.text.JTextComponent;
14 21
import org.apache.commons.lang3.StringUtils;
15 22
import org.gvsig.expressionevaluator.Expression;
16 23
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
17 24
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
25
import org.gvsig.expressionevaluator.ExpressionSyntaxException;
18 26
import org.gvsig.expressionevaluator.MutableSymbolTable;
19 27
import org.gvsig.expressionevaluator.SymbolTable;
20 28
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
......
23 31
import org.gvsig.tools.dataTypes.CoercionException;
24 32
import org.gvsig.tools.dataTypes.DataTypesManager;
25 33
import org.gvsig.tools.i18n.I18nManager;
34
import org.gvsig.tools.swing.api.ChangeListenerHelper;
26 35
import org.gvsig.tools.swing.api.ToolsSwingLocator;
27 36
import org.gvsig.tools.swing.api.ToolsSwingManager;
28 37
import org.gvsig.tools.swing.api.windowmanager.Dialog;
29 38
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
30 39
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
40
import org.slf4j.Logger;
41
import org.slf4j.LoggerFactory;
31 42

  
32 43
/**
33 44
 *
34 45
 * @author jjdelcerro
35 46
 */
36 47
@SuppressWarnings("UseSpecificCatch")
37
class DefaultCalculatorController<T> implements CalculatorController<T> {
48
class DefaultCalculatorController<T> 
49
        implements CalculatorController<T> , ChangeListenerHelper
50
    {
51

  
52
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCalculatorController.class);
38 53
    
39 54
    private static final Color COLOR_ERROR = new Color(255,225,232);
40 55
    
41 56
    private final JTextComponent text;
42 57
    private final int dataType;
43 58
    private final MutableSymbolTable defaultSymbolTable;
44
    private final Color backgroundColor;
45
    private final ExpressionEvaluatorSwingManager manager;
59
    private final Color color_ok;
60
    private final ExpressionEvaluatorSwingManager swingManager;
46 61
    private DefaultExpressionBuilderConfig config;
47 62
    private Expression expression;
63
    private boolean warning;
64
    private final ChangeListenerHelper changeListenerHelper;
65
    private final Timer fireChangeTimer;
66
    private String lastText;
67
    private final ExpressionEvaluatorManager manager;
48 68

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

  
53
        this.manager = manager;
73
        this.swingManager = manager;
74
        this.manager = ExpressionEvaluatorLocator.getManager();
54 75
        this.config = null;
55 76
        this.expression = null;
56

  
77
        this.warning = false;
78
        this.changeListenerHelper = toolsSwingManager.createChangeListenerHelper();
79
        
57 80
        this.text = text;
58 81
        this.dataType = dataType;
59
        this.backgroundColor = this.text.getBackground();
82
        this.color_ok = this.text.getBackground();
60 83
        this.defaultSymbolTable = ExpressionEvaluatorLocator.getManager().createSymbolTable();
84
        this.text.addKeyListener(new KeyAdapter() {
85
            @Override
86
            public void keyPressed(KeyEvent e) {
87
                   if( e.getKeyCode()==KeyEvent.VK_C && e.isControlDown() ) {
88
                       doCalculate(true);
89
                   } 
90
            }
91
        });
92
        this.text.getDocument().addDocumentListener(new DocumentListener() {
93
            @Override
94
            public void insertUpdate(DocumentEvent e) {
95
                fireChangeEvent();
96
            }
97

  
98
            @Override
99
            public void removeUpdate(DocumentEvent e) {
100
                fireChangeEvent();
101
            }
102

  
103
            @Override
104
            public void changedUpdate(DocumentEvent e) {
105
                fireChangeEvent();
106
            }
107
        });
61 108
        this.text.addFocusListener(new FocusListener() {
62 109
            @Override
63 110
            public void focusLost(FocusEvent e) {
64
                doCalculate();
111
                doCalculate(true);
65 112
            }
66 113

  
67 114
            @Override
68 115
            public void focusGained(FocusEvent e) {
69
                doCalculate();
116
                doCalculate(true);
70 117
            }
71 118
        });
72
        swingManager.addClearButton(this.text, new ActionListener() {
119
        toolsSwingManager.addClearButton(this.text, new ActionListener() {
73 120
            @Override
74 121
            public void actionPerformed(ActionEvent e) {
75 122
                set(null);
76 123
            }
77 124
        });
78
        swingManager.setDefaultPopupMenu(this.text);
125
        toolsSwingManager.setDefaultPopupMenu(this.text);
79 126
        JPopupMenu popupMenu = this.text.getComponentPopupMenu();
80 127
        Action showExpressionBuilderAction = new AbstractAction(i18n.getTranslation("_Show_expression_builder")) {
81 128
            @Override
......
85 132
        };  
86 133
        popupMenu.addSeparator();
87 134
        popupMenu.add(showExpressionBuilderAction);
135
        this.fireChangeTimer = new Timer(100, new ActionListener() {
136
            @Override
137
            public void actionPerformed(ActionEvent e) {
138
                fireEvent();
139
            }
140
        });
88 141
    }
89 142

  
143
    private void fireChangeEvent() {
144
        this.fireChangeTimer.setRepeats(false);
145
        this.fireChangeTimer.restart();
146
    }
147
    
90 148
    private void doShowExpressionBuilder() {
91 149
        if( this.config == null ) {
92
            this.config = new DefaultExpressionBuilderConfig(this.manager);
150
            this.config = new DefaultExpressionBuilderConfig(this.swingManager);
93 151
            this.config.addSymbolTable(this.defaultSymbolTable);
94 152
        }
95 153
        if( this.expression == null ) {
......
97 155
        }
98 156
        expression.setPhrase(this.text.getText());
99 157

  
100
        DefaultJExpressionBuilder panel = new DefaultJExpressionBuilder(this.manager, this.config);
158
        DefaultJExpressionBuilder panel = new DefaultJExpressionBuilder(this.swingManager, this.config);
101 159
        panel.setExpression(this.expression);
102 160
        
103 161
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
......
123 181
        return this.defaultSymbolTable;
124 182
    }
125 183

  
126
    private void doCalculate() {
184
    private Object doCalculate(boolean updateText) {
185
        System.out.println("doCalculate("+this.text.getName()+"), warning "+this.warning+", text '"+this.text.getText()+"'");
127 186
        if( !this.text.isEditable() ) {
128
            return;
187
            return null;
129 188
        }
130 189
        String source = this.text.getText();
131 190
        try {
132 191
            if( !StringUtils.isBlank(source) ) {
133
                ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
134
                Object value = manager.evaluate(this.defaultSymbolTable, source);
135
                this.text.setText(Objects.toString(value, ""));
192
                final Object value = this.manager.evaluate(this.defaultSymbolTable, source);
193
                if( updateText ) {
194
                    String s = Utils.repr(value);
195
                    if( !StringUtils.equals(s, this.lastText) ) {
196
                        this.setWarning(false);
197
                        this.lastText = s;
198
                        this.text.setText(this.lastText);
199
                    }
200
                }
201
                return value;
136 202
            }
137
            this.text.setBackground(this.backgroundColor);
203
            this.setWarning(false);
204
        } catch (ExpressionSyntaxException ex) {
205
            System.out.println("doCalculate("+this.text.getName()+"), Error, text '"+this.text.getText()+"' "+ex.getDescription());
206
            this.setWarning(true, ex.getDescription());
138 207
        } catch (Exception ex) {
208
            this.setWarning(true);
209
        }
210
        return null;
211
    }
212

  
213
    public void setWarning(boolean warning) {
214
        this.setWarning(warning, null);
215
    }
216
    
217
    public void setWarning(boolean warning, String description) {
218
        this.warning = warning;
219
        if( warning ) {
139 220
            this.text.setBackground(COLOR_ERROR);
221
            this.text.setToolTipText(description==null?"":description);
222
        } else {
223
            this.text.setBackground(this.color_ok);
224
            this.text.setToolTipText("");
140 225
        }
141 226
    }
227

  
228
    @Override
229
    public boolean getWarning() {
230
        return warning;
231
    }
142 232
    
233
    
143 234
    @Override
144 235
    public T get() {
145
        doCalculate();
146
        Object value = this.text.getText();
236
        Object value = doCalculate(false);
147 237
        try {
148 238
            DataTypesManager dataManager = ToolsLocator.getDataTypesManager();
149 239
            value = dataManager.coerce(this.dataType, value);
......
156 246
    @Override
157 247
    public void set(T value) {
158 248
        this.text.setText(Objects.toString(value, ""));
159
        this.text.setBackground(this.backgroundColor);
249
        this.text.setBackground(this.color_ok);
160 250
    }
161 251

  
162 252
    @Override
......
169 259
            }
170 260
        }
171 261
        this.text.setText(Objects.toString(value, ""));
172
        this.text.setBackground(this.backgroundColor);
262
        this.text.setBackground(this.color_ok);
173 263
    }
174 264

  
175 265
    @Override
......
191 281
    public boolean isEditable() {
192 282
        return this.text.isEditable();
193 283
    }
284

  
285
    @Override
286
    public void addChangeListener(ChangeListener cl) {
287
        this.changeListenerHelper.addChangeListener(cl);
288
    }
289

  
290
    @Override
291
    public ChangeListener[] getChangeListeners() {
292
        return this.changeListenerHelper.getChangeListeners();
293
    }
294

  
295
    @Override
296
    public void removeChangeListener(ChangeListener cl) {
297
        this.changeListenerHelper.removeAllChangeListener();
298
    }
299

  
300
    @Override
301
    public void removeAllChangeListener() {
302
        this.changeListenerHelper.removeAllChangeListener();
303
    }
304

  
305
    @Override
306
    public boolean hasChangeListeners() {
307
        return this.changeListenerHelper.hasChangeListeners();
308
    }
309

  
310
    @Override
311
    public void fireEvent() {
312
        this.changeListenerHelper.fireEvent();
313
    }
314

  
315
    @Override
316
    public void fireEvent(ChangeEvent ce) {
317
        this.changeListenerHelper.fireEvent(ce);
318
    }
194 319
    
195 320
}

Also available in: Unified diff