/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.utils.sql; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.print.Book; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.util.ArrayList; import java.util.Iterator; import java.util.StringTokenizer; import javax.swing.UIManager; /** * Permet d'imprimer les donn�es de la GenericTable. * * @author $Author: marcona $ * @version $Revision: 1.4 $ * */ public class PrintAction extends AbstractDbAction { GenericTablePrinter genericTablePrinter; /** * Constructeur * * @param gt La GenericTable * * @throws IllegalArgumentException TODO */ public PrintAction(GenericTable gt) { super(null, null, gt); if (gt == null) { throw new IllegalArgumentException(); } genericTablePrinter = new GenericTablePrinter(getGenericTable()); putValue(NAME, "Imprimer"); putValue(SHORT_DESCRIPTION, "Impression des donn�es"); putValue(SMALL_ICON, UIManager.getIcon("ListTable.print")); } /** * Lance l'impression des donn�es. * * @param evt L'evenement. */ public void actionPerformed(ActionEvent evt) { PrinterJob job = PrinterJob.getPrinterJob(); Book book = new Book(); // cover page could be appended to book here PageFormat pf = job.pageDialog(job.defaultPage()); int count = genericTablePrinter.calculatePageCount(pf); book.append((Printable)genericTablePrinter, pf, count); job.setPageable(book); if (job.printDialog()) { try { job.print(); } catch (PrinterException ex) { ex.printStackTrace(); } } } /** * Cette classe construit et g�re l'impression des donn�es. * * @author $Author: marcona $ * @version $Revision: 1.4 $ */ static class GenericTablePrinter implements Printable { ArrayList pages; PageFormat curPageFormat; Font font = new Font("TimesRoman", Font.PLAIN, 12); GenericTable genericTable; DataFormater dataFormater; /** * Constructeur. * * @param gt La GenericTable. */ public GenericTablePrinter(GenericTable gt) { genericTable = gt; dataFormater = new DataFormater(genericTable); } /** * D�termine le nombre de pages � imprimer. * * @param pf Le PageFormat (portrait ou paysage). * * @return Le nombre de pages � imprimer. */ public int calculatePageCount(PageFormat pf) { ArrayList pgs = repaginate(pf); return pgs.size(); } /** * Lance l'impression d'une page si elle exisre. * * @param g Le Graphics de l'impression. * @param pf Le PageFormat (portrait ou paysage). * @param idx Le num�ro de la page. * * @return Si la page doit �tre imprimer ou non. * * @exception PrinterException Pb d'impression ? */ public int print(Graphics g, PageFormat pf, int idx) throws PrinterException { // Printable's method implementation if (curPageFormat != pf) { curPageFormat = pf; pages = repaginate(pf); } if (idx >= pages.size()) { return Printable.NO_SUCH_PAGE; } g.setFont(font); g.setColor(Color.black); renderPage(g, pf, idx); return Printable.PAGE_EXISTS; } /** * Construit les lignes � imprimer pour une page. * * @param g Le Graphics. * @param pf Le PageFormat. * @param idx Le num�ro de la page. */ void renderPage(Graphics g, PageFormat pf, int idx) { // render the lines from the pages list int xo = (int)pf.getImageableX(); int yo = (int)pf.getImageableY(); int y = font.getSize(); ArrayList page = (ArrayList)pages.get(idx); Iterator it = page.iterator(); while (it.hasNext()) { String line = (String)it.next(); g.drawString(line, xo, y + yo); y += font.getSize(); } } /** * Construit les pages � imprimer en fonction des donn�es issues de la * GenericTable. * * @param pf Le PageFormat. * * @return La liste des pages � imprimer. */ private ArrayList repaginate(PageFormat pf) { // creating pages of lines int maxh = (int)pf.getImageableHeight(); int lineh = font.getSize(); ArrayList pgs = new ArrayList(); ArrayList page = new ArrayList(); int pageh = 0; // headers // page.add("Author: " + art.toString()); // page.add(" "); // pageh += (lineh * 2); // body StringTokenizer st = new StringTokenizer(dataFormater.buildDataForPrint(), "\n"); while (st.hasMoreTokens()) { String line = st.nextToken(); if (pageh + lineh > maxh) { // need new page pgs.add(page); page = new ArrayList(); pageh = 0; } page.add(line); pageh += lineh; } pgs.add(page); return pgs; } } }