Java tutorial
/* * 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; } } } }