Revision 43987 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
DefaultJExpressionBuilder.java | ||
---|---|---|
5 | 5 |
import java.awt.Dimension; |
6 | 6 |
import java.awt.event.ActionEvent; |
7 | 7 |
import java.awt.event.ActionListener; |
8 |
import java.awt.event.KeyAdapter; |
|
8 | 9 |
import java.awt.event.KeyEvent; |
9 | 10 |
import java.awt.event.KeyListener; |
11 |
import java.awt.event.MouseAdapter; |
|
12 |
import java.awt.event.MouseEvent; |
|
10 | 13 |
import java.net.URL; |
11 | 14 |
import java.util.ArrayList; |
12 | 15 |
import java.util.Collection; |
13 | 16 |
import java.util.Date; |
17 |
import java.util.HashSet; |
|
14 | 18 |
import java.util.List; |
15 | 19 |
import java.util.Objects; |
16 | 20 |
import javax.swing.DefaultListCellRenderer; |
... | ... | |
18 | 22 |
import javax.swing.JComponent; |
19 | 23 |
import javax.swing.JLabel; |
20 | 24 |
import javax.swing.JList; |
25 |
import javax.swing.JOptionPane; |
|
21 | 26 |
import javax.swing.JTree; |
22 | 27 |
import javax.swing.SwingUtilities; |
23 | 28 |
import javax.swing.event.ListSelectionEvent; |
24 | 29 |
import javax.swing.event.ListSelectionListener; |
30 |
import javax.swing.event.TreeModelEvent; |
|
25 | 31 |
import javax.swing.event.TreeModelListener; |
26 | 32 |
import javax.swing.event.TreeSelectionEvent; |
27 | 33 |
import javax.swing.event.TreeSelectionListener; |
... | ... | |
51 | 57 |
import org.gvsig.tools.swing.api.ToolsSwingManager; |
52 | 58 |
import org.gvsig.tools.swing.api.pickercontroller.PickerController; |
53 | 59 |
import org.gvsig.tools.swing.api.script.ScriptSwingManager; |
60 |
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager; |
|
54 | 61 |
import org.gvsig.tools.swing.icontheme.IconTheme; |
55 | 62 |
|
56 | 63 |
/** |
... | ... | |
67 | 74 |
private ScriptSwingManager.ScriptEditor scriptEditor; |
68 | 75 |
|
69 | 76 |
private final ExpressionBuilderConfig config; |
77 |
private ElementsTreeModel treeModel; |
|
70 | 78 |
|
71 | 79 |
private class ElementsTreeModel implements TreeModel { |
72 | 80 |
|
73 | 81 |
private final GroupElement root; |
82 |
private final HashSet<TreeModelListener> listeners; |
|
74 | 83 |
|
75 | 84 |
public ElementsTreeModel(GroupElement root) { |
76 | 85 |
this.root = root; |
86 |
this.listeners = new HashSet<>(); |
|
77 | 87 |
} |
78 | 88 |
|
79 | 89 |
@Override |
... | ... | |
81 | 91 |
return this.root; |
82 | 92 |
} |
83 | 93 |
|
94 |
public void reload() { |
|
95 |
this.reload(this.root); |
|
96 |
this.fireTreeChanged(); |
|
97 |
} |
|
98 |
|
|
99 |
private void reload(Element element) { |
|
100 |
if (element instanceof Element) { |
|
101 |
if (element instanceof GroupElement) { |
|
102 |
reload(element); |
|
103 |
} |
|
104 |
element.reload(); |
|
105 |
} |
|
106 |
} |
|
107 |
|
|
84 | 108 |
private List<Element> getChilds(final GroupElement node) { |
85 | 109 |
List<Element> x = new ArrayList<>(); |
86 | 110 |
for (Element element : node.getElements()) { |
... | ... | |
125 | 149 |
|
126 | 150 |
@Override |
127 | 151 |
public void addTreeModelListener(TreeModelListener l) { |
152 |
this.listeners.add(l); |
|
128 | 153 |
} |
129 | 154 |
|
130 | 155 |
@Override |
131 | 156 |
public void removeTreeModelListener(TreeModelListener l) { |
157 |
this.listeners.remove(l); |
|
132 | 158 |
} |
133 | 159 |
|
160 |
protected void fireTreeChanged() { |
|
161 |
for (TreeModelListener listener : listeners) { |
|
162 |
TreeModelEvent e = new TreeModelEvent(this, new Object[] {this.root}); |
|
163 |
listener.treeNodesChanged(e); |
|
164 |
} |
|
165 |
} |
|
134 | 166 |
} |
135 | 167 |
|
136 | 168 |
public DefaultJExpressionBuilder(ExpressionEvaluatorSwingManager manager, ExpressionBuilderConfig config) { |
... | ... | |
246 | 278 |
} |
247 | 279 |
} |
248 | 280 |
}); |
281 |
this.lstSimpleElement.addMouseListener(new MouseAdapter() { |
|
282 |
@Override |
|
283 |
public void mouseClicked(MouseEvent e) { |
|
284 |
if( e.getButton()==MouseEvent.BUTTON1 && e.getClickCount()==2 ) { |
|
285 |
ListElement<SimpleElement> element = (ListElement<SimpleElement>) lstSimpleElement.getSelectedValue(); |
|
286 |
if (element != null) { |
|
287 |
doSelectElement(element.getValue()); |
|
288 |
doInsert(element.getValue()); |
|
289 |
} |
|
290 |
} |
|
291 |
} |
|
292 |
}); |
|
293 |
this.lstSimpleElement.addKeyListener(new KeyAdapter() { |
|
294 |
@Override |
|
295 |
public void keyReleased(KeyEvent e) { |
|
296 |
if( e.getKeyCode()==KeyEvent.VK_ENTER ) { |
|
297 |
ListElement<SimpleElement> element = (ListElement<SimpleElement>) lstSimpleElement.getSelectedValue(); |
|
298 |
if (element != null) { |
|
299 |
doSelectElement(element.getValue()); |
|
300 |
doInsert(element.getValue()); |
|
301 |
} |
|
302 |
} |
|
303 |
} |
|
304 |
|
|
305 |
@Override |
|
306 |
public void keyTyped(KeyEvent e) { |
|
307 |
if( e.getKeyCode()==KeyEvent.VK_ENTER ) { |
|
308 |
ListElement<SimpleElement> element = (ListElement<SimpleElement>) lstSimpleElement.getSelectedValue(); |
|
309 |
if (element != null) { |
|
310 |
doSelectElement(element.getValue()); |
|
311 |
doInsert(element.getValue()); |
|
312 |
} |
|
313 |
} |
|
314 |
} |
|
315 |
}); |
|
316 |
this.btnSimpleElementTimeLimit.addActionListener(new ActionListener() { |
|
317 |
@Override |
|
318 |
public void actionPerformed(ActionEvent e) { |
|
319 |
doSetTimeLimit(); |
|
320 |
} |
|
321 |
}); |
|
249 | 322 |
this.btnSimpleElementSortDown.addActionListener(new ActionListener() { |
250 | 323 |
@Override |
251 | 324 |
public void actionPerformed(ActionEvent e) { |
... | ... | |
260 | 333 |
model.sort(true); |
261 | 334 |
} |
262 | 335 |
}); |
263 |
this.txtSimpleElementFilter.addKeyListener(new KeyListener() {
|
|
336 |
this.txtSimpleElementFilter.addKeyListener(new KeyAdapter() {
|
|
264 | 337 |
@Override |
265 | 338 |
public void keyTyped(KeyEvent e) { |
266 | 339 |
if (e.getKeyChar() == '\n') { |
267 | 340 |
doFilter(); |
268 | 341 |
} |
269 | 342 |
} |
270 |
|
|
271 |
@Override |
|
272 |
public void keyPressed(KeyEvent e) { |
|
273 |
} |
|
274 |
|
|
275 |
@Override |
|
276 |
public void keyReleased(KeyEvent e) { |
|
277 |
} |
|
278 | 343 |
}); |
279 | 344 |
this.btnAdd.addActionListener(new ActionListener() { |
280 | 345 |
@Override |
... | ... | |
335 | 400 |
this.pnlScriptEditorContainer.add(this.scriptEditor.asJComponent(), BorderLayout.CENTER); |
336 | 401 |
|
337 | 402 |
this.tabExpressionBuilder.setEnabledAt(0, this.config.getScriptsEnabled()); |
338 |
this.setPreferredSize(new Dimension(750, 500)); |
|
403 |
this.setPreferredSize(new Dimension(650, 350)); |
|
404 |
this.txtDescription.setPreferredSize(new Dimension(200,200)); |
|
339 | 405 |
} |
340 | 406 |
|
341 | 407 |
private String removeCursorMark(String s) { |
... | ... | |
388 | 454 |
html.append("<b>Value</b> NULL<br>\n"); |
389 | 455 |
} else { |
390 | 456 |
html.append("<b>Constant</b><br>\n<br>\n"); |
391 |
html.append("<b>Value</b> ").append(repr(value)).append("<br>\n<br>\n");
|
|
392 |
html.append("<b>Type</b> ").append(value.getClass().getSimpleName()).append("<br>\n<br>\n");
|
|
457 |
html.append("<b>Value</b> ").append(repr(value)).append("<br>\n"); |
|
458 |
html.append("<b>Type</b> ").append(value.getClass().getSimpleName()).append("<br>\n"); |
|
393 | 459 |
} |
394 | 460 |
|
395 | 461 |
} else if( element instanceof VariableElement ) { |
396 | 462 |
VariableElement var = (VariableElement)element; |
397 |
html.append("<b>").append(var.getLabel()).append("</b><br>\n<br>\n\n");
|
|
398 |
html.append("<b>Source</b> ").append(var.getSource()).append("<br>\n<br>\n");
|
|
399 |
html.append("<b>Name</b> ").append(var.getName()).append("<br>\n<br>\n");
|
|
400 |
html.append("<b>Type</b> ").append(var.getTypeName()).append("<br>\n<br>\n");
|
|
463 |
html.append("<b>").append(var.getLabel()).append("</b><br>\n<br>\n"); |
|
464 |
html.append("<b>Source</b> ").append(var.getSource()).append("<br>\n"); |
|
465 |
html.append("<b>Name</b> ").append(var.getName()).append("<br>\n"); |
|
466 |
html.append("<b>Type</b> ").append(var.getTypeName()).append("<br>\n"); |
|
401 | 467 |
|
402 | 468 |
} else if( element instanceof FunctionElement ) { |
403 | 469 |
Function function = ((FunctionElement)element).getFunction(); |
404 | 470 |
if (function == null) { |
405 | 471 |
html.append("<b>Function</b> ").append(element.getName()).append("<br>\n<br>\n"); |
406 | 472 |
html.append("<b>Return</b> Object<br>\n<br>\n"); |
407 |
html.append("<b>Template:</b> ").append(element.getName()).append("()<br>\n<br>\n");
|
|
473 |
html.append("<b>Template:</b> ").append(element.getName()).append("()<br>\n"); |
|
408 | 474 |
} else { |
409 | 475 |
html.append("<b>Function</b> ").append(element.getName()).append("<br>\n<br>\n"); |
410 | 476 |
html.append("<b>Return</b> "); |
411 | 477 |
html.append(StringUtils.isEmpty(function.returnType())?"Objec": function.returnType()); |
412 |
html.append("<br>\n<br>\n");
|
|
478 |
html.append("<br>\n"); |
|
413 | 479 |
html.append("<b>Template</b> "); |
414 | 480 |
html.append(StringUtils.isEmpty(function.template())?element.getName()+"()": removeCursorMark(function.template())); |
415 |
html.append("<br>\n<br>\n");
|
|
481 |
html.append("<br>\n"); |
|
416 | 482 |
|
417 | 483 |
String[] args = function.descriptionArgs(); |
418 | 484 |
if (args != null) { |
... | ... | |
426 | 492 |
} |
427 | 493 |
} else { |
428 | 494 |
html.append("<b>Generic element<br>\n<br>\n"); |
429 |
html.append("<b>Name</b> ").append(element.getName()).append("</br>\n</br>\n");
|
|
495 |
html.append("<b>Name</b> ").append(element.getName()).append("</br>\n"); |
|
430 | 496 |
|
431 | 497 |
} |
432 | 498 |
|
... | ... | |
548 | 614 |
} |
549 | 615 |
|
550 | 616 |
@Override |
617 |
public void addSymbolTable(String name) { |
|
618 |
this.config.addSymbolTable(name); |
|
619 |
} |
|
620 |
|
|
621 |
@Override |
|
551 | 622 |
public void addSymbolTable(SymbolTable symbolTable) { |
552 | 623 |
this.config.addSymbolTable(symbolTable); |
553 | 624 |
} |
... | ... | |
575 | 646 |
|
576 | 647 |
@Override |
577 | 648 |
public JComponent asJComponent() { |
578 |
TreeModel model = new ElementsTreeModel( |
|
579 |
this.manager.createGroupElement("Elements", this.getElements()) |
|
580 |
); |
|
581 |
this.treeElements.setModel(model); |
|
649 |
if( this.treeModel == null ) { |
|
650 |
this.treeModel = new ElementsTreeModel( |
|
651 |
this.manager.createGroupElement("_Elements", this.getElements()) |
|
652 |
); |
|
653 |
this.treeElements.setModel(this.treeModel); |
|
654 |
} |
|
582 | 655 |
return this; |
583 | 656 |
} |
584 | 657 |
|
... | ... | |
597 | 670 |
|
598 | 671 |
} |
599 | 672 |
|
673 |
private void doSetTimeLimit() { |
|
674 |
ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager(); |
|
675 |
String s = dialogs.inputDialog( |
|
676 |
"Indicate the time limit in seconds for calculating the elements", |
|
677 |
"Time limit", |
|
678 |
JOptionPane.QUESTION_MESSAGE, |
|
679 |
String.valueOf(this.config.getSimpleElementsLimit()) |
|
680 |
); |
|
681 |
if( StringUtils.isBlank(s) ) { |
|
682 |
return; |
|
683 |
} |
|
684 |
try { |
|
685 |
int n = Integer.parseInt(s); |
|
686 |
this.config.setSimpleElementsLimit(n); |
|
687 |
this.treeModel.reload(); |
|
688 |
} catch(Exception ex) { |
|
689 |
dialogs.messageDialog( |
|
690 |
"Invalid time limit '"+s+"'.", |
|
691 |
"Time limit", |
|
692 |
JOptionPane.WARNING_MESSAGE |
|
693 |
); |
|
694 |
} |
|
695 |
} |
|
600 | 696 |
} |
Also available in: Unified diff