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 / DefaultJExpressionBuilder.java @ 43970

History | View | Annotate | Download (9.76 KB)

1

    
2
package org.gvsig.expressionevaluator.swing.impl;
3

    
4
import java.awt.event.ActionEvent;
5
import java.awt.event.ActionListener;
6
import java.util.List;
7
import javax.swing.DefaultListModel;
8
import javax.swing.JComponent;
9
import javax.swing.SwingUtilities;
10
import javax.swing.event.ListSelectionEvent;
11
import javax.swing.event.ListSelectionListener;
12
import javax.swing.event.TreeModelListener;
13
import javax.swing.event.TreeSelectionEvent;
14
import javax.swing.event.TreeSelectionListener;
15
import javax.swing.tree.TreeModel;
16
import javax.swing.tree.TreePath;
17
import org.apache.commons.lang3.StringUtils;
18
import org.gvsig.expressionevaluator.Function;
19
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
20
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
21
import org.gvsig.tools.swing.api.ListElement;
22
import org.gvsig.tools.swing.api.ToolsSwingLocator;
23
import org.gvsig.tools.swing.api.ToolsSwingManager;
24

    
25
/**
26
 *
27
 * @author jjdelcerro
28
 */
29
public class DefaultJExpressionBuilder
30
        extends DefaultJExpressionBuilderView
31
        implements JExpressionBuilder {
32

    
33
    private final ExpressionEvaluatorSwingManager manager;
34
    private List<Element> elements;
35
    private GroupElement currentGroup;
36
    
37
    private class ElementsTreeModel implements TreeModel {
38

    
39
        private final GroupElement root;
40
        
41
        public ElementsTreeModel(GroupElement root) {
42
            this.root = root;
43
        }
44
        
45
        @Override
46
        public Object getRoot() {
47
            return this.root;
48
        }
49

    
50
        private List<Element> getChilds(final GroupElement node) {
51
            return node.getElements();
52
        }
53
        
54
        @Override
55
        public Object getChild(Object parent, int index) {
56
            List<Element> childs = getChilds((DefaultGroupElement)parent);
57
            return childs.get(index);
58
        }
59

    
60
        @Override
61
        public int getChildCount(Object parent) {
62
            List<Element> childs = getChilds((DefaultGroupElement)parent);
63
            return childs.size();
64
        }
65

    
66
        @Override
67
        public boolean isLeaf(Object node) {
68
            boolean leaf = node instanceof SimpleElement;
69
            return leaf;
70
        }
71

    
72
        @Override
73
        public void valueForPathChanged(TreePath path, Object newValue) {
74
        }
75

    
76
        @Override
77
        public int getIndexOfChild(Object parent, Object child) {
78
            List<Element> childs = getChilds((DefaultGroupElement)parent);
79
            int n = childs.indexOf(child);
80
            return n;
81
        }
82

    
83
        @Override
84
        public void addTreeModelListener(TreeModelListener l) {
85
        }
86

    
87
        @Override
88
        public void removeTreeModelListener(TreeModelListener l) {
89
        }
90
                
91
    }
92
    
93
    
94
    public DefaultJExpressionBuilder(ExpressionEvaluatorSwingManager manager) {
95
        this.manager = manager;
96
        this.initComponents();
97
    }
98

    
99
    private void initComponents() {
100
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
101
        
102
        toolsSwingManager.setDefaultPopupMenu(this.txtExpression);
103
        toolsSwingManager.setDefaultPopupMenu(this.txtGroupElement);
104
        toolsSwingManager.setDefaultPopupMenu(this.txtSimpleElementFilter);
105
        toolsSwingManager.setDefaultPopupMenu(this.txtDescription);
106
        toolsSwingManager.addClearButton(this.txtSimpleElementFilter);
107
        
108
        TreeModel model = new ElementsTreeModel(
109
                this.manager.createGroup("Elements", this.getElements())
110
        );
111
        this.treeElements.setModel(model);
112
        this.treeElements.addTreeSelectionListener(new TreeSelectionListener() {
113
            @Override
114
            public void valueChanged(TreeSelectionEvent e) {
115
                TreePath path = e.getPath();
116
                Element element = (Element) path.getLastPathComponent();
117
                if( element instanceof GroupElement) {
118
                    updateSimpleElementsList((GroupElement)element);
119
                }
120
            }
121
        });
122
        this.btnGroupElementInsert.addActionListener(new ActionListener() {
123
            @Override
124
            public void actionPerformed(ActionEvent e) {
125
                doInsert(txtGroupElement.getText());
126
            }
127
        });
128
        this.btnSimpleElementInsert.addActionListener(new ActionListener() {
129
            @Override
130
            public void actionPerformed(ActionEvent e) {
131
                SimpleElement element = (SimpleElement) lstSimpleElement.getSelectedValue();
132
                doInsert(element);
133
            }
134
        });
135
        this.btnSimpleElementFilter.addActionListener(new ActionListener() {
136
            @Override
137
            public void actionPerformed(ActionEvent e) {
138
                doFilter();
139
            }
140
        });
141
        this.lstSimpleElement.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
142
            @Override
143
            public void valueChanged(ListSelectionEvent e) {
144
                SimpleElement element = (SimpleElement) lstSimpleElement.getSelectedValue();
145
                doSelectElement(element);
146
            }
147
        });
148
        this.btnSimpleElementSortDown.addActionListener(new ActionListener() {
149
            @Override
150
            public void actionPerformed(ActionEvent e) {
151
                FilteredListModel model = (FilteredListModel) lstSimpleElement.getModel();
152
                model.sort(true);
153
            }
154
        });
155
        this.btnSimpleElementSortUp.addActionListener(new ActionListener() {
156
            @Override
157
            public void actionPerformed(ActionEvent e) {
158
                FilteredListModel model = (FilteredListModel) lstSimpleElement.getModel();
159
                model.sort(false);
160
            }
161
        });
162
    }
163
    
164
    private void doInsert(String s) {
165
        this.txtExpression.insert(s, this.txtExpression.getCaretPosition());
166
    }
167
    
168
    private void doInsert(SimpleElement element) {
169
        Function function = element.getFunction();
170
        if( function == null ) {
171
            doInsert(element.getName());
172
        } else {
173
            doInsert(function.template());
174
        }
175
    }
176
    
177
    private void doFilter() {
178
        FilteredListModel model = (FilteredListModel) this.lstSimpleElement.getModel();
179
        model.setFilter(this.txtSimpleElementFilter.getText());
180
    }
181
    
182
    private void doSelectElement(SimpleElement element) {
183
        StringBuilder html = new StringBuilder();
184
        html.append("<html>\n");
185
        html.append("<h1>").append(element.getName()).append("</h1>\n");
186
        Function function = element.getFunction();
187
        if( function != null ) {
188
                if( StringUtils.isEmpty(function.returnType()) ) {
189
                    html.append("<b>return</b> ").append(function.returnType()).append("<br>\n");
190
                }
191
                String[] args = function.descriptionArgs();
192
                if( args!=null ) {
193
                    html.append("<b>Arguments:</b> ").append("<ul>\n");
194
                    for (String arg : args) {
195
                        html.append("<li>").append(arg).append("</li>\n");
196
                    }
197
                    html.append("</ul>\n");
198
                    html.append("<br>\n");
199
                }
200
                if( StringUtils.isEmpty(function.template()) ) {
201
                    html.append("<b>Template:</b> ").append(function.template()).append("<br>\n");
202
                }
203
        }
204
        html.append(element.getDescription().replace("\n", "<br>")).append("<br>\n");
205
        html.append("</html>\n");
206
        this.txtDescription.setText(html.toString());
207
    }
208
    
209
    private void updateSimpleElementsList(GroupElement group) {
210
        FilteredListModel model = new FilteredListModel();
211
        model.addElement("Loading...");
212
        this.currentGroup = group;
213
        this.txtGroupElement.setText(group.getName());
214
        if( group instanceof SimpleElement ) {
215
            this.btnGroupElementInsert.setEnabled(true);
216
        } else {
217
            this.btnGroupElementInsert.setEnabled(false);
218
        }
219
        this.lstSimpleElement.setEnabled(false);
220
        this.lstSimpleElement.setModel(model);
221
        
222
        Thread th = new Thread(new Runnable() {
223
            @Override
224
            public void run() {
225
                simpleElementsUpdater();
226
            }
227
        }, "ExpressionBuilderSimpleElementsUpdater");
228
        th.start();
229
    }
230

    
231
    private void simpleElementsUpdater() {
232
        final GroupElement group = this.currentGroup;
233
        final DefaultListModel model = new DefaultListModel();
234
        for (Element child : group) {
235
            if( group != this.currentGroup ) {
236
                return;
237
            }
238
            String label = child.getName();
239
            if( child instanceof SimpleElement ) {
240
                Function function = ((SimpleElement) child).getFunction();
241
                if( function != null && StringUtils.isEmpty(function.returnType()) ) {
242
                    label = "<html><b>"  + label + "</b> return " + function.returnType() + "</html>";
243
                }
244
            }
245
            model.addElement(new ListElement<>(label,child));
246
        }
247
        SwingUtilities.invokeLater(new Runnable() {
248
            @Override
249
            public void run() {
250
                if( group != currentGroup ) {
251
                    return;
252
                }
253
                lstSimpleElement.setEnabled(true);
254
                lstSimpleElement.setModel(model);
255
            }
256
        });
257
        
258
    }
259
    
260
    @Override
261
    public String getExpression() {
262
        String expression = this.txtExpression.getText();
263
        if( StringUtils.isEmpty(expression) ) {
264
            return null;
265
        }
266
        return expression;
267
    }
268

    
269
    @Override
270
    public List<Element> getElements() {
271
        if( this.elements == null ) {
272
            this.elements = manager.getElements();
273
        }
274
        return elements;
275
    }
276
    
277
    @Override
278
    public JComponent asJComponent() {
279
        return this;
280
    }
281
    
282
}