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 | 43939 | jjdelcerro | |
---|---|---|---|
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 | 43970 | jjdelcerro | private final GroupElement root; |
40 | 43939 | jjdelcerro | |
41 | 43970 | jjdelcerro | public ElementsTreeModel(GroupElement root) {
|
42 | 43939 | jjdelcerro | this.root = root;
|
43 | } |
||
44 | |||
45 | @Override
|
||
46 | public Object getRoot() { |
||
47 | return this.root; |
||
48 | } |
||
49 | |||
50 | 43970 | jjdelcerro | private List<Element> getChilds(final GroupElement node) { |
51 | 43939 | jjdelcerro | 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 | 43970 | jjdelcerro | TreeModel model = new ElementsTreeModel( |
109 | this.manager.createGroup("Elements", this.getElements()) |
||
110 | ); |
||
111 | 43939 | jjdelcerro | 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 | } |