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

History | View | Annotate | Download (26.2 KB)

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

    
3
import java.awt.BorderLayout;
4
import java.awt.Component;
5
import java.awt.Dimension;
6
import java.awt.event.ActionEvent;
7
import java.awt.event.ActionListener;
8
import java.awt.event.KeyAdapter;
9
import java.awt.event.KeyEvent;
10
import java.awt.event.KeyListener;
11
import java.awt.event.MouseAdapter;
12
import java.awt.event.MouseEvent;
13
import java.net.URL;
14
import java.util.ArrayList;
15
import java.util.Collection;
16
import java.util.Date;
17
import java.util.HashSet;
18
import java.util.List;
19
import java.util.Objects;
20
import javax.swing.DefaultListCellRenderer;
21
import javax.swing.ImageIcon;
22
import javax.swing.JComponent;
23
import javax.swing.JLabel;
24
import javax.swing.JList;
25
import javax.swing.JOptionPane;
26
import javax.swing.JTree;
27
import javax.swing.SwingUtilities;
28
import javax.swing.event.ListSelectionEvent;
29
import javax.swing.event.ListSelectionListener;
30
import javax.swing.event.TreeModelEvent;
31
import javax.swing.event.TreeModelListener;
32
import javax.swing.event.TreeSelectionEvent;
33
import javax.swing.event.TreeSelectionListener;
34
import javax.swing.tree.DefaultTreeCellRenderer;
35
import javax.swing.tree.TreeModel;
36
import javax.swing.tree.TreePath;
37
import org.apache.commons.io.FilenameUtils;
38
import org.apache.commons.lang3.StringUtils;
39
import org.apache.commons.lang.StringEscapeUtils;
40
import org.gvsig.expressionevaluator.Expression;
41
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
42
import org.gvsig.expressionevaluator.Function;
43
import org.gvsig.expressionevaluator.SymbolTable;
44
import org.gvsig.expressionevaluator.swing.Element;
45
import org.gvsig.expressionevaluator.swing.Element.ConstantElement;
46
import org.gvsig.expressionevaluator.swing.Element.FunctionElement;
47
import org.gvsig.expressionevaluator.swing.Element.GroupElement;
48
import org.gvsig.expressionevaluator.swing.Element.SimpleElement;
49
import org.gvsig.expressionevaluator.swing.Element.VariableElement;
50
import org.gvsig.expressionevaluator.swing.ExpressionBuilderConfig;
51
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
52
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
53
import org.gvsig.tools.ToolsLocator;
54
import org.gvsig.tools.script.Script;
55
import org.gvsig.tools.swing.api.ListElement;
56
import org.gvsig.tools.swing.api.ToolsSwingLocator;
57
import org.gvsig.tools.swing.api.ToolsSwingManager;
58
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
59
import org.gvsig.tools.swing.api.script.ScriptSwingManager;
60
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
61
import org.gvsig.tools.swing.icontheme.IconTheme;
62

    
63
/**
64
 *
65
 * @author jjdelcerro
66
 */
67
public class DefaultJExpressionBuilder
68
        extends DefaultJExpressionBuilderView
69
        implements JExpressionBuilder {
70

    
71
    private final ExpressionEvaluatorSwingManager manager;
72
    private GroupElement currentGroup;
73
    private PickerController<List<Script>> scriptPicker;
74
    private ScriptSwingManager.ScriptEditor scriptEditor;
75
    
76
    private final ExpressionBuilderConfig config;
77
    private ElementsTreeModel treeModel;
78
    
79
    private class ElementsTreeModel implements TreeModel {
80

    
81
        private final GroupElement root;
82
        private final HashSet<TreeModelListener> listeners;
83

    
84
        public ElementsTreeModel(GroupElement root) {
85
            this.root = root;
86
            this.listeners = new HashSet<>();
87
        }
88

    
89
        @Override
90
        public Object getRoot() {
91
            return this.root;
92
        }
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
        
108
        private List<Element> getChilds(final GroupElement node) {
109
            List<Element> x = new ArrayList<>();
110
            for (Element element : node.getElements()) {
111
                if (element instanceof GroupElement) {
112
                    x.add(element);
113
                }
114
            }
115
            return x; //node.getElements();
116
        }
117

    
118
        @Override
119
        public Object getChild(Object parent, int index) {
120
            List<Element> childs = getChilds((GroupElement) parent);
121
            Element child = childs.get(index);
122
            return child;
123
        }
124

    
125
        @Override
126
        public int getChildCount(Object parent) {
127
            List<Element> childs = getChilds((GroupElement) parent);
128
            return childs.size();
129
        }
130

    
131
        @Override
132
        public boolean isLeaf(Object node) {
133
            if( node instanceof GroupElement ) {
134
                return !((GroupElement) node).hasSubgroups();
135
            }
136
            return false;
137
        }
138

    
139
        @Override
140
        public void valueForPathChanged(TreePath path, Object newValue) {
141
        }
142

    
143
        @Override
144
        public int getIndexOfChild(Object parent, Object child) {
145
            List<Element> childs = getChilds((GroupElement) parent);
146
            int n = childs.indexOf(child);
147
            return n;
148
        }
149

    
150
        @Override
151
        public void addTreeModelListener(TreeModelListener l) {
152
            this.listeners.add(l);
153
        }
154

    
155
        @Override
156
        public void removeTreeModelListener(TreeModelListener l) {
157
            this.listeners.remove(l);
158
        }
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
        }
166
    }
167

    
168
    public DefaultJExpressionBuilder(ExpressionEvaluatorSwingManager manager, ExpressionBuilderConfig config) {
169
        this.manager = manager;
170
        this.config = new DefaultExpressionBuilderConfig(manager);
171
        this.initComponents();
172
    }
173
    
174
    @Override
175
    public ImageIcon loadImage(String imageName) {
176
        String name = FilenameUtils.getBaseName(imageName);
177
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
178
        if (theme.exists(name)) {
179
            return theme.get(name);
180
        }
181
        URL url = this.getClass().getResource(name + ".png");
182
        if (url == null) {
183
            return null;
184
        }
185
        return new ImageIcon(url);
186
    }
187

    
188
    private void initComponents() {
189
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
190
        final IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
191
        
192
        toolsSwingManager.setDefaultPopupMenu(this.txtExpression);
193
        toolsSwingManager.setDefaultPopupMenu(this.txtGroupElement);
194
        toolsSwingManager.setDefaultPopupMenu(this.txtSimpleElementFilter);
195
        toolsSwingManager.setDefaultPopupMenu(this.txtDescription);
196
        toolsSwingManager.addClearButton(this.txtExpression);
197
        toolsSwingManager.addClearButton(this.txtSimpleElementFilter, new ActionListener() {
198
            @Override
199
            public void actionPerformed(ActionEvent e) {
200
                txtSimpleElementFilter.setText("");
201
                doFilter();
202
            }
203
        });
204
        
205
        this.treeElements.setCellRenderer(new DefaultTreeCellRenderer() {
206
            @Override
207
            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
208
                JLabel label = (JLabel) super.getTreeCellRendererComponent(tree,value, selected, expanded, leaf, row, hasFocus);
209
                if( value instanceof Element ) {
210
                    Element element = (Element) value;
211
                    label.setIcon(element.getIcon());
212
                    label.setText(element.getName());
213
                } else {
214
                    label.setIcon(null);
215
                    label.setText(Objects.toString(value, ""));
216
                }
217
                return label;
218
            }
219
        });
220
        
221
        this.treeElements.addTreeSelectionListener(new TreeSelectionListener() {
222
            @Override
223
            public void valueChanged(TreeSelectionEvent e) {
224
                TreePath path = e.getPath();
225
                Element element = (Element) path.getLastPathComponent();
226
                if (element instanceof GroupElement) {
227
                    updateSimpleElementsList((GroupElement) element);
228
                }
229
            }
230
        });
231
        this.btnGroupElementInsert.addActionListener(new ActionListener() {
232
            @Override
233
            public void actionPerformed(ActionEvent e) {
234
                doInsert(txtGroupElement.getText());
235
            }
236
        });
237
        this.btnSimpleElementInsert.addActionListener(new ActionListener() {
238
            @Override
239
            public void actionPerformed(ActionEvent e) {
240
                ListElement<SimpleElement> element = (ListElement<SimpleElement>) lstSimpleElement.getSelectedValue();
241
                if (element != null) {
242
                    doInsert(element.getValue());
243
                }
244
            }
245
        });
246
        this.btnSimpleElementFilter.addActionListener(new ActionListener() {
247
            @Override
248
            public void actionPerformed(ActionEvent e) {
249
                doFilter();
250
            }
251
        });
252
        this.lstSimpleElement.setCellRenderer(new DefaultListCellRenderer() {
253
            @Override
254
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
255
                JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
256
                Element element = null;
257
                if( value instanceof ListElement ) {
258
                    if( ((ListElement) value).getValue() instanceof Element ) {
259
                        element = (Element) ((ListElement) value).getValue();
260
                    }
261
                }
262
                if( element !=null ) {
263
                    label.setIcon(element.getIcon());
264
                    label.setText(element.getName());
265
                } else {
266
                    label.setIcon(null);
267
                    label.setText(Objects.toString(value, ""));
268
                }
269
                return label;
270
            }
271
        });
272
        this.lstSimpleElement.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
273
            @Override
274
            public void valueChanged(ListSelectionEvent e) {
275
                ListElement<SimpleElement> element = (ListElement<SimpleElement>) lstSimpleElement.getSelectedValue();
276
                if (element != null) {
277
                    doSelectElement(element.getValue());
278
                }
279
            }
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
        });
322
        this.btnSimpleElementSortDown.addActionListener(new ActionListener() {
323
            @Override
324
            public void actionPerformed(ActionEvent e) {
325
                FilteredListModel model = (FilteredListModel) lstSimpleElement.getModel();
326
                model.sort(false);
327
            }
328
        });
329
        this.btnSimpleElementSortUp.addActionListener(new ActionListener() {
330
            @Override
331
            public void actionPerformed(ActionEvent e) {
332
                FilteredListModel model = (FilteredListModel) lstSimpleElement.getModel();
333
                model.sort(true);
334
            }
335
        });
336
        this.txtSimpleElementFilter.addKeyListener(new KeyAdapter() {
337
            @Override
338
            public void keyTyped(KeyEvent e) {
339
                if (e.getKeyChar() == '\n') {
340
                    doFilter();
341
                }
342
            }
343
        });
344
        this.btnAdd.addActionListener(new ActionListener() {
345
            @Override
346
            public void actionPerformed(ActionEvent e) {
347
                doInsert(" + ");
348
            }
349
        });
350
        this.btnDiv.addActionListener(new ActionListener() {
351
            @Override
352
            public void actionPerformed(ActionEvent e) {
353
                doInsert(" / ");
354
            }
355
        });
356
        this.btnEq.addActionListener(new ActionListener() {
357
            @Override
358
            public void actionPerformed(ActionEvent e) {
359
                doInsert(" = ");
360
            }
361
        });
362
        this.btnMult.addActionListener(new ActionListener() {
363
            @Override
364
            public void actionPerformed(ActionEvent e) {
365
                doInsert(" * ");
366
            }
367
        });
368
        this.btnNeq.addActionListener(new ActionListener() {
369
            @Override
370
            public void actionPerformed(ActionEvent e) {
371
                doInsert(" <> ");
372
            }
373
        });
374
        this.btnParentClose.addActionListener(new ActionListener() {
375
            @Override
376
            public void actionPerformed(ActionEvent e) {
377
                doInsert(" ) ");
378
            }
379
        });
380
        this.btnParentOpen.addActionListener(new ActionListener() {
381
            @Override
382
            public void actionPerformed(ActionEvent e) {
383
                doInsert(" ( ");
384
            }
385
        });
386
        this.btnSubst.addActionListener(new ActionListener() {
387
            @Override
388
            public void actionPerformed(ActionEvent e) {
389
                doInsert(" - ");
390
            }
391
        });
392
        ScriptSwingManager scriptSwingManager = ToolsSwingLocator.getScriptSwingManager();
393
        this.scriptPicker = scriptSwingManager.createListScriptPickerController(
394
                cboPickerScripts,
395
                btnPickerRemove,
396
                btnPickerSelectScript
397
        );
398
        this.scriptEditor = scriptSwingManager.createScriptEditor();
399
        this.pnlScriptEditorContainer.setLayout(new BorderLayout());
400
        this.pnlScriptEditorContainer.add(this.scriptEditor.asJComponent(), BorderLayout.CENTER);
401
    
402
        this.tabExpressionBuilder.setEnabledAt(0, this.config.getScriptsEnabled());
403
        this.setPreferredSize(new Dimension(650, 350));
404
        this.txtDescription.setPreferredSize(new Dimension(200,200));
405
    }
406

    
407
    private String removeCursorMark(String s) {
408
        s = s.replace("{{", "");
409
        s = s.replace("}}", "");
410
        return s;
411
    }
412

    
413
    private void doInsert(String s) {
414
        this.txtExpression.replaceSelection(s);
415
        String ss = this.txtExpression.getText();
416
        int start = ss.indexOf("{{");
417
        int end = ss.indexOf("}}");
418
        if (start > 0 && end > 0) {
419
            this.txtExpression.replaceRange("", end, end + 2);
420
            this.txtExpression.replaceRange("", start, start + 2);
421
            this.txtExpression.setSelectionStart(start);
422
            this.txtExpression.setSelectionEnd(end - 2);
423
        }
424
        this.txtExpression.requestFocusInWindow();
425
    }
426

    
427
    private void doInsert(SimpleElement element) {
428
        if( element instanceof FunctionElement ) {
429
            Function function = ((FunctionElement)element).getFunction();
430
            if (function == null) {
431
                doInsert(element.getName());
432
            } else {
433
                doInsert(function.template() == null ? function.name() + "({{}})" : function.template());
434
            }
435
        } else if( element instanceof ConstantElement) {
436
            doInsert(" "+repr(((ConstantElement) element).getValue())+" ");
437
        } else {
438
            doInsert(" "+element.getName()+" ");
439
        }
440
    }
441

    
442
    private void doFilter() {
443
        FilteredListModel model = (FilteredListModel) this.lstSimpleElement.getModel();
444
        model.setFilter(this.txtSimpleElementFilter.getText());
445
    }
446

    
447
    private void doSelectElement(SimpleElement element) {
448
        StringBuilder html = new StringBuilder();
449
        html.append("<html>\n");
450
        if( element instanceof ConstantElement ) {
451
            Object value = ((ConstantElement)element).getValue();
452
            if( value == null ) {
453
                html.append("<b>Constant</b><br>\n<br>\n");
454
                html.append("<b>Value</b> NULL<br>\n");
455
            } else {
456
                html.append("<b>Constant</b><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");
459
            }
460
            
461
        } else if( element instanceof VariableElement ) {
462
                VariableElement var = (VariableElement)element;
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");
467
            
468
        } else if( element instanceof FunctionElement ) {
469
            Function function = ((FunctionElement)element).getFunction();
470
            if (function == null) {
471
                html.append("<b>Function</b> ").append(element.getName()).append("<br>\n<br>\n");
472
                html.append("<b>Return</b> Object<br>\n<br>\n");
473
                html.append("<b>Template:</b> ").append(element.getName()).append("()<br>\n");
474
            } else {
475
                html.append("<b>Function</b> ").append(element.getName()).append("<br>\n<br>\n");
476
                html.append("<b>Return</b> ");
477
                html.append(StringUtils.isEmpty(function.returnType())?"Objec": function.returnType());
478
                html.append("<br>\n");
479
                html.append("<b>Template</b> ");
480
                html.append(StringUtils.isEmpty(function.template())?element.getName()+"()": removeCursorMark(function.template()));
481
                html.append("<br>\n");
482

    
483
                String[] args = function.descriptionArgs();
484
                if (args != null) {
485
                    html.append("<b>Arguments:</b> ").append("<ul>\n");
486
                    for (String arg : args) {
487
                        html.append("<li>").append(arg).append("</li>\n");
488
                    }
489
                    html.append("</ul>\n");
490
                    html.append("<br>\n");
491
                }
492
            }
493
        } else {
494
            html.append("<b>Generic element<br>\n<br>\n");
495
            html.append("<b>Name</b> ").append(element.getName()).append("</br>\n");
496
            
497
        }
498

    
499
        if( element.getDescription()!=null ) {
500
            html.append("<b>Description</b><br>\n");
501
            html.append(element.getDescription().replace("\n", "<br>")).append("<br>\n");
502
        }
503
        html.append("</html>\n");
504
        this.txtDescription.setContentType("text/html");
505
        this.txtDescription.setText(html.toString());
506
        this.txtDescription.setCaretPosition(0);
507
    }
508

    
509
    private void updateSimpleElementsList(GroupElement group) {
510
        FilteredListModel model = new FilteredListModel();
511
        model.addElement("Loading...");
512
        this.currentGroup = group;
513
        this.txtGroupElement.setText(group.getName());
514
        this.txtSimpleElementFilter.setText("");
515
        this.txtDescription.setText("");
516
        if (group instanceof SimpleElement) {
517
            this.btnGroupElementInsert.setEnabled(true);
518
        } else {
519
            this.btnGroupElementInsert.setEnabled(false);
520
        }
521
        this.lstSimpleElement.setEnabled(false);
522
        this.lstSimpleElement.setModel(model);
523

    
524
        Thread th = new Thread(new Runnable() {
525
            @Override
526
            public void run() {
527
                simpleElementsUpdater();
528
            }
529
        }, "ExpressionBuilderSimpleElementsUpdater");
530
        th.start();
531
    }
532

    
533
    private void simpleElementsUpdater() {
534
        final GroupElement group = this.currentGroup;
535
        final FilteredListModel model = new FilteredListModel();
536
        for (Element child : group) {
537
            if (group != this.currentGroup) {
538
                return;
539
            }
540
            if (child instanceof SimpleElement) {
541
                String label = child.getName();
542
                Function function = child instanceof FunctionElement?  ((FunctionElement)child).getFunction(): null;
543
                if (function != null && !StringUtils.isEmpty(function.returnType())) {
544
                    label = "<html><b>" + label + "</b> return " + function.returnType() + "</html>";
545
//                    label = label + " return " + function.returnType();
546
                }
547
                model.addElement(new ListElement<>(label, child));
548
            }
549
        }
550
        model.sort(true);
551
        SwingUtilities.invokeLater(new Runnable() {
552
            @Override
553
            public void run() {
554
                if (group != currentGroup) {
555
                    return;
556
                }
557
                if( group.hasMoreElements() ) {
558
                    lblSimpleElementsMsg.setText("More elements...");
559
                } else {
560
                    lblSimpleElementsMsg.setText("");
561
                }
562
                lstSimpleElement.setEnabled(true);
563
                lstSimpleElement.setModel(model);
564
            }
565
        });
566

    
567
    }
568

    
569
    @Override
570
    public Expression getExpression() {
571
        String phrase = this.txtExpression.getText();
572
        if (StringUtils.isEmpty(phrase)) {
573
            return null;
574
        }
575
        Expression expression = ExpressionEvaluatorLocator.getManager().createExpression();
576
        expression.setPhrase(phrase);
577
        Script script = ToolsLocator.getScriptManager().createScript("UserScript", "", "python");
578
        this.scriptEditor.fetch(script);
579
        if( !StringUtils.isEmpty(script.getCode()) ) {
580
            expression.setUserScript(script);
581
        }
582
        return expression;
583
    }
584

    
585
    @Override
586
    public void setExpression(Expression expression) {
587
        this.txtExpression.setText(expression.getPhrase());
588
        if( expression.getUserScript()!=null ) {
589
            this.scriptEditor.set(expression.getUserScript());
590
        }
591
        if( expression.getScripts()!=null ) {
592
            this.scriptPicker.set(expression.getScripts().toList());
593
        }
594
    }
595
    
596
    @Override
597
    public int getSimpleElementsLimit() {
598
        return this.config.getSimpleElementsLimit();
599
    }
600

    
601
    @Override
602
    public void setSimpleElementsLimit(int limit) {
603
        this.config.setSimpleElementsLimit(limit);
604
    }
605
    
606
    @Override
607
    public List<Element> getElements() {
608
        return this.config.getElements();
609
    }
610

    
611
    @Override
612
    public Collection<SymbolTable> getSymbolTables() {
613
        return this.config.getSymbolTables();
614
    }
615
    
616
    @Override
617
    public void addSymbolTable(String name) {
618
        this.config.addSymbolTable(name);
619
    }
620
    
621
    @Override
622
    public void addSymbolTable(SymbolTable symbolTable) {
623
        this.config.addSymbolTable(symbolTable);
624
    }
625

    
626
    @Override
627
    public void removeAllSymbolTables() {
628
        this.config.removeAllSymbolTables();
629
    }
630

    
631
    @Override
632
    public void removeSymbolTable(String name) {
633
        this.config.removeSymbolTable(name);
634
    }
635

    
636
    @Override
637
    public void setScriptsEnabled(boolean enabled) {
638
        this.config.setScriptsEnabled(enabled);
639
        this.tabExpressionBuilder.setEnabledAt(0, this.config.getScriptsEnabled());
640
    }
641

    
642
    @Override
643
    public boolean getScriptsEnabled() {
644
        return this.config.getScriptsEnabled();
645
    }
646
    
647
    @Override
648
    public JComponent asJComponent() {
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
        }
655
        return this;
656
    }
657

    
658
    private String repr(Object value)  {
659
        if (value == null) {
660
            return "NULL";
661
        } else if (value instanceof Date) {
662
            return "DATE('" + value + "')";
663
        } else if (value instanceof Boolean) {
664
            return value.toString();
665
        } else if (value instanceof String) {
666
            return "'" + StringEscapeUtils.escapeSql((String) value) + "'";
667
        } else {
668
            return StringEscapeUtils.escapeSql(value.toString());
669
        }
670
        
671
    }
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
    }
696
}