JAL-629 Attempts to add PAE to structure. --headless working. Make HTML output single...
[jalview.git] / src / jalview / io / HTMLOutput.java
index 86da67a..2745420 100644 (file)
  */
 package jalview.io;
 
-import jalview.api.AlignExportSettingsI;
-import jalview.datamodel.AlignExportSettingsAdapter;
-import jalview.datamodel.AlignmentExportData;
-import jalview.exceptions.NoFileSelectedException;
-import jalview.gui.AlignmentPanel;
-import jalview.gui.IProgressIndicator;
-import jalview.util.MessageManager;
-
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
@@ -35,27 +27,47 @@ import java.io.InputStreamReader;
 import java.net.URL;
 import java.util.Objects;
 
+import jalview.api.AlignExportSettingsI;
+import jalview.bin.Cache;
+import jalview.bin.Jalview;
+import jalview.datamodel.AlignExportSettingsAdapter;
+import jalview.datamodel.AlignmentExportData;
+import jalview.gui.AlignmentPanel;
+import jalview.gui.IProgressIndicator;
+import jalview.util.MessageManager;
+
 public abstract class HTMLOutput implements Runnable
 {
   protected AlignmentPanel ap;
 
+  /*
+   * key for progress or status messages
+   */
   protected long pSessionId;
 
+  /*
+   * (optional) place to write progress messages to
+   */
   protected IProgressIndicator pIndicator;
 
   protected File generatedFile;
 
   String _bioJson = null;
 
+  private String description;
+
   /**
    * Constructor given an alignment panel (which should not be null)
    * 
    * @param ap
+   * @param desc
    */
-  public HTMLOutput(AlignmentPanel ap)
+  public HTMLOutput(AlignmentPanel ap, String desc)
   {
     this.ap = ap;
     this.pIndicator = ap.alignFrame;
+    this.description = desc;
+    this.pSessionId = System.currentTimeMillis();
   }
 
   /**
@@ -187,15 +199,15 @@ public abstract class HTMLOutput implements Runnable
 
   }
 
-  public String getOutputFile() throws NoFileSelectedException
+  /**
+   * Prompts the user to choose an output file and returns the file path, or
+   * null on Cancel
+   * 
+   * @return
+   */
+  public String getOutputFile()
   {
     String selectedFile = null;
-    if (pIndicator != null && !isHeadless())
-    {
-      pIndicator.setProgressBar(MessageManager.formatMessage(
-              "status.waiting_for_user_to_select_output_file", "HTML"),
-              pSessionId);
-    }
 
     // TODO: JAL-3048 generate html rendered view (requires SvgGraphics and/or
     // Jalview HTML rendering system- probably not required for Jalview-JS)
@@ -210,14 +222,11 @@ public abstract class HTMLOutput implements Runnable
     int fileChooserOpt = jvFileChooser.showSaveDialog(null);
     if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
     {
-      jalview.bin.Cache.setProperty("LAST_DIRECTORY",
+      Cache.setProperty("LAST_DIRECTORY",
               jvFileChooser.getSelectedFile().getParent());
       selectedFile = jvFileChooser.getSelectedFile().getPath();
     }
-    else
-    {
-      throw new NoFileSelectedException("No file was selected.");
-    }
+
     return selectedFile;
   }
 
@@ -246,16 +255,6 @@ public abstract class HTMLOutput implements Runnable
 
   /**
    * This method provides implementation of consistent behaviour which should
-   * occur before a HTML file export. It MUST be called at the start of the
-   * exportHTML() method implementation.
-   */
-  protected void exportStarted()
-  {
-    pSessionId = System.currentTimeMillis();
-  }
-
-  /**
-   * This method provides implementation of consistent behaviour which should
    * occur after a HTML file export. It MUST be called at the end of the
    * exportHTML() method implementation.
    */
@@ -263,14 +262,17 @@ public abstract class HTMLOutput implements Runnable
   {
     if (isLaunchInBrowserAfterExport() && !isHeadless())
     {
+      /*
       try
       {
-        jalview.util.BrowserLauncher
-                .openURL("file:///" + getExportedFile());
+      */
+      jalview.util.BrowserLauncher.openURL("file:///" + getExportedFile());
+      /*
       } catch (IOException e)
       {
         e.printStackTrace();
       }
+      */
     }
   }
 
@@ -295,13 +297,58 @@ public abstract class HTMLOutput implements Runnable
    * 
    * @return
    */
-  public abstract File getExportedFile();
+  public File getExportedFile()
+  {
+    return generatedFile;
+  }
+
+  public void exportHTML(String outputFile)
+  {
+    setProgressMessage(MessageManager.formatMessage(
+            "status.exporting_alignment_as_x_file", getDescription()));
+    try
+    {
+      if (outputFile == null)
+      {
+        /*
+         * prompt for output file
+         */
+        outputFile = getOutputFile();
+        if (outputFile == null)
+        {
+          setProgressMessage(MessageManager.formatMessage(
+                  "status.cancelled_image_export_operation",
+                  getDescription()));
+          return;
+        }
+      }
+      generatedFile = new File(outputFile);
+    } catch (Exception e)
+    {
+      setProgressMessage(MessageManager
+              .formatMessage("info.error_creating_file", getDescription()));
+      e.printStackTrace();
+      return;
+    }
+    if (Jalview.isHeadlessMode())
+    {
+      this.run();
+    }
+    else
+    {
+      new Thread(this).start();
+    }
+
+  }
 
   /**
-   * This is the main method to handle the HTML generation.
+   * Answers a short description of the image format suitable for display in
+   * messages
    * 
-   * @param outputFile
-   *          the file path of the generated HTML
+   * @return
    */
-  public abstract void exportHTML(String outputFile);
+  protected final String getDescription()
+  {
+    return description;
+  }
 }
\ No newline at end of file