]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.trend/src/org/simantics/trend/util/PrintUtil.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.trend / src / org / simantics / trend / util / PrintUtil.java
1 /*******************************************************************************\r
2 ' * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.trend.util;\r
13 \r
14 import java.awt.Graphics;\r
15 import java.awt.Graphics2D;\r
16 import java.awt.geom.Rectangle2D;\r
17 import java.awt.print.PageFormat;\r
18 import java.awt.print.Printable;\r
19 import java.awt.print.PrinterException;\r
20 import java.awt.print.PrinterJob;\r
21 import java.io.File;\r
22 import java.io.FileOutputStream;\r
23 import java.io.IOException;\r
24 import java.util.ArrayList;\r
25 import java.util.List;\r
26 \r
27 import org.simantics.g2d.canvas.impl.CanvasContext;\r
28 import org.simantics.history.HistoryManager;\r
29 import org.simantics.trend.TrendInitializer;\r
30 import org.simantics.trend.configuration.TrendSpec;\r
31 import org.simantics.trend.configuration.Viewport;\r
32 import org.simantics.trend.impl.MilestoneSpec;\r
33 import org.simantics.trend.impl.TrendNode;\r
34 import org.simantics.utils.page.MarginUtils;\r
35 import org.simantics.utils.page.PageDesc;\r
36 import org.simantics.utils.page.PageOrientation;\r
37 import org.simantics.utils.threads.AWTThread;\r
38 \r
39 import com.lowagie.text.Document;\r
40 import com.lowagie.text.DocumentException;\r
41 import com.lowagie.text.FontFactory;\r
42 import com.lowagie.text.Rectangle;\r
43 import com.lowagie.text.pdf.DefaultFontMapper;\r
44 import com.lowagie.text.pdf.FontMapper;\r
45 import com.lowagie.text.pdf.PdfContentByte;\r
46 import com.lowagie.text.pdf.PdfWriter;\r
47 \r
48 public class PrintUtil {\r
49 \r
50         PageDesc pageDesc;\r
51     FontMapper mapper;\r
52     List<PrintPage> pages = new ArrayList<PrintPage>();\r
53         \r
54     public PrintUtil()\r
55     {\r
56         pageDesc = new PageDesc("A4", PageOrientation.Landscape, 210, 297).withMargins( MarginUtils.MARGINS_10mm );\r
57         mapper = new DefaultFontMapper();\r
58         FontFactory.registerDirectories();\r
59     }\r
60     \r
61     public void addTrendPage(TrendSpec trendSpec, HistoryManager historian, MilestoneSpec milestones, Viewport viewport)\r
62     {\r
63         pages.add( TrendPage.addTrendPage(trendSpec, historian, milestones, viewport) );\r
64     }\r
65     \r
66     public void addTrendPage(TrendNode srcTrend) {\r
67         pages.add( TrendPage.createFrom(srcTrend));\r
68     }\r
69     \r
70         public void setPageDesc(PageDesc pageDesc)\r
71         {\r
72                 this.pageDesc = pageDesc;\r
73     }\r
74         \r
75         public void print() throws PrinterException {\r
76                 PrinterJob printJob = PrinterJob.getPrinterJob();\r
77                 printJob.setPrintable( new Printable() {\r
78                         @Override\r
79                         public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {\r
80                                 if (graphics instanceof Graphics2D == false) {\r
81                                         throw new PrinterException("Printer context does not support Graphics2D");\r
82                                 }\r
83                                 if (pageIndex < pages.size()) {\r
84                                         Graphics2D g2d = (Graphics2D) graphics;\r
85 \r
86                                         g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());                  \r
87                                         \r
88                                         Rectangle2D rect = new Rectangle2D.Double(0, 0, pageFormat.getImageableWidth(), pageFormat.getImageableHeight());\r
89                                         //g2d.setClip( rect );\r
90                                         System.out.println("Printing page "+pageIndex+", pageFormat="+pageFormat.getImageableX()+", "+pageFormat.getImageableY()+", "+pageFormat.getImageableWidth()+", "+pageFormat.getImageableHeight());\r
91                                         PrintPage trend = pages.get(pageIndex);\r
92                                         trend.print(g2d, rect);\r
93                                         \r
94                                         return PAGE_EXISTS;\r
95                                 }\r
96                                 return NO_SUCH_PAGE;\r
97                         }} );\r
98                 printJob.printDialog();\r
99                 printJob.print();\r
100         }       \r
101         \r
102         public void printPdf(File file) throws IOException\r
103         {               \r
104                 Document document = null;\r
105                 FileOutputStream fos = null;\r
106                 Graphics2D g2 = null;\r
107                 try {\r
108                         // Page area\r
109                         Rectangle2D.Float pageArea = new Rectangle2D.Float();\r
110                         pageDesc.getPageRectangle( pageArea );\r
111 \r
112                         // Content area in page\r
113                         Rectangle2D.Float contentArea = new Rectangle2D.Float();\r
114                         pageDesc.getMarginsRectangle( contentArea );\r
115         \r
116                         // step 1: creation of a document-object\r
117                         Rectangle pageArea2 = new Rectangle( \r
118                                         (float) PageDesc.toPoints(pageArea.getMinX()), \r
119                                         (float) PageDesc.toPoints(pageArea.getMinY()), \r
120                                         (float) PageDesc.toPoints(pageArea.getWidth()), \r
121                                         (float) PageDesc.toPoints(pageArea.getHeight()) );\r
122                         document = new Document( pageArea2 );\r
123           \r
124                         // step 2: creation of the writer\r
125                         if ( !file.exists() ) file.createNewFile();\r
126                         fos = new FileOutputStream( file, false );\r
127                         PdfWriter writer;\r
128                         try {\r
129                                 writer = PdfWriter.getInstance(document, fos);\r
130                         } catch (DocumentException e) {\r
131                                 throw new IOException(e);\r
132                         }\r
133             \r
134                         // step 3: we open the document\r
135                         document.open();\r
136 \r
137                         // step 4:\r
138                         for ( PrintPage page : pages ) \r
139                         {\r
140                                 if (!document.newPage()) break;\r
141                                 PdfContentByte cb = writer.getDirectContent();\r
142                                 g2 = cb.createGraphics( pageArea2.getWidth(), pageArea2.getHeight(), mapper);\r
143                                 \r
144                                 Rectangle2D contentArea2 = new Rectangle2D.Float( \r
145                                                 (float) PageDesc.toPoints(contentArea.getMinX()), \r
146                                                 (float) PageDesc.toPoints(contentArea.getMinY()), \r
147                                                 (float) PageDesc.toPoints(contentArea.getWidth()), \r
148                                                 (float) PageDesc.toPoints(contentArea.getHeight()) );\r
149         \r
150                                 page.print(g2, contentArea2);\r
151                         }\r
152                         \r
153         } finally {\r
154                 try {\r
155                         if (g2 != null) g2.dispose();\r
156                         if (document != null) document.close();\r
157                         if (fos != null) fos.close();\r
158                 } catch (Exception e) {}\r
159         }\r
160         }\r
161 \r
162         interface PrintPage {\r
163                 void print(Graphics2D g2d, Rectangle2D pageArea);\r
164         }\r
165         \r
166         static class TrendPage implements PrintPage\r
167         {\r
168                 boolean autoscale;\r
169                 TrendNode trend;\r
170                 \r
171                 public static TrendPage createFrom(TrendNode srcTrend)\r
172                 {\r
173                 TrendPage page = new TrendPage();\r
174                 CanvasContext ctx = TrendInitializer.createDefaultCanvas(AWTThread.getThreadAccess(), srcTrend.historian, srcTrend.collector, null, srcTrend.getTrendSpec());\r
175                 TrendNode trend = TrendInitializer.getTrendNode( ctx );        \r
176                 trend.setViewport( srcTrend.getViewport() );\r
177                 page.autoscale = false;\r
178                 if (srcTrend.milestones != null) trend.setMilestones( srcTrend.milestones );\r
179                 trend.printing = true;\r
180                 page.trend = trend;\r
181                 return page;\r
182                 }\r
183                 \r
184             public static TrendPage addTrendPage(TrendSpec trendSpec, HistoryManager historian, MilestoneSpec milestones, Viewport viewport)\r
185             {\r
186                 TrendPage page = new TrendPage();\r
187                 CanvasContext ctx = TrendInitializer.createDefaultCanvas(AWTThread.getThreadAccess(), historian, null, null, trendSpec);\r
188                 TrendNode trend = TrendInitializer.getTrendNode( ctx );         \r
189                 trend.printing = true;\r
190                 if (milestones!=null) {\r
191                         trend.setMilestones(milestones);\r
192                 }\r
193                 if ( viewport!=null ) {\r
194                         trend.setViewport(viewport);\r
195                         page.autoscale = false;\r
196                 } else {\r
197                         page.autoscale = true;\r
198                 }\r
199                 page.trend = trend;\r
200                 return page;\r
201             }\r
202                                 \r
203                 public void print(Graphics2D g2d, Rectangle2D pageArea)\r
204                 {\r
205                         Rectangle2D contentArea2 = new Rectangle2D.Float( \r
206                                         (float) PageDesc.toPoints(pageArea.getMinX()), \r
207                                         (float) PageDesc.toPoints(pageArea.getMinY()), \r
208                                         (float) PageDesc.toPoints(pageArea.getWidth()), \r
209                                         (float) PageDesc.toPoints(pageArea.getHeight()) );\r
210 \r
211                         java.awt.Rectangle r2 = g2d.getClipBounds();\r
212                         java.awt.Rectangle r = g2d.getClipBounds();\r
213                         r.width *= 2;\r
214                         r.height *= 2;\r
215                         g2d.scale(0.5, 0.5);\r
216 //                      r = g2d.getClipBounds();\r
217 //                      System.out.println(r);\r
218                         g2d.setClip(r);\r
219                         try {\r
220                                 trend.setSize(r.width, r.height);\r
221 //                              trend.setSize(contentArea2.getWidth()*2, contentArea2.getHeight()*2);\r
222 //                              g2d.setClip( contentArea2 );\r
223                                 //trend.setSize(contentArea2.getWidth(), contentArea2.getHeight());\r
224                                 if ( autoscale ) trend.zoomOut();\r
225                                 trend.layout();\r
226                                 trend.render( g2d );\r
227                         } finally {\r
228                                 g2d.scale(2, 2);\r
229                                 g2d.setClip(r2);\r
230                         }\r
231                 }\r
232         }\r
233         \r
234 }\r