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

History | View | Annotate | Download (11.5 KB)

1
package org.gvsig.expressionevaluator.swing.impl;
2

    
3
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener;
5
import java.util.ArrayList;
6
import java.util.Collection;
7
import java.util.Collections;
8
import java.util.Comparator;
9
import java.util.HashMap;
10
import java.util.List;
11
import java.util.Map;
12
import java.util.function.Predicate;
13
import javax.swing.AbstractAction;
14
import javax.swing.Action;
15
import javax.swing.JButton;
16
import javax.swing.text.JTextComponent;
17
import org.apache.commons.lang3.StringUtils;
18
import org.gvsig.expressionevaluator.ExpressionUtils;
19
import org.gvsig.expressionevaluator.Function;
20
import org.gvsig.expressionevaluator.SymbolTable;
21
import org.gvsig.expressionevaluator.swing.CalculatorController;
22
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
23
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
24
import org.gvsig.expressionevaluator.swing.Element;
25
import org.gvsig.expressionevaluator.swing.Element.ConstantElement;
26
import org.gvsig.expressionevaluator.swing.Element.FunctionElement;
27
import org.gvsig.expressionevaluator.swing.Element.GroupElement;
28
import org.gvsig.expressionevaluator.swing.ElementFactory;
29
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
30
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
31
import org.gvsig.expressionevaluator.swing.FunctionAdditionalPanelFactory;
32
import org.gvsig.expressionevaluator.swing.JExpressionPicker;
33
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultAggregateElements;
34
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultConstantValueElement;
35
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultFunctionElement;
36
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultGroupElement;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.dataTypes.DataType;
39
import org.gvsig.tools.i18n.I18nManager;
40
import org.gvsig.tools.swing.api.ToolsSwingLocator;
41
import org.gvsig.tools.swing.api.windowmanager.Dialog;
42
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
43
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
44

    
45
public class DefaultExpressionEvaluatorSwingManager
46
        implements ExpressionEvaluatorSwingManager {
47

    
48
    private final Map<String, ElementFactory> elementsFactories;
49
    private final Map<String, FunctionAdditionalPanelFactory> functionAdditionalPanelFactories;
50

    
51
    public DefaultExpressionEvaluatorSwingManager() {
52
        this.elementsFactories = new HashMap<>();
53
        this.functionAdditionalPanelFactories = new HashMap<>();
54
    }
55

    
56
    @Override
57
    public List<Element> createElements(Collection<SymbolTable> symbolTables, Predicate<Function>isAllowed) {
58
        I18nManager i18n = ToolsLocator.getI18nManager();
59
        Map<String, Function> functions = new HashMap<>();
60
        
61
        for (SymbolTable symbolTable : symbolTables) {
62
            for (Function function : symbolTable.functions()) {
63
                if( !function.isHidden() && isAllowed != null && isAllowed.test(function) ) {
64
                  functions.put(function.name().toUpperCase(), function);
65
                }
66
            }
67
        }
68
        
69
        Map<String, GroupElement> functionGroups = new HashMap<>();
70
        Map<String, GroupElement> operatorGroups = new HashMap<>();
71
        for (Function function : functions.values()) {
72
            if (function.isOperator()) {
73
                String groupName = function.group();
74
                GroupElement group = operatorGroups.get(groupName);
75
                if (group == null) {
76
                    group = new DefaultGroupElement(groupName);
77
                    operatorGroups.put(groupName, group);
78
                }
79
                group.addElement(new DefaultFunctionElement(function));
80
            } else {
81
                String groupName = function.group();
82
                GroupElement group = functionGroups.get(groupName);
83
                if (group == null) {
84
                    group = new DefaultGroupElement(groupName);
85
                    functionGroups.put(groupName, group);
86
                }
87
                group.addElement(new DefaultFunctionElement(function));
88
            }
89
        }
90
        GroupElement builtinFunctions = new DefaultAggregateElements(this, i18n.getTranslation("_Functions"));
91
        for (GroupElement group : functionGroups.values()) {
92
            builtinFunctions.addElement(group);
93
        }
94
        GroupElement operatorFunctions = new DefaultAggregateElements(this, i18n.getTranslation("_Operators"));
95
        for (GroupElement group : operatorGroups.values()) {
96
            operatorFunctions.addElement(group);
97
        }
98
        List<Element> elements = new ArrayList<>();
99
        elements.add(operatorFunctions);
100
        elements.add(builtinFunctions);
101
        return elements;
102
    }
103

    
104
    @Override
105
    public void registerElement(ElementFactory factory) {
106
        this.elementsFactories.put(factory.getName().toLowerCase(), factory);
107
    }
108

    
109
    @Override
110
    public Collection<ElementFactory> getElementFactories() {
111
        List<ElementFactory> factories = new ArrayList<>();
112
        factories.addAll(this.elementsFactories.values());
113
        Collections.sort(factories, new Comparator<ElementFactory>() {
114
            @Override
115
            public int compare(ElementFactory o1, ElementFactory o2) {
116
                return StringUtils.compare(o1.getName(), o2.getName());
117
            }
118
        });
119
        return factories;
120
    }
121

    
122
    private static class CreateJExpressionBuilderAction extends AbstractAction {
123

    
124
        private JTextComponent jtext;
125
        
126
        public CreateJExpressionBuilderAction(JTextComponent jtext) {
127
            this.jtext = jtext;
128
            I18nManager i18n = ToolsLocator.getI18nManager();
129
            this.putValue(
130
                    Action.ACTION_COMMAND_KEY, 
131
                    "CreateJExpressionBuilderAction"
132
            );
133
            this.putValue(
134
                    Action.NAME, 
135
                    i18n.getTranslation("_Show_expression_builder")
136
            );
137
            this.putValue(
138
                    Action.SMALL_ICON, 
139
                    ToolsSwingLocator.getIconThemeManager().getCurrent().get("picker-expression")
140
            );
141
        }
142
        
143
        @Override
144
        public void actionPerformed(ActionEvent e) {
145
            I18nManager i18n = ToolsLocator.getI18nManager();
146
            WindowManager_v2 winmgr = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
147
            final JExpressionBuilder panel = ExpressionEvaluatorSwingLocator.getManager().createJExpressionBuilder();
148
            final Dialog dialog = winmgr.createDialog(
149
                    panel.asJComponent(),
150
                    i18n.getTranslation("_Expression_builder"),
151
                    null, 
152
                    WindowManager_v2.BUTTONS_OK_CANCEL
153
            );
154
            dialog.addActionListener(new ActionListener() {
155
                @Override
156
                public void actionPerformed(ActionEvent e2) {
157
                    if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
158
                        if( ExpressionUtils.isDynamicText(jtext.getText())) {
159
                            jtext.replaceSelection(
160
                                    panel.getExpression().getPhrase()
161
                            );
162
                        } else {
163
                            jtext.replaceSelection(
164
                                ExpressionUtils.surroundByDynamicTextTag(
165
                                    panel.getExpression().getPhrase(),
166
                                    true
167
                                )
168
                            );
169
                        }
170
                    }
171
                }
172
            });
173
            dialog.show(WindowManager.MODE.DIALOG);
174
        }
175
        
176
    }
177

    
178
    @Override
179
    public Action createJExpressionBuilderAction(JTextComponent jtext) {
180
        Action action = new CreateJExpressionBuilderAction(jtext);
181
        return action;
182
    }
183
    
184
    @Override
185
    public JExpressionBuilder createJExpressionBuilder() {
186
        DefaultJExpressionBuilder x = new DefaultJExpressionBuilder(
187
                this, 
188
                new DefaultExpressionBuilderConfig(this)
189
        );
190
        return x;
191
    }
192

    
193
    @Override
194
    public Element createElement(String name, Object... parameters) {
195
        ElementFactory factory = this.elementsFactories.get(name.toLowerCase());
196
        if( factory==null ) {
197
            throw new RuntimeException("Can't locate element factory '"+name+"'.");
198
        }
199
        return factory.createElement(parameters);
200
    }
201
    
202
    @Override
203
    public GroupElement createGroupElement(String name) {
204
        GroupElement e = new DefaultGroupElement(name);
205
        return e;
206
    }
207

    
208
    @Override
209
    public GroupElement createGroupElement(String name, List<Element> elements) {
210
        GroupElement e = new DefaultGroupElement(this, name, elements);
211
        return e;
212
    }
213

    
214
    @Override
215
    public FunctionElement createFunctionElement(Function function) {
216
        FunctionElement e = new DefaultFunctionElement(function);
217
        return e;
218
    }
219

    
220
    @Override
221
    public ConstantElement createConstantElement(Object value, String label) {
222
        ConstantElement e = new DefaultConstantValueElement(
223
                value, 
224
                label, 
225
                null
226
        );
227
        return e;
228
    }
229

    
230
    @Override
231
    public ConstantElement createConstantElement(Object value, String label, String description) {
232
        ConstantElement e = new DefaultConstantValueElement(
233
                value, 
234
                StringUtils.defaultIfEmpty(label, ""), 
235
                description
236
        );
237
        return e;
238
    }
239
//
240
//    @Override
241
//    public VariableElement createVariableElement(ExpressionBuilderConfig config, String label, String source, String name, String typeName, String description) {
242
//        VariableElement e = new DefaultVariableElement(config, label, source, name, typeName, description);
243
//        return e;
244
//    }
245

    
246
    @Override
247
    public ExpressionPickerController createExpressionPickerController(JTextComponent text, JButton button) {
248
        ExpressionPickerController c = new DefaultExpressionPickerController(this, text, button, null, null);
249
        return c;
250
    }
251

    
252
    @Override
253
    public ExpressionPickerController createExpressionPickerController(JTextComponent text, JButton button, JButton bookmarks, JButton history) {
254
        ExpressionPickerController c = new DefaultExpressionPickerController(this, text, button, bookmarks, history);
255
        return c;
256
    }
257
    
258
    @Override
259
    public JExpressionPicker createJExpressionPicker() {
260
        JExpressionPicker x = new DefaultJExpressionPicker(this);
261
        return x;
262
    }
263

    
264
    @Override
265
    public CalculatorController createCalculatorController(JTextComponent text, int dataType) {
266
        DefaultCalculatorController controller = new DefaultCalculatorController(this,text,dataType);
267
        return controller;
268
    }
269

    
270
    @Override
271
    public void registerAdditionalPanel(FunctionAdditionalPanelFactory factory) {
272
        if( factory == null ) {
273
            throw new IllegalArgumentException("factory can't be null");
274
        }
275
        this.functionAdditionalPanelFactories.put(factory.getName().toUpperCase(),factory);
276
    }
277

    
278
    @Override
279
    public Collection<FunctionAdditionalPanelFactory> getFunctionAdditionalPanelFactories() {
280
        return this.functionAdditionalPanelFactories.values();
281
    }
282

    
283
    @Override
284
    public FunctionAdditionalPanelFactory getFunctionAdditionalPanelFactory(String functionName) {
285
        FunctionAdditionalPanelFactory factory = this.functionAdditionalPanelFactories.get(functionName.toUpperCase());
286
        return factory;
287
    }
288

    
289
}