JAL-1835 made BioJSON embedding to html exports configurable, and trapped import...
[jalview.git] / src / jalview / io / HtmlSvgOutput.java
index 4643858..7fcf629 100644 (file)
@@ -1,10 +1,10 @@
 package jalview.io;
 
+import jalview.api.FeatureRenderer;
+import jalview.datamodel.AlignmentExportData;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignViewport;
 import jalview.gui.AlignmentPanel;
-import jalview.gui.AnnotationPanel;
-import jalview.gui.FeatureRenderer;
 import jalview.gui.HTMLOptions;
 import jalview.math.AlignmentDimension;
 import jalview.util.MessageManager;
@@ -27,22 +27,26 @@ public class HtmlSvgOutput
   FeatureRenderer fr;
   AlignmentPanel ap;
 
-  AnnotationPanel annotationPanel;
 
-  public HtmlSvgOutput(AlignmentPanel ap)
+  public HtmlSvgOutput(File file, AlignmentPanel ap)
   {
-
-      this.av = ap.av;
-      this.ap = ap;
-      this.annotationPanel = ap.getAnnotationPanel();
-    generateHtmlSvgOutput();
+    this.av = ap.av;
+    this.ap = ap;
+    fr = ap.cloneFeatureRenderer();
+    generateHtmlSvgOutput(file);
   }
 
-  public void generateHtmlSvgOutput()
+  public void generateHtmlSvgOutput(File file)
   {
-    File file = null;
     try
     {
+      if (file == null /*
+                        * && !(System.getProperty("java.awt.headless") != null
+                        * && System
+                        * .getProperty("java.awt.headless").equals("true"))
+                        */)
+      {
+
       JalviewFileChooser chooser = getHTMLChooser();
       chooser.setFileView(new jalview.io.JalviewFileView());
       chooser.setDialogTitle(ap.alignFrame.getTitle());
@@ -55,6 +59,7 @@ public class HtmlSvgOutput
                 .getSelectedFile().getParent());
         file = chooser.getSelectedFile();
       }
+      }
 
       AlignmentDimension aDimension = ap.getAlignmentDimension();
       SVGGraphics2D g1 = new SVGGraphics2D(aDimension.getWidth(),
@@ -89,17 +94,36 @@ public class HtmlSvgOutput
       }
       printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0, g1,
               g2);
-      FileOutputStream out = new FileOutputStream(file);
 
       String titleSvgData = g1.getSVGDocument();
       String alignSvgData = g2.getSVGDocument();
-      String htmlData = getHtml(titleSvgData, alignSvgData);
-
+      String jsonData = null;
+      boolean isEmbbedBioJSON = Boolean.valueOf(jalview.bin.Cache
+              .getDefault("EXPORT_EMBBED_BIOJSON", "true"));
+      if (isEmbbedBioJSON)
+      {
+      AlignmentExportData exportData = ap.alignFrame.getAlignmentForExport(
+              JSONFile.FILE_DESC, av);
+      if (exportData.getSettings().isCancelled())
+      {
+        return;
+      }
+        jsonData = new FormatAdapter(ap, exportData.getSettings())
+              .formatSequences(JSONFile.FILE_DESC, exportData
+                      .getAlignment(), exportData.getOmitHidden(),
+                      exportData.getStartEndPostions(), ap
+                              .getAlignViewport().getColumnSelection());
+      }
+      String htmlData = getHtml(titleSvgData, alignSvgData, jsonData);
+      FileOutputStream out = new FileOutputStream(file);
       out.write(htmlData.getBytes());
       out.flush();
       out.close();
-
+      if (!(System.getProperty("java.awt.headless") != null && System
+              .getProperty("java.awt.headless").equals("true")))
+      {
       jalview.util.BrowserLauncher.openURL("file:///" + file);
+      }
     } catch (Exception e)
     {
       e.printStackTrace();
@@ -247,18 +271,77 @@ public class HtmlSvgOutput
     return Printable.PAGE_EXISTS;
   }
   
-  private String getHtml(String titleSvg, String alignmentSvg)
+  private String getHtml(String titleSvg, String alignmentSvg,
+          String jsonData)
   {
     StringBuilder htmlSvg = new StringBuilder();
-    htmlSvg.append("<html><style type=\"text/css\">" + "div.title {"
-            + "height: 100%;" + "width: 9%;" + "float: left;" + "}"
-            + "div.align {" + "height: 100%;" + "width: 91%;"
-            + "overflow: scroll;" + "float: right;" + "}" + "</style>"
-            + "<div style=\"width:100%; height:100%; overflow: hidden\">"
-            + "<div class=\"title\">");
-    htmlSvg.append(titleSvg);
-    htmlSvg.append("</div><div class=\"align\">").append(alignmentSvg);
+    htmlSvg.append("<html>\n");
+    if (jsonData != null)
+    {
+      htmlSvg.append("<button onclick=\"javascipt:openJalviewUsingCurrentUrl();\">Launch in Jalview</button>");
+      htmlSvg.append("<input type=\"hidden\" name=\"seqData\" id=\"seqData\" value='"
+              + jsonData + "'>");
+    }
+    htmlSvg.append("\n<style type=\"text/css\"> "
+            + "div.parent{ width:100%;<!-- overflow: auto; -->}\n"
+            + "div.titlex{ width:11%; float: left; }\n"
+            + "div.align{ width:89%; float: right; }\n"
+            + ".sub-category-container {overflow-y: scroll; overflow-x: hidden; width: 100%; height: 100%;}\n"
+            + "object {pointer-events: none;}"
+            + "</style>");
+    htmlSvg.append("<div>");
+    htmlSvg.append(
+"<div class=\"titlex\">");
+    htmlSvg.append(
+"<div class=\"sub-category-container\"> ")
+            .append(titleSvg)
+            .append("</div>")
+            .append("</div>\n\n<!-- ========================================================================================== -->\n\n");
+    htmlSvg.append(
+"<div class=\"align\" >");
+    htmlSvg.append(
+            "<div class=\"sub-category-container\"> <div style=\"overflow-x: scroll;\">")
+            .append(alignmentSvg)
+.append("</div></div>")
+            .append("</div>");
     htmlSvg.append("</div>");
+
+    htmlSvg.append("<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js\"></script>\n"
+            + "<script language=\"JavaScript\" type=\"text/javascript\"  src=\"//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js\"></script>\n"
+            + "<script>\n"
+            + "var subCatContainer = $(\".sub-category-container\");\n"
+            + "subCatContainer.scroll(\nfunction() {\n"
+            + "subCatContainer.scrollTop($(this).scrollTop());\n});\n");
+
+    htmlSvg.append("</script>\n");
+
+    // javascript for launching file in Jalview
+
+    htmlSvg.append("<script language=\"JavaScript\">\n");
+    htmlSvg.append("function openJalviewUsingCurrentUrl(){\n");
+    htmlSvg.append("    var json = JSON.parse(document.getElementById(\"seqData\").value);\n");
+    htmlSvg.append("    var jalviewVersion = json['appSettings'].version;\n");
+    htmlSvg.append("    var url = json['appSettings'].webStartUrl;\n");
+    htmlSvg.append("    var myForm = document.createElement(\"form\");\n\n");
+    htmlSvg.append("    var heap = document.createElement(\"input\");\n");
+    htmlSvg.append("    heap.setAttribute(\"name\", \"jvm-max-heap\") ;\n");
+    htmlSvg.append("    heap.setAttribute(\"value\", \"2G\");\n\n");
+    htmlSvg.append("    var target = document.createElement(\"input\");\n");
+    htmlSvg.append("    target.setAttribute(\"name\", \"open\");\n");
+    htmlSvg.append("    target.setAttribute(\"value\", document.URL);\n\n");
+    htmlSvg.append("    var jvVersion = document.createElement(\"input\");\n");
+    htmlSvg.append("    jvVersion.setAttribute(\"name\", \"version\") ;\n");
+    htmlSvg.append("    jvVersion.setAttribute(\"value\", jalviewVersion);\n\n");
+    htmlSvg.append("    myForm.action = url;\n");
+    htmlSvg.append("    myForm.appendChild(heap);\n");
+    htmlSvg.append("    myForm.appendChild(target);\n");
+    htmlSvg.append("    myForm.appendChild(jvVersion);\n");
+    htmlSvg.append("    document.body.appendChild(myForm);\n");
+    htmlSvg.append("    myForm.submit() ;\n");
+    htmlSvg.append("    document.body.removeChild(myForm);\n");
+    htmlSvg.append("}\n");
+    htmlSvg.append("</script>\n");
+    htmlSvg.append("</hmtl>");
     return htmlSvg.toString();
   }
 }