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