JAL-3103 Put jalview.jar first in getdown for .properties files. Remove now-not-neede...
[jalview.git] / src / jalview / io / HTMLOutput.java
old mode 100755 (executable)
new mode 100644 (file)
index d58bd67..eb44180
  */
 package jalview.io;
 
-import jalview.api.AlignExportSettingI;
-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;
@@ -34,87 +27,73 @@ import java.io.InputStreamReader;
 import java.net.URL;
 import java.util.Objects;
 
+import jalview.api.AlignExportSettingsI;
+import jalview.bin.Cache;
+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;
 
-  public HTMLOutput(AlignmentPanel ap)
-  {
-    if (ap != null)
-    {
-      this.ap = ap;
-      this.pIndicator = ap.alignFrame;
-    }
-  }
+  String _bioJson = null;
 
-  public String getBioJSONData()
+  private String description;
+
+  /**
+   * Constructor given an alignment panel (which should not be null)
+   * 
+   * @param ap
+   * @param desc
+   */
+  public HTMLOutput(AlignmentPanel ap, String desc)
   {
-    return getBioJSONData(null);
+    this.ap = ap;
+    this.pIndicator = ap.alignFrame;
+    this.description = desc;
+    this.pSessionId = System.currentTimeMillis();
   }
 
-  public String getBioJSONData(AlignExportSettingI exportSettings)
+  /**
+   * Gets the BioJSON data as a string, with lazy evaluation (first time called
+   * only). If the output format is configured not to embed BioJSON, returns
+   * null.
+   * 
+   * @return
+   */
+  public String getBioJSONData()
   {
     if (!isEmbedData())
     {
       return null;
     }
-    if (exportSettings == null)
+    if (_bioJson == null)
     {
-      exportSettings = new AlignExportSettingI()
-      {
-        @Override
-        public boolean isExportHiddenSequences()
-        {
-          return true;
-        }
-
-        @Override
-        public boolean isExportHiddenColumns()
-        {
-          return true;
-        }
-
-        @Override
-        public boolean isExportAnnotations()
-        {
-          return true;
-        }
-
-        @Override
-        public boolean isExportFeatures()
-        {
-          return true;
-        }
-
-        @Override
-        public boolean isExportGroups()
-        {
-          return true;
-        }
-
-        @Override
-        public boolean isCancelled()
-        {
-          return false;
-        }
-      };
+      AlignExportSettingsI options = new AlignExportSettingsAdapter(true);
+      AlignmentExportData exportData = ap.getAlignViewport()
+              .getAlignExportData(options);
+      _bioJson = new FormatAdapter(ap, options).formatSequences(
+              FileFormat.Json, exportData.getAlignment(),
+              exportData.getOmitHidden(), exportData.getStartEndPostions(),
+              ap.getAlignViewport().getAlignment().getHiddenColumns());
     }
-    AlignmentExportData exportData = jalview.gui.AlignFrame
-            .getAlignmentForExport(JSONFile.FILE_DESC,
-                    ap.getAlignViewport(), exportSettings);
-    String bioJSON = new FormatAdapter(ap, exportData.getSettings())
-            .formatSequences(JSONFile.FILE_DESC, exportData.getAlignment(),
-                    exportData.getOmitHidden(), exportData
-                            .getStartEndPostions(), ap.getAlignViewport()
-                            .getColumnSelection());
-    return bioJSON;
+
+    return _bioJson;
   }
 
   /**
@@ -145,7 +124,7 @@ public abstract class HTMLOutput implements Runnable
         {
           sb.append(line).append(lineSeparator);
         }
-  
+
       } catch (Exception ex)
       {
         ex.printStackTrace();
@@ -155,7 +134,7 @@ public abstract class HTMLOutput implements Runnable
         {
           isReader.close();
         }
-  
+
         if (buffReader != null)
         {
           buffReader.close();
@@ -167,123 +146,86 @@ public abstract class HTMLOutput implements Runnable
 
   public static String getImageMapHTML()
   {
-    return new String(
-            "<html>\n"
-                    + "<head>\n"
-                    + "<script language=\"JavaScript\">\n"
-                    + "var ns4 = document.layers;\n"
-                    + "var ns6 = document.getElementById && !document.all;\n"
-                    + "var ie4 = document.all;\n"
-                    + "offsetX = 0;\n"
-                    + "offsetY = 20;\n"
-                    + "var toolTipSTYLE=\"\";\n"
-                    + "function initToolTips()\n"
-                    + "{\n"
-                    + "  if(ns4||ns6||ie4)\n"
-                    + "  {\n"
-                    + "    if(ns4) toolTipSTYLE = document.toolTipLayer;\n"
-                    + "    else if(ns6) toolTipSTYLE = document.getElementById(\"toolTipLayer\").style;\n"
-                    + "    else if(ie4) toolTipSTYLE = document.all.toolTipLayer.style;\n"
-                    + "    if(ns4) document.captureEvents(Event.MOUSEMOVE);\n"
-                    + "    else\n"
-                    + "    {\n"
-                    + "      toolTipSTYLE.visibility = \"visible\";\n"
-                    + "      toolTipSTYLE.display = \"none\";\n"
-                    + "    }\n"
-                    + "    document.onmousemove = moveToMouseLoc;\n"
-                    + "  }\n"
-                    + "}\n"
-                    + "function toolTip(msg, fg, bg)\n"
-                    + "{\n"
-                    + "  if(toolTip.arguments.length < 1) // hide\n"
-                    + "  {\n"
-                    + "    if(ns4) toolTipSTYLE.visibility = \"hidden\";\n"
-                    + "    else toolTipSTYLE.display = \"none\";\n"
-                    + "  }\n"
-                    + "  else // show\n"
-                    + "  {\n"
-                    + "    if(!fg) fg = \"#555555\";\n"
-                    + "    if(!bg) bg = \"#FFFFFF\";\n"
-                    + "    var content =\n"
-                    + "    '<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"' + fg + '\"><td>' +\n"
-                    + "    '<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"' + bg + \n"
-                    + "    '\"><td align=\"center\"><font face=\"sans-serif\" color=\"' + fg +\n"
-                    + "    '\" size=\"-2\">&nbsp;' + msg +\n"
-                    + "    '&nbsp;</font></td></table></td></table>';\n"
-                    + "    if(ns4)\n"
-                    + "    {\n"
-                    + "      toolTipSTYLE.document.write(content);\n"
-                    + "      toolTipSTYLE.document.close();\n"
-                    + "      toolTipSTYLE.visibility = \"visible\";\n"
-                    + "    }\n"
-                    + "    if(ns6)\n"
-                    + "    {\n"
-                    + "      document.getElementById(\"toolTipLayer\").innerHTML = content;\n"
-                    + "      toolTipSTYLE.display='block'\n"
-                    + "    }\n"
-                    + "    if(ie4)\n"
-                    + "    {\n"
-                    + "      document.all(\"toolTipLayer\").innerHTML=content;\n"
-                    + "      toolTipSTYLE.display='block'\n"
-                    + "    }\n"
-                    + "  }\n"
-                    + "}\n"
-                    + "function moveToMouseLoc(e)\n"
-                    + "{\n"
-                    + "  if(ns4||ns6)\n"
-                    + "  {\n"
-                    + "    x = e.pageX;\n"
-                    + "    y = e.pageY;\n"
-                    + "  }\n"
-                    + "  else\n"
-                    + "  {\n"
-                    + "    x = event.x + document.body.scrollLeft;\n"
-                    + "    y = event.y + document.body.scrollTop;\n"
-                    + "  }\n"
-                    + "  toolTipSTYLE.left = x + offsetX;\n"
-                    + "  toolTipSTYLE.top = y + offsetY;\n"
-                    + "  return true;\n"
-                    + "}\n"
-                    + "</script>\n"
-                    + "</head>\n"
-                    + "<body>\n"
-                    + "<div id=\"toolTipLayer\" style=\"position:absolute; visibility: hidden\"></div>\n"
-                    + "<script language=\"JavaScript\"><!--\n"
-                    + "initToolTips(); //--></script>\n");
+    return new String("<html>\n" + "<head>\n"
+            + "<script language=\"JavaScript\">\n"
+            + "var ns4 = document.layers;\n"
+            + "var ns6 = document.getElementById && !document.all;\n"
+            + "var ie4 = document.all;\n" + "offsetX = 0;\n"
+            + "offsetY = 20;\n" + "var toolTipSTYLE=\"\";\n"
+            + "function initToolTips()\n" + "{\n" + "  if(ns4||ns6||ie4)\n"
+            + "  {\n"
+            + "    if(ns4) toolTipSTYLE = document.toolTipLayer;\n"
+            + "    else if(ns6) toolTipSTYLE = document.getElementById(\"toolTipLayer\").style;\n"
+            + "    else if(ie4) toolTipSTYLE = document.all.toolTipLayer.style;\n"
+            + "    if(ns4) document.captureEvents(Event.MOUSEMOVE);\n"
+            + "    else\n" + "    {\n"
+            + "      toolTipSTYLE.visibility = \"visible\";\n"
+            + "      toolTipSTYLE.display = \"none\";\n" + "    }\n"
+            + "    document.onmousemove = moveToMouseLoc;\n" + "  }\n"
+            + "}\n" + "function toolTip(msg, fg, bg)\n" + "{\n"
+            + "  if(toolTip.arguments.length < 1) // hide\n" + "  {\n"
+            + "    if(ns4) toolTipSTYLE.visibility = \"hidden\";\n"
+            + "    else toolTipSTYLE.display = \"none\";\n" + "  }\n"
+            + "  else // show\n" + "  {\n"
+            + "    if(!fg) fg = \"#555555\";\n"
+            + "    if(!bg) bg = \"#FFFFFF\";\n" + "    var content =\n"
+            + "    '<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"' + fg + '\"><td>' +\n"
+            + "    '<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"' + bg + \n"
+            + "    '\"><td align=\"center\"><font face=\"sans-serif\" color=\"' + fg +\n"
+            + "    '\" size=\"-2\">&nbsp;' + msg +\n"
+            + "    '&nbsp;</font></td></table></td></table>';\n"
+            + "    if(ns4)\n" + "    {\n"
+            + "      toolTipSTYLE.document.write(content);\n"
+            + "      toolTipSTYLE.document.close();\n"
+            + "      toolTipSTYLE.visibility = \"visible\";\n" + "    }\n"
+            + "    if(ns6)\n" + "    {\n"
+            + "      document.getElementById(\"toolTipLayer\").innerHTML = content;\n"
+            + "      toolTipSTYLE.display='block'\n" + "    }\n"
+            + "    if(ie4)\n" + "    {\n"
+            + "      document.all(\"toolTipLayer\").innerHTML=content;\n"
+            + "      toolTipSTYLE.display='block'\n" + "    }\n" + "  }\n"
+            + "}\n" + "function moveToMouseLoc(e)\n" + "{\n"
+            + "  if(ns4||ns6)\n" + "  {\n" + "    x = e.pageX;\n"
+            + "    y = e.pageY;\n" + "  }\n" + "  else\n" + "  {\n"
+            + "    x = event.x + document.body.scrollLeft;\n"
+            + "    y = event.y + document.body.scrollTop;\n" + "  }\n"
+            + "  toolTipSTYLE.left = x + offsetX;\n"
+            + "  toolTipSTYLE.top = y + offsetY;\n" + "  return true;\n"
+            + "}\n" + "</script>\n" + "</head>\n" + "<body>\n"
+            + "<div id=\"toolTipLayer\" style=\"position:absolute; visibility: hidden\"></div>\n"
+            + "<script language=\"JavaScript\"><!--\n"
+            + "initToolTips(); //--></script>\n");
 
   }
 
-  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);
-    }
 
-    JalviewFileChooser jvFileChooser = new JalviewFileChooser(
-            jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
-            new String[] { "html" }, new String[] { "HTML files" },
+    // TODO: JAL-3048 generate html rendered view (requires SvgGraphics and/or
+    // Jalview HTML rendering system- probably not required for Jalview-JS)
+    JalviewFileChooser jvFileChooser = new JalviewFileChooser("html",
             "HTML files");
     jvFileChooser.setFileView(new JalviewFileView());
 
-    jvFileChooser.setDialogTitle(MessageManager
-            .getString("label.save_as_html"));
+    jvFileChooser
+            .setDialogTitle(MessageManager.getString("label.save_as_html"));
     jvFileChooser.setToolTipText(MessageManager.getString("action.save"));
 
     int fileChooserOpt = jvFileChooser.showSaveDialog(null);
     if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
     {
-      jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser
-              .getSelectedFile().getParent());
+      Cache.setProperty("LAST_DIRECTORY",
+              jvFileChooser.getSelectedFile().getParent());
       selectedFile = jvFileChooser.getSelectedFile().getPath();
     }
-    else
-    {
-      throw new NoFileSelectedException("No file was selected.");
-    }
+
     return selectedFile;
   }
 
@@ -312,16 +254,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.
    */
@@ -329,14 +261,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();
       }
+      */
     }
   }
 
@@ -361,13 +296,51 @@ 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;
+    }
+    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