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

History | View | Annotate | Download (13.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.net.URL;
6
import java.util.ArrayList;
7
import java.util.Collection;
8
import java.util.Collections;
9
import java.util.Comparator;
10
import java.util.HashMap;
11
import java.util.List;
12
import java.util.Map;
13
import java.util.function.Predicate;
14
import javax.swing.AbstractAction;
15
import javax.swing.Action;
16
import javax.swing.ImageIcon;
17
import javax.swing.JButton;
18
import javax.swing.text.JTextComponent;
19
import org.apache.commons.io.FilenameUtils;
20
import org.apache.commons.lang3.StringUtils;
21
import org.gvsig.expressionevaluator.ExpressionUtils;
22
import org.gvsig.expressionevaluator.Function;
23
import org.gvsig.expressionevaluator.SymbolTable;
24
import org.gvsig.expressionevaluator.swing.CalculatorController;
25
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
26
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
27
import org.gvsig.expressionevaluator.swing.Element;
28
import org.gvsig.expressionevaluator.swing.Element.ConstantElement;
29
import org.gvsig.expressionevaluator.swing.Element.FunctionElement;
30
import org.gvsig.expressionevaluator.swing.Element.GroupElement;
31
import org.gvsig.expressionevaluator.swing.ElementFactory;
32
import org.gvsig.expressionevaluator.swing.ExpressionBuilderConfig;
33
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
34
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
35
import org.gvsig.expressionevaluator.swing.FunctionAdditionalPanelFactory;
36
import org.gvsig.expressionevaluator.swing.JExpressionPicker;
37
import org.gvsig.expressionevaluator.swing.JTextComponentProxy;
38
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultAggregateElements;
39
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultConstantValueElement;
40
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultFunctionElement;
41
import org.gvsig.expressionevaluator.swing.impl.elements.DefaultGroupElement;
42
import org.gvsig.tools.ToolsLocator;
43
import org.gvsig.tools.dataTypes.DataType;
44
import org.gvsig.tools.i18n.I18nManager;
45
import org.gvsig.tools.swing.api.ToolsSwingLocator;
46
import org.gvsig.tools.swing.api.windowmanager.Dialog;
47
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
48
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
49
import org.gvsig.tools.swing.icontheme.IconTheme;
50

    
51
public class DefaultExpressionEvaluatorSwingManager
52
        implements ExpressionEvaluatorSwingManager {
53

    
54
    private final Map<String, ElementFactory> elementsFactories;
55
    private final Map<String, FunctionAdditionalPanelFactory> functionAdditionalPanelFactories;
56

    
57
    public DefaultExpressionEvaluatorSwingManager() {
58
        this.elementsFactories = new HashMap<>();
59
        this.functionAdditionalPanelFactories = new HashMap<>();
60
    }
61

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

    
110
    @Override
111
    public void registerElement(ElementFactory factory) {
112
        this.elementsFactories.put(factory.getName().toLowerCase(), factory);
113
    }
114

    
115
    @Override
116
    public Collection<ElementFactory> getElementFactories() {
117
        List<ElementFactory> factories = new ArrayList<>();
118
        factories.addAll(this.elementsFactories.values());
119
        Collections.sort(factories, new Comparator<ElementFactory>() {
120
            @Override
121
            public int compare(ElementFactory o1, ElementFactory o2) {
122
                return StringUtils.compare(o1.getName(), o2.getName());
123
            }
124
        });
125
        return factories;
126
    }
127

    
128
    private static class CreateJExpressionBuilderAction extends AbstractAction {
129

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

    
184
    @Override
185
    public Action createJExpressionBuilderAction(JTextComponent jtext) {
186
        Action action = new CreateJExpressionBuilderAction(jtext);
187
        return action;
188
    }
189
    
190
    public JExpressionBuilder createJExpressionBuilder(ExpressionBuilderConfig config) {
191
        DefaultJExpressionBuilder x = new DefaultJExpressionBuilder(
192
          this, 
193
          config,
194
          new DefaultJExpressionBuilderView2() {
195
            @Override
196
            public ImageIcon loadImage(String imageName) {
197
              return loadImageFromIconTheme(imageName);
198
            }
199
          }
200
        );
201
        return x;
202
    }
203
    
204
    @Override
205
    public JExpressionBuilder createJExpressionBuilder() {
206
        DefaultJExpressionBuilder x = new DefaultJExpressionBuilder(
207
          this, 
208
          new DefaultExpressionBuilderConfig(this),
209
          new DefaultJExpressionBuilderView2() {
210
            @Override
211
            public ImageIcon loadImage(String imageName) {
212
              return loadImageFromIconTheme(imageName);
213
            }
214
          }
215
        );
216
        return x;
217
    }
218
    
219
    @Override
220
    public JExpressionBuilder createJExpressionBuilderAssistant(final JTextComponent expression) {
221
      return this.createJExpressionBuilderAssistant(() -> expression);
222
    }
223
    
224
    @Override
225
    public JExpressionBuilder createJExpressionBuilderAssistant(JTextComponentProxy expression) {
226
        DefaultJExpressionBuilder x = new DefaultJExpressionBuilder(
227
          this, 
228
          new DefaultExpressionBuilderConfig(this),
229
          new DefaultJExpressionBuilderView3(expression) {
230
            @Override
231
            public ImageIcon loadImage(String imageName) {
232
              return loadImageFromIconTheme(imageName);
233
            }
234
          }
235
        );
236
        return x;
237
    }
238
        
239
    public ImageIcon loadImageFromIconTheme(String imageName) {
240
        String name = FilenameUtils.getBaseName(imageName);
241
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
242
        if (theme.exists(name)) {
243
            return theme.get(name);
244
        }
245
        URL url = this.getClass().getResource(name + ".png");
246
        if (url == null) {
247
            return null;
248
        }
249
        return new ImageIcon(url);
250
    }
251

    
252

    
253
    @Override
254
    public Element createElement(String name, Object... parameters) {
255
        ElementFactory factory = this.elementsFactories.get(name.toLowerCase());
256
        if( factory==null ) {
257
            throw new RuntimeException("Can't locate element factory '"+name+"'.");
258
        }
259
        return factory.createElement(parameters);
260
    }
261
    
262
    @Override
263
    public GroupElement createGroupElement(String name) {
264
        GroupElement e = new DefaultGroupElement(name);
265
        return e;
266
    }
267

    
268
    @Override
269
    public GroupElement createGroupElement(String name, List<Element> elements) {
270
        GroupElement e = new DefaultGroupElement(this, name, elements);
271
        return e;
272
    }
273

    
274
    @Override
275
    public FunctionElement createFunctionElement(Function function) {
276
        FunctionElement e = new DefaultFunctionElement(function);
277
        return e;
278
    }
279

    
280
    @Override
281
    public ConstantElement createConstantElement(Object value, String label) {
282
        ConstantElement e = new DefaultConstantValueElement(
283
                value, 
284
                label, 
285
                null
286
        );
287
        return e;
288
    }
289

    
290
    @Override
291
    public ConstantElement createConstantElement(Object value, String label, String description) {
292
        ConstantElement e = new DefaultConstantValueElement(
293
                value, 
294
                StringUtils.defaultIfEmpty(label, ""), 
295
                description
296
        );
297
        return e;
298
    }
299
//
300
//    @Override
301
//    public VariableElement createVariableElement(ExpressionBuilderConfig config, String label, String source, String name, String typeName, String description) {
302
//        VariableElement e = new DefaultVariableElement(config, label, source, name, typeName, description);
303
//        return e;
304
//    }
305

    
306
    @Override
307
    public ExpressionPickerController createExpressionPickerController(JTextComponent text, JButton button) {
308
        ExpressionPickerController c = new DefaultExpressionPickerController(this, text, button, null, null);
309
        return c;
310
    }
311

    
312
    @Override
313
    public ExpressionPickerController createExpressionPickerController(JTextComponent text, JButton button, JButton bookmarks, JButton history) {
314
        ExpressionPickerController c = new DefaultExpressionPickerController(this, text, button, bookmarks, history);
315
        return c;
316
    }
317
    
318
    @Override
319
    public JExpressionPicker createJExpressionPicker() {
320
        JExpressionPicker x = new DefaultJExpressionPicker(this);
321
        return x;
322
    }
323

    
324
    @Override
325
    public CalculatorController createCalculatorController(JTextComponent text, int dataType) {
326
        DefaultCalculatorController controller = new DefaultCalculatorController(this,text,dataType);
327
        return controller;
328
    }
329

    
330
    @Override
331
    public void registerAdditionalPanel(FunctionAdditionalPanelFactory factory) {
332
        if( factory == null ) {
333
            throw new IllegalArgumentException("factory can't be null");
334
        }
335
        this.functionAdditionalPanelFactories.put(factory.getName().toUpperCase(),factory);
336
    }
337

    
338
    @Override
339
    public Collection<FunctionAdditionalPanelFactory> getFunctionAdditionalPanelFactories() {
340
        return this.functionAdditionalPanelFactories.values();
341
    }
342

    
343
    @Override
344
    public FunctionAdditionalPanelFactory getFunctionAdditionalPanelFactory(String functionName) {
345
        FunctionAdditionalPanelFactory factory = this.functionAdditionalPanelFactories.get(functionName.toUpperCase());
346
        return factory;
347
    }
348

    
349
}