create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / gui / print / PrintController.java
1 /*
2  * PrintController.java
3  *
4  */
5 package net.sf.openrocket.gui.print;
6
7 import com.itextpdf.text.Document;
8 import com.itextpdf.text.DocumentException;
9 import com.itextpdf.text.ExceptionConverter;
10 import com.itextpdf.text.Rectangle;
11 import com.itextpdf.text.pdf.PdfBoolean;
12 import com.itextpdf.text.pdf.PdfName;
13 import com.itextpdf.text.pdf.PdfWriter;
14 import net.sf.openrocket.document.OpenRocketDocument;
15 import net.sf.openrocket.gui.print.components.Rule;
16 import net.sf.openrocket.gui.print.visitor.CenteringRingStrategy;
17 import net.sf.openrocket.gui.print.visitor.FinMarkingGuideStrategy;
18 import net.sf.openrocket.gui.print.visitor.FinSetPrintStrategy;
19 import net.sf.openrocket.gui.print.visitor.PageFitPrintStrategy;
20 import net.sf.openrocket.gui.print.visitor.PartsDetailVisitorStrategy;
21 import net.sf.openrocket.gui.print.visitor.TransitionStrategy;
22
23 import java.io.IOException;
24 import java.io.OutputStream;
25 import java.util.Iterator;
26 import java.util.Set;
27
28 /**
29  * This is the main active object for printing.  It performs all actions necessary to create and populate the print
30  * file.
31  */
32 public class PrintController {
33
34     /**
35      * Print the selected components to a PDF document.
36      *
37      * @param doc         the OR document
38      * @param toBePrinted the user chosen items to print
39      * @param outputFile  the file being written to
40      * @param settings    the print settings
41      * @param rotation    the angle the rocket figure is rotated
42      */
43     public void print(OpenRocketDocument doc, Iterator<PrintableContext> toBePrinted, OutputStream outputFile,
44                       PrintSettings settings, double rotation) {
45
46         Document idoc = new Document(getSize(settings));
47         PdfWriter writer = null;
48         try {
49             writer = PdfWriter.getInstance(idoc, outputFile);
50             writer.setStrictImageSequence(true);
51
52             writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
53             writer.addViewerPreference(PdfName.PICKTRAYBYPDFSIZE, PdfBoolean.PDFTRUE);
54             try {
55                 idoc.open();
56                 Thread.sleep(1000);
57             }
58             catch (InterruptedException e) {
59             }
60
61             // Used to combine multiple components onto fewer sheets of paper
62             PageFitPrintStrategy pageFitPrint = new PageFitPrintStrategy(idoc, writer);
63
64             boolean addRule = false;
65
66             while (toBePrinted.hasNext()) {
67                 PrintableContext printableContext = toBePrinted.next();
68
69                 Set<Integer> stages = printableContext.getStageNumber();
70
71                 switch (printableContext.getPrintable()) {
72                     case DESIGN_REPORT:
73                         DesignReport dp = new DesignReport(doc, idoc, rotation);
74                         dp.writeToDocument(writer);
75                         idoc.newPage();
76                         break;
77
78                     case FIN_TEMPLATE:
79                         final FinSetPrintStrategy finWriter = new FinSetPrintStrategy(idoc, writer, stages, pageFitPrint);
80                         finWriter.writeToDocument(doc.getRocket());
81                         addRule = true;
82                         break;
83
84                     case PARTS_DETAIL:
85                         final PartsDetailVisitorStrategy detailVisitor = new PartsDetailVisitorStrategy(idoc, writer, stages);
86                         detailVisitor.writeToDocument(doc.getRocket());
87                         detailVisitor.close();
88                         idoc.newPage();
89                         break;
90
91                     case TRANSITION_TEMPLATE:
92                         final TransitionStrategy tranWriter = new TransitionStrategy(idoc, writer, stages, pageFitPrint);
93                         if (tranWriter.writeToDocument(doc.getRocket(), false)) {
94                             addRule = true;
95                         }
96                         break;
97
98                     case NOSE_CONE_TEMPLATE:
99                         final TransitionStrategy coneWriter = new TransitionStrategy(idoc, writer, stages, pageFitPrint);
100                         if (coneWriter.writeToDocument(doc.getRocket(), true)) {
101                             addRule = true;
102                         }
103                         break;
104
105                     case CENTERING_RING_TEMPLATE:
106                         final CenteringRingStrategy crWriter = new CenteringRingStrategy(idoc, writer, stages,
107                                 pageFitPrint);
108                         crWriter.writeToDocument(doc.getRocket());
109                         addRule = true;
110                         break;
111
112                     case FIN_MARKING_GUIDE:
113                         final FinMarkingGuideStrategy fmg = new FinMarkingGuideStrategy(idoc, writer);
114                         fmg.writeToDocument(doc.getRocket());
115                         idoc.newPage();
116                         addRule = true;
117                         break;
118                 }
119             }
120
121             if (addRule) {
122                 //Add a ruler to the output.
123                 pageFitPrint.addComponent(new Rule(Rule.Orientation.BOTTOM));
124             }
125
126             // Write out parts that we are going to combine onto single sheets of paper
127             pageFitPrint.writeToDocument(doc.getRocket());
128             idoc.newPage();
129
130             //Stupid iText throws a really nasty exception if there is no data when close is called.
131             if (writer.getCurrentDocumentSize() <= 140) {
132                 writer.setPageEmpty(false);
133             }
134             writer.close();
135             idoc.close();
136         }
137         catch (DocumentException e) {
138         }
139         catch (ExceptionConverter ec) {
140         }
141         finally {
142             if (outputFile != null) {
143                 try {
144                     outputFile.close();
145                 }
146                 catch (IOException e) {
147                 }
148             }
149         }
150     }
151
152     /**
153      * Get the correct paper size from the print settings.
154      *
155      * @param settings the print settings
156      *
157      * @return the paper size
158      */
159     private Rectangle getSize(PrintSettings settings) {
160         PaperSize size = settings.getPaperSize();
161         PaperOrientation orientation = settings.getPaperOrientation();
162         return orientation.orient(size.getSize());
163     }
164
165 }