/*
 * ReportViewer.java
 *
 * Created on August 4, 2008, 2:37 PM
 */
package usda.weru.weps.reports;

import com.blogspot.gyfus.LoadingCircle;
import de.schlichtherle.truezip.file.TFile;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Desktop;
import java.io.IOException;
import java.net.URL;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.concurrent.Semaphore;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.event.EventListenerList;
import javax.swing.filechooser.FileFilter;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JRSaveContributor;
import net.sf.jasperreports.view.save.JRDocxSaveContributor;
import net.sf.jasperreports.view.save.JRMultipleSheetsXlsSaveContributor;
import net.sf.jasperreports.view.save.JRPrintSaveContributor;
import net.sf.jasperreports.view.save.JRSingleSheetXlsSaveContributor;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.openide.util.Exceptions;
import usda.weru.util.ConfigData;
import usda.weru.weps.reports.query.WepsConnection;

/**
 *
 * @author joelevin
 */
public class ReportViewer extends javax.swing.JFrame implements ReportPackListener {

    private static final long serialVersionUID = 1L;

    private static final Logger LOGGER = Logger.getLogger(ReportViewer.class);

    /**
     *
     */
    public static final String PROP_BUSY = "busy";

    /**
     *
     */
    public static final String PROP_ALLOW_CONNECTION_CHANGE = "allowConnectionChange";

    /**
     *
     */
    protected EventListenerList c_listeners;

    /**
     *
     */
    protected boolean c_allowConnectionChange = false;

    /**
     *
     */
    protected boolean c_busy;

    /**
     *
     */
    protected ReportPack c_pack;

    boolean zoomToPage = false;

    /**
     * Creates new form ReportViewer
     */
    private Locks rvLock = new Locks();

    public ReportViewer() {

        initComponents();

        confidenceInterval.setVisible(false);
        detailReportButton.setVisible(false);
        stirReportButton.setVisible(false);
        cropintervalbutton.setVisible(false);
        covercropbutton.setVisible(false);
        cropReportButton.setVisible(false);
        managementReportButton.setVisible(false);
        runReportButton.setVisible(false);
        //frame icon        
        setIconImage(new ImageIcon(getClass().getResource("/usda/weru/resources/weruface.jpg")).getImage());

        c_listeners = new EventListenerList();

        //setup the toolbar        
        toolbar.add(viewer.getPrintButton());

        //add export button
        javax.swing.JButton btnSave = new javax.swing.JButton();
        btnSave.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btnSave.setMaximumSize(new java.awt.Dimension(23, 23));
        btnSave.setMinimumSize(new java.awt.Dimension(23, 23));
        btnSave.setPreferredSize(new java.awt.Dimension(23, 23));
        btnSave.setToolTipText("Export");
        btnSave.setIcon(new ImageIcon(getClass().getResource("/usda/weru/resources/export.gif"))); // NOI18N
        btnSave.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSaveActionPerformed(evt);
            }
        });
        javax.swing.JButton viewPDF = new javax.swing.JButton();
        viewPDF.setMargin(new java.awt.Insets(2, 2, 2, 2));
        viewPDF.setMaximumSize(new java.awt.Dimension(23, 23));
        viewPDF.setMinimumSize(new java.awt.Dimension(23, 23));
        viewPDF.setPreferredSize(new java.awt.Dimension(23, 23));
        viewPDF.setToolTipText("View PDF");
        viewPDF.setIcon(new ImageIcon(getClass().getResource("/usda/weru/resources/pdf.png"))); // NOI18N
        viewPDF.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonPDFActionPerformed(evt);
            }
        });

        toolbar.add(btnSave);
        toolbar.add(viewPDF);
        toolbar.add(connectionButton);
        connectionButton.setVisible(false);
        toolbar.add(refreshButton);
        //hide the refresh button to simplify the toolbar
        refreshButton.setVisible(false);

        //add spacer
        toolbar.add(new JToolBar.Separator());

        //page navigation
        toolbar.add(viewer.getFirstButton());
        toolbar.add(viewer.getPreviousButton());
        toolbar.add(viewer.getNextButton());
        toolbar.add(viewer.getLastButton());
        toolbar.add(viewer.getGoToTextField());

        //add spacer
        toolbar.add(new JToolBar.Separator());

        //view fittings
        toolbar.add(viewer.getActualSizeButton());
        toolbar.add(viewer.getFitPageButton());
        toolbar.add(viewer.getFitWidthButton());

        //add spacer
        toolbar.add(new JToolBar.Separator());

        //zooming
        toolbar.add(viewer.getZoomInButton());
        toolbar.add(viewer.getZoomOutButton());
        toolbar.add(viewer.getZoomRatioComboBox());

        toolbar.add(new JToolBar.Separator());
        ConfigData cd = ConfigData.getDefault();
        if (cd.getReportVisibility(ConfigData.RunVis)) {
            toolbar.add(runReportButton);
            runReportButton.setVisible(true);
        }
        if (cd.getReportVisibility(ConfigData.ManVis)) {
            toolbar.add(managementReportButton);
            managementReportButton.setVisible(true);
        }
        if (cd.getReportVisibility(ConfigData.CropVis)) {
            toolbar.add(cropReportButton);
            cropReportButton.setVisible(true);
        }
        if (cd.getReportVisibility(ConfigData.CCrVis)) {
            toolbar.add(covercropbutton);
            covercropbutton.setVisible(true);
        }
        if (cd.getReportVisibility(ConfigData.CIntVis)) {
            toolbar.add(cropintervalbutton);
            cropintervalbutton.setVisible(true);
        }
        if (cd.getReportVisibility(ConfigData.STIRVis)) {
            toolbar.add(stirReportButton);
            stirReportButton.setVisible(true);
        }
        if (cd.getReportVisibility(ConfigData.DetVis)) {
            toolbar.add(detailReportButton);
            detailReportButton.setVisible(true);
        }
        if (cd.getReportVisibility(ConfigData.ConfVis)) {
            toolbar.add(confidenceInterval);
            confidenceInterval.setVisible(true);
        }

        loadingCircle.setStylePreset(LoadingCircle.StylePresets.FireFox);
        loadingCircle.setVisible(false);

    }

    /**
     *
     * @param pack
     */
    public ReportViewer(ReportPack pack) {
        this(pack, false);
    }

    /**
     *
     * @param pack
     * @param zoomToPage
     */
    public ReportViewer(ReportPack pack, boolean zoomToPage) {
        this();
        this.zoomToPage = zoomToPage;
        setReportPack(pack);
        if (pack.getPrint() != null) {
            viewer.setJasperPrint(pack.getPrint());

        } else {
            refreshReport();
        }
    }

    /**
     *
     * @param pack
     */
    public void setReportPack(ReportPack pack) {
        if (c_pack != null) {
            c_pack.removeReportPackListener(this);
        }

        c_pack = pack;
        if (c_pack != null) {
            c_pack.addReportPackListener(this);
        }
    }

    /**
     *
     * @return
     */
    public ReportPack getReportPack() {
        return c_pack;
    }

    /**
     *
     * @return
     */
    public JToolBar getToolbar() {
        return toolbar;
    }

    /**
     * ReportViewer supports accessory components to add features. This makes it
     * possible to have a notes editor in line with the reports.
     *
     * @param accessory
     * @param direction Uses the BorderLayout direction constants. Typical use
     * is BorderLayout.SOUTH or BorderLayout.NORTH.
     */
    public void addAccessory(JComponent accessory, String direction) {
        layoutPanel.add(accessory, direction);
    }

    /**
     * Remove a component added to
     *
     * @param accessory to remove.
     */
    public void removeAccessory(JComponent accessory) {
        layoutPanel.remove(accessory);
    }

    /**
     *
     */
    public void refreshReport() {
        if (c_pack != null) {
            setBusy(true);
            c_pack.startFill();
        } else {
            throw new IllegalStateException("No ReportPack to refresh.");
        }
    }

    /**
     *
     * @param busy
     */
    protected void setBusy(boolean busy) {
        loadingCircle.setActive(busy);
        loadingCircle.setVisible(busy);

        refreshButton.setEnabled(!busy);
        viewer.getSaveButton().setEnabled(!busy);
        viewer.getPrintButton().setEnabled(!busy);

        if (busy) {
            //the proper buttons will be reenabled by the viewer component
            viewer.getFirstButton().setEnabled(false);
            viewer.getPreviousButton().setEnabled(false);
            viewer.getNextButton().setEnabled(false);
            viewer.getLastButton().setEnabled(false);
            viewer.getGoToTextField().setEnabled(false);

            viewer.getZoomInButton().setEnabled(false);
            viewer.getZoomOutButton().setEnabled(false);
            viewer.getActualSizeButton().setEnabled(false);
            viewer.getFitPageButton().setEnabled(false);
            viewer.getFitWidthButton().setEnabled(false);
            viewer.getZoomRatioComboBox().setEnabled(false);

        }

        connectionButton.setEnabled(!busy);
        if (busy) {
            setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        } else {
            setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
        }

        //handle fire the event
        boolean old = c_busy;
        c_busy = busy;
        firePropertyChange(PROP_BUSY, old, c_busy);
        fireBusyStateChanged();
    }

    /**
     *
     * @return
     */
    public boolean isBusy() {
        return c_busy;
    }

    /**
     *
     * @return
     */
    public boolean isAllowConnectionChange() {
        return c_allowConnectionChange;
    }

    /**
     *
     * @param allow
     */
    public void setAllowConnectionChange(boolean allow) {
        boolean old = c_allowConnectionChange;
        c_allowConnectionChange = allow;
        firePropertyChange(PROP_ALLOW_CONNECTION_CHANGE, old, c_allowConnectionChange);
    }

    /**
     * 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.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        toolbar = new javax.swing.JToolBar();
        connectionButton = new javax.swing.JButton();
        refreshButton = new javax.swing.JButton();
        runReportButton = new javax.swing.JButton();
        managementReportButton = new javax.swing.JButton();
        cropReportButton = new javax.swing.JButton();
        covercropbutton = new javax.swing.JButton();
        cropintervalbutton = new javax.swing.JButton();
        stirReportButton = new javax.swing.JButton();
        detailReportButton = new javax.swing.JButton();
        confidenceInterval = new javax.swing.JButton();
        circleToolbar = new javax.swing.JToolBar();
        loadingCircle = new com.blogspot.gyfus.LoadingCircle();
        layoutPanel = new javax.swing.JPanel();
        viewer = new usda.weru.weps.reports.JRViewerBean();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("Report Viewer");
        setMinimumSize(new java.awt.Dimension(500, 300));
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        toolbar.setFloatable(false);
        toolbar.setRollover(true);

        connectionButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/connection.gif"))); // NOI18N
        connectionButton.setToolTipText("Select Runs");
        connectionButton.setEnabled(false);
        connectionButton.setFocusable(false);
        connectionButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        connectionButton.setMargin(new java.awt.Insets(2, 2, 2, 2));
        connectionButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        toolbar.add(connectionButton);

        refreshButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/refresh.gif"))); // NOI18N
        refreshButton.setToolTipText("Refresh");
        refreshButton.setEnabled(false);
        refreshButton.setFocusable(false);
        refreshButton.setMargin(new java.awt.Insets(2, 2, 2, 2));
        refreshButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                refreshButtonActionPerformed(evt);
            }
        });
        toolbar.add(refreshButton);

        runReportButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/ReportR.gif"))); // NOI18N
        runReportButton.setFocusable(false);
        runReportButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        runReportButton.setMargin(new java.awt.Insets(2, 2, 2, 2));
        runReportButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        runReportButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                runReportButtonActionPerformed(evt);
            }
        });
        toolbar.add(runReportButton);

        managementReportButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/ReportM.gif"))); // NOI18N
        managementReportButton.setFocusable(false);
        managementReportButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        managementReportButton.setMargin(new java.awt.Insets(2, 2, 2, 2));
        managementReportButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        managementReportButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                managementReportButtonActionPerformed(evt);
            }
        });
        toolbar.add(managementReportButton);

        cropReportButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/ReportC.gif"))); // NOI18N
        cropReportButton.setFocusable(false);
        cropReportButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        cropReportButton.setMargin(new java.awt.Insets(2, 2, 2, 2));
        cropReportButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        cropReportButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cropReportButtonActionPerformed(evt);
            }
        });
        toolbar.add(cropReportButton);

        covercropbutton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/ReportCC.png"))); // NOI18N
        covercropbutton.setToolTipText("Toolbar:coverCropSummary");
        covercropbutton.setFocusable(false);
        covercropbutton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        covercropbutton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        covercropbutton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                covercropbutton_ActionPerformed(evt);
            }
        });
        toolbar.add(covercropbutton);

        cropintervalbutton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/ReportCI.png"))); // NOI18N
        cropintervalbutton.setToolTipText("Toolbar:cropIntervalSummary");
        cropintervalbutton.setFocusable(false);
        cropintervalbutton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        cropintervalbutton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        cropintervalbutton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cropintervalbutton_ActionPerformed(evt);
            }
        });
        toolbar.add(cropintervalbutton);

        stirReportButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/ReportS.gif"))); // NOI18N
        stirReportButton.setFocusable(false);
        stirReportButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        stirReportButton.setMargin(new java.awt.Insets(2, 2, 2, 2));
        stirReportButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        stirReportButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                stirReportButtonActionPerformed(evt);
            }
        });
        toolbar.add(stirReportButton);

        detailReportButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/ReportD.gif"))); // NOI18N
        detailReportButton.setFocusable(false);
        detailReportButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        detailReportButton.setMargin(new java.awt.Insets(2, 2, 2, 2));
        detailReportButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        detailReportButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                detailReportButtonActionPerformed(evt);
            }
        });
        toolbar.add(detailReportButton);

        confidenceInterval.setIcon(new javax.swing.ImageIcon(getClass().getResource("/usda/weru/resources/ReportI.gif"))); // NOI18N
        confidenceInterval.setToolTipText("Toolbar:intervalSummary");
        confidenceInterval.setFocusable(false);
        confidenceInterval.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        confidenceInterval.setName("Rep-Conf"); // NOI18N
        confidenceInterval.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        confidenceInterval.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                confidenceIntervalActionPerformed(evt);
            }
        });
        toolbar.add(confidenceInterval);

        circleToolbar.setFloatable(false);
        circleToolbar.setRollover(true);

        loadingCircle.setToolTipText("Loading Report...");
        loadingCircle.setActive(false);
        loadingCircle.setColor(java.awt.SystemColor.textHighlight);
        loadingCircle.setFocusable(false);
        loadingCircle.setRotationSpeed(50);

        javax.swing.GroupLayout loadingCircleLayout = new javax.swing.GroupLayout(loadingCircle);
        loadingCircle.setLayout(loadingCircleLayout);
        loadingCircleLayout.setHorizontalGroup(
            loadingCircleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 27, Short.MAX_VALUE)
        );
        loadingCircleLayout.setVerticalGroup(
            loadingCircleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 23, Short.MAX_VALUE)
        );

        circleToolbar.add(loadingCircle);

        layoutPanel.setOpaque(false);
        layoutPanel.setLayout(new java.awt.BorderLayout());

        viewer.setToolbarVisible(false);
        layoutPanel.add(viewer, java.awt.BorderLayout.CENTER);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(toolbar, javax.swing.GroupLayout.DEFAULT_SIZE, 771, Short.MAX_VALUE)
                .addGap(0, 0, 0)
                .addComponent(circleToolbar, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addComponent(layoutPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 800, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(circleToolbar, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(toolbar, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(0, 0, 0)
                .addComponent(layoutPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 517, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed
    refreshReport();
}//GEN-LAST:event_refreshButtonActionPerformed

private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
    try {
        fireReportViewerClosing();
        setVisible(false);
        setReportPack(null);
        dispose();
    } catch (VetoException re) {
        //something wants to prevent the form from closing.
    }
}//GEN-LAST:event_formWindowClosing

private void runReportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_runReportButtonActionPerformed
    try {
        rvLock.getrvMutex();
        //System.out.println("got lock");
        openOtherReport("run");
    } catch (InterruptedException ex) {
        Exceptions.printStackTrace(ex);
    }
    rvLock.setrvMutex();
}//GEN-LAST:event_runReportButtonActionPerformed

private void managementReportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_managementReportButtonActionPerformed
    try {
        //System.out.println("running: management");
        rvLock.getrvMutex();
        //System.out.println("got lock");
        openOtherReport("management");
    } catch (InterruptedException ex) {
        Exceptions.printStackTrace(ex);
    }
    rvLock.setrvMutex();
}//GEN-LAST:event_managementReportButtonActionPerformed

private void cropReportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cropReportButtonActionPerformed
    try {
        //System.out.println("running: cropsummary");
        rvLock.getrvMutex();
        //System.out.println("got lock");
        openOtherReport("cropsummary");
    } catch (InterruptedException ex) {
        Exceptions.printStackTrace(ex);
    }
    rvLock.setrvMutex();
}//GEN-LAST:event_cropReportButtonActionPerformed

private void detailReportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_detailReportButtonActionPerformed
    try {
        //System.out.println("running: detail");
        rvLock.getrvMutex();
        //System.out.println("got lock");
        openOtherReport("detail");
    } catch (InterruptedException ex) {
        Exceptions.printStackTrace(ex);
    }
    rvLock.setrvMutex();
}//GEN-LAST:event_detailReportButtonActionPerformed

private void stirReportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stirReportButtonActionPerformed
    try {
        //System.out.println("running: stir");
        rvLock.getrvMutex();
        //System.out.println("got lock");
        openOtherReport("stir");
    } catch (InterruptedException ex) {
        Exceptions.printStackTrace(ex);
    }
    rvLock.setrvMutex();
}//GEN-LAST:event_stirReportButtonActionPerformed

    private void covercropbutton_ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_covercropbutton_ActionPerformed
        try {
            //System.out.println("running: covercropsummary");
            rvLock.getrvMutex();
            //System.out.println("got lock");
            openOtherReport("covercropsummary");
        } catch (InterruptedException ex) {
            Exceptions.printStackTrace(ex);
        }
        rvLock.setrvMutex();
    }//GEN-LAST:event_covercropbutton_ActionPerformed

    private void cropintervalbutton_ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cropintervalbutton_ActionPerformed
        try {
            //System.out.println("running: cropintervalsum");
            rvLock.getrvMutex();
            //System.out.println("got lock");
            openOtherReport("cropintervalsum");
        } catch (InterruptedException ex) {
            Exceptions.printStackTrace(ex);
        }
        rvLock.setrvMutex();
    }//GEN-LAST:event_cropintervalbutton_ActionPerformed

    private void confidenceIntervalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_confidenceIntervalActionPerformed
        try {
            //System.out.println("running: detail");
            rvLock.getrvMutex();
            //System.out.println("got lock");
            openOtherReport("ci");
        } catch (InterruptedException ex) {
            Exceptions.printStackTrace(ex);
        }
        rvLock.setrvMutex();
    }//GEN-LAST:event_confidenceIntervalActionPerformed

    private void openOtherReport(String reportName) {
        WepsConnection con = getReportPack().getConnection();
        if (con != null) {
            if (con.getRunFiles().length == 1) {
                TFile runFile = con.getRunFiles()[0];
                ReportManager.getDefault().displayReport(runFile, reportName);
            }
        }
    }

    /**
     *
     * @param listener
     */
    public void addReportViewerListener(ReportViewerListener listener) {
        c_listeners.add(ReportViewerListener.class, listener);
    }

    /**
     *
     * @param listener
     */
    public void removeReportViewerListener(ReportViewerListener listener) {
        c_listeners.remove(ReportViewerListener.class, listener);
    }

    /**
     *
     */
    protected void fireBusyStateChanged() {
        ReportViewerListener[] listeners = c_listeners.getListeners(ReportViewerListener.class);
        for (ReportViewerListener listener : listeners) {
            listener.busyStateChanged(this, c_busy);
        }
    }

    /**
     *
     * @throws VetoException
     */
    protected void fireReportViewerClosing() throws VetoException {
        ReportViewerListener[] listeners = c_listeners.getListeners(ReportViewerListener.class);
        for (ReportViewerListener listener : listeners) {
            listener.reportViewerClosing(this);
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        BasicConfigurator.configure();

        ReportPack pack = null;
        try {
            WepsConnection connection = new WepsConnection("Cotton-Corn_6.wjr", new TFile("C:\\temp\\cotton_corn\\Cotton-Corn_6.wjr"));
            pack = new ReportPack(ReportLoader.getDefault(), connection, "run");
        } catch (SQLException e) {
            e.printStackTrace();
        }

        final ReportViewer viewer = pack != null ? new ReportViewer(pack) : new ReportViewer();

        SummaryAccessory notes = new SummaryAccessory(pack, viewer);
        viewer.addReportViewerListener(notes);

        viewer.addAccessory(notes, BorderLayout.SOUTH);
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                viewer.setVisible(true);
            }
        });

    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    protected javax.swing.JToolBar circleToolbar;
    public javax.swing.JButton confidenceInterval;
    protected javax.swing.JButton connectionButton;
    protected javax.swing.JButton covercropbutton;
    protected javax.swing.JButton cropReportButton;
    protected javax.swing.JButton cropintervalbutton;
    protected javax.swing.JButton detailReportButton;
    protected javax.swing.JPanel layoutPanel;
    protected com.blogspot.gyfus.LoadingCircle loadingCircle;
    protected javax.swing.JButton managementReportButton;
    protected javax.swing.JButton refreshButton;
    protected javax.swing.JButton runReportButton;
    protected javax.swing.JButton stirReportButton;
    protected javax.swing.JToolBar toolbar;
    protected usda.weru.weps.reports.JRViewerBean viewer;
    // End of variables declaration//GEN-END:variables

    /**
     *
     * @param t
     */
    @Override
    public void fillError(final Throwable t) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JOptionPane.showMessageDialog(ReportViewer.this, t.getLocalizedMessage(), "Report Error", JOptionPane.ERROR_MESSAGE);
                setBusy(false);
            }

        });

    }

    /**
     *
     */
    @Override
    public void fillCanceled() {
        setBusy(false);
    }

    /**
     *
     */
    @Override
    public void fillStarted() {
        setBusy(true);
    }

    /**
     *
     * @param print
     */
    @Override
    public void fillFinished(JasperPrint print) {
        viewer.setJasperPrint(print);
        setBusy(false);
        if (zoomToPage) {
            viewer.getFitPageButton().doClick();
        } else {
            viewer.getFitWidthButton().doClick();
        }
    }

    /**
     *
     * @param bln
     */
    @Override
    public void setVisible(boolean bln) {
        super.setVisible(bln);
        if (bln) {
            if (zoomToPage) {
                viewer.getFitPageButton().doClick();
            } else {
                viewer.getFitWidthButton().doClick();
            }
        }
    }

    void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {
        // Add your handling code here:
        JRSaveContributor[] saveContributors = viewer.getSaveContributors();
        System.out.println(Arrays.toString(c_pack.getConnection().getRunFiles()));
        JFileChooser fileChooser = new JFileChooser(c_pack.getConnection().getRunFiles()[0].getAbsolutePath());
        fileChooser.setLocale(this.getLocale());
        fileChooser.updateUI();
        for (int i = 0; i < saveContributors.length; i++) {
            //Long disble check for docx and xls
            if ((saveContributors[i] instanceof JRSingleSheetXlsSaveContributor)
                    || (saveContributors[i] instanceof JRMultipleSheetsXlsSaveContributor)
                    || (saveContributors[i] instanceof JRDocxSaveContributor)) {
                continue;
            }
            fileChooser.addChoosableFileFilter(saveContributors[i]);
        }
        if (saveContributors.length > 0) {
            //set to pdf by default
            fileChooser.setFileFilter(saveContributors[1]);
        }

        TFile lastFolder;

        fileChooser.setSelectedFile(new TFile(c_pack.getReportName()));

        int retValue = fileChooser.showSaveDialog(this);
        if (retValue == JFileChooser.APPROVE_OPTION) {
            FileFilter fileFilter = fileChooser.getFileFilter();
            TFile file = new TFile(fileChooser.getSelectedFile());

            lastFolder = file.getParentFile();

            JRSaveContributor contributor = null;

            if (fileFilter instanceof JRSaveContributor) {
                contributor = (JRSaveContributor) fileFilter;
            } else {
                int i = 0;
                while (contributor == null && i < saveContributors.length) {
                    contributor = saveContributors[i++];
                    if (!contributor.accept(file)) {
                        contributor = null;
                    }
                }

                if (contributor == null) {
                    contributor = new JRPrintSaveContributor(viewer.getContext().getJasperReportsContext(), getLocale(), viewer.getContext().getResourceBundle());
                }
            }

            try {
                contributor.save(viewer.getContext().getJasperPrint(), file);
            } catch (JRException e) {
            }
        }
    }

    void buttonPDFActionPerformed(java.awt.event.ActionEvent evt) {
        String path = c_pack.getConnection().getRunFiles()[0].getAbsolutePath();
        path += TFile.separator + c_pack.getReportName() + ".pdf";
        TFile file = new TFile(path);

        //if file does not exist and user is selecting crop report
        //attempt to generate older pdf from 1.3.9 using the crop.pdf string
        //if pdf does not exist file will exit and indicate no pdf generated
        if (!file.exists() && c_pack.getReportName().equals("cropsummary")) {
            System.out.println("check for crop.pdf...");
            path = c_pack.getConnection().getRunFiles()[0].getAbsolutePath();
            path += TFile.separator + "crop.pdf";
            file = new TFile(path);
            if (!file.exists()) {
                JOptionPane.showMessageDialog(null, "No PDF has been generated for this report.\n"
                        + " Please save it and try again.",
                        "PDF Warning", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } else if (!file.exists()) {
            JOptionPane.showMessageDialog(null, "No PDF has been generated for this report.\n"
                    + " Please save it and try again.",
                    "PDF Warning", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if (Desktop.isDesktopSupported()) {
            try {
                Desktop.getDesktop().open(file);
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null, "No specified default PDF Viewer.\n"
                        + "Please specifiy a default viewer and try again.",
                        "PDF Warning", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Cannot access environment for default PDF Viewer.",
                    "PDF Warning", JOptionPane.WARNING_MESSAGE);
        }
    }

    public JRViewerBean getBean() {
        return viewer;
    }

    public String getpath() {
        return c_pack.getConnection().getRunFiles()[0].getAbsolutePath();
    }
}
