com.jaspersoft.ireport.designer.data.fieldsproviders.BeanInspectorPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.ireport.designer.data.fieldsproviders.BeanInspectorPanel.java

Source

/*
 * iReport - Visual Designer for JasperReports.
 * Copyright (C) 2002 - 2009 Jaspersoft Corporation. All rights reserved.
 * http://www.jaspersoft.com
 *
 * Unless you have purchased a commercial license agreement from Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of iReport.
 *
 * iReport is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * iReport is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with iReport. If not, see <http://www.gnu.org/licenses/>.
 */
package com.jaspersoft.ireport.designer.data.fieldsproviders;

import com.jaspersoft.ireport.locale.I18n;
import com.jaspersoft.ireport.designer.data.*;
import com.jaspersoft.ireport.designer.FieldsProviderEditor;
import com.jaspersoft.ireport.designer.IReportManager;
import com.jaspersoft.ireport.designer.data.fieldsproviders.hibernate.HQLFieldsReader;
import com.jaspersoft.ireport.designer.utils.Misc;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import net.sf.jasperreports.engine.design.JRDesignField;
import org.apache.commons.beanutils.MethodUtils;

/**
 *
 * @author  gtoffoli
 */
public class BeanInspectorPanel extends javax.swing.JPanel implements FieldsProviderEditor {

    private boolean pathOnDescription = false;
    private JTable jTableFields = null;
    private boolean comboVisible = true;
    private ReportQueryDialog reportQueryDialog = null;

    /** Creates new form BeanInspectorPanel */
    public BeanInspectorPanel() {
        initComponents();

        DefaultTreeModel dttm = (DefaultTreeModel) jTree1.getModel();
        DefaultMutableTreeNode root = new DefaultMutableTreeNode();
        jTree1.setModel(new DefaultTreeModel(root));

        jTree1.setCellRenderer(new JBTreeCellRenderer());

        //applyI18n();
    }

    public void setClassNames(List classNames) {
        if (classNames == null)
            return;

        jComboBox1.removeAllItems();
        for (int i = 0; i < classNames.size(); ++i) {
            jComboBox1.addItem(classNames.get(i));
        }

        jComboBox1ActionPerformed(null);
    }

    /**
     * Must be used when the combobox is not visible...
     */
    public void setClassName(String className) {
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) jTree1.getModel().getRoot();
        root.removeAllChildren();
        jTree1.updateUI();
        if (className != null && className.trim().length() > 0) {
            exploreBean(root, className, "");
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jComboBox1 = new javax.swing.JComboBox();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTree1 = new javax.swing.JTree();
        jPanel2 = new javax.swing.JPanel();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();

        setLayout(new java.awt.GridBagLayout());

        jPanel1.setLayout(new java.awt.GridBagLayout());

        jLabel1.setText(I18n.getString("BeanInspectorPanel.Label.Bean")); // NOI18N
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
        jPanel1.add(jLabel1, gridBagConstraints);

        jComboBox1.setMinimumSize(new java.awt.Dimension(51, 22));
        jComboBox1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBox1ActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(4, 0, 4, 0);
        jPanel1.add(jComboBox1, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        add(jPanel1, gridBagConstraints);

        jTree1.setRootVisible(false);
        jTree1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jTree1MouseClicked1(evt);
            }
        });
        jScrollPane1.setViewportView(jTree1);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridwidth = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0);
        add(jScrollPane1, gridBagConstraints);

        jPanel2.setLayout(new java.awt.GridBagLayout());

        jButton2.setText(I18n.getString("BeanInspectorPanel.Button.AddFields")); // NOI18N
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 4);
        jPanel2.add(jButton2, gridBagConstraints);

        jButton3.setText(I18n.getString("BeanInspectorPanel.Button.ClearFields")); // NOI18N
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed1(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
        gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 0);
        jPanel2.add(jButton3, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0);
        add(jPanel2, gridBagConstraints);
    }// </editor-fold>//GEN-END:initComponents

    private void jButton2ActionPerformed1(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed1

        DefaultTableModel dtm = (DefaultTableModel) getJTableFields().getModel();
        dtm.setRowCount(0);

    }//GEN-LAST:event_jButton2ActionPerformed1

    @SuppressWarnings("unchecked")
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed

        DefaultTableModel dtm = (DefaultTableModel) getJTableFields().getModel();

        TreePath[] paths = jTree1.getSelectionPaths();
        if (paths == null)
            return;
        for (int i = 0; i < paths.length; ++i) {
            boolean valid = true;
            TreePath tp = paths[i];

            TreeJRField tjrf = (TreeJRField) ((DefaultMutableTreeNode) tp.getLastPathComponent()).getUserObject();
            String returnType = Misc.getJRFieldType(tjrf.getObj().getName());

            JRDesignField field = new JRDesignField();
            field.setName(tjrf.getField().getName());
            field.setValueClassName(returnType);

            field.setDescription(tjrf.getField().getDescription());
            Vector row = new Vector();
            row.addElement(field);
            row.addElement(field.getValueClassName());
            row.addElement(field.getDescription());

            if (isComboVisible() && jComboBox1.getSelectedItem() instanceof FieldClassWrapper) {
                FieldClassWrapper cw = (FieldClassWrapper) jComboBox1.getSelectedItem();
                field.setName(cw.getFieldName() + "." + field.getDescription());
                field.setDescription(field.getName());
            }

            // Check for duplicates fields...
            boolean found = fieldAlreadyExists(field);
            String baseName = field.getName();
            for (int j = 1; isPathOnDescription() && found; ++j) {
                field.setName(baseName + "_" + j);
                found = fieldAlreadyExists(field);
            }

            if (!found) {
                dtm.addRow(row);
                getJTableFields().getSelectionModel().addSelectionInterval(getJTableFields().getRowCount() - 1,
                        getJTableFields().getRowCount() - 1);
            }
        }
    }//GEN-LAST:event_jButton2ActionPerformed

    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboBox1ActionPerformed

        Object obj = jComboBox1.getSelectedItem();
        if (obj == null) {
            setClassName(null);
            return;
        }
        if (obj instanceof String)
            setClassName((String) obj);
        if (obj instanceof FieldClassWrapper)
            setClassName(((FieldClassWrapper) obj).getClassType());

    }//GEN-LAST:event_jComboBox1ActionPerformed

    private boolean fieldAlreadyExists(JRDesignField field) {
        boolean found = false;
        for (int j = 0; j < getJTableFields().getRowCount(); ++j) {
            Object ff = getJTableFields().getValueAt(j, 0);
            if (ff instanceof JRDesignField) {
                if (((JRDesignField) ff).getName().equals(field.getName())) {
                    found = true;
                    break;
                }
            }
        }

        return found;
    }

    private void jTree1MouseClicked1(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTree1MouseClicked1

        if (evt.getClickCount() == 2 && evt.getButton() == MouseEvent.BUTTON1) {
            DefaultMutableTreeNode tn = (DefaultMutableTreeNode) jTree1.getSelectionPath().getLastPathComponent();

            if (tn.getChildCount() > 0)
                return;

            /*if (!jTree1.isCollapsed( jTree1.getSelectionPath() ))
            {
            jTree1.collapsePath( jTree1.getSelectionPath() );
            return;
            }
             *
             */
            if (tn.getUserObject() instanceof TreeJRField) {
                TreeJRField jrf = (TreeJRField) tn.getUserObject();
                if (!jrf.getObj().isPrimitive() && !jrf.getObj().getName().startsWith("java.lang.")) {
                    exploreBean(tn, jrf.getObj().getName(),
                            isPathOnDescription() ? Misc.nvl(jrf.getField().getDescription(), "")
                                    : Misc.nvl(jrf.getField().getName(), ""));
                }
            }
        }

    }//GEN-LAST:event_jTree1MouseClicked1

    public void exploreBean(DefaultMutableTreeNode root, String classname, String parentPath) {
        try {

            root.removeAllChildren();
            if (parentPath.length() > 0)
                parentPath += ".";

            Class clazz = Class.forName(classname, true, IReportManager.getInstance().getReportClassLoader());

            java.beans.PropertyDescriptor[] pd = org.apache.commons.beanutils.PropertyUtils
                    .getPropertyDescriptors(clazz);
            for (int nd = 0; nd < pd.length; ++nd) {
                String fieldName = pd[nd].getName();
                if (pd[nd].getPropertyType() != null && pd[nd].getReadMethod() != null) {
                    Class clazzRT = pd[nd].getPropertyType();

                    if (clazzRT.isPrimitive()) {
                        clazzRT = MethodUtils.getPrimitiveWrapper(clazzRT);
                    }

                    String returnType = clazzRT.getName();

                    JRDesignField field = new JRDesignField();
                    field.setName(fieldName);
                    field.setValueClassName(returnType);

                    if (isPathOnDescription()) {
                        field.setDescription(parentPath + fieldName);
                    } else {
                        field.setName(parentPath + fieldName);
                    }

                    TreeJRField jtf = new TreeJRField();

                    jtf.setField(field);
                    jtf.setObj(pd[nd].getPropertyType());

                    boolean bChildrens = true;
                    if (pd[nd].getPropertyType().isPrimitive()
                            || pd[nd].getPropertyType().getName().startsWith("java.lang.")) {
                        bChildrens = false;
                    }
                    root.add(new DefaultMutableTreeNode(jtf, bChildrens));
                }
            }

            jTree1.expandPath(new TreePath(root.getPath()));
            jTree1.updateUI();

        } catch (ClassNotFoundException cnf) {
            javax.swing.JOptionPane.showMessageDialog(this, Misc.formatString( //"messages.BeanInspectorPanel.classNotFoundError",
                    I18n.getString("BeanInspectorPanel.Message.Error"), new Object[] { cnf.getMessage() }),
                    I18n.getString("BeanInspectorPanel.Message.Error2"), javax.swing.JOptionPane.ERROR_MESSAGE);
            return;
        } catch (Exception ex) {
            ex.printStackTrace();
            javax.swing.JOptionPane.showMessageDialog(this, ex.getMessage(),
                    I18n.getString("BeanInspectorPanel.Message.Error2"), javax.swing.JOptionPane.ERROR_MESSAGE);
            return;
        }
    }

    public JTable getJTableFields() {
        return jTableFields;
    }

    public void setJTableFields(JTable jTableFields) {
        this.jTableFields = jTableFields;
    }

    public boolean isComboVisible() {
        return comboVisible;
    }

    public void setComboVisible(boolean comboVisible) {
        this.comboVisible = comboVisible;
        jPanel1.setVisible(comboVisible);
    }

    public boolean isPathOnDescription() {
        return pathOnDescription;
    }

    public void setPathOnDescription(boolean pathOnDescription) {
        this.pathOnDescription = pathOnDescription;
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTree jTree1;
    // End of variables declaration//GEN-END:variables

    /*
    public void applyI18n(){
            // Start autogenerated code ----------------------
            jButton2.setText(I18n.getString("beanInspectorPanel.button2","Add selected field(s)"));
            jButton3.setText(I18n.getString("beanInspectorPanel.button3","Clear fields list"));
            jLabel1.setText(I18n.getString("beanInspectorPanel.label1","Bean"));
            // End autogenerated code ----------------------
    }
    */

    int lastExecution = 0;

    @SuppressWarnings("unchecked")
    public void queryChanged(String newQuery) {

        lastExecution++;
        int thisExecution = lastExecution;
        // Execute a thread to perform the query change...

        String error_msg = "";
        lastExecution++;

        int in = lastExecution;

        if (getReportQueryDialog() == null)
            return;

        getReportQueryDialog().getJLabelStatusSQL().setText(I18n.getString("BeanInspectorPanel.Label.StatusSQL"));
        /////////////////////////////

        try {
            Thread.currentThread().setContextClassLoader(IReportManager.getInstance().getReportClassLoader());
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        if (in < lastExecution)
            return; //Abort, new execution requested

        HQLFieldsReader hqlFR = new HQLFieldsReader(newQuery,
                getReportQueryDialog().getDataset().getParametersList());

        if (in < lastExecution)
            return; //Abort, new execution requested

        try {
            Vector fields = hqlFR.readFields();

            List columns = new ArrayList();
            for (int i = 0; i < fields.size(); ++i) {
                JRDesignField field = (JRDesignField) fields.elementAt(i);
                columns.add(new Object[] { field, field.getValueClassName(), field.getDescription() });
            }

            Vector v = hqlFR.getNotScalars();

            if (v.size() == 0)
                v = null;

            if (in < lastExecution)
                return; //Abort, new execution requested
            setBeanExplorerFromWorker(v, true, true);

            if (in < lastExecution)
                return; //Abort, new execution requested
            setColumnsFromWorker(columns);

        } catch (Exception ex) {
            ex.printStackTrace();
            setBeanExplorerFromWorker(null, true, true);
            setColumnErrorFromWork(I18n.getString("BeanInspectorPanel.Message.Error3") + ex.getMessage());
        }

        getReportQueryDialog().getJLabelStatusSQL()
                .setText(I18n.getString("BeanInspectorPanel.Message.StatusSQL2"));
    }

    /**
     * Set the columns error message in the ReportQueryDialog....
     * This is called from a none swing thread, hence all the invoke and
     * wait magic.
     * The message is only set if the query string matches the one the 
     * error message is for.
     *
     * @param columns The list of columns to set.
     */
    protected void setColumnErrorFromWork(final String error_msg) {
        try {

            Runnable r = new Runnable() {
                public void run() {
                    getReportQueryDialog().setColumnsError(error_msg);
                    getReportQueryDialog().getQueryEditorPane().requestFocusInWindow();
                }
            };

            if (SwingUtilities.isEventDispatchThread()) {
                r.run();
            } else {
                SwingUtilities.invokeAndWait(r);
            }

        } catch (Exception e) {
            // oh well we got interrupted.
        }
    }

    /**
     * Set the columns in the ReportQueryDialog....
     * This is called from a none swing thread, hence all the invoke and
     * wait magic.
     * The message is only set if the query string matches the one the 
     * error message is for.
     *
     * @param columns The list of columns to set.
     */
    protected void setColumnsFromWorker(final List columns) {
        try {

            Runnable r = new Runnable() {
                public void run() {
                    getReportQueryDialog().setColumns(columns);
                    getReportQueryDialog().getQueryEditorPane().requestFocusInWindow();
                }
            };

            if (SwingUtilities.isEventDispatchThread()) {
                r.run();
            } else {
                SwingUtilities.invokeAndWait(r);
            }

        } catch (Exception e) {
            // oh well we got interrupted.
        }
    }

    /**
     * Set the bean explorer
     *
     * @param columns The list of columns to set.
     */
    protected void setBeanExplorerFromWorker(final Vector v, final boolean pathOnDescription,
            final boolean useCombo) {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    Vector v1 = v;
                    if (v1 == null)
                        v1 = new Vector();

                    setComboVisible(useCombo);
                    setPathOnDescription(pathOnDescription);
                    setClassNames(v1);

                    getReportQueryDialog().getQueryEditorPane().requestFocusInWindow();
                    getReportQueryDialog().getQueryEditorPane().requestFocus();
                }
            });
        } catch (Exception e) {
            // oh well we got interrupted.
            e.printStackTrace();
        }
    }

    public ReportQueryDialog getReportQueryDialog() {
        return reportQueryDialog;
    }

    public void setReportQueryDialog(ReportQueryDialog reportQueryDialog) {
        this.reportQueryDialog = reportQueryDialog;
    }

}