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. * */ package datasoul.servicelist; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedList; import java.util.regex.Matcher; import javax.imageio.ImageIO; import javax.swing.JOptionPane; import com.lowagie.text.BadElementException; import com.lowagie.text.Cell; import com.lowagie.text.Chunk; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.FontFactory; import com.lowagie.text.Image; import com.lowagie.text.Paragraph; import com.lowagie.text.Table; import com.lowagie.text.pdf.PdfWriter; import com.lowagie.text.rtf.RtfWriter2; import datasoul.DatasoulMainForm; import datasoul.serviceitems.ServiceItem; import datasoul.serviceitems.song.Chord; import datasoul.serviceitems.song.ChordShapePanel; import datasoul.serviceitems.song.ChordsDB; import datasoul.serviceitems.song.Song; import datasoul.serviceitems.text.TextServiceItem; /** * * @author samuel */ public class ServiceListExporterDocument { private Document document; public static final int TYPE_PDF = 0; public static final int TYPE_RTF = 1; private boolean exportGuitarTabs; private LinkedList<Paragraph> guitarTabs; public ServiceListExporterDocument(int type, String filename, boolean exportGuitarTabs) throws FileNotFoundException, DocumentException { document = new Document(); // ensure file do not exist to avoid garbage at the end of the file File f = new File(filename); if (f.exists()) { f.delete(); } if (type == TYPE_RTF) { RtfWriter2.getInstance(document, new FileOutputStream(filename)); } else { PdfWriter w = PdfWriter.getInstance(document, new FileOutputStream(filename)); w.setStrictImageSequence(true); } document.open(); document.addCreator("Datasoul " + DatasoulMainForm.getVersion()); document.addCreationDate(); this.exportGuitarTabs = exportGuitarTabs; if (exportGuitarTabs) { guitarTabs = new LinkedList<Paragraph>(); } } public void write() { document.close(); } public void addServicePlan() throws DocumentException { ServiceListTable slt = ServiceListTable.getActiveInstance(); Paragraph p = new Paragraph( java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("SERVICE PLAN"), FontFactory.getFont(FontFactory.HELVETICA, 12)); p.setAlignment(Element.ALIGN_CENTER); document.add(p); p = new Paragraph(slt.getTitle(), FontFactory.getFont(FontFactory.HELVETICA_BOLD, 16)); p.setAlignment(Element.ALIGN_CENTER); document.add(p); Table t = new Table(4); t.setWidths(new int[] { 10, 5, 50, 35 }); t.setPadding(2.0f); t.setWidth(100.0f); t.addCell(createHeaderCell( java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("TIME"))); t.addCell( createHeaderCell(java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("MIN"))); t.addCell(createHeaderCell( java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("TITLE"))); t.addCell(createHeaderCell( java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("NOTES"))); for (int i = 0; i < slt.getRowCount(); i++) { ServiceItem si = (ServiceItem) slt.getServiceItem(i); Cell c; // Start time c = new Cell(si.getStartTime()); c.setMaxLines(1); c.setVerticalAlignment(Cell.ALIGN_MIDDLE); c.setHorizontalAlignment(Cell.ALIGN_CENTER); t.addCell(c); // Duration c = new Cell(Integer.toString(si.getDuration())); c.setMaxLines(1); c.setVerticalAlignment(Cell.ALIGN_MIDDLE); c.setHorizontalAlignment(Cell.ALIGN_RIGHT); t.addCell(c); // Title c = new Cell(si.getTitle()); c.setVerticalAlignment(Cell.ALIGN_MIDDLE); t.addCell(c); // Notes c = new Cell(si.getNotes()); c.setVerticalAlignment(Cell.ALIGN_MIDDLE); t.addCell(c); } document.add(t); p = new Paragraph(java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("NOTES"), FontFactory.getFont(FontFactory.HELVETICA_BOLD)); document.add(p); p = new Paragraph(slt.getNotes(), FontFactory.getFont(FontFactory.HELVETICA)); p.setIndentationLeft(10.0f); document.add(p); document.newPage(); } private Cell createHeaderCell(String text) throws BadElementException { Cell c = new Cell(new Chunk(text, FontFactory.getFont(FontFactory.HELVETICA_BOLD))); c.setMaxLines(1); c.setHeader(true); c.setVerticalAlignment(Cell.ALIGN_MIDDLE); c.setHorizontalAlignment(Cell.ALIGN_CENTER); return c; } private void addSongHeader(Song s) throws DocumentException { Paragraph p; p = new Paragraph(s.getTitle(), FontFactory.getFont(FontFactory.HELVETICA_BOLD, 16)); document.add(p); if (!s.getSongAuthor().trim().equals("")) { p = new Paragraph(java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("AUTHOR") + ": " + s.getSongAuthor(), FontFactory.getFont(FontFactory.HELVETICA_BOLD)); document.add(p); } if (!s.getCopyright().trim().equals("")) { p = new Paragraph(java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("COPYRIGHT") + s.getCopyright(), FontFactory.getFont(FontFactory.HELVETICA_BOLD)); document.add(p); } if (!s.getSongSource().trim().equals("")) { p = new Paragraph(java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("SOURCE") + s.getSongSource(), FontFactory.getFont(FontFactory.HELVETICA_BOLD)); document.add(p); } } public void addSongLyrics(Song s) throws DocumentException { addSongHeader(s); Paragraph p; p = new Paragraph( "(" + java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("LYRICS") + ")", FontFactory.getFont(FontFactory.HELVETICA, 8)); document.add(p); String text = s.getText().replace(Song.CHORUS_MARK, "").replace(Song.SLIDE_BREAK, ""); p = new Paragraph(" ", FontFactory.getFont(FontFactory.HELVETICA)); document.add(p); p = new Paragraph(text, FontFactory.getFont(FontFactory.HELVETICA)); document.add(p); document.newPage(); } public void addTextItem(TextServiceItem t) throws DocumentException { String text = t.getText().replace(Song.CHORUS_MARK, "").replace(Song.SLIDE_BREAK, ""); Paragraph p; p = new Paragraph(t.getTitle(), FontFactory.getFont(FontFactory.HELVETICA_BOLD, 16)); document.add(p); p = new Paragraph(" ", FontFactory.getFont(FontFactory.HELVETICA)); document.add(p); p = new Paragraph(text, FontFactory.getFont(FontFactory.HELVETICA)); document.add(p); document.newPage(); } public void addSongChordsSimple(Song s) throws DocumentException { // If we don't have the chords saved, skip it if (s.getChordsSimplified().trim().equals("")) return; addSongHeader(s); Paragraph p; p = new Paragraph("(" + java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("CHORDS SIMPLE") + ")", FontFactory.getFont(FontFactory.HELVETICA, 8)); document.add(p); p = new Paragraph(" ", FontFactory.getFont(FontFactory.HELVETICA)); document.add(p); String text[] = s.getChordsSimplified().replace(Song.CHORUS_MARK, " ").replace(Song.SLIDE_BREAK, " ") .split("\n"); addSongChords(text); p = new Paragraph(" ", FontFactory.getFont(FontFactory.HELVETICA)); document.add(p); if (exportGuitarTabs) { p = new Paragraph(s.getTitle(), FontFactory.getFont(FontFactory.HELVETICA_BOLD)); guitarTabs.add(p); p = new Paragraph("(" + java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("CHORDS COMPLETE") + ")", FontFactory.getFont(FontFactory.HELVETICA, 8)); guitarTabs.add(p); guitarTabs.addAll(addChordsShape(Song.getUsedChords(s.getChordsSimplified()))); } document.newPage(); } public void addSongChordsComplete(Song s) throws DocumentException { // If we don't have the chords saved, skip it if (s.getChordsComplete().trim().equals("")) return; addSongHeader(s); Paragraph p; p = new Paragraph( "(" + java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("CHORDS COMPLETE") + ")", FontFactory.getFont(FontFactory.HELVETICA, 8)); document.add(p); p = new Paragraph(" ", FontFactory.getFont(FontFactory.HELVETICA)); document.add(p); String text[] = s.getChordsComplete().replace(Song.CHORUS_MARK, " ").replace(Song.SLIDE_BREAK, " ") .split("\n"); addSongChords(text); p = new Paragraph(" ", FontFactory.getFont(FontFactory.HELVETICA)); document.add(p); if (exportGuitarTabs) { p = new Paragraph(s.getTitle(), FontFactory.getFont(FontFactory.HELVETICA_BOLD)); guitarTabs.add(p); p = new Paragraph("(" + java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("CHORDS COMPLETE") + ")", FontFactory.getFont(FontFactory.HELVETICA, 8)); guitarTabs.add(p); guitarTabs.addAll(addChordsShape(Song.getUsedChords(s.getChordsComplete()))); } document.newPage(); } private LinkedList<Paragraph> addChordsShape(ArrayList<String> chordsName) throws DocumentException { ChordsDB chordsDB = ChordsDB.getInstance(); String notCatalogued = ""; LinkedList<Chunk> images = new LinkedList<Chunk>(); LinkedList<File> filesToDelete = new LinkedList<File>(); LinkedList<Paragraph> ret = new LinkedList<Paragraph>(); for (int i = 0; i < chordsName.size(); i++) { Chord chord = chordsDB.getChordByName(chordsName.get(i)); if (chord != null) { ChordShapePanel csp = new ChordShapePanel(2, chord.getName(), chord.getShape()); BufferedImage im = csp.createImage(); try { File tmp = File.createTempFile("datasoul-img", ".png"); tmp.deleteOnExit(); filesToDelete.add(tmp); ImageIO.write(im, "png", tmp); Chunk c = new Chunk(Image.getInstance(tmp.getAbsolutePath()), 0, 0, false); images.add(c); } catch (IOException e) { JOptionPane.showMessageDialog(null, java.util.ResourceBundle .getBundle("datasoul/internationalize").getString("INTERNAL ERROR: ") + e.getMessage()); } } else { notCatalogued += chordsName.get(i); } } Paragraph p = new Paragraph(); if (!images.isEmpty()) { for (Chunk c : images) { p.add(c); } p.setLeading(images.getFirst().getImage().getScaledHeight()); p.setKeepTogether(true); } ret.add(p); if (!notCatalogued.equals("")) { p = new Paragraph( java.util.ResourceBundle.getBundle("datasoul/internationalize") .getString("THE FOLLOWING CHORDS ARE NOT CATALOGED: ") + notCatalogued, FontFactory.getFont(FontFactory.HELVETICA, 8)); ret.add(p); } for (File f : filesToDelete) { try { f.delete(); } catch (Exception e) { //ignore, it will be deleted on exit } } return ret; } private void addSongChords(String[] text) throws DocumentException { Font chordfont = new Font(Font.COURIER, 12, Font.BOLD, Color.BLUE.darker()); Font lyricfont = new Font(Font.COURIER, 12, Font.NORMAL); Paragraph p; for (String line : text) { Matcher matcher = Song.CHORDS_REGEX_PATTERN.matcher(line); if (matcher.find()) { if (line.startsWith("=")) { line = line.replaceFirst("=", " "); } p = new Paragraph(line, chordfont); } else { p = new Paragraph(line, lyricfont); } document.add(p); } } public void addGuitarTabs() throws DocumentException { document.newPage(); Paragraph p = new Paragraph( java.util.ResourceBundle.getBundle("datasoul/internationalize").getString("GUITAR TABS"), FontFactory.getFont(FontFactory.HELVETICA_BOLD, 16)); document.add(p); for (Paragraph p2 : guitarTabs) { document.add(p2); } } }