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

View differences:

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