Revision 44080

View differences:

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
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
}
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/DefaultExpressionPickerController.java
5 5
import java.net.URL;
6 6
import java.util.Collection;
7 7
import java.util.List;
8
import javax.swing.AbstractAction;
9
import javax.swing.Action;
8 10
import javax.swing.ImageIcon;
9 11
import javax.swing.JButton;
12
import javax.swing.JPopupMenu;
10 13
import javax.swing.text.JTextComponent;
11 14
import org.apache.commons.lang3.StringUtils;
12 15
import org.gvsig.expressionevaluator.DataTypes;
......
24 27
import org.gvsig.expressionevaluator.swing.ExpressionBuilderConfig;
25 28
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
26 29
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
30
import org.gvsig.tools.i18n.I18nManager;
31
import org.gvsig.tools.swing.api.ToolsSwingManager;
27 32
import org.gvsig.tools.swing.api.windowmanager.Dialog;
28 33
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
29 34
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
......
54 59
    private final ExpressionEvaluatorSwingManager manager;
55 60
    
56 61
    public DefaultExpressionPickerController(ExpressionEvaluatorSwingManager manager, JTextComponent text, JButton button) {
62
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
63
        I18nManager i18n = ToolsLocator.getI18nManager();
64

  
57 65
        this.manager = manager;
58 66
        this.config = new DefaultExpressionBuilderConfig(manager);
59 67
        this.text = text;
......
67 75
            }
68 76
        });
69 77

  
78
        swingManager.addClearButton(this.text);
79
        swingManager.setDefaultPopupMenu(this.text);
80
        JPopupMenu popupMenu = this.text.getComponentPopupMenu();
81
        Action showExpressionBuilderAction = new AbstractAction(i18n.getTranslation("_Show_expression_builder")) {
82
            @Override
83
            public void actionPerformed(ActionEvent e) {
84
                doSelectExpression();
85
            }
86
        };  
87
        popupMenu.addSeparator();
88
        popupMenu.add(showExpressionBuilderAction);
70 89
    }
71 90
    
72 91
    private void doSelectExpression() {
......
96 115

  
97 116
    @Override
98 117
    public void set(Expression value) {
99
        this.value = value; 
100 118
        if( value==null ) {
101 119
            this.text.setText("");
120
            this.value.setPhrase("");
102 121
        } else {
122
            this.value = value;
103 123
            this.text.setText(this.value.getPhrase());
104 124
        }
105 125
    }
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/DefaultExpressionEvaluatorSwingManager.java
177 177

  
178 178
    @Override
179 179
    public CalculatorController createCalculatorController(JTextComponent text, int dataType) {
180
        DefaultCalculatorController controller = new DefaultCalculatorController(text,dataType);
180
        DefaultCalculatorController controller = new DefaultCalculatorController(this,text,dataType);
181 181
        return controller;
182 182
    }
183 183

  
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.swing/org.gvsig.expressionevaluator.swing.api/src/main/java/org/gvsig/expressionevaluator/swing/CalculatorController.java
22 22
    public boolean isEnabled();
23 23

  
24 24
    public void setEnabled(boolean enabled);
25

  
26
    public void setEditable(boolean editable);
25 27
    
28
    public boolean isEditable();
29
    
26 30
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/date/RelativeInstantFunction.java
1
package org.gvsig.expressionevaluator.impl.function.date;
2

  
3
import java.text.ParseException;
4
import java.text.SimpleDateFormat;
5
import java.util.Date;
6
import java.util.Objects;
7
import org.apache.commons.lang3.Range;
8
import org.gvsig.expressionevaluator.Interpreter;
9
import org.gvsig.expressionevaluator.spi.AbstractFunction;
10
import org.gvsig.timesupport.DataTypes;
11
import org.gvsig.timesupport.RelativeInstant;
12
import org.gvsig.timesupport.TimeSupportLocator;
13
import org.gvsig.tools.ToolsLocator;
14
import org.gvsig.tools.dataTypes.CoercionException;
15
import org.gvsig.tools.dataTypes.DataTypesManager;
16

  
17
public class RelativeInstantFunction extends AbstractFunction {
18

  
19
    private final DataTypesManager.Coercion toInstant;
20

  
21
    public RelativeInstantFunction() {
22
        super("Date", "RelativeInstant",Range.is(1),
23
            "Returns a relative instant from the arguments",
24
            "RelativeInstant({{date}}, format)",
25
            new String[]{
26
                "date - a string with a date",
27
                "format - Optional. Format to use to parse the date"
28
            },
29
            "RelativeInstant",
30
            false
31
        );
32
        this.toInstant = ToolsLocator.getDataTypesManager().getCoercion(DataTypes.INSTANT);
33
    }
34

  
35
    @Override
36
    public boolean allowConstantFolding() {
37
        return true;
38
    }
39
    
40
    @Override
41
    public Object call(Interpreter interpreter, Object[] args) {
42
        if( args.length==1 ) {
43
            Object arg0 = getObject(args, 0);
44
            try {
45
                Object instant = this.toInstant.coerce(arg0);
46
                return instant;
47
            } catch (CoercionException ex) {
48
                throw new RuntimeException("Can't convert value '"+Objects.toString(arg0, "")+"' to instant.", ex);
49
            }
50
        }
51
        String format = getStr(args, 1);
52
        String date = getStr(args, 0);
53
        SimpleDateFormat df = new SimpleDateFormat();
54
        if( format != null ) {
55
            df.applyPattern(format);
56
        }
57
        try {
58
            Date x = df.parse(date);
59
            RelativeInstant instant = TimeSupportLocator.getManager().createRelativeInstant(x);
60
            return instant;
61
        } catch (ParseException ex) {
62
            throw new RuntimeException("Can't parse date value '"+date+"' with format '"+format==null?"":format+"'", ex);
63
        }
64
        
65
    }
66
    
67

  
68
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/date/RelativeIntervalFunction.java
1
package org.gvsig.expressionevaluator.impl.function.date;
2

  
3
import java.text.ParseException;
4
import java.text.SimpleDateFormat;
5
import java.util.Date;
6
import java.util.Objects;
7
import org.apache.commons.lang3.Range;
8
import org.gvsig.expressionevaluator.Interpreter;
9
import org.gvsig.expressionevaluator.spi.AbstractFunction;
10
import org.gvsig.timesupport.DataTypes;
11
import org.gvsig.timesupport.Instant;
12
import org.gvsig.timesupport.RelativeInstant;
13
import org.gvsig.timesupport.RelativeInterval;
14
import org.gvsig.timesupport.TimeSupportLocator;
15
import org.gvsig.tools.ToolsLocator;
16
import org.gvsig.tools.dataTypes.CoercionException;
17
import org.gvsig.tools.dataTypes.DataTypesManager;
18

  
19
public class RelativeIntervalFunction extends AbstractFunction {
20

  
21
    private final DataTypesManager.Coercion toInstant;
22

  
23
    public RelativeIntervalFunction() {
24
        super("Date", "RelativeInterval",Range.is(2),
25
            "Returns a relative interval from the arguments",
26
            "RelativeInterval({{date1}}, data2)",
27
            new String[]{
28
                "date1 - An object that represents a moment of time.",
29
                "date2 - An object that represents a moment of time."
30
            },
31
            "RelativeInterval",
32
            false
33
        );
34
        this.toInstant = ToolsLocator.getDataTypesManager().getCoercion(DataTypes.INSTANT);
35
    }
36

  
37
    @Override
38
    public boolean allowConstantFolding() {
39
        return true;
40
    }
41
    
42
    @Override
43
    public Object call(Interpreter interpreter, Object[] args) {
44
            Object arg0 = getObject(args, 0);
45
            Object arg1 = getObject(args, 1);
46
            try {
47
                RelativeInstant instant0 = (RelativeInstant) this.toInstant.coerce(arg0);
48
                RelativeInstant instant1 = (RelativeInstant) this.toInstant.coerce(arg1);
49
                RelativeInterval interval = TimeSupportLocator.getManager().createRelativeInterval(
50
                    instant0,
51
                    instant1
52
                );
53
                return interval;
54
            } catch (CoercionException ex) {
55
                throw new RuntimeException("Can't create an interval from '"+Objects.toString(arg0, "")+":"+Objects.toString(arg1, "")+"'.", ex);
56
            }
57
        }        
58
    }
59
    
60

  
61

  
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/symboltable/SQLSymbolTable.java
3 3
import org.gvsig.expressionevaluator.Function;
4 4
import org.gvsig.expressionevaluator.impl.function.date.DateFunction;
5 5
import org.gvsig.expressionevaluator.impl.function.date.NowFunction;
6
import org.gvsig.expressionevaluator.impl.function.date.RelativeInstantFunction;
7
import org.gvsig.expressionevaluator.impl.function.date.RelativeIntervalFunction;
6 8
import org.gvsig.expressionevaluator.impl.function.date.TimeFunction;
7 9
import org.gvsig.expressionevaluator.impl.function.date.TimestampFunction;
8 10
import org.gvsig.expressionevaluator.impl.function.numeric.ACosFunction;
......
167 169

  
168 170
        this.addFunction(new IIFFunction());
169 171
        this.addFunction(new IFNULLFunction());
172

  
173
        this.addFunction(new RelativeInstantFunction());
174
        this.addFunction(new RelativeIntervalFunction());
170 175
    }
171 176

  
172 177
    private void addOperator(Function operator) {
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/pom.xml
44 44
            <artifactId>${org.gvsig.proj.lib.impl}</artifactId>
45 45
            <scope>test</scope>
46 46
        </dependency>
47
        <dependency>
48
            <groupId>org.gvsig</groupId>
49
            <artifactId>org.gvsig.timesupport.lib.api</artifactId>
50
            <scope>compile</scope>
51
        </dependency>
47 52
    </dependencies>
48 53
</project>

Also available in: Unified diff