KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > it > businesslogic > ireport > gui > ExpressionEditor


1 /*
2  * Copyright (C) 2005 - 2006 JasperSoft Corporation. All rights reserved.
3  * http://www.jaspersoft.com.
4  *
5  * Unless you have purchased a commercial license agreement from JasperSoft,
6  * the following license terms apply:
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as published by
10  * the Free Software Foundation.
11  *
12  * This program is distributed WITHOUT ANY WARRANTY; and without the
13  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
18  * or write to:
19  *
20  * Free Software Foundation, Inc.,
21  * 59 Temple Place - Suite 330,
22  * Boston, MA USA 02111-1307
23  *
24  *
25  *
26  *
27  * ExpressionEditor.java
28  *
29  * Created on 17 novembre 2003, 22.03
30  *
31  */

32
33 package it.businesslogic.ireport.gui;
34 import bsh.EvalError;
35 import bsh.ParseException;
36 import bsh.TargetError;
37 import groovy.lang.Binding;
38 import groovy.lang.GroovyShell;
39 import it.businesslogic.ireport.CrosstabReportElement;
40 import it.businesslogic.ireport.ExpressionContext;
41 import it.businesslogic.ireport.IRParsingException;
42 import it.businesslogic.ireport.JRField;
43 import it.businesslogic.ireport.JRParameter;
44 import it.businesslogic.ireport.JRVariable;
45 import it.businesslogic.ireport.SubDataset;
46 import it.businesslogic.ireport.crosstab.CrosstabGroup;
47 import it.businesslogic.ireport.crosstab.CrosstabParameter;
48 import it.businesslogic.ireport.crosstab.Measure;
49 import it.businesslogic.ireport.gui.expbuilder.ArithmeticOperationHelper;
50 import it.businesslogic.ireport.gui.expbuilder.ExpObject;
51 import it.businesslogic.ireport.gui.expbuilder.ExpObjectCellRenderer;
52 import it.businesslogic.ireport.util.I18n;
53 import it.businesslogic.ireport.util.JRFakeObject;
54 import it.businesslogic.ireport.util.Misc;
55 import java.awt.Color JavaDoc;
56 import java.io.StringReader JavaDoc;
57 import java.text.MessageFormat JavaDoc;
58 import javax.swing.event.CaretEvent JavaDoc;
59 import javax.swing.event.CaretListener JavaDoc;
60 import javax.swing.event.ChangeEvent JavaDoc;
61 import javax.swing.event.ChangeListener JavaDoc;
62 import javax.swing.text.Style JavaDoc;
63 import javax.swing.text.StyleConstants JavaDoc;
64 import javax.swing.tree.*;
65 import javax.swing.*;
66 import java.util.*;
67 import net.sf.jasperreports.engine.JRExpression;
68 import net.sf.jasperreports.engine.JRExpressionChunk;
69 import net.sf.jasperreports.engine.design.JRDesignExpression;
70 import net.sf.jasperreports.engine.fill.JRFillField;
71 import net.sf.jasperreports.engine.fill.JRFillParameter;
72 import net.sf.jasperreports.engine.fill.JRFillVariable;
73 import net.sf.jasperreports.engine.util.JRStringUtil;
74 import org.codehaus.groovy.control.CompilationFailedException;
75 import javax.swing.text.DefaultStyledDocument JavaDoc;
76 /**
77  *
78  * @author Administrator
79  */

80 public class ExpressionEditor extends javax.swing.JDialog JavaDoc implements CaretListener JavaDoc
81 {
82    
83     //public final static int CONTEXT_REPORT_DATASET = 0;
84
//public final static int CONTEXT_BUCKET_MEASURE = 1;
85
//public final static int CONTEXT_DATASET_RUN = 2;
86
//public final static int CONTEXT_STYLE = 3;
87

88     public static final int VARIABLE = 1;
89     public static final int PARAMETER = 2;
90     public static final int FIELD = 3;
91     
92     
93     private SubDataset subDataset = null;
94     private Vector crosstabElements = new Vector();
95     
96     public static Vector defaultExpressions = null;
97     public boolean init = false;
98     
99     public static Vector recentExpressions = new Vector();
100     
101     
102     Style JavaDoc errorStyle = null;
103     Style JavaDoc okStyle = null;
104     DefaultStyledDocument JavaDoc doc = null;
105
106     
107     static {
108         defaultExpressions = new Vector();
109         defaultExpressions.add("( <condition> ? exp1 : exp2 )");
110         defaultExpressions.add("msg(<pattern>, <arg0>)");
111         defaultExpressions.add("msg(<pattern>, <arg0>, <arg1>)");
112         defaultExpressions.add("msg(<pattern>, <arg0>, <arg1>, <arg2>)");
113         defaultExpressions.add("str(<key>)");
114         defaultExpressions.add("((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource(<select expression>)");
115         defaultExpressions.add("((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource(<select expression>)");
116     }
117         
118    /** Creates new form ExpressionEditor */
119    public ExpressionEditor()
120    {
121       super( MainFrame.getMainInstance(), true);
122       initComponents();
123       this.setSize(750, 450);
124       
125       this.setModal(true);
126       //this.setModal(true);
127
org.syntax.jedit.SyntaxDocument sd = new org.syntax.jedit.SyntaxDocument();
128       sd.setTokenMarker(new org.syntax.jedit.tokenmarker.JavaTokenMarker() );
129       
130       this.jEditTextArea1.setDocument( sd );
131       this.jEditTextArea1.getPainter().setEOLMarkersPainted(false);
132       this.jEditTextArea1.getPainter().setInvalidLinesPainted(false);
133       this.jEditTextArea1.getPainter().setLineHighlightEnabled(false);
134         
135       
136       DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode("root");
137       
138       this.jTree1.setCellRenderer(new DocumentExpressionEditorTreeCellRenderer());
139       this.jTree1.setModel(new javax.swing.tree.DefaultTreeModel JavaDoc(dmtn));
140       
141       it.businesslogic.ireport.util.Misc.centerFrame(this);
142       
143       jList1.setModel(new DefaultListModel());
144       jList2.setModel(new DefaultListModel());
145
146       jEditTextArea1.requestFocusInWindow();
147       
148       jEditTextArea1.getDocument().addDocumentListener( new javax.swing.event.DocumentListener JavaDoc() {
149             public void changedUpdate(javax.swing.event.DocumentEvent JavaDoc evt) {
150                 jRTextExpressionAreaTextChanged();
151             }
152             public void insertUpdate(javax.swing.event.DocumentEvent JavaDoc evt) {
153                 jRTextExpressionAreaTextChanged();
154             }
155             public void removeUpdate(javax.swing.event.DocumentEvent JavaDoc evt) {
156                 jRTextExpressionAreaTextChanged();
157             }
158         });
159         
160         jEditTextArea1.addCaretListener( this );
161         
162       
163         javax.swing.KeyStroke JavaDoc escape = javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ESCAPE, 0, false);
164         javax.swing.Action JavaDoc escapeAction = new javax.swing.AbstractAction JavaDoc() {
165             public void actionPerformed(java.awt.event.ActionEvent JavaDoc e) {
166                 setVisible(false);
167             }
168         };
169        
170         getRootPane().getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE");
171         getRootPane().getActionMap().put("ESCAPE", escapeAction);
172
173         jList1.getSelectionModel().setSelectionMode( jList1.getSelectionModel().SINGLE_SELECTION );
174         jList1.setCellRenderer(new ExpObjectCellRenderer(jList1));
175         jList2.setCellRenderer(new TextAreaCellRenderer(jList2));
176         
177         //to make the default button ...
178
//this.getRootPane().setDefaultButton(this.jButtonOK);
179
jSplitPane3.updateUI();
180         applyI18n();
181         caretUpdate(null);
182         
183         jTabbedPane1.addChangeListener( new ChangeListener JavaDoc() {
184             public void stateChanged(ChangeEvent JavaDoc e)
185             {
186                 if (jTabbedPane1.getSelectedIndex() == 1)
187                 {
188                     SwingUtilities.invokeLater( new Runnable JavaDoc() {
189                     
190                         public void run()
191                         {
192                             try {
193                                 validateExpression();
194                             } catch (Exception JavaDoc ex)
195                             {
196                                 setErrorText("Exception occurred during the expression validation", true);
197                             }
198                         }
199                     });
200                 }
201             }
202         });
203         
204         doc = new DefaultStyledDocument JavaDoc();
205         
206         jTextPaneErrors.setDocument( doc );
207         errorStyle = doc.addStyle("errorStyle", null);
208         StyleConstants.setForeground(errorStyle, Color.red);
209         okStyle = doc.addStyle("okStyle", null);
210         StyleConstants.setForeground(okStyle, Color.blue);
211         
212         this.pack();
213    }
214    
215    
216    
217    /** This method is called from within the constructor to
218     * initialize the form.
219     * WARNING: Do NOT modify this code. The content of this method is
220     * always regenerated by the Form Editor.
221     */

222     // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
223
private void initComponents() {
224         java.awt.GridBagConstraints JavaDoc gridBagConstraints;
225
226         jPanel1 = new javax.swing.JPanel JavaDoc();
227         jSplitPane1 = new javax.swing.JSplitPane JavaDoc();
228         jPanel6 = new javax.swing.JPanel JavaDoc();
229         jEditTextArea1 = new org.syntax.jedit.JEditTextArea();
230         jLabel1 = new javax.swing.JLabel JavaDoc();
231         jLabelCaretPosition = new javax.swing.JLabel JavaDoc();
232         jPanel5 = new javax.swing.JPanel JavaDoc();
233         jTabbedPane1 = new javax.swing.JTabbedPane JavaDoc();
234         jSplitPaneOAE = new javax.swing.JSplitPane JavaDoc();
235         jPanel4 = new javax.swing.JPanel JavaDoc();
236         jSplitPane3 = new javax.swing.JSplitPane JavaDoc();
237         jScrollPane1 = new javax.swing.JScrollPane JavaDoc();
238         jList1 = new javax.swing.JList JavaDoc();
239         jScrollPane3 = new javax.swing.JScrollPane JavaDoc();
240         jList2 = new javax.swing.JList JavaDoc();
241         jPanel3 = new javax.swing.JPanel JavaDoc();
242         jScrollPane2 = new javax.swing.JScrollPane JavaDoc();
243         jTree1 = new javax.swing.JTree JavaDoc();
244         jScrollPane4 = new javax.swing.JScrollPane JavaDoc();
245         jTextPaneErrors = new javax.swing.JTextPane JavaDoc();
246         jPanel2 = new javax.swing.JPanel JavaDoc();
247         jButtonLoadExpression = new javax.swing.JButton JavaDoc();
248         jButtonSaveExpression = new javax.swing.JButton JavaDoc();
249         jButtonCheckExpression = new javax.swing.JButton JavaDoc();
250         jButtonApply = new javax.swing.JButton JavaDoc();
251         jButtonCancel = new javax.swing.JButton JavaDoc();
252
253         setTitle("Expression editor...");
254         setModal(true);
255         addComponentListener(new java.awt.event.ComponentAdapter JavaDoc() {
256             public void componentResized(java.awt.event.ComponentEvent JavaDoc evt) {
257                 formComponentResized(evt);
258             }
259         });
260         addWindowListener(new java.awt.event.WindowAdapter JavaDoc() {
261             public void windowClosing(java.awt.event.WindowEvent JavaDoc evt) {
262                 exitForm(evt);
263             }
264         });
265
266         jPanel1.setLayout(new java.awt.BorderLayout JavaDoc());
267
268         jPanel1.setPreferredSize(new java.awt.Dimension JavaDoc(752, 416));
269         jSplitPane1.setDividerSize(4);
270         jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
271         jSplitPane1.setResizeWeight(0.5);
272         jPanel6.setLayout(new java.awt.GridBagLayout JavaDoc());
273
274         jEditTextArea1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
275         jEditTextArea1.setFocusCycleRoot(true);
276         jEditTextArea1.setFont(new java.awt.Font JavaDoc("Courier New", 0, 11));
277         jEditTextArea1.setMinimumSize(new java.awt.Dimension JavaDoc(20, 20));
278         jEditTextArea1.setPreferredSize(new java.awt.Dimension JavaDoc(750, 150));
279         jEditTextArea1.addComponentListener(new java.awt.event.ComponentAdapter JavaDoc() {
280             public void componentResized(java.awt.event.ComponentEvent JavaDoc evt) {
281                 jEditTextArea1ComponentResized(evt);
282             }
283         });
284         jEditTextArea1.addInputMethodListener(new java.awt.event.InputMethodListener JavaDoc() {
285             public void caretPositionChanged(java.awt.event.InputMethodEvent JavaDoc evt) {
286             }
287             public void inputMethodTextChanged(java.awt.event.InputMethodEvent JavaDoc evt) {
288                 jEditTextArea1InputMethodTextChanged(evt);
289             }
290         });
291
292         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
293         gridBagConstraints.gridwidth = 2;
294         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
295         gridBagConstraints.weightx = 1.0;
296         gridBagConstraints.weighty = 1.0;
297         gridBagConstraints.insets = new java.awt.Insets JavaDoc(2, 2, 2, 2);
298         jPanel6.add(jEditTextArea1, gridBagConstraints);
299
300         jLabel1.setForeground(new java.awt.Color JavaDoc(255, 0, 51));
301         jLabel1.setText(" ");
302         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
303         gridBagConstraints.gridx = 0;
304         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
305         gridBagConstraints.weightx = 1.0;
306         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 4, 0, 0);
307         jPanel6.add(jLabel1, gridBagConstraints);
308
309         jLabelCaretPosition.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
310         jLabelCaretPosition.setText("Line: 1 Column: 1");
311         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
312         gridBagConstraints.gridx = 1;
313         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
314         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 4, 0, 4);
315         jPanel6.add(jLabelCaretPosition, gridBagConstraints);
316
317         jSplitPane1.setTopComponent(jPanel6);
318
319         jPanel5.setLayout(new java.awt.GridBagLayout JavaDoc());
320
321         jSplitPaneOAE.setBorder(null);
322         jSplitPaneOAE.setDividerSize(4);
323         jSplitPaneOAE.setResizeWeight(0.1);
324         jSplitPaneOAE.setAutoscrolls(true);
325         jSplitPaneOAE.setPreferredSize(new java.awt.Dimension JavaDoc(361, 160));
326         jPanel4.setLayout(new java.awt.BorderLayout JavaDoc());
327
328         jPanel4.setPreferredSize(new java.awt.Dimension JavaDoc(100, 100));
329         jSplitPane3.setBorder(null);
330         jSplitPane3.setDividerSize(4);
331         jSplitPane3.setResizeWeight(0.8);
332         jList1.addListSelectionListener(new javax.swing.event.ListSelectionListener JavaDoc() {
333             public void valueChanged(javax.swing.event.ListSelectionEvent JavaDoc evt) {
334                 jList1ValueChanged(evt);
335             }
336         });
337         jList1.addMouseListener(new java.awt.event.MouseAdapter JavaDoc() {
338             public void mouseClicked(java.awt.event.MouseEvent JavaDoc evt) {
339                 jList1MouseClicked(evt);
340             }
341         });
342
343         jScrollPane1.setViewportView(jList1);
344
345         jSplitPane3.setLeftComponent(jScrollPane1);
346
347         jList2.addMouseListener(new java.awt.event.MouseAdapter JavaDoc() {
348             public void mouseClicked(java.awt.event.MouseEvent JavaDoc evt) {
349                 jList2MouseClicked(evt);
350             }
351         });
352
353         jScrollPane3.setViewportView(jList2);
354
355         jSplitPane3.setRightComponent(jScrollPane3);
356
357         jPanel4.add(jSplitPane3, java.awt.BorderLayout.CENTER);
358
359         jSplitPaneOAE.setRightComponent(jPanel4);
360         jPanel4.getAccessibleContext().setAccessibleParent(jPanel1);
361
362         jPanel3.setLayout(new java.awt.BorderLayout JavaDoc());
363
364         jScrollPane2.setPreferredSize(new java.awt.Dimension JavaDoc(100, 100));
365         jTree1.setRootVisible(false);
366         jTree1.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener JavaDoc() {
367             public void valueChanged(javax.swing.event.TreeSelectionEvent JavaDoc evt) {
368                 jTree1ValueChanged(evt);
369             }
370         });
371
372         jScrollPane2.setViewportView(jTree1);
373
374         jPanel3.add(jScrollPane2, java.awt.BorderLayout.CENTER);
375
376         jSplitPaneOAE.setLeftComponent(jPanel3);
377         jPanel3.getAccessibleContext().setAccessibleParent(jPanel1);
378
379         jTabbedPane1.addTab("Objects and expressions", jSplitPaneOAE);
380
381         jTextPaneErrors.setEditable(false);
382         jScrollPane4.setViewportView(jTextPaneErrors);
383
384         jTabbedPane1.addTab("Validation errors", jScrollPane4);
385
386         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
387         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
388         gridBagConstraints.weightx = 1.0;
389         gridBagConstraints.weighty = 1.0;
390         jPanel5.add(jTabbedPane1, gridBagConstraints);
391
392         jSplitPane1.setRightComponent(jPanel5);
393
394         jPanel1.add(jSplitPane1, java.awt.BorderLayout.CENTER);
395
396         getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
397
398         jPanel2.setLayout(new java.awt.GridBagLayout JavaDoc());
399
400         jPanel2.setMinimumSize(new java.awt.Dimension JavaDoc(10, 30));
401         jPanel2.setPreferredSize(new java.awt.Dimension JavaDoc(10, 30));
402         jButtonLoadExpression.setLabel("Import...");
403         jButtonLoadExpression.addActionListener(new java.awt.event.ActionListener JavaDoc() {
404             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
405                 jButtonLoadExpressionActionPerformed1(evt);
406             }
407         });
408
409         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
410         gridBagConstraints.insets = new java.awt.Insets JavaDoc(2, 2, 2, 2);
411         jPanel2.add(jButtonLoadExpression, gridBagConstraints);
412
413         jButtonSaveExpression.setText("Export...");
414         jButtonSaveExpression.addActionListener(new java.awt.event.ActionListener JavaDoc() {
415             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
416                 jButtonSaveExpressionActionPerformed1(evt);
417             }
418         });
419
420         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
421         gridBagConstraints.insets = new java.awt.Insets JavaDoc(2, 2, 2, 2);
422         jPanel2.add(jButtonSaveExpression, gridBagConstraints);
423
424         jButtonCheckExpression.setText("Check expression");
425         jButtonCheckExpression.addActionListener(new java.awt.event.ActionListener JavaDoc() {
426             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
427                 jButtonCheckExpressionActionPerformed(evt);
428             }
429         });
430
431         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
432         gridBagConstraints.insets = new java.awt.Insets JavaDoc(2, 2, 2, 2);
433         jPanel2.add(jButtonCheckExpression, gridBagConstraints);
434
435         jButtonApply.setMnemonic('a');
436         jButtonApply.setText("Apply");
437         jButtonApply.addActionListener(new java.awt.event.ActionListener JavaDoc() {
438             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
439                 jButtonApplyActionPerformed(evt);
440             }
441         });
442
443         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
444         gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
445         gridBagConstraints.weightx = 1.0;
446         gridBagConstraints.insets = new java.awt.Insets JavaDoc(2, 2, 2, 2);
447         jPanel2.add(jButtonApply, gridBagConstraints);
448
449         jButtonCancel.setMnemonic('c');
450         jButtonCancel.setText("Cancel");
451         jButtonCancel.addActionListener(new java.awt.event.ActionListener JavaDoc() {
452             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
453                 jButtonCancelActionPerformed(evt);
454             }
455         });
456
457         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
458         gridBagConstraints.insets = new java.awt.Insets JavaDoc(2, 2, 2, 2);
459         jPanel2.add(jButtonCancel, gridBagConstraints);
460
461         getContentPane().add(jPanel2, java.awt.BorderLayout.SOUTH);
462
463         pack();
464     }// </editor-fold>//GEN-END:initComponents
465

466     private void jButtonCheckExpressionActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_jButtonCheckExpressionActionPerformed
467

468         SwingUtilities.invokeLater( new Runnable JavaDoc() {
469                     
470                         public void run()
471                         {
472                             try {
473                                 validateExpression();
474                             } catch (Exception JavaDoc ex)
475                             {
476                                 setErrorText("Exception occurred during the expression validation", true);
477                             }
478                         }
479                     });
480     }//GEN-LAST:event_jButtonCheckExpressionActionPerformed
481

482     private void jButtonSaveExpressionActionPerformed1(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_jButtonSaveExpressionActionPerformed1
483
Misc.saveExpression( jEditTextArea1.getText(), this );
484     }//GEN-LAST:event_jButtonSaveExpressionActionPerformed1
485

486     private void jButtonLoadExpressionActionPerformed1(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_jButtonLoadExpressionActionPerformed1
487
String JavaDoc expression = Misc.loadExpression(this);
488         
489         if (expression != null) {
490             jEditTextArea1.setText(expression);
491         }
492     }//GEN-LAST:event_jButtonLoadExpressionActionPerformed1
493

494     static int xxx = 0;
495     public void jRTextExpressionAreaTextChanged()
496     {
497         if (init) return;
498         jLabel1.setText(" ");
499         
500         try {
501             bsh.Parser parser = new bsh.Parser(new StringReader JavaDoc(jEditTextArea1.getText()+";") );
502             while(!parser.Line()) {
503                         //SimpleNode node = parser.popNode();
504
// use the node, etc. (See bsh.BSH* classes)
505
}
506
507         } catch (Exception JavaDoc ex)
508         {
509             jLabel1.setText("" + ex.getMessage());
510         }
511     }
512     private void jEditTextArea1InputMethodTextChanged(java.awt.event.InputMethodEvent JavaDoc evt) {//GEN-FIRST:event_jEditTextArea1InputMethodTextChanged
513

514         
515     }//GEN-LAST:event_jEditTextArea1InputMethodTextChanged
516

517     private void jList2MouseClicked(java.awt.event.MouseEvent JavaDoc evt) {//GEN-FIRST:event_jList2MouseClicked
518

519         if (evt.getButton() == evt.BUTTON1 && evt.getClickCount() == 2)
520         {
521             if (jList1.getSelectedValue() != null && jList2.getSelectedValue() != null)
522             {
523                 try {
524                     
525                     String JavaDoc objName = "";
526                     if (jList1.getSelectedValue() instanceof ExpObject)
527                     {
528                         objName = ((ExpObject)jList1.getSelectedValue()).getExpression();
529                     }
530                     else
531                     {
532                         objName = ""+jList1.getSelectedValue();
533                     }
534                     
535                     String JavaDoc method = (jList2.getSelectedValue()+"");
536                     method = method.substring(0, method.lastIndexOf(")")+1);
537                     jEditTextArea1.getDocument().replace(jEditTextArea1.getSelectionStart(),
538                                              jEditTextArea1.getSelectionEnd()-jEditTextArea1.getSelectionStart(),
539                                              objName+"."+method, null);
540             } catch (Exception JavaDoc ex){}
541             }
542         }
543     }//GEN-LAST:event_jList2MouseClicked
544

545     private void jList1MouseClicked(java.awt.event.MouseEvent JavaDoc evt) {//GEN-FIRST:event_jList1MouseClicked
546

547         if (evt.getButton() == evt.BUTTON1 && evt.getClickCount() == 2)
548         {
549             DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode)jTree1.getSelectionPath().getLastPathComponent();
550             if ((""+dmtn.getUserObject()).equalsIgnoreCase(I18n.getString("Wizards","Wizards")))
551             {
552                 ArithmeticOperationHelper aoe = new ArithmeticOperationHelper();
553
554                 aoe.setLanguage( MainFrame.getMainInstance().getActiveReportFrame().getReport().getLanguage() );
555                 
556                 if ((jList1.getSelectedValue()+"").equals( I18n.getString("Addition","Addition (+)")))
557                 {
558                     aoe.setOperation("+");
559                 }
560                 if ((jList1.getSelectedValue()+"").equals( I18n.getString("Subtraction","Subtraction (-)")))
561                 {
562                     aoe.setOperation("-");
563                 }
564                 if ((jList1.getSelectedValue()+"").equals( I18n.getString("Division","Division (/)")))
565                 {
566                     aoe.setOperation("/");
567                 }
568                 if ((jList1.getSelectedValue()+"").equals( I18n.getString("Multiplication","Multiplication (*)")))
569                 {
570                     aoe.setOperation("*");
571                 }
572                 
573                 // Collect all objects...
574
aoe.setValues( getAllObjects() );
575                 
576                 if ( aoe.showDialog(this) == JOptionPane.OK_OPTION)
577                 {
578
579                     String JavaDoc exp = aoe.getExpression();
580                     try {
581                     jEditTextArea1.getDocument().replace(jEditTextArea1.getSelectionStart(),
582                                                  jEditTextArea1.getSelectionEnd()-jEditTextArea1.getSelectionStart(),
583                                                  exp, null);
584                     } catch (Exception JavaDoc ex){}
585                 }
586             }
587             else
588             {
589                 try {
590                     String JavaDoc objName = "";
591                     if (jList1.getSelectedValue() instanceof ExpObject)
592                     {
593                         objName = ((ExpObject)jList1.getSelectedValue()).getExpression();
594                     }
595                     else
596                     {
597                         objName = ""+jList1.getSelectedValue();
598                     }
599                     
600                     jEditTextArea1.getDocument().replace(jEditTextArea1.getSelectionStart(),
601                                                      jEditTextArea1.getSelectionEnd()-jEditTextArea1.getSelectionStart(),
602                                                      objName+"", null);
603                     } catch (Exception JavaDoc ex){}
604             }
605         }
606     }//GEN-LAST:event_jList1MouseClicked
607

608     private void jList1ValueChanged(javax.swing.event.ListSelectionEvent JavaDoc evt) {//GEN-FIRST:event_jList1ValueChanged
609

610         DefaultListModel dlm = (DefaultListModel)jList2.getModel();
611         dlm.removeAllElements();
612         
613         Class JavaDoc clazz = null; //getSelectedObjectClass();
614

615         if (jList1.getSelectedValue() instanceof ExpObject)
616         {
617             try {
618                 clazz = this.getClass().getClassLoader().loadClass( ((ExpObject)jList1.getSelectedValue()).getClassType());
619         
620             } catch (Throwable JavaDoc ex)
621             {
622                 
623             }
624         }
625         
626         
627         
628         if (clazz != null)
629         {
630             java.lang.reflect.Method JavaDoc[] methods = clazz.getMethods();
631             for (int i=0; i<methods.length; ++i)
632             {
633                 if ((methods[i].getModifiers() & java.lang.reflect.Modifier.PUBLIC) != 0 )
634                 {
635                     String JavaDoc method_firm = methods[i].getName() + "(";
636                     Class JavaDoc[] params = methods[i].getParameterTypes();
637                     int j=0;
638                     for (j=0; j<params.length; ++j)
639                     {
640                         
641                         if (j > 0) method_firm +=", ";
642                         else method_firm +=" ";
643                         method_firm += getPrintableTypeName( params[j].getName() );
644                     }
645                     if (j>0) method_firm+=" ";
646                     method_firm += ") ";
647
648                     String JavaDoc rname = methods[i].getReturnType().getName();
649                     if (rname.equals("void")) continue; // we have to return something always!
650
method_firm += getPrintableTypeName( rname);
651                     dlm.addElement( method_firm );
652                 }
653             }
654         }
655         
656         
657     }//GEN-LAST:event_jList1ValueChanged
658

659     public String JavaDoc getPrintableTypeName( String JavaDoc type )
660     {
661             if (type == null) return "void";
662
663             if (type.endsWith(";")) type = type.substring(0,type.length()-1);
664     
665             while (type.startsWith("["))
666             {
667                 type = type.substring(1) + "[]";
668                 if (type.startsWith("[")) continue;
669                 if (type.startsWith("L")) type = type.substring(1);
670                 if (type.startsWith("Z")) type = "boolean" + type.substring(1);
671                 if (type.startsWith("B")) type = "byte" + type.substring(1);
672                 if (type.startsWith("C")) type = "char" + type.substring(1);
673                 if (type.startsWith("D")) type = "double" + type.substring(1);
674                 if (type.startsWith("F")) type = "float" + type.substring(1);
675                 if (type.startsWith("I")) type = "int" + type.substring(1);
676                 if (type.startsWith("J")) type = "long" + type.substring(1);
677                 if (type.startsWith("S")) type = "short" + type.substring(1);
678             }
679             
680             if (type.startsWith("java.lang."))
681             {
682                 type = type.substring("java.lang.".length());
683                 if (type.indexOf(".") > 0)
684                 {
685                     type = "java.lang." + type;
686                 }
687             }
688             return type;
689     }
690     private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent JavaDoc evt) {//GEN-FIRST:event_jTree1ValueChanged
691

692        ( (DefaultListModel)jList1.getModel()).removeAllElements();
693        
694        //if (getSubDataset() == null) return;
695
DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode)jTree1.getSelectionPath().getLastPathComponent();
696        if (dmtn.getUserObject() instanceof CrosstabReportElementWrapper)
697        {
698            CrosstabReportElement cr = ((CrosstabReportElementWrapper)dmtn.getUserObject()).getCrosstabReportElement();
699            Enumeration e = cr.getMeasures().elements();
700            while (e.hasMoreElements())
701            {
702              Measure measure = (Measure)e.nextElement();
703              //( (DefaultListModel)jList1.getModel()).addElement( "$V{"+measure+"}" );
704
( (DefaultListModel)jList1.getModel()).addElement( new ExpObject(measure.getName(), ExpObject.TYPE_VARIABLE, measure.getClassType() ));
705              
706              for (int j=0; j<cr.getRowGroups().size(); ++j)
707              {
708                 CrosstabGroup group = (CrosstabGroup)cr.getRowGroups().elementAt(j);
709                 //((DefaultListModel)jList1.getModel()).addElement( "$V{"+measure+"_"+group.getName()+"_"+"ALL}");
710
((DefaultListModel)jList1.getModel()).addElement( new ExpObject(measure.getName() + "_"+group.getName()+"_"+"ALL", ExpObject.TYPE_VARIABLE, group.getBucketExpressionClass() ));
711              }
712              for (int j=0; j<cr.getColumnGroups().size(); ++j)
713              {
714                 CrosstabGroup group = (CrosstabGroup)cr.getColumnGroups().elementAt(j);
715                 //((DefaultListModel)jList1.getModel()).addElement( "$V{"+measure+"_"+group.getName()+"_"+"ALL}");
716
((DefaultListModel)jList1.getModel()).addElement( new ExpObject(measure.getName() + "_"+group.getName()+"_"+"ALL", ExpObject.TYPE_VARIABLE, group.getBucketExpressionClass() ));
717              }
718            }
719            
720            for (int i=0; i<cr.getRowGroups().size(); ++i)
721            {
722                 CrosstabGroup group = (CrosstabGroup)cr.getRowGroups().elementAt(i);
723                 //( (DefaultListModel)jList1.getModel()).addElement( "$V{"+group +"}" );
724
((DefaultListModel)jList1.getModel()).addElement( new ExpObject(group.getName(), ExpObject.TYPE_VARIABLE, group.getBucketExpressionClass() ));
725            }
726             
727            for (int i=0; i<cr.getColumnGroups().size(); ++i)
728            {
729                 CrosstabGroup group = (CrosstabGroup)cr.getColumnGroups().elementAt(i);
730                 //( (DefaultListModel)jList1.getModel()).addElement( "$V{"+group +"}" );
731
((DefaultListModel)jList1.getModel()).addElement( new ExpObject(group.getName(), ExpObject.TYPE_VARIABLE, group.getBucketExpressionClass() ));
732            }
733            
734
735            for (int i=0; i<cr.getCrosstabParameters().size(); ++i)
736            {
737                CrosstabParameter parameter = (CrosstabParameter)cr.getCrosstabParameters().elementAt(i);
738                //( (DefaultListModel)jList1.getModel()).addElement( "$P{"+parameter +"}" );
739
((DefaultListModel)jList1.getModel()).addElement( new ExpObject(parameter.getName(), ExpObject.TYPE_PARAM, parameter.getClassType() ));
740            }
741
742        }
743        else if ((""+dmtn.getUserObject()).equalsIgnoreCase("Fields") && getSubDataset() != null)
744        {
745           Enumeration e = getSubDataset().getFields().elements();
746           while (e.hasMoreElements())
747           {
748               JRField field = (JRField)e.nextElement();
749              //( (DefaultListModel)jList1.getModel()).addElement( "$F{"+e.nextElement() +"}" );
750
((DefaultListModel)jList1.getModel()).addElement( new ExpObject(field.getName(), ExpObject.TYPE_FIELD, field.getClassType() ));
751           }
752        }
753        else if ((""+dmtn.getUserObject()).equalsIgnoreCase("Parameters") && getSubDataset() != null)
754        {
755           Enumeration e = getSubDataset().getParameters().elements();
756           while (e.hasMoreElements())
757           {
758               JRParameter parameter = (JRParameter)e.nextElement();
759              //( (DefaultListModel)jList1.getModel()).addElement( "$P{"+ e.nextElement()+"}" );
760
((DefaultListModel)jList1.getModel()).addElement( new ExpObject(parameter.getName(), ExpObject.TYPE_PARAM, parameter.getClassType() ));
761              
762           }
763        }
764        else if ((""+dmtn.getUserObject()).equalsIgnoreCase("Variables") && getSubDataset() != null)
765        {
766           Enumeration e = getSubDataset().getVariables().elements();
767           while (e.hasMoreElements())
768           {
769              JRVariable variable = (JRVariable)e.nextElement();
770              //( (DefaultListModel)jList1.getModel()).addElement( "$V{"+e.nextElement() +"}" );
771
((DefaultListModel)jList1.getModel()).addElement( new ExpObject(variable.getName(), ExpObject.TYPE_VARIABLE, variable.getClassType() ));
772           }
773        }
774        else if ((""+dmtn.getUserObject()).equalsIgnoreCase(I18n.getString("Formulas","Formulas" )))
775        {
776            for (int i=0; i<defaultExpressions.size(); ++i)
777            {
778                ( (DefaultListModel)jList1.getModel()).addElement(defaultExpressions.elementAt(i));
779            }
780        }
781        else if ((""+dmtn.getUserObject()).equalsIgnoreCase(I18n.getString("RecentExpressions","Recent expressions")))
782        {
783            for (int i=0; i<recentExpressions.size(); ++i)
784            {
785                ( (DefaultListModel)jList1.getModel()).addElement(recentExpressions.elementAt(i));
786            }
787        }
788        else if ((""+dmtn.getUserObject()).equalsIgnoreCase(I18n.getString("Wizards","Wizards")))
789        {
790            // Adding wizards...
791
( (DefaultListModel)jList1.getModel()).addElement(I18n.getString("Addition","Addition (+)"));
792            ( (DefaultListModel)jList1.getModel()).addElement(I18n.getString("Subtraction","Subtraction (-)"));
793            ( (DefaultListModel)jList1.getModel()).addElement(I18n.getString("Division","Division (/)"));
794            ( (DefaultListModel)jList1.getModel()).addElement(I18n.getString("Multiplication","Multiplication (*)"));
795        }
796     }//GEN-LAST:event_jTree1ValueChanged
797

798     private void jButtonCancelActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_jButtonCancelActionPerformed
799
//this.setExpression( this.jEditTextArea1.getText() );
800
this.setDialogResult( javax.swing.JOptionPane.NO_OPTION );
801        this.dispose();
802     }//GEN-LAST:event_jButtonCancelActionPerformed
803

804     private void jButtonApplyActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_jButtonApplyActionPerformed
805
this.setExpression( this.jEditTextArea1.getText() );
806        
807        recentExpressions.add( this.jEditTextArea1.getText() );
808        
809        this.setDialogResult( javax.swing.JOptionPane.OK_OPTION );
810        this.dispose();
811     }//GEN-LAST:event_jButtonApplyActionPerformed
812

813     private void jEditTextArea1ComponentResized(java.awt.event.ComponentEvent JavaDoc evt) {//GEN-FIRST:event_jEditTextArea1ComponentResized
814
// Add your handling code here:
815
}//GEN-LAST:event_jEditTextArea1ComponentResized
816

817     private void formComponentResized(java.awt.event.ComponentEvent JavaDoc evt) {//GEN-FIRST:event_formComponentResized
818
//this.jEditTextArea1.recalculateVisibleLines();
819
this.jEditTextArea1.updateScrollBars();
820     }//GEN-LAST:event_formComponentResized
821

822     /** Exit the Application */
823     private void exitForm(java.awt.event.WindowEvent JavaDoc evt) {//GEN-FIRST:event_exitForm
824

825     }//GEN-LAST:event_exitForm
826

827     /**
828      * @param args the command line arguments
829      */

830     public static void main(String JavaDoc args[])
831     {
832        new ExpressionEditor().setVisible(true);
833     }
834     
835
836     /** Getter for property Expression.
837      * @return Value of property Expression.
838      *
839      */

840     public java.lang.String JavaDoc getExpression()
841     {
842        return Expression;
843     }
844     
845     /** Setter for property Expression.
846      * @param Expression New value of property Expression.
847      *
848      */

849     public void setExpression(java.lang.String JavaDoc Expression)
850     {
851         init = true;
852        this.jEditTextArea1.setText( Expression );
853        this.Expression = Expression;
854        init = false;
855     }
856     
857     /** Getter for property dialogResult.
858      * @return Value of property dialogResult.
859      *
860      */

861     public int getDialogResult()
862     {
863        return dialogResult;
864     }
865     
866     /** Setter for property dialogResult.
867      * @param dialogResult New value of property dialogResult.
868      *
869      */

870     public void setDialogResult(int dialogResult)
871     {
872        this.dialogResult = dialogResult;
873     }
874     
875     // Variables declaration - do not modify//GEN-BEGIN:variables
876
private javax.swing.JButton JavaDoc jButtonApply;
877     private javax.swing.JButton JavaDoc jButtonCancel;
878     private javax.swing.JButton JavaDoc jButtonCheckExpression;
879     private javax.swing.JButton JavaDoc jButtonLoadExpression;
880     private javax.swing.JButton JavaDoc jButtonSaveExpression;
881     private org.syntax.jedit.JEditTextArea jEditTextArea1;
882     private javax.swing.JLabel JavaDoc jLabel1;
883     private javax.swing.JLabel JavaDoc jLabelCaretPosition;
884     private javax.swing.JList JavaDoc jList1;
885     private javax.swing.JList JavaDoc jList2;
886     private javax.swing.JPanel JavaDoc jPanel1;
887     private javax.swing.JPanel JavaDoc jPanel2;
888     private javax.swing.JPanel JavaDoc jPanel3;
889     private javax.swing.JPanel JavaDoc jPanel4;
890     private javax.swing.JPanel JavaDoc jPanel5;
891     private javax.swing.JPanel JavaDoc jPanel6;
892     private javax.swing.JScrollPane JavaDoc jScrollPane1;
893     private javax.swing.JScrollPane JavaDoc jScrollPane2;
894     private javax.swing.JScrollPane JavaDoc jScrollPane3;
895     private javax.swing.JScrollPane JavaDoc jScrollPane4;
896     private javax.swing.JSplitPane JavaDoc jSplitPane1;
897     private javax.swing.JSplitPane JavaDoc jSplitPane3;
898     private javax.swing.JSplitPane JavaDoc jSplitPaneOAE;
899     private javax.swing.JTabbedPane JavaDoc jTabbedPane1;
900     private javax.swing.JTextPane JavaDoc jTextPaneErrors;
901     private javax.swing.JTree JavaDoc jTree1;
902     // End of variables declaration//GEN-END:variables
903

904    
905     private String JavaDoc Expression;
906     
907     private int dialogResult;
908
909     public SubDataset getSubDataset() {
910         return subDataset;
911     }
912
913     public void setSubDataset(SubDataset subDataset) {
914         this.subDataset = subDataset;
915         
916         // Selezioniamo il campo fields....
917
if (subDataset != null)
918         {
919             jEditTextArea1.getTokenMarker().setKeywordLookup(subDataset.getKeywordLookup());
920         }
921         updateTreeEntries();
922         
923     }
924     
925     public void updateTreeEntries() {
926         
927         
928         DefaultMutableTreeNode root = (DefaultMutableTreeNode)jTree1.getModel().getRoot();
929         
930         root.removeAllChildren();
931         
932         if (getSubDataset() != null)
933         {
934             root.add( new DefaultMutableTreeNode("Fields"));
935             root.add( new DefaultMutableTreeNode("Variables"));
936             root.add( new DefaultMutableTreeNode("Parameters"));
937         }
938         
939         for (int i=0; i<getCrosstabElements().size(); ++i)
940         {
941             root.add( new DefaultMutableTreeNode( new CrosstabReportElementWrapper( (CrosstabReportElement)getCrosstabElements().get(i))));
942         }
943         root.add( new DefaultMutableTreeNode(I18n.getString("Formulas","Formulas" )));
944         
945         root.add( new DefaultMutableTreeNode(I18n.getString("RecentExpressions","Recent expressions")));
946         
947         root.add( new DefaultMutableTreeNode(new IconedString(I18n.getString("Wizards","Wizards"),"/it/businesslogic/ireport/icons/wand.png" )));
948         
949         jTree1.expandPath(new TreePath(root));
950         jTree1.updateUI();
951         jTree1.setSelectionRow(0);
952     }
953
954     public Vector getCrosstabElements() {
955         return crosstabElements;
956     }
957
958     public void setCrosstabElements(Vector crosstabElements) {
959         this.crosstabElements = crosstabElements;
960     }
961     
962     
963     public void addCrosstabReportElement(CrosstabReportElement re)
964     {
965         if (!this.getCrosstabElements().contains(re))
966         {
967             getCrosstabElements().add(re);
968             updateTreeEntries();
969         }
970     }
971     
972     /**
973      * Set an expression contex. If the passes expression context is null,
974      * nothing is done...
975      * The context replace all previos settings
976      */

977     public void setExpressionContext(ExpressionContext ec)
978     {
979         if ( ec == null) return;
980         setCrosstabElements(ec.getCrosstabReportElements());
981         
982         setSubDataset(ec.getSubDataset());
983     }
984     
985     /*
986     private Class getSelectedObjectClass()
987     {
988         try {
989             if (jList1.getSelectedValue() == null) return null;
990             String s = (String)jList1.getSelectedValue();
991
992             if (s == null) return null;
993
994             DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode)jTree1.getSelectionPath().getLastPathComponent();
995             if (dmtn.getUserObject() instanceof CrosstabReportElementWrapper)
996             {
997                     // look for the object here....
998                     CrosstabReportElement cr = ((CrosstabReportElementWrapper)dmtn.getUserObject()).getCrosstabReportElement();
999                    Enumeration e = cr.getMeasures().elements();
1000                   while (e.hasMoreElements())
1001                   {
1002                     Measure measure = (Measure)e.nextElement();
1003                     if (s.equals( "$V{"+measure+"}" ))
1004                     {
1005                         return this.getClass().getClassLoader().loadClass( measure.getClassType() );
1006                     }
1007
1008                     for (int j=0; j<cr.getRowGroups().size(); ++j)
1009                     {
1010                        CrosstabGroup group = (CrosstabGroup)cr.getRowGroups().elementAt(j);
1011                        if (s.equals( "$V{"+measure+"_"+group.getName()+"_"+"ALL}"))
1012                        {
1013                            // should be always a number?
1014                             return this.getClass().getClassLoader().loadClass( measure.getClassType() );
1015                        }
1016                     }
1017                     for (int j=0; j<cr.getColumnGroups().size(); ++j)
1018                     {
1019                        CrosstabGroup group = (CrosstabGroup)cr.getColumnGroups().elementAt(j);
1020                        if (s.equals( "$V{"+group+"_"+group.getName()+"_"+"ALL}"))
1021                        {
1022                            // should be always a number?
1023                             return this.getClass().getClassLoader().loadClass( group.getBucketExpressionClass());
1024                        }
1025                     }
1026                   }
1027
1028                   for (int i=0; i<cr.getRowGroups().size(); ++i)
1029                   {
1030                        CrosstabGroup group = (CrosstabGroup)cr.getRowGroups().elementAt(i);
1031                        if (s.equals( "$V{"+group+"}"))
1032                        {
1033                            // should be always a number?
1034                             return this.getClass().getClassLoader().loadClass( group.getBucketExpressionClass());
1035                        }
1036                   }
1037
1038                   for (int i=0; i<cr.getColumnGroups().size(); ++i)
1039                   {
1040                        CrosstabGroup group = (CrosstabGroup)cr.getColumnGroups().elementAt(i);
1041                        if (s.equals( "$V{"+group+"}"))
1042                        {
1043                            // should be always a number?
1044                             return this.getClass().getClassLoader().loadClass( group.getBucketExpressionClass());
1045                        }
1046                   }
1047
1048                   for (int i=0; i<cr.getCrosstabParameters().size(); ++i)
1049                   {
1050                       CrosstabParameter parameter = (CrosstabParameter)cr.getCrosstabParameters().elementAt(i);
1051                       if (s.equals( "$P{"+parameter +"}"))
1052                        {
1053                            // should be always a number?
1054                             return this.getClass().getClassLoader().loadClass( parameter.getClassType());
1055                        }
1056                   }
1057            }
1058            else if ((""+dmtn.getUserObject()).equalsIgnoreCase("Fields") && getSubDataset() != null)
1059           {
1060              Enumeration e = getSubDataset().getFields().elements();
1061              while (e.hasMoreElements())
1062              {
1063                  JRField f = (JRField)e.nextElement();
1064                  if (s.equals( "$F{"+ f +"}"))
1065                        {
1066                            // should be always a number?
1067                             return this.getClass().getClassLoader().loadClass( f.getClassType());
1068                        }
1069              }
1070           }
1071           else if ((""+dmtn.getUserObject()).equalsIgnoreCase("Parameters") && getSubDataset() != null)
1072           {
1073              Enumeration e = getSubDataset().getParameters().elements();
1074              while (e.hasMoreElements())
1075              {
1076                 JRParameter p = (JRParameter)e.nextElement();
1077                  if (s.equals( "$P{"+ p +"}"))
1078                    {
1079                        // should be always a number?
1080                         return this.getClass().getClassLoader().loadClass( p.getClassType());
1081                    }
1082              }
1083           }
1084           else if ((""+dmtn.getUserObject()).equalsIgnoreCase("Variables") && getSubDataset() != null)
1085           {
1086              Enumeration e = getSubDataset().getVariables().elements();
1087              while (e.hasMoreElements())
1088              {
1089                 JRVariable v = (JRVariable)e.nextElement();
1090                  if (s.equals( "$V{"+ v +"}"))
1091                    {
1092                        // should be always a number?
1093                         return this.getClass().getClassLoader().loadClass(v.getClassType());
1094                    }
1095              }
1096           }
1097        
1098        } catch (Throwable ex)
1099        {
1100            ex.printStackTrace();
1101            return null;
1102        }
1103        
1104        return null;
1105    }
1106 */

1107    public void caretUpdate(CaretEvent JavaDoc e) {
1108        
1109       MessageFormat JavaDoc formatter = new MessageFormat JavaDoc("");
1110       formatter.applyPattern( I18n.getString("LineColumn","Line {0,number,integer}, Column {1,number,integer}" ));
1111
1112       if (jEditTextArea1.getCaretLine() < 0)
1113       {
1114           jLabelCaretPosition.setText(formatter.format(new Object JavaDoc[]{new Integer JavaDoc(0), new Integer JavaDoc(0)}));
1115       }
1116       String JavaDoc s = jEditTextArea1.getText();
1117       
1118       int pos = jEditTextArea1.getCaretPosition();
1119       int newLineStart = s.substring(0,jEditTextArea1.getCaretPosition()).lastIndexOf('\n')+1;
1120       pos = pos - newLineStart;
1121       pos++;
1122       
1123       jLabelCaretPosition.setText(formatter.format(new Object JavaDoc[]{new Integer JavaDoc((jEditTextArea1.getCaretLine()+1)), new Integer JavaDoc(pos)}));
1124    }
1125   
1126    
1127    public void applyI18n()
1128    {
1129                // Start autogenerated code ----------------------
1130
jLabel1.setText(I18n.getString("expressionEditor.label1"," "));
1131                jLabelCaretPosition.setText(I18n.getString("expressionEditor.labelCaretPosition","Line: 1 Column: 1"));
1132                // End autogenerated code ----------------------
1133
jButtonLoadExpression.setText(it.businesslogic.ireport.util.I18n.getString("import", "Import..."));
1134        jButtonSaveExpression.setText(it.businesslogic.ireport.util.I18n.getString("export", "Export..."));
1135        jButtonCheckExpression.setText(it.businesslogic.ireport.util.I18n.getString("checkExpression", "Check expression"));
1136        jButtonApply.setText(it.businesslogic.ireport.util.I18n.getString("gui.OptionsDialog.ButtonApply", "Apply"));
1137        jButtonCancel.setText(it.businesslogic.ireport.util.I18n.getString("gui.OptionsDialog.ButtonCancel", "Cancel"));
1138        jTabbedPane1.setTitleAt(0,it.businesslogic.ireport.util.I18n.getString("ObjectsAndExpressions", "Objects and expressions") );
1139        jTabbedPane1.setTitleAt(1,it.businesslogic.ireport.util.I18n.getString("ValidationErrors", "Validation errors") );
1140    
1141    
1142        jTabbedPane1.setTitleAt(0, it.businesslogic.ireport.util.I18n.getString("expressionEditor.tab.ObjectsAndExpressions","Objects and expressions"));
1143        jTabbedPane1.setTitleAt(1, it.businesslogic.ireport.util.I18n.getString("expressionEditor.tab.ValidationErrors","Validation errors"));
1144                  
1145    }
1146    
1147    public void validateExpression()
1148    {
1149        String JavaDoc expression_to_validate = jEditTextArea1.getText();
1150        
1151        // 1. replace all $Parameters, $Variables, $Fields and $R expressions
1152
JRDesignExpression jrExpression = new JRDesignExpression();
1153        jrExpression.setText( expression_to_validate );
1154        jTextPaneErrors.setText("");
1155        
1156        try {
1157            
1158            java.util.List JavaDoc paramsObjects = new java.util.ArrayList JavaDoc();
1159            java.util.List JavaDoc varsObjects = new java.util.ArrayList JavaDoc();
1160            java.util.List JavaDoc fieldsObjects = new java.util.ArrayList JavaDoc();
1161            
1162            String JavaDoc final_espression = generateExpression(jrExpression, paramsObjects, fieldsObjects, varsObjects);
1163
1164            if ( MainFrame.getMainInstance().getActiveReportFrame().getReport().getLanguage().equals("groovy"))
1165            {
1166                Binding binding = new Binding();
1167                for (int i=0; i<paramsObjects.size(); ++i)
1168                {
1169                    String JavaDoc name = ""+paramsObjects.get(i);
1170                    binding.setVariable(name, new JRFakeObject());
1171                }
1172                for (int i=0; i<varsObjects.size(); ++i)
1173                {
1174                    String JavaDoc name = ""+varsObjects.get(i);
1175                    binding.setVariable(name, new JRFakeObject());
1176                }
1177                for (int i=0; i<fieldsObjects.size(); ++i)
1178                {
1179                    String JavaDoc name = ""+fieldsObjects.get(i);
1180                    binding.setVariable(name, new JRFakeObject());
1181                }
1182                GroovyShell shell = new GroovyShell(binding);
1183                
1184                shell.parse(final_espression);
1185
1186            }
1187            else if ( MainFrame.getMainInstance().getActiveReportFrame().getReport().getLanguage().equals("java"))
1188            {
1189                bsh.Interpreter interpreter = new bsh.Interpreter();
1190            
1191                StringTokenizer st = new StringTokenizer( MainFrame.getMainInstance().getProperties().getProperty("classpath",""),"\n");
1192                interpreter.eval("String tmp;");
1193                while (st.hasMoreTokens())
1194                {
1195                    String JavaDoc token = st.nextToken();
1196                    if (token != null && token.trim().length() > 0)
1197                    {
1198                        interpreter.set("tmp", token.trim());
1199                        interpreter.eval("addClassPath(tmp);");
1200                    }
1201                }
1202
1203                // Add report import directives to the bsh interpreter
1204
Enumeration imps = MainFrame.getMainInstance().getActiveReportFrame().getReport().getImports().elements();
1205                while ( imps.hasMoreElements() )
1206                {
1207                    String JavaDoc var = (String JavaDoc)imps.nextElement();
1208                    interpreter.eval("import " + var + ";");
1209                }
1210
1211                interpreter.eval("import java.util.*;");
1212                interpreter.eval("import java.math.*;");
1213                interpreter.eval("import java.text.*;");
1214                interpreter.eval("import java.io.*;");
1215                interpreter.eval("import java.net.*;");
1216                interpreter.setStrictJava(true);
1217
1218                for (int i=0; i<paramsObjects.size(); ++i)
1219                {
1220                    String JavaDoc name = ""+paramsObjects.get(i);
1221                    interpreter.set(name, new JRFakeObject());
1222                }
1223                for (int i=0; i<varsObjects.size(); ++i)
1224                {
1225                    String JavaDoc name = ""+varsObjects.get(i);
1226                    interpreter.set(name, new JRFakeObject());
1227                }
1228                for (int i=0; i<fieldsObjects.size(); ++i)
1229                {
1230                    String JavaDoc name = ""+fieldsObjects.get(i);
1231                    interpreter.set(name, new JRFakeObject());
1232                }
1233
1234                interpreter.eval(final_espression);
1235            }
1236            setErrorText(it.businesslogic.ireport.util.I18n.getString("ValidationOK", "Expression successfully validated."),false);
1237        
1238        
1239        } catch (CompilationFailedException ex)
1240        {
1241            setErrorText( ex.getMessage() , true);
1242        } catch (ParseException ex)
1243        {
1244            setErrorText(ex.getMessage() + "\n" + ex.getErrorText() + "\nLine: " + ex.getErrorLineNumber(), true );
1245            
1246        } catch (TargetError ex)
1247        {
1248            // What to say... we tried!
1249
setErrorText(it.businesslogic.ireport.util.I18n.getString("ValidationOK", "Expression successfully validated."), true);
1250        
1251        } catch (EvalError ex)
1252        {
1253            setErrorText(ex.getMessage() + "\n" + ex.getErrorText() + "\nLine: " + ex.getErrorLineNumber(), true );
1254        } catch (IRParsingException ex)
1255        {
1256            setErrorText( ex.getMessage() , true);
1257            if (ex.getChunk() != null)
1258            {
1259                int pos = expression_to_validate.indexOf( ex.getChunk() );
1260                if (pos >=0)
1261                {
1262                    jEditTextArea1.setSelectionStart(pos);
1263                    jEditTextArea1.setSelectionEnd(pos);
1264                    jEditTextArea1.setSelectionEnd(pos + ex.getChunk().length());
1265                }
1266            }
1267        } catch (Exception JavaDoc ex)
1268        {
1269            setErrorText(ex.getMessage(), true);
1270            ex.printStackTrace();
1271        }
1272        
1273        jTabbedPane1.setSelectedIndex(1);
1274    }
1275    
1276    private String JavaDoc generateExpression(JRExpression expression,
1277                                      java.util.List JavaDoc paramsObjects,
1278                                      java.util.List JavaDoc fieldsObjects,
1279                                      java.util.List JavaDoc varsObjects) throws IRParsingException
1280    {
1281        net.sf.jasperreports.engine.JRParameter jrParameter = null;
1282        net.sf.jasperreports.engine.JRField jrField = null;
1283        net.sf.jasperreports.engine.JRVariable jrVariable = null;
1284
1285        StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
1286
1287        JRExpressionChunk[] chunks = expression.getChunks();
1288        JRExpressionChunk chunk = null;
1289        String JavaDoc chunkText = null;
1290        if (chunks != null && chunks.length > 0)
1291        {
1292            for(int i = 0; i < chunks.length; i++)
1293            {
1294                chunk = chunks[i];
1295
1296                chunkText = chunk.getText();
1297                if (chunkText == null)
1298                {
1299                    chunkText = "";
1300                }
1301                
1302                switch (chunk.getType())
1303                {
1304                    case JRExpressionChunk.TYPE_TEXT :
1305                    {
1306                        sb.append(chunkText);
1307                        break;
1308                    }
1309                    case JRExpressionChunk.TYPE_PARAMETER :
1310                    {
1311                                                // Look for the given parameter...
1312
JRParameter param = (JRParameter)getExpressionObject(chunkText, PARAMETER);
1313    
1314                        sb.append("((");
1315                        sb.append(param.getClassType());
1316                        sb.append(")");
1317                                                String JavaDoc vname = "parameter_" + JRStringUtil.getLiteral(chunkText);
1318                        sb.append(vname);
1319                                                paramsObjects.add(vname);
1320                        sb.append(".getValue())");
1321    
1322                        break;
1323                    }
1324                    case JRExpressionChunk.TYPE_FIELD :
1325                    {
1326                                                JRField field = (JRField)getExpressionObject(chunkText, FIELD);
1327                        
1328                        sb.append("((");
1329                        sb.append(field.getClassType());
1330                        sb.append(")");
1331                                                String JavaDoc vname = "field_" + JRStringUtil.getLiteral(chunkText);
1332                        sb.append(vname);
1333                                                fieldsObjects.add(vname);
1334                        sb.append(".get");
1335                        //sb.append((String)fieldPrefixMap.get(new Byte(evaluationType)));
1336
sb.append("Value())");
1337    
1338                        break;
1339                    }
1340                    case JRExpressionChunk.TYPE_VARIABLE :
1341                    {
1342                        JRVariable variable = (JRVariable)getExpressionObject(chunkText, VARIABLE);
1343    
1344                        sb.append("((");
1345                        sb.append(variable.getClassType());
1346                        sb.append(")");
1347                        String JavaDoc vname = "variable_" + JRStringUtil.getLiteral(chunkText);
1348                        sb.append(vname);
1349                                                varsObjects.add(vname);
1350                        sb.append(".get");
1351                        //sb.append((String)variablePrefixMap.get(new Byte(evaluationType)));
1352
sb.append("Value())");
1353    
1354                        break;
1355                    }
1356                    case JRExpressionChunk.TYPE_RESOURCE :
1357                    {
1358                        sb.append("str(\"");
1359                        sb.append(chunkText);
1360                        sb.append("\")");
1361    
1362                        break;
1363                    }
1364                }
1365            }
1366        }
1367        
1368        if (sb.length() == 0)
1369        {
1370            sb.append("null");
1371        }
1372
1373        return sb.toString();
1374    }
1375        
1376    private Object JavaDoc getExpressionObject(String JavaDoc name, int type) throws IRParsingException
1377    {
1378        if (name == null) throw new IRParsingException("Object not found!");
1379        
1380        SubDataset subDataset = getSubDataset();
1381        if (getSubDataset() == null && getCrosstabElements().size() == 0)
1382        {
1383            subDataset = MainFrame.getMainInstance().getActiveReportFrame().getReport();
1384        }
1385        
1386        if (type == PARAMETER)
1387        {
1388            if (subDataset != null)
1389            {
1390                Enumeration e = subDataset.getParameters().elements();
1391                while (e.hasMoreElements())
1392                {
1393                    JRParameter p = (JRParameter)e.nextElement();
1394                    if (p.getName().equals(name)) return p;
1395                }
1396            }
1397            
1398            // Try to look in some crosstab...
1399
for (int k=0; k<crosstabElements.size(); ++k)
1400            {
1401                //----------------------------------------------
1402
CrosstabReportElement cr = (CrosstabReportElement)crosstabElements.get(k);
1403   
1404                   for (int i=0; i<cr.getCrosstabParameters().size(); ++i)
1405                   {
1406                       CrosstabParameter parameter = (CrosstabParameter)cr.getCrosstabParameters().elementAt(i);
1407                       if (name.equals( ""+parameter) )
1408                       {
1409                            // should be always a number?
1410
return new JRParameter(parameter.getName(), parameter.getClassType());
1411                       }
1412                   }
1413            //-----------------------------------------------------
1414

1415            }
1416            // Parameter not found!!!
1417

1418            throw new IRParsingException("Parameter " + name + " not found!", "$P{" + name + "}");
1419        }
1420        else if (type == FIELD)
1421        {
1422            if (subDataset != null)
1423            {
1424                Enumeration e = subDataset.getFields().elements();
1425                while (e.hasMoreElements())
1426                {
1427                    JRField p = (JRField)e.nextElement();
1428                    if (p.getName().equals(name)) return p;
1429                }
1430            }
1431            // Parameter not found!!!
1432
throw new IRParsingException("Field " + name + " not found!", "$F{" + name + "}");
1433        }
1434        else if (type == VARIABLE)
1435        {
1436            if (subDataset != null)
1437            {
1438                Enumeration e = subDataset.getVariables().elements();
1439                while (e.hasMoreElements())
1440                {
1441                    JRVariable p = (JRVariable)e.nextElement();
1442                    if (p.getName().equals(name)) return p;
1443                }
1444            }
1445            
1446            // Try to look in some crosstab...
1447
for (int k=0; k<crosstabElements.size(); ++k)
1448            {
1449                //----------------------------------------------
1450
CrosstabReportElement cr = (CrosstabReportElement)crosstabElements.get(k);
1451                Enumeration e = cr.getMeasures().elements();
1452                   while (e.hasMoreElements())
1453                   {
1454                     Measure measure = (Measure)e.nextElement();
1455                     if (name.equals( measure.getName() ))
1456                     {
1457                         return new JRVariable(measure.getName(), measure.getClassType(),false);
1458                     }
1459
1460                     for (int j=0; j<cr.getRowGroups().size(); ++j)
1461                     {
1462                        CrosstabGroup group = (CrosstabGroup)cr.getRowGroups().elementAt(j);
1463                        if (name.equals( ""+measure+"_"+group.getName()+"_"+"ALL"))
1464                        {
1465                            // should be always a number?
1466
return new JRVariable(measure+"_"+group.getName(), group.getBucketExpressionClass(),false);
1467                        }
1468                     }
1469                     for (int j=0; j<cr.getColumnGroups().size(); ++j)
1470                     {
1471                        CrosstabGroup group = (CrosstabGroup)cr.getColumnGroups().elementAt(j);
1472                        if (name.equals( ""+group+"_"+group.getName()+"_"+"ALL"))
1473                        {
1474                            // should be always a number?
1475
return new JRVariable(measure+"_"+group.getName(), group.getBucketExpressionClass(),false);
1476                        }
1477                     }
1478                   }
1479
1480                   for (int i=0; i<cr.getRowGroups().size(); ++i)
1481                   {
1482                        CrosstabGroup group = (CrosstabGroup)cr.getRowGroups().elementAt(i);
1483                        if (name.equals( ""+group))
1484                        {
1485                            // should be always a number?
1486
return new JRVariable(""+group, group.getBucketExpressionClass(),false);
1487                        }
1488                   }
1489
1490                   for (int i=0; i<cr.getColumnGroups().size(); ++i)
1491                   {
1492                        CrosstabGroup group = (CrosstabGroup)cr.getColumnGroups().elementAt(i);
1493                        if (name.equals( ""+group))
1494                        {
1495                            // should be always a number?
1496
return new JRVariable(""+group, group.getBucketExpressionClass(),false);
1497                        }
1498                   }
1499
1500                   
1501            //-----------------------------------------------------
1502

1503            }
1504            // Parameter not found!!!
1505
throw new IRParsingException("Variable " + name + " not found!", "$F{" + name + "}");
1506        }
1507        
1508        throw new IRParsingException("Object " + name + " not found!", name);
1509    }
1510    
1511    public void setErrorText(String JavaDoc msg, boolean isError)
1512    {
1513        jTextPaneErrors.setText("");
1514        try {
1515        doc.insertString(doc.getLength(), msg, (isError) ? errorStyle : okStyle);
1516        } catch (Exception JavaDoc ex){}
1517    }
1518    
1519    
1520    public java.util.List JavaDoc getAllObjects()
1521    {
1522        java.util.List JavaDoc list = new java.util.ArrayList JavaDoc();
1523        if (getSubDataset() != null)
1524        {
1525            Enumeration e = getSubDataset().getFields().elements();
1526            while (e.hasMoreElements())
1527            {
1528                JRField f = (JRField)e.nextElement();
1529                list.add(new ExpObject(f.getName(), ExpObject.TYPE_FIELD, f.getClassType() ));
1530            }
1531            
1532            e = getSubDataset().getVariables().elements();
1533            while (e.hasMoreElements())
1534            {
1535                JRVariable f = (JRVariable)e.nextElement();
1536                list.add(new ExpObject(f.getName(), ExpObject.TYPE_VARIABLE, f.getClassType() ));
1537            }
1538            
1539            e = getSubDataset().getParameters().elements();
1540            while (e.hasMoreElements())
1541            {
1542                JRParameter f = (JRParameter)e.nextElement();
1543                list.add(new ExpObject(f.getName(), ExpObject.TYPE_PARAM, f.getClassType() ));
1544            }
1545        }
1546        for (int ct=0; ct<getCrosstabElements().size(); ++ct)
1547        {
1548             CrosstabReportElement cr = (CrosstabReportElement)getCrosstabElements().get(ct);
1549             Enumeration e = cr.getMeasures().elements();
1550             while (e.hasMoreElements())
1551             {
1552                Measure measure = (Measure)e.nextElement();
1553                list.add(new ExpObject(measure.getName(), ExpObject.TYPE_VARIABLE, measure.getClassType() ));
1554                
1555                for (int j=0; j<cr.getRowGroups().size(); ++j)
1556                {
1557                    CrosstabGroup group = (CrosstabGroup)cr.getRowGroups().elementAt(j);
1558                    list.add(new ExpObject(measure.getName()+"_"+group.getName()+"_"+"ALL", ExpObject.TYPE_VARIABLE, measure.getClassType() ));
1559                }
1560                for (int j=0; j<cr.getColumnGroups().size(); ++j)
1561                {
1562                    CrosstabGroup group = (CrosstabGroup)cr.getColumnGroups().elementAt(j);
1563                    list.add(new ExpObject(measure.getName()+"_"+group.getName()+"_"+"ALL", ExpObject.TYPE_VARIABLE, measure.getClassType() ));
1564                }
1565            }
1566             
1567            for (int i=0; i<cr.getRowGroups().size(); ++i)
1568           {
1569                CrosstabGroup group = (CrosstabGroup)cr.getRowGroups().elementAt(i);
1570                list.add(new ExpObject(group.getName(), ExpObject.TYPE_VARIABLE, group.getBucketExpressionClass() ));
1571           }
1572            
1573           for (int i=0; i<cr.getColumnGroups().size(); ++i)
1574           {
1575                CrosstabGroup group = (CrosstabGroup)cr.getColumnGroups().elementAt(i);
1576                list.add(new ExpObject(group.getName(), ExpObject.TYPE_VARIABLE, group.getBucketExpressionClass() ));
1577           }
1578           
1579
1580           for (int i=0; i<cr.getCrosstabParameters().size(); ++i)
1581           {
1582               CrosstabParameter parameter = (CrosstabParameter)cr.getCrosstabParameters().elementAt(i);
1583               list.add(new ExpObject(parameter.getName(), ExpObject.TYPE_PARAM, parameter.getClassType() ));
1584           }
1585        }
1586        
1587        return list;
1588    }
1589    
1590}
1591
1592
Popular Tags