--- /dev/null
+/*******************************************************************************\r
+' * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
+ * Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.trend.util;\r
+\r
+import java.awt.Graphics;\r
+import java.awt.Graphics2D;\r
+import java.awt.geom.Rectangle2D;\r
+import java.awt.print.PageFormat;\r
+import java.awt.print.Printable;\r
+import java.awt.print.PrinterException;\r
+import java.awt.print.PrinterJob;\r
+import java.io.File;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.simantics.g2d.canvas.impl.CanvasContext;\r
+import org.simantics.history.HistoryManager;\r
+import org.simantics.trend.TrendInitializer;\r
+import org.simantics.trend.configuration.TrendSpec;\r
+import org.simantics.trend.configuration.Viewport;\r
+import org.simantics.trend.impl.MilestoneSpec;\r
+import org.simantics.trend.impl.TrendNode;\r
+import org.simantics.utils.page.MarginUtils;\r
+import org.simantics.utils.page.PageDesc;\r
+import org.simantics.utils.page.PageOrientation;\r
+import org.simantics.utils.threads.AWTThread;\r
+\r
+import com.lowagie.text.Document;\r
+import com.lowagie.text.DocumentException;\r
+import com.lowagie.text.FontFactory;\r
+import com.lowagie.text.Rectangle;\r
+import com.lowagie.text.pdf.DefaultFontMapper;\r
+import com.lowagie.text.pdf.FontMapper;\r
+import com.lowagie.text.pdf.PdfContentByte;\r
+import com.lowagie.text.pdf.PdfWriter;\r
+\r
+public class PrintUtil {\r
+\r
+ PageDesc pageDesc;\r
+ FontMapper mapper;\r
+ List<PrintPage> pages = new ArrayList<PrintPage>();\r
+ \r
+ public PrintUtil()\r
+ {\r
+ pageDesc = new PageDesc("A4", PageOrientation.Landscape, 210, 297).withMargins( MarginUtils.MARGINS_10mm );\r
+ mapper = new DefaultFontMapper();\r
+ FontFactory.registerDirectories();\r
+ }\r
+ \r
+ public void addTrendPage(TrendSpec trendSpec, HistoryManager historian, MilestoneSpec milestones, Viewport viewport)\r
+ {\r
+ pages.add( TrendPage.addTrendPage(trendSpec, historian, milestones, viewport) );\r
+ }\r
+ \r
+ public void addTrendPage(TrendNode srcTrend) {\r
+ pages.add( TrendPage.createFrom(srcTrend));\r
+ }\r
+ \r
+ public void setPageDesc(PageDesc pageDesc)\r
+ {\r
+ this.pageDesc = pageDesc;\r
+ }\r
+ \r
+ public void print() throws PrinterException {\r
+ PrinterJob printJob = PrinterJob.getPrinterJob();\r
+ printJob.setPrintable( new Printable() {\r
+ @Override\r
+ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {\r
+ if (graphics instanceof Graphics2D == false) {\r
+ throw new PrinterException("Printer context does not support Graphics2D");\r
+ }\r
+ if (pageIndex < pages.size()) {\r
+ Graphics2D g2d = (Graphics2D) graphics;\r
+\r
+ g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); \r
+ \r
+ Rectangle2D rect = new Rectangle2D.Double(0, 0, pageFormat.getImageableWidth(), pageFormat.getImageableHeight());\r
+ //g2d.setClip( rect );\r
+ System.out.println("Printing page "+pageIndex+", pageFormat="+pageFormat.getImageableX()+", "+pageFormat.getImageableY()+", "+pageFormat.getImageableWidth()+", "+pageFormat.getImageableHeight());\r
+ PrintPage trend = pages.get(pageIndex);\r
+ trend.print(g2d, rect);\r
+ \r
+ return PAGE_EXISTS;\r
+ }\r
+ return NO_SUCH_PAGE;\r
+ }} );\r
+ printJob.printDialog();\r
+ printJob.print();\r
+ } \r
+ \r
+ public void printPdf(File file) throws IOException\r
+ { \r
+ Document document = null;\r
+ FileOutputStream fos = null;\r
+ Graphics2D g2 = null;\r
+ try {\r
+ // Page area\r
+ Rectangle2D.Float pageArea = new Rectangle2D.Float();\r
+ pageDesc.getPageRectangle( pageArea );\r
+\r
+ // Content area in page\r
+ Rectangle2D.Float contentArea = new Rectangle2D.Float();\r
+ pageDesc.getMarginsRectangle( contentArea );\r
+ \r
+ // step 1: creation of a document-object\r
+ Rectangle pageArea2 = new Rectangle( \r
+ (float) PageDesc.toPoints(pageArea.getMinX()), \r
+ (float) PageDesc.toPoints(pageArea.getMinY()), \r
+ (float) PageDesc.toPoints(pageArea.getWidth()), \r
+ (float) PageDesc.toPoints(pageArea.getHeight()) );\r
+ document = new Document( pageArea2 );\r
+ \r
+ // step 2: creation of the writer\r
+ if ( !file.exists() ) file.createNewFile();\r
+ fos = new FileOutputStream( file, false );\r
+ PdfWriter writer;\r
+ try {\r
+ writer = PdfWriter.getInstance(document, fos);\r
+ } catch (DocumentException e) {\r
+ throw new IOException(e);\r
+ }\r
+ \r
+ // step 3: we open the document\r
+ document.open();\r
+\r
+ // step 4:\r
+ for ( PrintPage page : pages ) \r
+ {\r
+ if (!document.newPage()) break;\r
+ PdfContentByte cb = writer.getDirectContent();\r
+ g2 = cb.createGraphics( pageArea2.getWidth(), pageArea2.getHeight(), mapper);\r
+ \r
+ Rectangle2D contentArea2 = new Rectangle2D.Float( \r
+ (float) PageDesc.toPoints(contentArea.getMinX()), \r
+ (float) PageDesc.toPoints(contentArea.getMinY()), \r
+ (float) PageDesc.toPoints(contentArea.getWidth()), \r
+ (float) PageDesc.toPoints(contentArea.getHeight()) );\r
+ \r
+ page.print(g2, contentArea2);\r
+ }\r
+ \r
+ } finally {\r
+ try {\r
+ if (g2 != null) g2.dispose();\r
+ if (document != null) document.close();\r
+ if (fos != null) fos.close();\r
+ } catch (Exception e) {}\r
+ }\r
+ }\r
+\r
+ interface PrintPage {\r
+ void print(Graphics2D g2d, Rectangle2D pageArea);\r
+ }\r
+ \r
+ static class TrendPage implements PrintPage\r
+ {\r
+ boolean autoscale;\r
+ TrendNode trend;\r
+ \r
+ public static TrendPage createFrom(TrendNode srcTrend)\r
+ {\r
+ TrendPage page = new TrendPage();\r
+ CanvasContext ctx = TrendInitializer.createDefaultCanvas(AWTThread.getThreadAccess(), srcTrend.historian, srcTrend.collector, null, srcTrend.getTrendSpec());\r
+ TrendNode trend = TrendInitializer.getTrendNode( ctx ); \r
+ trend.setViewport( srcTrend.getViewport() );\r
+ page.autoscale = false;\r
+ if (srcTrend.milestones != null) trend.setMilestones( srcTrend.milestones );\r
+ trend.printing = true;\r
+ page.trend = trend;\r
+ return page;\r
+ }\r
+ \r
+ public static TrendPage addTrendPage(TrendSpec trendSpec, HistoryManager historian, MilestoneSpec milestones, Viewport viewport)\r
+ {\r
+ TrendPage page = new TrendPage();\r
+ CanvasContext ctx = TrendInitializer.createDefaultCanvas(AWTThread.getThreadAccess(), historian, null, null, trendSpec);\r
+ TrendNode trend = TrendInitializer.getTrendNode( ctx ); \r
+ trend.printing = true;\r
+ if (milestones!=null) {\r
+ trend.setMilestones(milestones);\r
+ }\r
+ if ( viewport!=null ) {\r
+ trend.setViewport(viewport);\r
+ page.autoscale = false;\r
+ } else {\r
+ page.autoscale = true;\r
+ }\r
+ page.trend = trend;\r
+ return page;\r
+ }\r
+ \r
+ public void print(Graphics2D g2d, Rectangle2D pageArea)\r
+ {\r
+ Rectangle2D contentArea2 = new Rectangle2D.Float( \r
+ (float) PageDesc.toPoints(pageArea.getMinX()), \r
+ (float) PageDesc.toPoints(pageArea.getMinY()), \r
+ (float) PageDesc.toPoints(pageArea.getWidth()), \r
+ (float) PageDesc.toPoints(pageArea.getHeight()) );\r
+\r
+ java.awt.Rectangle r2 = g2d.getClipBounds();\r
+ java.awt.Rectangle r = g2d.getClipBounds();\r
+ r.width *= 2;\r
+ r.height *= 2;\r
+ g2d.scale(0.5, 0.5);\r
+// r = g2d.getClipBounds();\r
+// System.out.println(r);\r
+ g2d.setClip(r);\r
+ try {\r
+ trend.setSize(r.width, r.height);\r
+// trend.setSize(contentArea2.getWidth()*2, contentArea2.getHeight()*2);\r
+// g2d.setClip( contentArea2 );\r
+ //trend.setSize(contentArea2.getWidth(), contentArea2.getHeight());\r
+ if ( autoscale ) trend.zoomOut();\r
+ trend.layout();\r
+ trend.render( g2d );\r
+ } finally {\r
+ g2d.scale(2, 2);\r
+ g2d.setClip(r2);\r
+ }\r
+ }\r
+ }\r
+ \r
+}\r