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

History | View | Annotate | Download (15.2 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 javax.swing.ImageIcon;
7
import javax.swing.JButton;
8
import javax.swing.JComboBox;
9
import javax.swing.JMenuItem;
10
import javax.swing.JPopupMenu;
11
import javax.swing.text.JTextComponent;
12
import org.apache.commons.lang3.StringUtils;
13
import org.gvsig.expressionevaluator.DataTypes;
14
import org.gvsig.expressionevaluator.Expression;
15
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
16
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
17
import org.gvsig.expressionevaluator.ExpressionUtils;
18
import org.gvsig.expressionevaluator.swing.ExpressionBuilderConfig;
19
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
20
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
21
import org.gvsig.tools.ToolsLocator;
22
import org.gvsig.tools.dataTypes.Coercion;
23
import org.gvsig.tools.dataTypes.CoercionException;
24
import org.gvsig.tools.dispose.Disposable;
25
import org.gvsig.tools.dispose.DisposeUtils;
26
import org.gvsig.tools.i18n.I18nManager;
27
import org.gvsig.tools.swing.api.InitComponentsListener;
28
import org.gvsig.tools.swing.api.ToolsSwingLocator;
29
import org.gvsig.tools.swing.api.ToolsSwingManager;
30
import org.gvsig.tools.swing.api.ToolsSwingUtils;
31
import org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue;
32
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_GETVALUE;
33
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_SETVALUE;
34
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController;
35
import org.gvsig.tools.swing.api.bookmarkshistory.HistoryController;
36
import org.gvsig.tools.swing.api.pickercontroller.AbstractPickerController;
37
import org.gvsig.tools.swing.api.windowmanager.Dialog;
38
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
39
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
40
import org.gvsig.tools.swing.icontheme.IconTheme;
41
import org.gvsig.tools.swing.icontheme.IconThemeManager;
42

    
43
/**
44
 *
45
 * @author jjdelcerro
46
 */
47
public class DefaultExpressionPickerController 
48
        extends AbstractPickerController<Expression>
49
        implements ExpressionPickerController, Disposable 
50
    {
51

    
52
    public static void selfRegister() {
53
        URL imageResource = DefaultExpressionPickerController.class.getClassLoader().getResource("org/gvsig/tools/swing/picker/picker-expression.png");
54
        if (imageResource != null) {
55
            IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
56
            IconTheme theme = iconThemeManager.getCurrent();
57
            ImageIcon icon = new ImageIcon(imageResource);
58
            theme.registerDefault("tools", "picker", "picker-expression", icon, imageResource);
59
        }
60
    }
61
    
62
    private JButton button;
63
    private JTextComponent text;
64
    private Expression value;
65
    private ExpressionBuilderConfig config;
66
    private DefaultExpressionEvaluatorSwingManager manager;
67
    private ActionListener buttonAction;
68
    private JMenuItem menuItem;
69
    private AbstractAutomaticExpressionChecker automaticExpressionChecker;
70
    private boolean returnNullWhenEmptyExpression;
71
    private HistoryController<Expression> historyController;
72
    private BookmarksController<Expression> bookmarksController;
73
    private JButton buttonBookmarks;
74
    private JButton buttonHistory;
75
    private ActionListener historyAndBookmarkListener;
76
    private JComboBox combo;
77
    
78
    public DefaultExpressionPickerController(DefaultExpressionEvaluatorSwingManager manager, 
79
            JComboBox combo, 
80
            JButton button,
81
            JButton btnHistory,
82
            JButton btnBookmarks
83
        ) {
84
        this(
85
                manager,
86
                (JTextComponent)(combo.getEditor().getEditorComponent()),
87
                button, 
88
                btnHistory, 
89
                btnBookmarks
90
        );
91
        this.combo = combo;
92
    }
93
    
94
    public DefaultExpressionPickerController(DefaultExpressionEvaluatorSwingManager manager, 
95
            JTextComponent text, 
96
            JButton button,
97
            JButton btnHistory,
98
            JButton btnBookmarks
99
        ) {
100
        this.manager = manager;
101
        this.text = text;
102
        this.button = button;
103
        this.buttonHistory = btnHistory;
104
        this.buttonBookmarks = btnBookmarks;
105

    
106
        createComponents();
107
    }
108
    
109
    private void createComponents() {
110
        ToolsSwingUtils.addInitComponentsListener(this.text, new InitComponentsListener() {
111
            @Override
112
            public void doDisposeComponents() {
113
                disposeComponents();
114
            }
115

    
116
            @Override
117
            public void doInitComponents() {
118
                initComponents();
119
            }
120
        });
121
        
122
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
123
        I18nManager i18n = ToolsLocator.getI18nManager();
124

    
125
        this.config = new DefaultExpressionBuilderConfig(manager);
126
        this.returnNullWhenEmptyExpression = true;
127
        this.value = null;
128
        this.buttonAction = (ActionEvent e) -> {
129
          doSelectExpression();
130
        };
131
        this.menuItem = new JMenuItem(i18n.getTranslation("_Show_expression_builder"));
132

    
133
        this.historyAndBookmarkListener = (ActionEvent e) -> {
134
          ActionEventWithCurrentValue<Expression> ee = (ActionEventWithCurrentValue<Expression>)e;
135
          switch(ee.getID()) {
136
            case ID_SETVALUE:
137
              set(ee.getCurrentValue());
138
              fireChangeEvent();
139
              break;
140
            case ID_GETVALUE:
141
              ee.setCurrentValue(get());
142
              break;
143
          }
144
        };
145
        this.historyController = swingManager.createHistoryController(
146
                ExpressionEvaluatorLocator.getManager().getHistory(), 
147
                this.buttonHistory
148
        );
149

    
150
        this.bookmarksController = swingManager.createBookmarksController(
151
                ExpressionEvaluatorLocator.getManager().getBookmarks(), 
152
                this.buttonBookmarks
153
        );
154

    
155
        this.automaticExpressionChecker = new AbstractAutomaticExpressionChecker(config, text) {
156
            @Override
157
            protected Expression getExpression() {
158
                return getWithOutHistory();
159
            }
160

    
161
            @Override
162
            protected String getSuggestion() {
163
                if(config == null){
164
                    return null;
165
                }
166
              return config.getSuggestion(this.getExpression());
167
            }
168

    
169
            @Override
170
            protected void stateChanged() {
171
                fireChangeEvent();
172
            }
173
        };
174
        
175
    }
176
    
177
    private void disposeComponents() {
178
        dispose();
179
    }
180
    
181
    private void initComponents() {
182
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
183
        I18nManager i18n = ToolsLocator.getI18nManager();
184

    
185
        
186

    
187
        if(  "...".equals(this.button.getText()) ) {
188
            this.button.setText("");
189
        }
190
        this.button.setIcon(this.getIcon("picker-expression"));
191
        this.button.addActionListener(this.buttonAction);
192
        
193
        swingManager.addClearButton(this.text, (ActionEvent e) -> {
194
            set((Expression)null);
195
            fireChangeEvent();
196
        });
197
        swingManager.setDefaultPopupMenu(this.text);
198
        JPopupMenu popupMenu = this.text.getComponentPopupMenu();
199
        this.menuItem.addActionListener(buttonAction);
200
        popupMenu.add(this.menuItem);
201
        
202
        this.historyController.addActionListener(historyAndBookmarkListener);
203
        popupMenu.add(this.historyController.createMenu());
204
        
205
        this.bookmarksController.addActionListener(historyAndBookmarkListener);        
206
        popupMenu.add(this.bookmarksController.createMenu());
207

    
208
    }
209
    
210
    @Override
211
    public void dispose() {
212
        if(this.buttonAction != null){
213
            this.button.removeActionListener(this.buttonAction);
214
            this.menuItem.removeActionListener(buttonAction);
215
            this.buttonAction = null;
216
        }
217
        if(this.historyAndBookmarkListener != null){
218
            this.historyController.removeActionListener(historyAndBookmarkListener);
219
            this.bookmarksController.removeActionListener(historyAndBookmarkListener);       
220
            this.historyAndBookmarkListener = null;
221
        }
222
        DisposeUtils.disposeQuietly(this.config);
223
        this.config = null;
224
    }
225
    
226
    private void doSelectExpression() {
227
        I18nManager i18n = ToolsLocator.getI18nManager();
228
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
229

    
230
        Expression theValue = this.get();
231
        JExpressionBuilder panel = this.manager.createJExpressionBuilder(config.cloneConfig());
232
        panel.setExpression(theValue);
233
        
234
        Dialog dialog = windowManager.createDialog(
235
                panel.asJComponent(),
236
                i18n.getTranslation("_Expression_builder"),
237
                null, 
238
                WindowManager_v2.BUTTONS_OK_CANCEL
239
        );
240
        dialog.show(WindowManager.MODE.DIALOG);
241
        if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
242
            this.set(panel.getExpression());
243
            fireChangeEvent();
244
        }
245
    }
246
    
247
    @Override
248
    public Expression get() {
249
        Expression expression = this.getWithOutHistory();
250
        ExpressionEvaluatorManager theManager = ExpressionEvaluatorLocator.getManager();
251
        if (expression != null && !expression.isEmpty()) {
252
            theManager.getHistory().add(expression);
253
        }
254
        return expression;
255
    }
256
    
257
    @Override
258
    public Expression getWithOutHistory() {
259
        String s = this.text.getText();
260
        if( this.returnNullWhenEmptyExpression ) {
261
            if( ExpressionUtils.isEmpty(this.value) &&  StringUtils.isBlank(s) ) {
262
                return null;
263
            }
264
        }
265
        if( this.value == null ) {
266
            this.value = ExpressionEvaluatorLocator.getManager().createExpression();
267
        }
268
        this.value.setPhrase(StringUtils.defaultIfBlank(this.text.getText(),null));
269
        return this.value;
270
    }
271

    
272
    @Override
273
    public void set(Expression value) {
274
        if( value==null ) {
275
            this.text.setText("");
276
            this.value = null;
277
            this.returnNullWhenEmptyExpression = true;
278
        } else {
279
            this.value = value;
280
            this.text.setText(this.value.getPhrase());
281
            this.returnNullWhenEmptyExpression = false;
282
        }
283
    }
284
    
285
    public void set(String phrase) {
286
        if(this.value!=null) {
287
            this.value.setPhrase(phrase);
288
        }
289
    }
290

    
291
    @Override
292
    public boolean isEmpty() {
293
        boolean empty = StringUtils.isBlank(this.text.getText());
294
        return empty;
295
    }
296

    
297
    
298
    @Override
299
    public void coerceAndSet(Object value) {
300
        try {
301
            Coercion toExpression = ToolsLocator.getDataTypesManager().getCoercion(DataTypes.EXPRESSION);
302
            this.set((Expression) toExpression.coerce(value));
303
        } catch (CoercionException ex) {
304
            throw new IllegalArgumentException("Can't converto to color", ex);
305
        }
306
    }
307

    
308
    @Override
309
    public void setEnabled(boolean enabled) {
310
        this.text.setEnabled(enabled);
311
        this.button.setEnabled(enabled);
312
        if(this.buttonBookmarks != null){
313
            this.buttonBookmarks.setEnabled(enabled);
314
        }
315
        if(this.buttonHistory != null){
316
            this.buttonHistory.setEnabled(enabled);
317
        }
318
    }
319

    
320
    @Override
321
    public boolean isEnabled() {
322
        return this.text.isEnabled();
323
    }
324

    
325
    @Override
326
    public void setEditable(boolean editable) {
327
        super.setEditable(editable);
328
        this.text.setEditable(editable);
329
        this.button.setEnabled(editable);
330
        if(this.buttonBookmarks != null){
331
            this.buttonBookmarks.setEnabled(editable);
332
        }
333
        if(this.buttonHistory != null){
334
            this.buttonHistory.setEnabled(editable);
335
        }
336
        
337
    }
338

    
339
//    @Override
340
//    public Preferences getPreferences() {
341
//        return this.config.getPreferences();
342
//    }
343
//    
344
//    @Override
345
//    public List<Element> getElements() {
346
//        return this.config.getElements();
347
//    }
348
//
349
//    @Override
350
//    public void addElement(Element element) {
351
//        this.config.addElement(element);
352
//    }
353
//    
354
//    @Override
355
//    public Collection<SymbolTable> getSymbolTables() {
356
//        return this.config.getSymbolTables();
357
//    }
358
//
359
//    @Override
360
//    public void addSymbolTable(String name) {
361
//        this.config.addSymbolTable(name);
362
//    }
363
//    
364
//    @Override
365
//    public void addSymbolTable(SymbolTable symbolTable) {
366
//        this.config.addSymbolTable(symbolTable);
367
//    }
368
//
369
//    @Override
370
//    public void removeAllSymbolTables() {
371
//        this.config.removeAllSymbolTables();
372
//    }
373
//
374
//    @Override
375
//    public void removeSymbolTable(String name) {
376
//        this.config.removeSymbolTable(name);
377
//    }
378
//
379
//    @Override
380
//    public SymbolTable getPreviewSymbolTable() {
381
//        return this.config.getPreviewSymbolTable();
382
//    }
383
//
384
//    @Override
385
//    public void setPreviewSymbolTable(SymbolTable symbolTable) {
386
//        this.config.setPreviewSymbolTable(symbolTable);
387
//    }
388
//
389
//    @Override
390
//    public void addPreviewSymbolTable(SymbolTable symbolTable) {
391
//        this.config.addPreviewSymbolTable(symbolTable);
392
//    }
393
//
394
//    @Override
395
//    public Object getProperty(String name) {
396
//        return this.config.getProperty(name);
397
//    }
398
//
399
//    @Override
400
//    public void setProperty(String name, Object value) {
401
//        this.config.setProperty(name, value);
402
//    }
403
//
404
//    @Override
405
//    public Map<String, Object> getProperties() {
406
//        return this.config.getProperties();
407
//    }
408
//
409
//    @Override
410
//    public boolean allowAggregates() {
411
//      return this.config.allowAggregates();
412
//    }
413
//
414
//    @Override
415
//    public boolean allowAggregates(boolean allow) {
416
//      return this.config.allowAggregates(allow);
417
//    }
418
//
419
//    @Override
420
//    public java.util.function.Function<String, Integer> isFunctionAllowed() {
421
//      return this.config.isFunctionAllowed();
422
//    }
423
//
424
//    @Override
425
//    public void setAllowedFunctions(java.util.function.Function<String, Integer> allow) {
426
//      this.config.setAllowedFunctions(allow);
427
//    }
428
//
429
//    @Override
430
//    public void addSuggestionFactory(Factory factory) {
431
//      this.config.addSuggestionFactory(factory);
432
//    }
433
//
434
//    @Override
435
//    public String getSuggestion(Expression expression) {
436
//      return this.config.getSuggestion(expression);
437
//    }
438
//
439
//    @Override
440
//    public void copyConfigFrom(ExpressionBuilderConfig other) {
441
//      this.config.copyConfigFrom(other);
442
//    }
443
//
444
//    @Override
445
//    public Function<String, Integer> getAllowedFunctions() {
446
//      return this.config.getAllowedFunctions();
447
//    }
448
//
449
//    @Override
450
//    public Collection<Factory> getSuggestionFactories() {
451
//      return this.config.getSuggestionFactories();
452
//    }
453
//
454
//    @Override
455
//    public void removeAllElements() {
456
//      this.config.removeAllElements();
457
//    }
458
//
459
//    @Override
460
//    public List<Element> getAddedElements() {
461
//        return this.config.getAddedElements();
462
//    }
463

    
464
    @Override
465
    public ExpressionBuilderConfig getConfig() {
466
        return this.config;
467
    }
468
    
469
}