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 / DefaultExpressionPickerController.java @ 44902

History | View | Annotate | Download (11.9 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.Collection;
7
import java.util.List;
8
import java.util.Map;
9
import java.util.function.Function;
10
import javax.swing.ImageIcon;
11
import javax.swing.JButton;
12
import javax.swing.JMenuItem;
13
import javax.swing.JPopupMenu;
14
import javax.swing.text.JTextComponent;
15
import org.apache.commons.lang3.StringUtils;
16
import org.gvsig.expressionevaluator.DataTypes;
17
import org.gvsig.expressionevaluator.Expression;
18
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
19
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
20
import org.gvsig.expressionevaluator.ExpressionUtils;
21
import org.gvsig.expressionevaluator.SymbolTable;
22
import org.gvsig.expressionevaluator.swing.Element;
23
import org.gvsig.expressionevaluator.swing.ExpressionBuilderConfig;
24
import org.gvsig.tools.ToolsLocator;
25
import org.gvsig.tools.dataTypes.CoercionException;
26
import org.gvsig.tools.swing.api.ToolsSwingLocator;
27
import org.gvsig.tools.swing.api.pickercontroller.AbstractPickerController;
28
import org.gvsig.tools.swing.icontheme.IconTheme;
29
import org.gvsig.tools.swing.icontheme.IconThemeManager;
30
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
31
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
32
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
33
import org.gvsig.tools.dataTypes.Coercion;
34
import org.gvsig.tools.i18n.I18nManager;
35
import org.gvsig.tools.swing.api.ToolsSwingManager;
36
import org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue;
37
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_GETVALUE;
38
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_SETVALUE;
39
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController;
40
import org.gvsig.tools.swing.api.bookmarkshistory.HistoryController;
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
import org.gvsig.tools.util.Factory;
45

    
46
/**
47
 *
48
 * @author jjdelcerro
49
 */
50
public class DefaultExpressionPickerController 
51
        extends AbstractPickerController<Expression>
52
        implements ExpressionPickerController 
53
    {
54

    
55
    public static void selfRegister() {
56
        URL imageResource = DefaultExpressionPickerController.class.getClassLoader().getResource("org/gvsig/tools/swing/picker/picker-expression.png");
57
        if (imageResource != null) {
58
            IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
59
            IconTheme theme = iconThemeManager.getCurrent();
60
            ImageIcon icon = new ImageIcon(imageResource);
61
            theme.registerDefault("tools", "picker", "picker-expression", icon, imageResource);
62
        }
63
    }
64
    
65
    private final JButton button;
66
    private final JTextComponent text;
67
    private Expression value;
68
    private final ExpressionBuilderConfig config;
69
    private final DefaultExpressionEvaluatorSwingManager manager;
70
    private final ActionListener buttonAction;
71
    private final JMenuItem menuItem;
72
    private final AbstractAutomaticExpressionChecker automaticExpressionChecker;
73
    private boolean returnNullWhenEmptyExpression;
74
    private final HistoryController<Expression> historyController;
75
    private final BookmarksController<Expression> bookmarksController;
76
    
77
    public DefaultExpressionPickerController(DefaultExpressionEvaluatorSwingManager manager, 
78
            JTextComponent text, 
79
            JButton button,
80
            JButton btnHistory,
81
            JButton btnBookmarks
82
        ) {
83
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
84
        I18nManager i18n = ToolsLocator.getI18nManager();
85

    
86
        this.manager = manager;
87
        this.config = new DefaultExpressionBuilderConfig(manager);
88
        this.text = text;
89
        this.button = button;
90
        if(  "...".equals(this.button.getText()) ) {
91
            this.button.setText("");
92
        }
93
        this.value = null;
94
        this.returnNullWhenEmptyExpression = true;
95
        this.button.setIcon(this.getIcon("picker-expression"));
96
        this.buttonAction = (ActionEvent e) -> {
97
          doSelectExpression();
98
        };
99
        this.button.addActionListener(this.buttonAction);
100

    
101
        swingManager.addClearButton(this.text);
102
        swingManager.setDefaultPopupMenu(this.text);
103
        JPopupMenu popupMenu = this.text.getComponentPopupMenu();
104
        this.menuItem = new JMenuItem(i18n.getTranslation("_Show_expression_builder"));
105
        this.menuItem.addActionListener(buttonAction);
106
        popupMenu.add(this.menuItem);
107
        
108
        ActionListener historyAndBookmarkListener = (ActionEvent e) -> {
109
          ActionEventWithCurrentValue<Expression> ee = (ActionEventWithCurrentValue<Expression>)e;
110
          switch(ee.getID()) {
111
            case ID_SETVALUE:
112
              set(ee.getCurrentValue());
113
              break;
114
            case ID_GETVALUE:
115
              ee.setCurrentValue(get());
116
              break;
117
          }
118
        };
119
        this.historyController = swingManager.createHistoryController(
120
                ExpressionEvaluatorLocator.getManager().getHistory(), 
121
                btnHistory
122
        );
123
        this.historyController.addActionListener(historyAndBookmarkListener);
124
        popupMenu.add(this.historyController.createMenu());
125
        
126
        this.bookmarksController = swingManager.createBookmarksController(
127
                ExpressionEvaluatorLocator.getManager().getBookmarks(), 
128
                btnBookmarks
129
        );
130
        this.bookmarksController.addActionListener(historyAndBookmarkListener);        
131
        popupMenu.add(this.bookmarksController.createMenu());
132

    
133
        this.automaticExpressionChecker = new AbstractAutomaticExpressionChecker(config, text) {
134
            @Override
135
            protected Expression getExpression() {
136
                return getWithOutHistory();
137
            }
138

    
139
            @Override
140
            protected String getSuggestion() {
141
              return config.getSuggestion(this.getExpression());
142
            }
143
            
144
        };
145
    }
146
    
147
    private void doSelectExpression() {
148
        I18nManager i18n = ToolsLocator.getI18nManager();
149
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
150

    
151
        Expression theValue = this.get();
152
        JExpressionBuilder panel = this.manager.createJExpressionBuilder(config);
153
        panel.copyConfigFrom(this);
154
        panel.setExpression(theValue);
155
        
156
        Dialog dialog = windowManager.createDialog(
157
                panel.asJComponent(),
158
                i18n.getTranslation("_Expression_builder"),
159
                null, 
160
                WindowManager_v2.BUTTONS_OK_CANCEL
161
        );
162
        dialog.show(WindowManager.MODE.DIALOG);
163
        if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
164
            this.set(panel.getExpression());
165
        }
166
    }
167
    
168
    @Override
169
    public Expression get() {
170
        Expression expression = this.getWithOutHistory();
171
        ExpressionEvaluatorManager theManager = ExpressionEvaluatorLocator.getManager();
172
        if (expression != null && !expression.isEmpty()) {
173
            theManager.getHistory().add(expression);
174
        }
175
        return expression;
176
    }
177
    
178
    @Override
179
    public Expression getWithOutHistory() {
180
        String s = this.text.getText();
181
        if( this.returnNullWhenEmptyExpression ) {
182
            if( ExpressionUtils.isEmpty(this.value) &&  StringUtils.isBlank(s) ) {
183
                return null;
184
            }
185
        }
186
        if( this.value == null ) {
187
            this.value = ExpressionEvaluatorLocator.getManager().createExpression();
188
        }
189
        this.value.setPhrase(StringUtils.defaultIfBlank(this.text.getText(),null));
190
        return this.value;
191
    }
192

    
193
    @Override
194
    public void set(Expression value) {
195
        if( value==null ) {
196
            this.text.setText("");
197
            this.value = null;
198
            this.returnNullWhenEmptyExpression = true;
199
        } else {
200
            this.value = value;
201
            this.text.setText(this.value.getPhrase());
202
            this.returnNullWhenEmptyExpression = false;
203
        }
204
    }
205

    
206
    @Override
207
    public boolean isEmpty() {
208
        boolean empty = StringUtils.isBlank(this.text.getText());
209
        return empty;
210
    }
211

    
212
    
213
    @Override
214
    public void coerceAndSet(Object value) {
215
        try {
216
            Coercion toExpression = ToolsLocator.getDataTypesManager().getCoercion(DataTypes.EXPRESSION);
217
            this.set((Expression) toExpression.coerce(value));
218
        } catch (CoercionException ex) {
219
            throw new IllegalArgumentException("Can't converto to color", ex);
220
        }
221
    }
222

    
223
    @Override
224
    public void setEnabled(boolean enabled) {
225
        this.text.setEnabled(enabled);
226
        this.button.setEnabled(enabled);
227
    }
228

    
229
    @Override
230
    public boolean isEnabled() {
231
        return this.text.isEnabled();
232
    }
233

    
234
    @Override
235
    public void setEditable(boolean editable) {
236
        super.setEditable(editable);
237
        this.text.setEditable(editable);
238
        this.button.setEnabled(editable);
239
    }
240

    
241
    @Override
242
    public Preferences getPreferences() {
243
        return this.config.getPreferences();
244
    }
245
    
246
    @Override
247
    public List<Element> getElements() {
248
        return this.config.getElements();
249
    }
250

    
251
    @Override
252
    public void addElement(Element element) {
253
        this.config.addElement(element);
254
    }
255
    
256
    @Override
257
    public Collection<SymbolTable> getSymbolTables() {
258
        return this.config.getSymbolTables();
259
    }
260

    
261
    @Override
262
    public void addSymbolTable(String name) {
263
        this.config.addSymbolTable(name);
264
    }
265
    
266
    @Override
267
    public void addSymbolTable(SymbolTable symbolTable) {
268
        this.config.addSymbolTable(symbolTable);
269
    }
270

    
271
    @Override
272
    public void removeAllSymbolTables() {
273
        this.config.removeAllSymbolTables();
274
    }
275

    
276
    @Override
277
    public void removeSymbolTable(String name) {
278
        this.config.removeSymbolTable(name);
279
    }
280

    
281
    @Override
282
    public SymbolTable getPreviewSymbolTable() {
283
        return this.config.getPreviewSymbolTable();
284
    }
285

    
286
    @Override
287
    public void setPreviewSymbolTable(SymbolTable symbolTable) {
288
        this.config.setPreviewSymbolTable(symbolTable);
289
    }
290

    
291
    @Override
292
    public Object getProperty(String name) {
293
        return this.config.getProperty(name);
294
    }
295

    
296
    @Override
297
    public void setProperty(String name, Object value) {
298
        this.config.setProperty(name, value);
299
    }
300

    
301
    @Override
302
    public Map<String, Object> getProperties() {
303
        return this.config.getProperties();
304
    }
305

    
306
    @Override
307
    public boolean allowAggregates() {
308
      return this.config.allowAggregates();
309
    }
310

    
311
    @Override
312
    public boolean allowAggregates(boolean allow) {
313
      return this.config.allowAggregates(allow);
314
    }
315

    
316
    @Override
317
    public java.util.function.Function<String, Integer> isFunctionAllowed() {
318
      return this.config.isFunctionAllowed();
319
    }
320

    
321
    @Override
322
    public void setAllowedFunctions(java.util.function.Function<String, Integer> allow) {
323
      this.config.setAllowedFunctions(allow);
324
    }
325

    
326
    @Override
327
    public void addSuggestionFactory(Factory factory) {
328
      this.config.addSuggestionFactory(factory);
329
    }
330

    
331
    @Override
332
    public String getSuggestion(Expression expression) {
333
      return this.config.getSuggestion(expression);
334
    }
335

    
336
    @Override
337
    public void copyConfigFrom(ExpressionBuilderConfig other) {
338
      this.config.copyConfigFrom(other);
339
    }
340

    
341
    @Override
342
    public Function<String, Integer> getAllowedFunctions() {
343
      return this.config.getAllowedFunctions();
344
    }
345

    
346
    @Override
347
    public Collection<Factory> getSuggestionFactories() {
348
      return this.config.getSuggestionFactories();
349
    }
350

    
351
    @Override
352
    public void removeAllElements() {
353
      this.config.removeAllElements();
354
    }
355
    
356
}