DGP - 1st printing
[debian/openrocket] / 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.FinSetVisitorStrategy;
16 import net.sf.openrocket.gui.print.visitor.PartsDetailVisitorStrategy;
17 import net.sf.openrocket.rocketcomponent.ComponentVisitor;
18
19 import javax.print.attribute.standard.MediaSizeName;
20 import java.io.OutputStream;
21 import java.util.Iterator;
22 import java.util.Set;
23
24 /**
25  * This is the main active object for printing.  It performs all actions necessary to create and populate the print file.
26  */
27 public class PrintController {
28
29     /**
30      * Print the selected components to a PDF document.
31      * 
32      * @param doc          the OR document
33      * @param toBePrinted  the user chosen items to print
34      * @param outputFile   the file being written to
35      * @param msn          the paper size
36      */
37     public void print (OpenRocketDocument doc, Iterator<PrintableContext> toBePrinted, OutputStream outputFile, MediaSizeName msn) {
38
39         Document idoc = new Document(convertWithDefault(msn));
40         PdfWriter writer = null;
41 //        OutputStream fileOutputStream = null;
42         try {
43 //            fileOutputStream = outputFile;
44             writer = PdfWriter.getInstance(idoc, outputFile);
45             writer.setStrictImageSequence(true);
46
47             writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
48             writer.addViewerPreference(PdfName.PICKTRAYBYPDFSIZE, PdfBoolean.PDFTRUE);
49             try {
50                 idoc.open();
51                 Thread.sleep(1000);
52             }
53             catch (InterruptedException e) {
54             }
55             while (toBePrinted.hasNext()) {
56                 PrintableContext printableContext = toBePrinted.next();
57
58                 Set<Integer> stages = printableContext.getStageNumber();
59
60                 switch (printableContext.getPrintable()) {
61                     case DESIGN_REPORT:
62                         DesignReport dp = new DesignReport(doc, idoc);
63                         dp.print(writer);
64                         idoc.newPage();
65                         break;
66                     case FIN_TEMPLATE:
67                         final ComponentVisitor finVisitor = new ComponentVisitor(new FinSetVisitorStrategy(idoc,
68                                                                                                            writer,
69                                                                                                            stages));
70                         finVisitor.visit(doc.getRocket());
71                         finVisitor.close();
72                         break;
73                     case PARTS_DETAIL:
74                         final ComponentVisitor detailVisitor = new ComponentVisitor(new PartsDetailVisitorStrategy(idoc,
75                                                                                                                    writer,
76                                                                                                                    stages));
77                         detailVisitor.visit(doc.getRocket());
78                         detailVisitor.close();
79                         idoc.newPage();
80                         break;
81                /*     case PARTS_LIST:
82                         final ComponentVisitor partsVisitor = new ComponentVisitor(new PartsListVisitorStrategy(idoc,
83                                                                                                                 writer,
84                                                                                                                 stages));
85                         partsVisitor.visit(doc.getRocket());
86                         partsVisitor.close();
87                         idoc.newPage();
88                         break;
89                 */}
90             }
91             //Stupid iText throws a really nasty exception if there is no data when close is called.
92             if (writer.getCurrentDocumentSize() <= 140) {
93                 writer.setPageEmpty(false);
94             }
95             writer.close();
96             idoc.close();
97         }
98         catch (DocumentException e) {
99         }
100         catch (ExceptionConverter ec) {
101         }
102 /*        finally {
103             if (fileOutputStream != null) {
104                 try {
105                     fileOutputStream.close();
106                 }
107                 catch (IOException e) {
108                 }
109             }
110         }
111   */  }
112
113     private Rectangle convertWithDefault (final MediaSizeName msn) {
114         Rectangle result = PaperSize.convert(msn);
115         if (result == null) {
116             result = PaperSize.convert(PrintUtilities.getDefaultMedia().getMediaSizeName());
117         }
118         return result;
119     }
120
121 }