Statistics
| Revision:

svn-gvsig-desktop / 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 @ 44207

History | View | Annotate | Download (8.19 KB)

1 43939 jjdelcerro
package org.gvsig.expressionevaluator.swing.impl;
2
3
import java.util.ArrayList;
4 43983 jjdelcerro
import java.util.Collection;
5 44034 jjdelcerro
import java.util.Collections;
6
import java.util.Comparator;
7 43939 jjdelcerro
import java.util.HashMap;
8
import java.util.List;
9
import java.util.Map;
10 43983 jjdelcerro
import javax.swing.JButton;
11
import javax.swing.text.JTextComponent;
12 44034 jjdelcerro
import org.apache.commons.lang3.StringUtils;
13 43939 jjdelcerro
import org.gvsig.expressionevaluator.Function;
14 43983 jjdelcerro
import org.gvsig.expressionevaluator.SymbolTable;
15 44076 jjdelcerro
import org.gvsig.expressionevaluator.swing.CalculatorController;
16 43939 jjdelcerro
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
17
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
18 43983 jjdelcerro
import org.gvsig.expressionevaluator.swing.Element;
19
import org.gvsig.expressionevaluator.swing.Element.ConstantElement;
20
import org.gvsig.expressionevaluator.swing.Element.FunctionElement;
21
import org.gvsig.expressionevaluator.swing.Element.GroupElement;
22
import org.gvsig.expressionevaluator.swing.Element.VariableElement;
23
import org.gvsig.expressionevaluator.swing.ElementFactory;
24 44191 jjdelcerro
import org.gvsig.expressionevaluator.swing.ExpressionBuilderConfig;
25 43983 jjdelcerro
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
26 44126 jjdelcerro
import org.gvsig.expressionevaluator.swing.FunctionAdditionalPanelFactory;
27 43983 jjdelcerro
import org.gvsig.expressionevaluator.swing.JExpressionPicker;
28
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultConstantValueElement;
29
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultFunctionElement;
30
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultGroupElement;
31
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultVariableElement;
32 44012 jjdelcerro
import org.gvsig.tools.ToolsLocator;
33
import org.gvsig.tools.i18n.I18nManager;
34 43939 jjdelcerro
35 43983 jjdelcerro
public class DefaultExpressionEvaluatorSwingManager
36
        implements ExpressionEvaluatorSwingManager {
37 43939 jjdelcerro
38 44191 jjdelcerro
    private final Map<String, ElementFactory> elementsFactories;
39
    private final Map<String, FunctionAdditionalPanelFactory> functionAdditionalPanelFactories;
40 43939 jjdelcerro
41
    public DefaultExpressionEvaluatorSwingManager() {
42 43983 jjdelcerro
        this.elementsFactories = new HashMap<>();
43 44126 jjdelcerro
        this.functionAdditionalPanelFactories = new HashMap<>();
44 43939 jjdelcerro
    }
45 43983 jjdelcerro
46
    @Override
47 44191 jjdelcerro
    public List<Element> createElements(ExpressionBuilderConfig config, Collection<SymbolTable> symbolTables) {
48 44012 jjdelcerro
        I18nManager i18n = ToolsLocator.getI18nManager();
49 43939 jjdelcerro
        Map<String, Function> functions = new HashMap<>();
50
51 43983 jjdelcerro
        for (SymbolTable symbolTable : symbolTables) {
52
            for (Function function : symbolTable.functions()) {
53
                functions.put(function.name().toUpperCase(), function);
54
            }
55
        }
56
57
        Map<String, GroupElement> functionGroups = new HashMap<>();
58
        Map<String, GroupElement> operatorGroups = new HashMap<>();
59 43939 jjdelcerro
        for (Function function : functions.values()) {
60 43983 jjdelcerro
            if (function.isOperator()) {
61 43939 jjdelcerro
                String groupName = function.group();
62
                GroupElement group = operatorGroups.get(groupName);
63 43983 jjdelcerro
                if (group == null) {
64 44191 jjdelcerro
                    group = new DefaultGroupElement(config, groupName);
65 43939 jjdelcerro
                    operatorGroups.put(groupName, group);
66
                }
67 44191 jjdelcerro
                group.addElement(new DefaultFunctionElement(config, function));
68 43939 jjdelcerro
            } else {
69
                String groupName = function.group();
70
                GroupElement group = functionGroups.get(groupName);
71 43983 jjdelcerro
                if (group == null) {
72 44191 jjdelcerro
                    group = new DefaultGroupElement(config, groupName);
73 43939 jjdelcerro
                    functionGroups.put(groupName, group);
74
                }
75 44191 jjdelcerro
                group.addElement(new DefaultFunctionElement(config, function));
76 43939 jjdelcerro
            }
77
        }
78 44191 jjdelcerro
        GroupElement builtinFunctions = this.createGroupElement(config, i18n.getTranslation("_Functions"));
79 43939 jjdelcerro
        for (GroupElement group : functionGroups.values()) {
80
            builtinFunctions.addElement(group);
81
        }
82 44191 jjdelcerro
        GroupElement operatorFunctions = this.createGroupElement(config, i18n.getTranslation("_Operators"));
83 43939 jjdelcerro
        for (GroupElement group : operatorGroups.values()) {
84
            operatorFunctions.addElement(group);
85
        }
86 43983 jjdelcerro
        List<Element> elements = new ArrayList<>();
87
        elements.add(operatorFunctions);
88
        elements.add(builtinFunctions);
89
        return elements;
90 43939 jjdelcerro
    }
91 43983 jjdelcerro
92 43939 jjdelcerro
    @Override
93 43983 jjdelcerro
    public void registerElement(ElementFactory factory) {
94
        this.elementsFactories.put(factory.getName().toLowerCase(), factory);
95 43939 jjdelcerro
    }
96 43983 jjdelcerro
97 43939 jjdelcerro
    @Override
98 44034 jjdelcerro
    public Collection<ElementFactory> getElementFactories() {
99
        List<ElementFactory> factories = new ArrayList<>();
100
        factories.addAll(this.elementsFactories.values());
101
        Collections.sort(factories, new Comparator<ElementFactory>() {
102
            @Override
103
            public int compare(ElementFactory o1, ElementFactory o2) {
104
                return StringUtils.compare(o1.getName(), o2.getName());
105
            }
106
        });
107
        return factories;
108
    }
109
110
    @Override
111 43983 jjdelcerro
    public JExpressionBuilder createJExpressionBuilder() {
112
        DefaultJExpressionBuilder x = new DefaultJExpressionBuilder(
113
                this,
114
                new DefaultExpressionBuilderConfig(this)
115
        );
116
        return x;
117 43969 jjdelcerro
    }
118 43983 jjdelcerro
119 43969 jjdelcerro
    @Override
120 43983 jjdelcerro
    public Element createElement(String name, Object... parameters) {
121
        ElementFactory factory = this.elementsFactories.get(name.toLowerCase());
122
        if( factory==null ) {
123
            throw new RuntimeException("Can't locate element factory '"+name+"'.");
124
        }
125
        return factory.createElement(parameters);
126 43970 jjdelcerro
    }
127
128
    @Override
129 44191 jjdelcerro
    public GroupElement createGroupElement(ExpressionBuilderConfig config, String name) {
130
        GroupElement e = new DefaultGroupElement(config, name);
131 43983 jjdelcerro
        return e;
132 43969 jjdelcerro
    }
133 43983 jjdelcerro
134 43969 jjdelcerro
    @Override
135 44191 jjdelcerro
    public GroupElement createGroupElement(ExpressionBuilderConfig config, String name, List<Element> elements) {
136
        GroupElement e = new DefaultGroupElement(this, config, name, elements);
137 43983 jjdelcerro
        return e;
138
    }
139
140
    @Override
141 44191 jjdelcerro
    public FunctionElement createFunctionElement(ExpressionBuilderConfig config, Function function) {
142
        FunctionElement e = new DefaultFunctionElement(config, function);
143 43983 jjdelcerro
        return e;
144
    }
145
146
    @Override
147 44191 jjdelcerro
    public ConstantElement createConstantElement(ExpressionBuilderConfig config, Object value) {
148
        ConstantElement e = new DefaultConstantValueElement(config, value, null);
149 43983 jjdelcerro
        return e;
150
    }
151
152
    @Override
153 44191 jjdelcerro
    public ConstantElement createConstantElement(ExpressionBuilderConfig config, Object value, String description) {
154
        ConstantElement e = new DefaultConstantValueElement(config, value, description);
155 43983 jjdelcerro
        return e;
156
    }
157
158
    @Override
159 44191 jjdelcerro
    public VariableElement createVariableElement(ExpressionBuilderConfig config, String label, String source, String name, String typeName, String description) {
160
        VariableElement e = new DefaultVariableElement(config, label, source, name, typeName, description);
161 43983 jjdelcerro
        return e;
162
    }
163
164
    @Override
165
    public ExpressionPickerController createExpressionPickerController(JTextComponent text, JButton button) {
166
        ExpressionPickerController c = new DefaultExpressionPickerController(this, text, button);
167
        return c;
168
    }
169
170
    @Override
171
    public JExpressionPicker createJExpressionPicker() {
172
        JExpressionPicker x = new DefaultJExpressionPicker(this);
173 43939 jjdelcerro
        return x;
174
    }
175
176 44076 jjdelcerro
    @Override
177
    public CalculatorController createCalculatorController(JTextComponent text, int dataType) {
178 44080 jjdelcerro
        DefaultCalculatorController controller = new DefaultCalculatorController(this,text,dataType);
179 44076 jjdelcerro
        return controller;
180
    }
181
182 44126 jjdelcerro
    @Override
183
    public void registerAdditionalPanel(FunctionAdditionalPanelFactory factory) {
184
        if( factory == null ) {
185
            throw new IllegalArgumentException("factory can't be null");
186
        }
187
        this.functionAdditionalPanelFactories.put(factory.getName().toUpperCase(),factory);
188
    }
189
190
    @Override
191
    public Collection<FunctionAdditionalPanelFactory> getFunctionAdditionalPanelFactories() {
192
        return this.functionAdditionalPanelFactories.values();
193
    }
194
195
    @Override
196
    public FunctionAdditionalPanelFactory getFunctionAdditionalPanelFactory(String functionName) {
197
        FunctionAdditionalPanelFactory factory = this.functionAdditionalPanelFactories.get(functionName.toUpperCase());
198
        return factory;
199
    }
200
201 43939 jjdelcerro
}