2 * PageFitPrintStrategy.java
4 package net.sf.openrocket.gui.print.visitor;
6 import com.itextpdf.text.Document;
7 import com.itextpdf.text.pdf.PdfContentByte;
8 import com.itextpdf.text.pdf.PdfWriter;
9 import net.sf.openrocket.gui.print.PrintUnit;
10 import net.sf.openrocket.gui.print.PrintableComponent;
11 import net.sf.openrocket.logging.LogHelper;
12 import net.sf.openrocket.rocketcomponent.RocketComponent;
13 import net.sf.openrocket.startup.Application;
16 import java.util.ArrayList;
17 import java.util.ListIterator;
21 * A strategy for drawing multiple rocket components onto as few pages as possible.
23 * @author Jason Blood <dyster2000@gmail.com>
25 public class PageFitPrintStrategy {
30 private static final LogHelper log = Application.getLogger();
35 protected Document document;
38 * The direct iText writer.
40 protected PdfWriter writer;
43 * The stages selected.
45 protected Set<Integer> stages;
47 protected ArrayList<PrintableComponent> componentToPrint;
52 * @param doc The iText document
53 * @param theWriter The direct iText writer
54 * @param theStages The stages to be printed by this strategy
56 public PageFitPrintStrategy(Document doc, PdfWriter theWriter) {
59 componentToPrint = new ArrayList<PrintableComponent>();
63 * Add a component we want to print.
65 * @param component The component to add for printing
67 public void addComponent(PrintableComponent component) {
68 componentToPrint.add(component);
72 * Recurse through the given rocket component.
74 * @param root the root component; all children will be printed recursively
76 public void writeToDocument (final RocketComponent root) {
81 * Iterate through the components to print fitting them onto pages as best possible.
83 private void fitPrintComponents() {
84 final Dimension pageSize = getPageSize();
85 double wPage = pageSize.getWidth();
86 double hPage = pageSize.getHeight();
87 int marginX = (int)(PrintUnit.POINTS_PER_INCH * 0.3f);
88 int marginY = (int)(PrintUnit.POINTS_PER_INCH * 0.3f);
89 PdfContentByte cb = writer.getDirectContent();
91 while (componentToPrint.size() > 0) {
93 Boolean anyAddedToRow;
95 Graphics2D g2 = cb.createGraphics(pageSize.width, pageSize.height);
101 ListIterator<PrintableComponent> entry = componentToPrint.listIterator();
102 anyAddedToRow = false;
104 while (entry.hasNext()) {
105 PrintableComponent component = entry.next();
106 java.awt.Dimension dim = component.getSize();
107 if ((rowX + dim.width < wPage) && (rowY + dim.height < hPage)) {
108 component.setPrintOffset(rowX, rowY);
109 rowX += dim.width + marginX;
110 if (rowY + dim.height + marginY > pageY)
111 pageY = rowY + dim.height + marginY;
114 anyAddedToRow = true;
117 } while (anyAddedToRow);
125 * Get the dimensions of the paper page.
127 * @return an internal Dimension
129 protected Dimension getPageSize () {
130 return new Dimension(document.getPageSize().getWidth(),
131 document.getPageSize().getHeight());
135 * Convenience class to model a dimension.
138 /** Width, in points. */
140 /** Height, in points. */
148 public Dimension (float w, float h) {
158 public float getWidth () {
167 public float getHeight () {