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

History | View | Annotate | Download (13.1 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
    private final JButton buttonBookmarks;
77
    private final JButton buttonHistory;
78
    private final ActionListener historyAndBookmarkListener;
79
    
80
    public DefaultExpressionPickerController(DefaultExpressionEvaluatorSwingManager manager, 
81
            JTextComponent text, 
82
            JButton button,
83
            JButton btnHistory,
84
            JButton btnBookmarks
85
        ) {
86
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
87
        I18nManager i18n = ToolsLocator.getI18nManager();
88

    
89
        this.manager = manager;
90
        this.config = new DefaultExpressionBuilderConfig(manager);
91
        this.text = text;
92
        this.button = button;
93
        if(  "...".equals(this.button.getText()) ) {
94
            this.button.setText("");
95
        }
96
        this.value = null;
97
        this.returnNullWhenEmptyExpression = true;
98
        this.button.setIcon(this.getIcon("picker-expression"));
99
        this.buttonAction = (ActionEvent e) -> {
100
          doSelectExpression();
101
        };
102
        this.button.addActionListener(this.buttonAction);
103
        
104
        swingManager.addClearButton(this.text);
105
        swingManager.setDefaultPopupMenu(this.text);
106
        JPopupMenu popupMenu = this.text.getComponentPopupMenu();
107
        this.menuItem = new JMenuItem(i18n.getTranslation("_Show_expression_builder"));
108
        this.menuItem.addActionListener(buttonAction);
109
        popupMenu.add(this.menuItem);
110
        
111
        this.historyAndBookmarkListener = (ActionEvent e) -> {
112
          ActionEventWithCurrentValue<Expression> ee = (ActionEventWithCurrentValue<Expression>)e;
113
          switch(ee.getID()) {
114
            case ID_SETVALUE:
115
              set(ee.getCurrentValue());
116
              fireChangeEvent();
117
              break;
118
            case ID_GETVALUE:
119
              ee.setCurrentValue(get());
120
              break;
121
          }
122
        };
123
        this.buttonHistory = btnHistory;
124
        this.historyController = swingManager.createHistoryController(
125
                ExpressionEvaluatorLocator.getManager().getHistory(), 
126
                btnHistory
127
        );
128
        this.historyController.addActionListener(historyAndBookmarkListener);
129
        popupMenu.add(this.historyController.createMenu());
130
        
131
        this.buttonBookmarks = btnBookmarks;
132
        this.bookmarksController = swingManager.createBookmarksController(
133
                ExpressionEvaluatorLocator.getManager().getBookmarks(), 
134
                btnBookmarks
135
        );
136
        this.bookmarksController.addActionListener(historyAndBookmarkListener);        
137
        popupMenu.add(this.bookmarksController.createMenu());
138

    
139
        this.automaticExpressionChecker = new AbstractAutomaticExpressionChecker(config, text) {
140
            @Override
141
            protected Expression getExpression() {
142
                return getWithOutHistory();
143
            }
144

    
145
            @Override
146
            protected String getSuggestion() {
147
              return config.getSuggestion(this.getExpression());
148
            }
149

    
150
            @Override
151
            protected void stateChanged() {
152
                fireChangeEvent();
153
            }
154
        };
155
    }
156
    public void dispose() {
157
        this.button.removeActionListener(this.buttonAction);
158
        this.menuItem.removeActionListener(buttonAction);
159
        this.historyController.removeActionListener(historyAndBookmarkListener);
160
        this.bookmarksController.removeActionListener(historyAndBookmarkListener);        
161
    }
162
    
163
    private void doSelectExpression() {
164
        I18nManager i18n = ToolsLocator.getI18nManager();
165
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
166

    
167
        Expression theValue = this.get();
168
        JExpressionBuilder panel = this.manager.createJExpressionBuilder(config);
169
        panel.copyConfigFrom(this);
170
        panel.setExpression(theValue);
171
        
172
        Dialog dialog = windowManager.createDialog(
173
                panel.asJComponent(),
174
                i18n.getTranslation("_Expression_builder"),
175
                null, 
176
                WindowManager_v2.BUTTONS_OK_CANCEL
177
        );
178
        dialog.show(WindowManager.MODE.DIALOG);
179
        if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
180
            this.set(panel.getExpression());
181
            fireChangeEvent();
182
        }
183
    }
184
    
185
    @Override
186
    public Expression get() {
187
        Expression expression = this.getWithOutHistory();
188
        ExpressionEvaluatorManager theManager = ExpressionEvaluatorLocator.getManager();
189
        if (expression != null && !expression.isEmpty()) {
190
            theManager.getHistory().add(expression);
191
        }
192
        return expression;
193
    }
194
    
195
    @Override
196
    public Expression getWithOutHistory() {
197
        String s = this.text.getText();
198
        if( this.returnNullWhenEmptyExpression ) {
199
            if( ExpressionUtils.isEmpty(this.value) &&  StringUtils.isBlank(s) ) {
200
                return null;
201
            }
202
        }
203
        if( this.value == null ) {
204
            this.value = ExpressionEvaluatorLocator.getManager().createExpression();
205
        }
206
        this.value.setPhrase(StringUtils.defaultIfBlank(this.text.getText(),null));
207
        return this.value;
208
    }
209

    
210
    @Override
211
    public void set(Expression value) {
212
        if( value==null ) {
213
            this.text.setText("");
214
            this.value = null;
215
            this.returnNullWhenEmptyExpression = true;
216
        } else {
217
            this.value = value;
218
            this.text.setText(this.value.getPhrase());
219
            this.returnNullWhenEmptyExpression = false;
220
        }
221
    }
222
    
223
    public void set(String phrase) {
224
        if(this.value!=null) {
225
            this.value.setPhrase(phrase);
226
        }
227
    }
228

    
229
    @Override
230
    public boolean isEmpty() {
231
        boolean empty = StringUtils.isBlank(this.text.getText());
232
        return empty;
233
    }
234

    
235
    
236
    @Override
237
    public void coerceAndSet(Object value) {
238
        try {
239
            Coercion toExpression = ToolsLocator.getDataTypesManager().getCoercion(DataTypes.EXPRESSION);
240
            this.set((Expression) toExpression.coerce(value));
241
        } catch (CoercionException ex) {
242
            throw new IllegalArgumentException("Can't converto to color", ex);
243
        }
244
    }
245

    
246
    @Override
247
    public void setEnabled(boolean enabled) {
248
        this.text.setEnabled(enabled);
249
        this.button.setEnabled(enabled);
250
        if(this.buttonBookmarks != null){
251
            this.buttonBookmarks.setEnabled(enabled);
252
        }
253
        if(this.buttonHistory != null){
254
            this.buttonHistory.setEnabled(enabled);
255
        }
256
    }
257

    
258
    @Override
259
    public boolean isEnabled() {
260
        return this.text.isEnabled();
261
    }
262

    
263
    @Override
264
    public void setEditable(boolean editable) {
265
        super.setEditable(editable);
266
        this.text.setEditable(editable);
267
        this.button.setEnabled(editable);
268
        if(this.buttonBookmarks != null){
269
            this.buttonBookmarks.setEnabled(editable);
270
        }
271
        if(this.buttonHistory != null){
272
            this.buttonHistory.setEnabled(editable);
273
        }
274
        
275
    }
276

    
277
    @Override
278
    public Preferences getPreferences() {
279
        return this.config.getPreferences();
280
    }
281
    
282
    @Override
283
    public List<Element> getElements() {
284
        return this.config.getElements();
285
    }
286

    
287
    @Override
288
    public void addElement(Element element) {
289
        this.config.addElement(element);
290
    }
291
    
292
    @Override
293
    public Collection<SymbolTable> getSymbolTables() {
294
        return this.config.getSymbolTables();
295
    }
296

    
297
    @Override
298
    public void addSymbolTable(String name) {
299
        this.config.addSymbolTable(name);
300
    }
301
    
302
    @Override
303
    public void addSymbolTable(SymbolTable symbolTable) {
304
        this.config.addSymbolTable(symbolTable);
305
    }
306

    
307
    @Override
308
    public void removeAllSymbolTables() {
309
        this.config.removeAllSymbolTables();
310
    }
311

    
312
    @Override
313
    public void removeSymbolTable(String name) {
314
        this.config.removeSymbolTable(name);
315
    }
316

    
317
    @Override
318
    public SymbolTable getPreviewSymbolTable() {
319
        return this.config.getPreviewSymbolTable();
320
    }
321

    
322
    @Override
323
    public void setPreviewSymbolTable(SymbolTable symbolTable) {
324
        this.config.setPreviewSymbolTable(symbolTable);
325
    }
326

    
327
    @Override
328
    public Object getProperty(String name) {
329
        return this.config.getProperty(name);
330
    }
331

    
332
    @Override
333
    public void setProperty(String name, Object value) {
334
        this.config.setProperty(name, value);
335
    }
336

    
337
    @Override
338
    public Map<String, Object> getProperties() {
339
        return this.config.getProperties();
340
    }
341

    
342
    @Override
343
    public boolean allowAggregates() {
344
      return this.config.allowAggregates();
345
    }
346

    
347
    @Override
348
    public boolean allowAggregates(boolean allow) {
349
      return this.config.allowAggregates(allow);
350
    }
351

    
352
    @Override
353
    public java.util.function.Function<String, Integer> isFunctionAllowed() {
354
      return this.config.isFunctionAllowed();
355
    }
356

    
357
    @Override
358
    public void setAllowedFunctions(java.util.function.Function<String, Integer> allow) {
359
      this.config.setAllowedFunctions(allow);
360
    }
361

    
362
    @Override
363
    public void addSuggestionFactory(Factory factory) {
364
      this.config.addSuggestionFactory(factory);
365
    }
366

    
367
    @Override
368
    public String getSuggestion(Expression expression) {
369
      return this.config.getSuggestion(expression);
370
    }
371

    
372
    @Override
373
    public void copyConfigFrom(ExpressionBuilderConfig other) {
374
      this.config.copyConfigFrom(other);
375
    }
376

    
377
    @Override
378
    public Function<String, Integer> getAllowedFunctions() {
379
      return this.config.getAllowedFunctions();
380
    }
381

    
382
    @Override
383
    public Collection<Factory> getSuggestionFactories() {
384
      return this.config.getSuggestionFactories();
385
    }
386

    
387
    @Override
388
    public void removeAllElements() {
389
      this.config.removeAllElements();
390
    }
391
    
392
}