]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.trend/src/org/simantics/trend/util/PrintUtil.java b/bundles/org.simantics.trend/src/org/simantics/trend/util/PrintUtil.java
new file mode 100644 (file)
index 0000000..c81288e
--- /dev/null
@@ -0,0 +1,234 @@
+/*******************************************************************************\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