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

History | View | Annotate | Download (11.3 KB)

1 43939 jjdelcerro
package org.gvsig.expressionevaluator.swing.impl;
2
3 44408 jjdelcerro
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener;
5 43939 jjdelcerro
import java.util.ArrayList;
6 43983 jjdelcerro
import java.util.Collection;
7 44034 jjdelcerro
import java.util.Collections;
8
import java.util.Comparator;
9 43939 jjdelcerro
import java.util.HashMap;
10
import java.util.List;
11
import java.util.Map;
12 44408 jjdelcerro
import javax.swing.AbstractAction;
13
import javax.swing.Action;
14 43983 jjdelcerro
import javax.swing.JButton;
15
import javax.swing.text.JTextComponent;
16 44034 jjdelcerro
import org.apache.commons.lang3.StringUtils;
17 44408 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionUtils;
18 43939 jjdelcerro
import org.gvsig.expressionevaluator.Function;
19 43983 jjdelcerro
import org.gvsig.expressionevaluator.SymbolTable;
20 44076 jjdelcerro
import org.gvsig.expressionevaluator.swing.CalculatorController;
21 43939 jjdelcerro
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
22
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
23 43983 jjdelcerro
import org.gvsig.expressionevaluator.swing.Element;
24
import org.gvsig.expressionevaluator.swing.Element.ConstantElement;
25
import org.gvsig.expressionevaluator.swing.Element.FunctionElement;
26
import org.gvsig.expressionevaluator.swing.Element.GroupElement;
27
import org.gvsig.expressionevaluator.swing.ElementFactory;
28 44408 jjdelcerro
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
29 43983 jjdelcerro
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
30 44126 jjdelcerro
import org.gvsig.expressionevaluator.swing.FunctionAdditionalPanelFactory;
31 43983 jjdelcerro
import org.gvsig.expressionevaluator.swing.JExpressionPicker;
32 44262 jjdelcerro
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultAggregateElements;
33 43983 jjdelcerro
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultConstantValueElement;
34
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultFunctionElement;
35
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultGroupElement;
36 44012 jjdelcerro
import org.gvsig.tools.ToolsLocator;
37
import org.gvsig.tools.i18n.I18nManager;
38 44408 jjdelcerro
import org.gvsig.tools.swing.api.ToolsSwingLocator;
39
import org.gvsig.tools.swing.api.windowmanager.Dialog;
40
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
41
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
42 43939 jjdelcerro
43 43983 jjdelcerro
public class DefaultExpressionEvaluatorSwingManager
44
        implements ExpressionEvaluatorSwingManager {
45 43939 jjdelcerro
46 44191 jjdelcerro
    private final Map<String, ElementFactory> elementsFactories;
47
    private final Map<String, FunctionAdditionalPanelFactory> functionAdditionalPanelFactories;
48 43939 jjdelcerro
49
    public DefaultExpressionEvaluatorSwingManager() {
50 43983 jjdelcerro
        this.elementsFactories = new HashMap<>();
51 44126 jjdelcerro
        this.functionAdditionalPanelFactories = new HashMap<>();
52 43939 jjdelcerro
    }
53 43983 jjdelcerro
54
    @Override
55 44259 jjdelcerro
    public List<Element> createElements(Collection<SymbolTable> symbolTables) {
56 44012 jjdelcerro
        I18nManager i18n = ToolsLocator.getI18nManager();
57 43939 jjdelcerro
        Map<String, Function> functions = new HashMap<>();
58
59 43983 jjdelcerro
        for (SymbolTable symbolTable : symbolTables) {
60
            for (Function function : symbolTable.functions()) {
61
                functions.put(function.name().toUpperCase(), function);
62
            }
63
        }
64
65
        Map<String, GroupElement> functionGroups = new HashMap<>();
66
        Map<String, GroupElement> operatorGroups = new HashMap<>();
67 43939 jjdelcerro
        for (Function function : functions.values()) {
68 43983 jjdelcerro
            if (function.isOperator()) {
69 43939 jjdelcerro
                String groupName = function.group();
70
                GroupElement group = operatorGroups.get(groupName);
71 43983 jjdelcerro
                if (group == null) {
72 44259 jjdelcerro
                    group = new DefaultGroupElement(groupName);
73 43939 jjdelcerro
                    operatorGroups.put(groupName, group);
74
                }
75 44259 jjdelcerro
                group.addElement(new DefaultFunctionElement(function));
76 43939 jjdelcerro
            } else {
77
                String groupName = function.group();
78
                GroupElement group = functionGroups.get(groupName);
79 43983 jjdelcerro
                if (group == null) {
80 44259 jjdelcerro
                    group = new DefaultGroupElement(groupName);
81 43939 jjdelcerro
                    functionGroups.put(groupName, group);
82
                }
83 44259 jjdelcerro
                group.addElement(new DefaultFunctionElement(function));
84 43939 jjdelcerro
            }
85
        }
86 44262 jjdelcerro
        GroupElement builtinFunctions = new DefaultAggregateElements(this, i18n.getTranslation("_Functions"));
87 43939 jjdelcerro
        for (GroupElement group : functionGroups.values()) {
88
            builtinFunctions.addElement(group);
89
        }
90 44262 jjdelcerro
        GroupElement operatorFunctions = new DefaultAggregateElements(this, i18n.getTranslation("_Operators"));
91 43939 jjdelcerro
        for (GroupElement group : operatorGroups.values()) {
92
            operatorFunctions.addElement(group);
93
        }
94 43983 jjdelcerro
        List<Element> elements = new ArrayList<>();
95
        elements.add(operatorFunctions);
96
        elements.add(builtinFunctions);
97
        return elements;
98 43939 jjdelcerro
    }
99 43983 jjdelcerro
100 43939 jjdelcerro
    @Override
101 43983 jjdelcerro
    public void registerElement(ElementFactory factory) {
102
        this.elementsFactories.put(factory.getName().toLowerCase(), factory);
103 43939 jjdelcerro
    }
104 43983 jjdelcerro
105 43939 jjdelcerro
    @Override
106 44034 jjdelcerro
    public Collection<ElementFactory> getElementFactories() {
107
        List<ElementFactory> factories = new ArrayList<>();
108
        factories.addAll(this.elementsFactories.values());
109
        Collections.sort(factories, new Comparator<ElementFactory>() {
110
            @Override
111
            public int compare(ElementFactory o1, ElementFactory o2) {
112
                return StringUtils.compare(o1.getName(), o2.getName());
113
            }
114
        });
115
        return factories;
116
    }
117 44408 jjdelcerro
118
    private static class CreateJExpressionBuilderAction extends AbstractAction {
119
120
        private JTextComponent jtext;
121
122
        public CreateJExpressionBuilderAction(JTextComponent jtext) {
123
            this.jtext = jtext;
124
            I18nManager i18n = ToolsLocator.getI18nManager();
125
            this.putValue(
126
                    Action.ACTION_COMMAND_KEY,
127
                    "CreateJExpressionBuilderAction"
128
            );
129
            this.putValue(
130
                    Action.NAME,
131
                    i18n.getTranslation("_Show_expression_builder")
132
            );
133
            this.putValue(
134
                    Action.SMALL_ICON,
135
                    ToolsSwingLocator.getIconThemeManager().getCurrent().get("picker-expression")
136
            );
137
        }
138
139
        @Override
140
        public void actionPerformed(ActionEvent e) {
141
            I18nManager i18n = ToolsLocator.getI18nManager();
142
            WindowManager_v2 winmgr = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
143
            final JExpressionBuilder panel = ExpressionEvaluatorSwingLocator.getManager().createJExpressionBuilder();
144
            final Dialog dialog = winmgr.createDialog(
145
                    panel.asJComponent(),
146
                    i18n.getTranslation("_Expression_builder"),
147
                    null,
148
                    WindowManager_v2.BUTTONS_OK_CANCEL
149
            );
150
            dialog.addActionListener(new ActionListener() {
151
                @Override
152
                public void actionPerformed(ActionEvent e2) {
153
                    if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
154
                        if( ExpressionUtils.isDynamicText(jtext.getText())) {
155
                            jtext.replaceSelection(
156
                                    panel.getExpression().getPhrase()
157
                            );
158
                        } else {
159
                            jtext.replaceSelection(
160
                                ExpressionUtils.surroundByDynamicTextTag(
161
                                    panel.getExpression().getPhrase(),
162
                                    true
163
                                )
164
                            );
165
                        }
166
                    }
167
                }
168
            });
169
            dialog.show(WindowManager.MODE.DIALOG);
170
        }
171
172
    }
173
174
    @Override
175
    public Action createJExpressionBuilderAction(JTextComponent jtext) {
176
        Action action = new CreateJExpressionBuilderAction(jtext);
177
        return action;
178
    }
179 44034 jjdelcerro
180
    @Override
181 43983 jjdelcerro
    public JExpressionBuilder createJExpressionBuilder() {
182
        DefaultJExpressionBuilder x = new DefaultJExpressionBuilder(
183
                this,
184
                new DefaultExpressionBuilderConfig(this)
185
        );
186
        return x;
187 43969 jjdelcerro
    }
188 43983 jjdelcerro
189 43969 jjdelcerro
    @Override
190 43983 jjdelcerro
    public Element createElement(String name, Object... parameters) {
191
        ElementFactory factory = this.elementsFactories.get(name.toLowerCase());
192
        if( factory==null ) {
193
            throw new RuntimeException("Can't locate element factory '"+name+"'.");
194
        }
195
        return factory.createElement(parameters);
196 43970 jjdelcerro
    }
197
198
    @Override
199 44259 jjdelcerro
    public GroupElement createGroupElement(String name) {
200
        GroupElement e = new DefaultGroupElement(name);
201 43983 jjdelcerro
        return e;
202 43969 jjdelcerro
    }
203 43983 jjdelcerro
204 43969 jjdelcerro
    @Override
205 44259 jjdelcerro
    public GroupElement createGroupElement(String name, List<Element> elements) {
206
        GroupElement e = new DefaultGroupElement(this, name, elements);
207 43983 jjdelcerro
        return e;
208
    }
209
210
    @Override
211 44259 jjdelcerro
    public FunctionElement createFunctionElement(Function function) {
212
        FunctionElement e = new DefaultFunctionElement(function);
213 43983 jjdelcerro
        return e;
214
    }
215
216
    @Override
217 44259 jjdelcerro
    public ConstantElement createConstantElement(Object value, String label) {
218
        ConstantElement e = new DefaultConstantValueElement(
219
                value,
220
                label,
221
                null
222
        );
223 43983 jjdelcerro
        return e;
224
    }
225
226
    @Override
227 44259 jjdelcerro
    public ConstantElement createConstantElement(Object value, String label, String description) {
228
        ConstantElement e = new DefaultConstantValueElement(
229
                value,
230
                StringUtils.defaultIfEmpty(label, ""),
231
                description
232
        );
233 43983 jjdelcerro
        return e;
234
    }
235 44259 jjdelcerro
//
236
//    @Override
237
//    public VariableElement createVariableElement(ExpressionBuilderConfig config, String label, String source, String name, String typeName, String description) {
238
//        VariableElement e = new DefaultVariableElement(config, label, source, name, typeName, description);
239
//        return e;
240
//    }
241 43983 jjdelcerro
242
    @Override
243
    public ExpressionPickerController createExpressionPickerController(JTextComponent text, JButton button) {
244 44267 jjdelcerro
        ExpressionPickerController c = new DefaultExpressionPickerController(this, text, button, null, null);
245 43983 jjdelcerro
        return c;
246
    }
247
248
    @Override
249 44265 jjdelcerro
    public ExpressionPickerController createExpressionPickerController(JTextComponent text, JButton button, JButton bookmarks, JButton history) {
250 44267 jjdelcerro
        ExpressionPickerController c = new DefaultExpressionPickerController(this, text, button, bookmarks, history);
251 44265 jjdelcerro
        return c;
252
    }
253
254
    @Override
255 43983 jjdelcerro
    public JExpressionPicker createJExpressionPicker() {
256
        JExpressionPicker x = new DefaultJExpressionPicker(this);
257 43939 jjdelcerro
        return x;
258
    }
259
260 44076 jjdelcerro
    @Override
261
    public CalculatorController createCalculatorController(JTextComponent text, int dataType) {
262 44080 jjdelcerro
        DefaultCalculatorController controller = new DefaultCalculatorController(this,text,dataType);
263 44076 jjdelcerro
        return controller;
264
    }
265
266 44126 jjdelcerro
    @Override
267
    public void registerAdditionalPanel(FunctionAdditionalPanelFactory factory) {
268
        if( factory == null ) {
269
            throw new IllegalArgumentException("factory can't be null");
270
        }
271
        this.functionAdditionalPanelFactories.put(factory.getName().toUpperCase(),factory);
272
    }
273
274
    @Override
275
    public Collection<FunctionAdditionalPanelFactory> getFunctionAdditionalPanelFactories() {
276
        return this.functionAdditionalPanelFactories.values();
277
    }
278
279
    @Override
280
    public FunctionAdditionalPanelFactory getFunctionAdditionalPanelFactory(String functionName) {
281
        FunctionAdditionalPanelFactory factory = this.functionAdditionalPanelFactories.get(functionName.toUpperCase());
282
        return factory;
283
    }
284
285 43939 jjdelcerro
}