package com.xenoage.zong.desktop.io.print; import static com.xenoage.utils.error.Err.handle; import static com.xenoage.utils.log.Log.log; import static com.xenoage.utils.log.Report.error; import static com.xenoage.utils.log.Report.remark; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.print.PageFormat; import java.awt.print.Pageable; import java.awt.print.Paper; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import com.xenoage.utils.math.Units; import com.xenoage.utils.math.geom.Size2f; import com.xenoage.zong.Voc; import com.xenoage.zong.layout.Layout; import com.xenoage.zong.renderer.LayoutRenderer; import com.xenoage.zong.renderer.awt.canvas.AwtCanvas; import com.xenoage.zong.renderer.canvas.CanvasDecoration; import com.xenoage.zong.renderer.canvas.CanvasFormat; import com.xenoage.zong.renderer.canvas.CanvasIntegrity; /** * This class allows the user to print out the current score. * * The whole process (from the printer dialog to the actual printing) * is implemented in this class. * * @author Andreas Wenger */ public final class PrintProcess implements Pageable, Printable { private Layout layout; /** * Starts a print process. * * First a print dialog is shown, where the user * can select a printer, the range of pages and * the number of copies. * The user can cancel the process here. * * If he continues, the selected pages are printed. * Thus this method needs a PageLayout instance. */ public void requestPrint(Layout layout) { this.layout = layout; //show print dialog PrinterJob pj = PrinterJob.getPrinterJob(); pj.setJobName("Score Document"); pj.setPrintable(this); pj.setPageable(this); try { log(remark("Opening print dialog...")); pj.setCopies(1); if (pj.printDialog()) { log(remark("Starting print...")); pj.print(); } } catch (PrinterException ex) { handle(error(Voc.ErrorWhilePrinting, ex)); } } @Override public int getNumberOfPages() { return layout.getPages().size(); } @Override public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException { com.xenoage.zong.core.format.PageFormat pageFormat = layout.getPages().get(pageIndex).getFormat(); PageFormat ret = new PageFormat(); ret.setOrientation(PageFormat.PORTRAIT); //set paper size Paper paper = new Paper(); paper.setSize(Units.mmToPx(pageFormat.getSize().width, 1), Units.mmToPx(pageFormat.getSize().height, 1)); //no margins TEST: 10 mm paper.setImageableArea(10, 10, Units.mmToPx(pageFormat.getSize().width, 1) - 20, Units.mmToPx(pageFormat.getSize().height, 1) - 20); ret.setPaper(paper); return ret; } @Override public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException { return this; } @Override public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException { //valid page number? if (pageIndex < 0 || pageIndex >= layout.getPages().size()) { return Printable.NO_SUCH_PAGE; } //print page log(remark("Printing page " + pageIndex + "...")); Graphics2D g2d = (Graphics2D) g; Size2f pageSize = layout.getPages().get(pageIndex).getFormat().getSize(); LayoutRenderer.paintToCanvas(layout, pageIndex, new AwtCanvas(g2d, pageSize, CanvasFormat.Vector, CanvasDecoration.None, CanvasIntegrity.Perfect)); //DEMO /* com.xenoage.zong.data.format.PageFormat pf = layout.getPages().get(pageIndex).getFormat(); g2d.setColor(Color.red); g2d.setStroke(new BasicStroke(1)); float w = Units.mmToPx(pf.getSize().width, 1); float h = Units.mmToPx(pf.getSize().height, 1); float margin = Units.mmToPx(10, 1); float x1 = margin; float y1 = margin; float x2 = w - margin; float y2 = h - margin; g2d.draw(new Rectangle2D.Float(x1, y1, x2 - margin, y2 - margin)); g2d.draw(new Line2D.Float(x1, y1, x2, y2)); g2d.draw(new Line2D.Float(x2, y1, x1, y2)); */ return Printable.PAGE_EXISTS; } }