datasoul.servicelist.ServiceListExporterPanel.java Source code

Java tutorial

Introduction

Here is the source code for datasoul.servicelist.ServiceListExporterPanel.java

Source

/* 
 * Copyright 2005-2010 Samuel Mello
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; version 2 or later of the License.
 * 
 *   This program 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 General Public License for more details.
 * 
 */

/*
 * ServiceListExporterPanel.java
 *
 * Created on June 4, 2008, 11:44 PM
 */

package datasoul.servicelist;

import java.awt.Desktop;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import com.lowagie.text.DocumentException;

import datasoul.DatasoulMainForm;
import datasoul.config.BackgroundConfig;
import datasoul.render.ContentRender;
import datasoul.serviceitems.ServiceItem;
import datasoul.serviceitems.imagelist.ImageListServiceRenderer;
import datasoul.serviceitems.song.Song;
import datasoul.serviceitems.text.TextServiceItem;
import datasoul.templates.DisplayTemplate;
import datasoul.templates.TemplateManager;

/**
 *
 * @author  samuel
 */
public class ServiceListExporterPanel extends javax.swing.JFrame {

    /**
    * 
    */
    private static final long serialVersionUID = -9185576471182395731L;
    public static final int MODE_EXPORT = 0;
    public static final int MODE_PRINT = 1;

    /** Creates new form ServiceListExporterPanel */
    public ServiceListExporterPanel() {
        initComponents();
        DatasoulMainForm.setDatasoulIcon(this);
        pbProgress.setVisible(false);
    }

    private Song singleSong = null;
    private int mode;

    public void setSingleSong(Song s) {
        singleSong = s;
        cbServicePlan.setSelected(false);
        cbServicePlan.setEnabled(false);
        rbSlides.setEnabled(false);
    }

    public boolean setMode(int mode) {
        String action = "";
        switch (mode) {
        case MODE_EXPORT:
            action = java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("EXPORT");
            break;
        case MODE_PRINT:
            action = java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("PRINT");
            if (!Desktop.isDesktopSupported() || !Desktop.getDesktop().isSupported(Desktop.Action.PRINT)) {
                JOptionPane.showMessageDialog(ServiceListExporterPanel.this,
                        java.util.ResourceBundle.getBundle("datasoul/internationalize")
                                .getString("PRINT SUPPORT IS NOT ENABLED BY JAVA IN YOUR PLATFORM.") + "\n"
                                + java.util.ResourceBundle.getBundle("datasoul/internationalize")
                                        .getString("PLEASE USE EXPORT FUNCTION AND PRINT IT MANUALLY."));
                return false;
            }
            break;
        }

        if (singleSong == null) {
            lblTitle.setText(action + " "
                    + java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("SERVICE LIST"));
        } else {
            lblTitle.setText(action + " "
                    + java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("SONG"));
        }

        this.mode = mode;

        return true;
    }

    /** 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() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        lblTitle = new javax.swing.JLabel();
        cbServicePlan = new javax.swing.JCheckBox();
        cbLyrics = new javax.swing.JCheckBox();
        cbChordsSimple = new javax.swing.JCheckBox();
        cbChordsComplete = new javax.swing.JCheckBox();
        cbOk = new javax.swing.JButton();
        lblFormat = new javax.swing.JLabel();
        cbFormat = new javax.swing.JComboBox();
        cbCancel = new javax.swing.JButton();
        rbPrintout = new javax.swing.JRadioButton();
        rbSlides = new javax.swing.JRadioButton();
        pbProgress = new javax.swing.JProgressBar();
        cbEmptySlide = new javax.swing.JCheckBox();
        cbGuitarTabs = new javax.swing.JCheckBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("datasoul/internationalize"); // NOI18N
        setTitle(bundle.getString("EXPORT SERVICE LIST")); // NOI18N

        lblTitle.setFont(lblTitle.getFont().deriveFont(lblTitle.getFont().getStyle() | java.awt.Font.BOLD));
        lblTitle.setText(bundle.getString("PRINT SERVICE LIST")); // NOI18N

        cbServicePlan.setSelected(true);
        cbServicePlan.setText(bundle.getString("SERVICE PLAN")); // NOI18N
        cbServicePlan.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbServicePlanActionPerformed(evt);
            }
        });

        cbLyrics.setSelected(true);
        cbLyrics.setText(bundle.getString("SONG LYRICS AND TEXTS ITEMS")); // NOI18N
        cbLyrics.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbLyricsActionPerformed(evt);
            }
        });

        cbChordsSimple.setSelected(true);
        cbChordsSimple.setText(bundle.getString("SONGS CHORDS SIMPLE")); // NOI18N

        cbChordsComplete.setSelected(true);
        cbChordsComplete.setText(bundle.getString("SONGS CHORDS COMPLETE")); // NOI18N

        cbOk.setIcon(new javax.swing.ImageIcon(getClass().getResource("/datasoul/icons/v2/dialog-apply.png"))); // NOI18N
        cbOk.setText(bundle.getString("OK")); // NOI18N
        cbOk.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbOkActionPerformed(evt);
            }
        });

        lblFormat.setText(bundle.getString("FORMAT")); // NOI18N

        cbFormat.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "PDF", "RTF" }));

        cbCancel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/datasoul/icons/v2/process-stop.png"))); // NOI18N
        cbCancel.setText(bundle.getString("CANCEL")); // NOI18N
        cbCancel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbCancelActionPerformed(evt);
            }
        });

        buttonGroup1.add(rbPrintout);
        rbPrintout.setSelected(true);
        rbPrintout.setText(bundle.getString("PRINTOUTS")); // NOI18N
        rbPrintout.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbPrintoutActionPerformed(evt);
            }
        });

        buttonGroup1.add(rbSlides);
        rbSlides.setText(bundle.getString("SLIDES")); // NOI18N
        rbSlides.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbSlidesActionPerformed(evt);
            }
        });

        cbEmptySlide.setSelected(true);
        cbEmptySlide.setText(bundle.getString("ADD AN EMPTY SLIDE BETWEEN SERVICE ITEMS")); // NOI18N
        cbEmptySlide.setEnabled(false);
        cbEmptySlide.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbEmptySlideActionPerformed(evt);
            }
        });

        cbGuitarTabs.setSelected(true);
        cbGuitarTabs.setText(bundle.getString("GUITAR TABS")); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup().addGap(12, 12, 12).addComponent(cbEmptySlide))
                        .addGroup(
                                javax.swing.GroupLayout.Alignment.TRAILING,
                                layout.createSequentialGroup()
                                        .addComponent(pbProgress, javax.swing.GroupLayout.DEFAULT_SIZE, 194,
                                                Short.MAX_VALUE)
                                        .addGap(12, 12, 12).addComponent(cbCancel)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(cbOk))
                        .addGroup(layout.createSequentialGroup().addGap(12, 12, 12)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(cbServicePlan).addComponent(cbLyrics)
                                        .addComponent(cbChordsSimple).addComponent(cbChordsComplete)
                                        .addGroup(layout.createSequentialGroup().addComponent(lblFormat)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(cbFormat, javax.swing.GroupLayout.PREFERRED_SIZE, 103,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addComponent(cbGuitarTabs)))
                        .addComponent(rbPrintout).addComponent(lblTitle).addComponent(rbSlides))
                        .addContainerGap()));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addContainerGap().addComponent(lblTitle)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(rbPrintout)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbServicePlan)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(cbLyrics)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbChordsSimple)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbChordsComplete)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbGuitarTabs)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lblFormat).addComponent(cbFormat,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(rbSlides)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbEmptySlide)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(cbOk).addComponent(cbCancel))
                                .addComponent(pbProgress, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap()));

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

    private void cbServicePlanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbServicePlanActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_cbServicePlanActionPerformed

    private void cbLyricsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbLyricsActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_cbLyricsActionPerformed

    private void exportSlides(String fileName) throws FileNotFoundException, DocumentException, Exception {

        // Determine width and height. Use from the template for the first item
        ServiceItem item = ServiceListTable.getActiveInstance().getServiceItem(0);
        if (item == null)
            return;

        DisplayTemplate firstTemplate = TemplateManager.getInstance().newDisplayTemplate(item.getTemplate());
        int width = firstTemplate.getWidth();
        int height = firstTemplate.getHeight();

        // Create output
        ServiceListExporterSlides sles = new ServiceListExporterSlides(fileName, width, height);
        try {
            ServiceListTable slt = ServiceListTable.getActiveInstance();
            ContentRender r = sles.getRender();
            ImageListServiceRenderer img = new ImageListServiceRenderer();
            img.setImageWithoutTempFile(BackgroundConfig.getInstance().getBackgroundImg());
            r.paintBackground(img);
            int slideCount = 0;

            /* initial empty slide */
            if (cbEmptySlide.isSelected()) {
                sles.addEmptySlide();
                slideCount++;
            }

            pbProgress.setMaximum(slt.getRowCount());
            for (int i = 0; i < slt.getRowCount(); i++) {
                Object o = slt.getServiceItem(i);
                pbProgress.setValue(i);
                if (o instanceof Song) {
                    Song s = (Song) o;
                    r.setTemplate(s.getTemplate());
                    r.setTitle(s.getTitle());
                    r.setSongAuthor(s.getSongAuthor());
                    r.setSongSource(s.getSongSource());
                    r.setCopyright(s.getCopyright());
                    for (int k = 0; k < s.getRowCount(); k++) {
                        slideCount++;
                        r.setSlide(s.getSlideText(k));
                        if (k < s.getRowCount() - 1) {
                            r.setNextSlide(s.getSlideText(k + 1));
                        } else {
                            r.setNextSlide("");
                        }
                        /* start rendering */
                        r.slideChange(-1);
                        /* wait render thread to render the slide */
                        while (slideCount > sles.getSlideCount()) {
                            try {
                                Thread.sleep(200);
                            } catch (InterruptedException ex) {
                                // ignore
                            }
                            if (sles.getSlideCount() == -1) {
                                throw new DocumentException(java.util.ResourceBundle
                                        .getBundle("datasoul/internationalize").getString("INTERNAL ERROR"));
                            }
                        }
                    }
                    /* empty slide after songs */
                    if (cbEmptySlide.isSelected()) {
                        sles.addEmptySlide();
                        slideCount++;
                    }

                } else if (o instanceof TextServiceItem) {
                    TextServiceItem t = (TextServiceItem) o;
                    r.setTemplate(t.getTemplate());
                    r.setTitle(t.getTitle());
                    for (int k = 0; k < t.getRowCount(); k++) {
                        slideCount++;
                        r.setSlide(t.getSlideText(k));
                        if (k < t.getRowCount() - 1) {
                            r.setNextSlide(t.getSlideText(k + 1));
                        } else {
                            r.setNextSlide("");
                        }
                        /* start rendering */
                        r.slideChange(-1);
                        /* wait render thread to render the slide */
                        while (slideCount > sles.getSlideCount()) {
                            try {
                                Thread.sleep(200);
                            } catch (InterruptedException ex) {
                                // ignore
                            }
                            if (sles.getSlideCount() == -1) {
                                throw new DocumentException(java.util.ResourceBundle
                                        .getBundle("datasoul/internationalize").getString("INTERNAL ERROR"));
                            }
                        }
                    }
                    /* empty slide after text */
                    if (cbEmptySlide.isSelected()) {
                        sles.addEmptySlide();
                        slideCount++;
                    }

                }
            }
            pbProgress.setValue(slt.getRowCount());
            sles.write();

        } finally {
            sles.cleanup();
        }

    }

    private void exportPrintout(int type, String fileName) throws DocumentException, FileNotFoundException {
        ServiceListExporterDocument sled = new ServiceListExporterDocument(type, fileName,
                cbGuitarTabs.isSelected());

        if (singleSong == null) {

            if (cbServicePlan.isSelected()) {
                sled.addServicePlan();
            }

            ServiceListTable slt = ServiceListTable.getActiveInstance();
            pbProgress.setMaximum(slt.getRowCount());
            for (int i = 0; i < slt.getRowCount(); i++) {
                Object o = slt.getServiceItem(i);
                pbProgress.setValue(i);
                if (o instanceof Song) {
                    if (cbLyrics.isSelected()) {
                        sled.addSongLyrics((Song) o);
                    }
                    if (cbChordsSimple.isSelected()) {
                        sled.addSongChordsSimple((Song) o);
                    }
                    if (cbChordsComplete.isSelected()) {
                        sled.addSongChordsComplete((Song) o);
                    }
                } else if (o instanceof TextServiceItem) {
                    if (cbLyrics.isSelected()) {
                        sled.addTextItem((TextServiceItem) o);
                    }
                }
            }
            pbProgress.setValue(slt.getRowCount());

        } else {
            if (cbLyrics.isSelected()) {
                sled.addSongLyrics(singleSong);
            }
            if (cbChordsSimple.isSelected()) {
                sled.addSongChordsSimple(singleSong);
            }
            if (cbChordsComplete.isSelected()) {
                sled.addSongChordsComplete(singleSong);
            }

        }

        if (cbGuitarTabs.isSelected()) {
            sled.addGuitarTabs();
        }
        sled.write();

    }

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

        String fileName = null;

        // Choose PDF or RTF
        int type = ServiceListExporterDocument.TYPE_PDF;
        String fileextension = ".pdf";

        if (rbPrintout.isSelected() && cbFormat.getSelectedIndex() == 1) {
            type = ServiceListExporterDocument.TYPE_RTF;
            fileextension = ".rtf";
        }

        if (mode == MODE_EXPORT) {
            // Ask for file to save
            JFileChooser fc = new JFileChooser();
            fc.setDialogTitle(java.util.ResourceBundle.getBundle("datasoul/internationalize")
                    .getString("SELECT THE FILE TO SAVE."));
            if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
                fileName = fc.getSelectedFile().getPath();
                if (!fileName.contains(fileextension)) {
                    fileName = fileName + fileextension;
                }
            }

        } else {
            try {
                // Just create a temporary file
                File tmp = File.createTempFile("datasoul-exp-", fileextension);
                tmp.deleteOnExit();
                fileName = tmp.getAbsolutePath();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        // Process it
        if (fileName != null) {

            enablePrintoutControls(false);
            enableSlideControls(false);
            rbPrintout.setEnabled(false);
            rbSlides.setEnabled(false);
            cbCancel.setEnabled(false);
            cbOk.setEnabled(false);

            pbProgress.setVisible(true);
            Thread t = new ProcessThread(type, fileName, rbSlides.isSelected());
            t.start();
        }

    }//GEN-LAST:event_cbOkActionPerformed

    private void cbCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbCancelActionPerformed
        dispose();
    }//GEN-LAST:event_cbCancelActionPerformed

    private void enablePrintoutControls(boolean b) {
        cbChordsComplete.setEnabled(b);
        cbChordsSimple.setEnabled(b);
        cbLyrics.setEnabled(b);
        cbServicePlan.setEnabled(b);
        lblFormat.setEnabled(b);
        cbFormat.setEnabled(b);
        cbGuitarTabs.setEnabled(b);
    }

    private void enableSlideControls(boolean b) {
        cbEmptySlide.setEnabled(b);
    }

    private void rbPrintoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rbPrintoutActionPerformed
        enablePrintoutControls(true);
        enableSlideControls(false);
    }//GEN-LAST:event_rbPrintoutActionPerformed

    private void rbSlidesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rbSlidesActionPerformed
        enablePrintoutControls(false);
        enableSlideControls(true);
    }//GEN-LAST:event_rbSlidesActionPerformed

    private void cbEmptySlideActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbEmptySlideActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_cbEmptySlideActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JButton cbCancel;
    private javax.swing.JCheckBox cbChordsComplete;
    private javax.swing.JCheckBox cbChordsSimple;
    private javax.swing.JCheckBox cbEmptySlide;
    private javax.swing.JComboBox cbFormat;
    private javax.swing.JCheckBox cbGuitarTabs;
    private javax.swing.JCheckBox cbLyrics;
    private javax.swing.JButton cbOk;
    private javax.swing.JCheckBox cbServicePlan;
    private javax.swing.JLabel lblFormat;
    private javax.swing.JLabel lblTitle;
    private javax.swing.JProgressBar pbProgress;
    private javax.swing.JRadioButton rbPrintout;
    private javax.swing.JRadioButton rbSlides;
    // End of variables declaration//GEN-END:variables

    private class ProcessThread extends Thread {
        private int type;
        private String fileName;
        private boolean slides;

        public ProcessThread(int type, String fileName, boolean slides) {
            this.type = type;
            this.fileName = fileName;
            this.slides = slides;
        }

        public void run() {
            try {
                if (slides) {
                    exportSlides(fileName);
                } else {
                    exportPrintout(type, fileName);
                }
                done();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(ServiceListExporterPanel.this,
                        java.util.ResourceBundle.getBundle("datasoul/internationalize")
                                .getString("ERROR CREATING DOCUMENT: ") + e.getMessage());
                e.printStackTrace();
            }
            (ServiceListExporterPanel.this).dispose();
        }

        public void done() {

            switch (mode) {
            case MODE_EXPORT:
                JOptionPane.showMessageDialog(ServiceListExporterPanel.this, java.util.ResourceBundle
                        .getBundle("datasoul/internationalize").getString("DOCUMENT CREATED SUCCESSFULLY"));
                try {
                    Desktop.getDesktop().open(new File(fileName));
                    return;
                } catch (Exception e) {
                    // ignore and just show the message
                    e.printStackTrace();
                }
                break;

            case MODE_PRINT:
                try {
                    Desktop.getDesktop().print(new File(fileName));
                    return;
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(ServiceListExporterPanel.this, java.util.ResourceBundle
                            .getBundle("datasoul/internationalize").getString("UNABLE TO PRINT DOCUMENT"));
                    e.printStackTrace();
                }
                break;

            }

        }

    }
}