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

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

    
43
/**
44
 *
45
 * @author jjdelcerro
46
 */
47
public class DefaultExpressionPickerController 
48
        extends AbstractPickerController<Expression>
49
        implements ExpressionPickerController 
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 final JButton button;
63
    private final JTextComponent text;
64
    private Expression value;
65
    private final ExpressionBuilderConfig config;
66
    private final ExpressionEvaluatorSwingManager manager;
67
    private final ActionListener buttonAction;
68
    private final JMenuItem menuItem;
69
    private final AbstractAutomaticExpressionChecker automaticExpressionChecker;
70
    private boolean returnNullWhenEmptyExpression;
71
    private final HistoryController<Expression> historyController;
72
    private final BookmarksController<Expression> bookmarksController;
73
    
74
    public DefaultExpressionPickerController(ExpressionEvaluatorSwingManager manager, 
75
            JTextComponent text, 
76
            JButton button,
77
            JButton btnHistory,
78
            JButton btnBookmarks
79
        ) {
80
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
81
        I18nManager i18n = ToolsLocator.getI18nManager();
82

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

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

    
130
        this.automaticExpressionChecker = new AbstractAutomaticExpressionChecker(config, text) {
131
            @Override
132
            protected Expression getExpression() {
133
                return getWithOutHistory();
134
            }
135
        };
136
    }
137
    
138
    private void doSelectExpression() {
139
        I18nManager i18n = ToolsLocator.getI18nManager();
140
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
141

    
142
        Expression theValue = this.get();
143
        DefaultJExpressionBuilder panel = new DefaultJExpressionBuilder(this.manager, this.config);
144
        panel.setPreviewSymbolTable(this.getPreviewSymbolTable());
145
        panel.setExpression(theValue);
146
        
147
        Dialog dialog = windowManager.createDialog(
148
                panel.asJComponent(),
149
                i18n.getTranslation("_Expression_builder"),
150
                null, 
151
                WindowManager_v2.BUTTONS_OK_CANCEL
152
        );
153
        dialog.show(WindowManager.MODE.DIALOG);
154
        if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
155
            this.set(panel.getExpression());
156
        }
157
    }
158
    
159
    @Override
160
    public Expression get() {
161
        Expression expression = this.getWithOutHistory();
162
        ExpressionEvaluatorManager theManager = ExpressionEvaluatorLocator.getManager();
163
        if (expression != null && !expression.isEmpty()) {
164
            theManager.getHistory().add(expression);
165
        }
166
        return expression;
167
    }
168
    
169
    @Override
170
    public Expression getWithOutHistory() {
171
        String s = this.text.getText();
172
        if( this.returnNullWhenEmptyExpression ) {
173
            if( ExpressionUtils.isEmpty(this.value) &&  StringUtils.isBlank(s) ) {
174
                return null;
175
            }
176
        }
177
        if( this.value == null ) {
178
            this.value = ExpressionEvaluatorLocator.getManager().createExpression();
179
        }
180
        this.value.setPhrase(StringUtils.defaultIfBlank(this.text.getText(),null));
181
        return this.value;
182
    }
183

    
184
    @Override
185
    public void set(Expression value) {
186
        if( value==null ) {
187
            this.text.setText("");
188
            this.value = null;
189
            this.returnNullWhenEmptyExpression = true;
190
        } else {
191
            this.value = value;
192
            this.text.setText(this.value.getPhrase());
193
            this.returnNullWhenEmptyExpression = false;
194
        }
195
    }
196

    
197
    @Override
198
    public boolean isEmpty() {
199
        boolean empty = StringUtils.isBlank(this.text.getText());
200
        return empty;
201
    }
202

    
203
    
204
    @Override
205
    public void coerceAndSet(Object value) {
206
        try {
207
            Coercion toExpression = ToolsLocator.getDataTypesManager().getCoercion(DataTypes.EXPRESSION);
208
            this.set((Expression) toExpression.coerce(value));
209
        } catch (CoercionException ex) {
210
            throw new IllegalArgumentException("Can't converto to color", ex);
211
        }
212
    }
213

    
214
    @Override
215
    public void setEnabled(boolean enabled) {
216
        this.text.setEnabled(enabled);
217
        this.button.setEnabled(enabled);
218
    }
219

    
220
    @Override
221
    public boolean isEnabled() {
222
        return this.text.isEnabled();
223
    }
224

    
225
    @Override
226
    public void setEditable(boolean editable) {
227
        super.setEditable(editable);
228
        this.text.setEditable(editable);
229
        this.button.setEnabled(editable);
230
    }
231

    
232
    @Override
233
    public Preferences getPreferences() {
234
        return this.config.getPreferences();
235
    }
236
    
237
    @Override
238
    public List<Element> getElements() {
239
        return this.config.getElements();
240
    }
241

    
242
    @Override
243
    public void addElement(Element element) {
244
        this.config.addElement(element);
245
    }
246
    
247
    @Override
248
    public Collection<SymbolTable> getSymbolTables() {
249
        return this.config.getSymbolTables();
250
    }
251

    
252
    @Override
253
    public void addSymbolTable(String name) {
254
        this.config.addSymbolTable(name);
255
    }
256
    
257
    @Override
258
    public void addSymbolTable(SymbolTable symbolTable) {
259
        this.config.addSymbolTable(symbolTable);
260
    }
261

    
262
    @Override
263
    public void removeAllSymbolTables() {
264
        this.config.removeAllSymbolTables();
265
    }
266

    
267
    @Override
268
    public void removeSymbolTable(String name) {
269
        this.config.removeSymbolTable(name);
270
    }
271

    
272
    @Override
273
    public SymbolTable getPreviewSymbolTable() {
274
        return this.config.getPreviewSymbolTable();
275
    }
276

    
277
    @Override
278
    public void setPreviewSymbolTable(SymbolTable symbolTable) {
279
        this.config.setPreviewSymbolTable(symbolTable);
280
    }
281

    
282
    @Override
283
    public Object getProperty(String name) {
284
        return this.config.getProperty(name);
285
    }
286

    
287
    @Override
288
    public void setProperty(String name, Object value) {
289
        this.config.setProperty(name, value);
290
    }
291

    
292
    @Override
293
    public Map<String, Object> getProperties() {
294
        return this.config.getProperties();
295
    }
296
}