package com.revolsys.swing.map.print; 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.PrinterAbortException; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import com.revolsys.geometry.model.BoundingBox; import com.revolsys.logging.Logs; import com.revolsys.swing.map.GraphicsViewport2D; import com.revolsys.swing.map.MapPanel; import com.revolsys.swing.map.Viewport2D; import com.revolsys.swing.map.layer.Layer; import com.revolsys.swing.map.layer.Project; import com.revolsys.swing.map.layer.record.AbstractRecordLayer; import com.revolsys.swing.map.layer.record.LayerRecord; import com.revolsys.swing.parallel.Invoke; public class SinglePage extends GraphicsViewport2D implements Pageable, Printable { public static void print() { final Project project = Project.get(); final Viewport2D viewport = project.getViewport(); final int viewWidth = viewport.getViewWidthPixels(); final int viewHeight = viewport.getViewHeightPixels(); final BoundingBox boundingBox = viewport.getBoundingBox(); final double scaleForVisible = viewport.getScaleForVisible(); final PrinterJob job = PrinterJob.getPrinterJob(); job.setJobName(project.getName()); final PageFormat format = job.defaultPage(); final PrintRequestAttributeSet printAttributes = new HashPrintRequestAttributeSet(); if (boundingBox.getAspectRatio() > 1) { format.setOrientation(PageFormat.LANDSCAPE); // printAttributes.add(OrientationRequested.LANDSCAPE); } else { format.setOrientation(PageFormat.PORTRAIT); // printAttributes.add(OrientationRequested.PORTRAIT); } final SinglePage pageable = new SinglePage(project, boundingBox, viewWidth, viewHeight, scaleForVisible); job.setPageable(pageable); final boolean doPrint = job.printDialog(); if (doPrint) { Invoke.background("Print", () -> { try { job.print(); } catch (final PrinterAbortException e) { } catch (final Exception e) { Logs.error(SinglePage.class, "Unable to print", e); } }); } } private final double scaleForVisible; public SinglePage(final Project project, final BoundingBox boundingBox, final int viewWidth, final int viewHeight, final double scaleForVisible) { super(project, viewWidth, viewHeight, boundingBox); this.scaleForVisible = scaleForVisible; } @Override public int getNumberOfPages() { return 1; } @Override public PageFormat getPageFormat(final int pageIndex) { final PageFormat pageFormat = new PageFormat(); final Paper paper = new Paper(); final int viewWidth = getViewWidthPixels(); final int viewHeight = getViewHeightPixels(); double width; double height; if (viewWidth > viewHeight) { width = viewHeight; height = viewWidth; pageFormat.setOrientation(PageFormat.LANDSCAPE); } else { width = viewWidth; height = viewHeight; } paper.setSize(width, height); paper.setImageableArea(0, 0, width, height); pageFormat.setPaper(paper); return pageFormat; } @Override protected double getPixelsPerYUnit(final double viewHeight, final double mapHeight) { return -viewHeight / mapHeight; } @Override public Printable getPrintable(final int pageIndex) { if (pageIndex == 0) { return this; } else { return null; } } @Override public double getScaleForVisible() { return this.scaleForVisible; } @Override public int getScreenResolution() { return 72; } @Override public boolean isHidden(final AbstractRecordLayer layer, final LayerRecord record) { return false; } @Override public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex) throws PrinterException { if (pageIndex == 0) { setGraphics((Graphics2D)graphics); final int translateX = (int)pageFormat.getImageableX(); final int translateY = (int)pageFormat.getImageableY(); graphics.translate(translateX - 1, translateY - 1); final Project project = getProject(); final MapPanel mapPanel = project.getMapPanel(); final Layer baseMapLayer = mapPanel.getBaseMapLayer(); render(baseMapLayer); render(project); return PAGE_EXISTS; } else { return NO_SUCH_PAGE; } } }