JAL-3085 spike - will need to cherrypick from this branch
[jalview.git] / src / jalview / util / ImageMaker.java
index 8f8af54..ed16e11 100755 (executable)
@@ -20,7 +20,6 @@
  */
 package jalview.util;
 
-import jalview.bin.Cache;
 import jalview.bin.Jalview;
 import jalview.gui.EPSOptions;
 import jalview.gui.IProgressIndicator;
@@ -32,6 +31,8 @@ import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.image.BufferedImage;
+import java.awt.print.PageFormat;
+import java.awt.print.Paper;
 import java.io.File;
 import java.io.FileOutputStream;
 
@@ -41,6 +42,8 @@ import org.jfree.graphics2d.svg.SVGGraphics2D;
 import org.jfree.graphics2d.svg.SVGHints;
 import org.jibble.epsgraphics.EpsGraphics2D;
 
+import gnu.jpdf.PDFJob;
+
 public class ImageMaker
 {
   public static final String SVG_DESCRIPTION = "Scalable Vector Graphics";
@@ -55,6 +58,10 @@ public class ImageMaker
 
   public static final String PNG_DESCRIPTION = "Portable  network graphics";
 
+  public static final String PDF_EXTENSION = "pdf";
+
+  public static final String PDF_DESCRIPTION = "Portable  Document Format";
+
   public static final String HTML_EXTENSION = "html";
 
   public static final String HTML_DESCRIPTION = "Hypertext Markup Language";
@@ -63,6 +70,7 @@ public class ImageMaker
 
   SVGGraphics2D g2;
 
+
   Graphics graphics;
 
   FileOutputStream out;
@@ -77,11 +85,15 @@ public class ImageMaker
 
   private boolean headless;
 
+  private PDFJob pdfjob;
+
   public enum TYPE
   {
     EPS("EPS", MessageManager.getString("label.eps_file"), getEPSChooser()),
-    PNG("PNG", MessageManager.getString("label.png_image"), getPNGChooser()),
-    SVG("SVG", "SVG", getSVGChooser());
+    PNG("PNG", MessageManager.getString("label.png_image"),
+            getPNGChooser()),
+    SVG("SVG", "SVG", getSVGChooser()),
+    PDF("PDF","PDF",getPDFChooser());
 
     private JalviewFileChooser chooser;
 
@@ -134,8 +146,8 @@ public class ImageMaker
 
       if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
       {
-        jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser
-                .getSelectedFile().getParent());
+        jalview.bin.Cache.setProperty("LAST_DIRECTORY",
+                chooser.getSelectedFile().getParent());
         file = chooser.getSelectedFile();
       }
       else
@@ -165,13 +177,17 @@ public class ImageMaker
         {
           setupPNG(width, height);
         }
+        else if (type == TYPE.PDF)
+        {
+          setupPDF(width, height, fileTitle);
+        }
 
       } catch (Exception ex)
       {
         System.out.println("Error creating " + type.getName() + " file.");
 
-        setProgressMessage(MessageManager.formatMessage(
-                "info.error_creating_file", type.getName()));
+        setProgressMessage(MessageManager
+                .formatMessage("info.error_creating_file", type.getName()));
       }
     }
   }
@@ -202,6 +218,10 @@ public class ImageMaker
         out.flush();
         out.close();
         break;
+      case PDF:
+        graphics = null;
+        pdfjob.end();
+        pdfjob = null;
       }
     } catch (Exception ex)
     {
@@ -248,13 +268,57 @@ public class ImageMaker
       pg.setAccurateTextMode(accurateText);
 
       graphics = pg;
-      setProgressMessage(MessageManager.formatMessage(
-              "status.export_complete", type.getName()));
+      setProgressMessage(MessageManager
+              .formatMessage("status.export_complete", type.getName()));
     } catch (Exception ex)
     {
     }
   }
 
+  void setupPDF(int width, int height, String title)
+  {
+    boolean accurateText = true;
+
+    // String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",
+    // "Prompt each time");
+    //
+    // // If we need to prompt, and if the GUI is visible then
+    // // Prompt for EPS rendering style
+    // if (renderStyle.equalsIgnoreCase("Prompt each time")
+    // && !(System.getProperty("java.awt.headless") != null && System
+    // .getProperty("java.awt.headless").equals("true")))
+    // {
+    // EPSOptions eps = new EPSOptions();
+    // renderStyle = eps.getValue();
+    //
+    // if (renderStyle == null || eps.cancelled)
+    // {
+    // setProgressMessage(MessageManager.formatMessage(
+    // "status.cancelled_image_export_operation", "EPS"));
+    // return;
+    // }
+    // }
+    //
+    // if (renderStyle.equalsIgnoreCase("text"))
+    // {
+    // accurateText = false;
+    // }
+
+    try
+    {
+      pdfjob = new PDFJob(out, title);
+      
+      Paper paper = new Paper();
+      paper.setSize(width, height);
+      PageFormat pf = new PageFormat();
+      pf.setPaper(paper);
+      graphics = pdfjob.getGraphics(pf);
+      setProgressMessage(MessageManager
+              .formatMessage("status.export_complete", type.getName()));
+    } catch (Exception ex)
+    {
+    }
+  }
   void setupPNG(int width, int height)
   {
     bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
@@ -262,8 +326,8 @@ public class ImageMaker
     Graphics2D ig2 = (Graphics2D) graphics;
     ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
             RenderingHints.VALUE_ANTIALIAS_ON);
-    setProgressMessage(MessageManager.formatMessage(
-            "status.export_complete", type.getName()));
+    setProgressMessage(MessageManager
+            .formatMessage("status.export_complete", type.getName()));
 
   }
 
@@ -299,8 +363,8 @@ public class ImageMaker
               SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR);
     }
 
-    setProgressMessage(MessageManager.formatMessage(
-            "status.export_complete", type.getName()));
+    setProgressMessage(MessageManager
+            .formatMessage("status.export_complete", type.getName()));
     graphics = g2;
   }
 
@@ -310,8 +374,16 @@ public class ImageMaker
     {
       return null;
     }
-    return new JalviewFileChooser(Cache.getProperty("LAST_DIRECTORY"),
-            PNG_EXTENSION, PNG_DESCRIPTION);
+    return new JalviewFileChooser(PNG_EXTENSION, PNG_DESCRIPTION);
+  }
+
+  static JalviewFileChooser getPDFChooser()
+  {
+    if (Jalview.isHeadlessMode())
+    {
+      return null;
+    }
+    return new JalviewFileChooser(PDF_EXTENSION, PDF_DESCRIPTION);
   }
 
   static JalviewFileChooser getEPSChooser()
@@ -320,8 +392,7 @@ public class ImageMaker
     {
       return null;
     }
-    return new JalviewFileChooser(Cache.getProperty("LAST_DIRECTORY"),
-            EPS_EXTENSION, EPS_DESCRIPTION);
+    return new JalviewFileChooser(EPS_EXTENSION, EPS_DESCRIPTION);
   }
 
   private void setProgressMessage(String message)
@@ -338,7 +409,6 @@ public class ImageMaker
     {
       return null;
     }
-    return new JalviewFileChooser(Cache.getProperty("LAST_DIRECTORY"),
-            SVG_EXTENSION, SVG_DESCRIPTION);
+    return new JalviewFileChooser(SVG_EXTENSION, SVG_DESCRIPTION);
   }
 }