2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.exceptions.NoFileSelectedException;
24 import jalview.gui.AlignmentPanel;
25 import jalview.gui.HTMLOptions;
26 import jalview.gui.OOMWarning;
27 import jalview.math.AlignmentDimension;
28 import jalview.util.MessageManager;
30 import java.awt.Graphics;
31 import java.awt.print.PrinterException;
33 import java.io.FileOutputStream;
34 import java.io.IOException;
36 import org.jfree.graphics2d.svg.SVGGraphics2D;
37 import org.jfree.graphics2d.svg.SVGHints;
39 public class HtmlSvgOutput extends HTMLOutput
42 public HtmlSvgOutput(AlignmentPanel ap)
48 public void exportHTML(String outputFile)
53 if (outputFile == null)
55 outputFile = getOutputFile();
57 generatedFile = new File(outputFile);
58 } catch (NoFileSelectedException e)
60 setProgressMessage(MessageManager.formatMessage(
61 "status.cancelled_image_export_operation", "HTML"));
65 setProgressMessage(MessageManager
66 .formatMessage("info.error_creating_file", "HTML"));
70 new Thread(this).start();
73 public int printUnwrapped(int pwidth, int pheight, int pi,
74 Graphics idGraphics, Graphics alignmentGraphics)
75 throws PrinterException
77 return ap.printUnwrapped(pwidth, pheight, pi, idGraphics,
81 public int printWrapped(int pwidth, int pheight, int pi, Graphics... pg)
82 throws PrinterException
84 return ap.printWrappedAlignment(pwidth, pheight, pi, pg[0]);
87 private String getHtml(String titleSvg, String alignmentSvg,
88 String jsonData, boolean wrapped)
90 StringBuilder htmlSvg = new StringBuilder();
91 htmlSvg.append("<html>\n");
95 "<button onclick=\"javascipt:openJalviewUsingCurrentUrl();\">Launch in Jalview</button> ");
97 "<input type=\"submit\" value=\"View raw BioJSON Data\" onclick=\"jQuery.facebox({ div:'#seqData' }); return false;\" />");
99 "<div style=\"display: none;\" name=\"seqData\" id=\"seqData\" >"
100 + jsonData + "</div>");
101 htmlSvg.append("<br/> ");
103 htmlSvg.append("\n<style type=\"text/css\"> "
104 + "div.parent{ width:100%;<!-- overflow: auto; -->}\n"
105 + "div.titlex{ width:11%; float: left; }\n"
106 + "div.align{ width:89%; float: right; }\n"
107 + "div.main-container{ border: 2px solid blue; border: 2px solid blue; width: 99%; min-height: 99%; }\n"
108 + ".sub-category-container {overflow-y: scroll; overflow-x: hidden; width: 100%; height: 100%;}\n"
109 + "object {pointer-events: none;}");
110 if (jsonData != null)
112 // facebox style sheet for displaying raw BioJSON data
114 "#facebox { position: absolute; top: 0; left: 0; z-index: 100; text-align: left; }\n"
115 + "#facebox .popup{ position:relative; border:3px solid rgba(0,0,0,0); -webkit-border-radius:5px;"
116 + "-moz-border-radius:5px; border-radius:5px; -webkit-box-shadow:0 0 18px rgba(0,0,0,0.4); -moz-box-shadow:0 0 18px rgba(0,0,0,0.4);"
117 + "box-shadow:0 0 18px rgba(0,0,0,0.4); }\n"
118 + "#facebox .content { display:table; width: 98%; padding: 10px; background: #fff; -webkit-border-radius:4px; -moz-border-radius:4px;"
119 + " border-radius:4px; }\n"
120 + "#facebox .content > p:first-child{ margin-top:0; }\n"
121 + "#facebox .content > p:last-child{ margin-bottom:0; }\n"
122 + "#facebox .close{ position:absolute; top:5px; right:5px; padding:2px; background:#fff; }\n"
123 + "#facebox .close img{ opacity:0.3; }\n"
124 + "#facebox .close:hover img{ opacity:1.0; }\n"
125 + "#facebox .loading { text-align: center; }\n"
126 + "#facebox .image { text-align: center;}\n"
127 + "#facebox img { border: 0; margin: 0; }\n"
128 + "#facebox_overlay { position: fixed; top: 0px; left: 0px; height:100%; width:100%; }\n"
129 + ".facebox_hide { z-index:-100; }\n"
130 + ".facebox_overlayBG { background-color: #000; z-index: 99; }");
132 htmlSvg.append("</style>");
135 htmlSvg.append("<div class=\"main-container\" \n>");
136 htmlSvg.append("<div class=\"titlex\">\n");
137 htmlSvg.append("<div class=\"sub-category-container\"> \n");
138 htmlSvg.append(titleSvg);
139 htmlSvg.append("</div>");
141 "</div>\n\n<!-- ========================================================================================== -->\n\n");
142 htmlSvg.append("<div class=\"align\" >");
144 "<div class=\"sub-category-container\"> <div style=\"overflow-x: scroll;\">")
145 .append(alignmentSvg).append("</div></div>").append("</div>");
146 htmlSvg.append("</div>");
149 "<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js\"></script>\n"
150 + "<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js\"></script>\n"
152 + "var subCatContainer = $(\".sub-category-container\");\n"
153 + "subCatContainer.scroll(\nfunction() {\n"
154 + "subCatContainer.scrollTop($(this).scrollTop());\n});\n");
156 htmlSvg.append("</script>\n");
160 htmlSvg.append("<div>\n").append(alignmentSvg).append("</div>");
162 "<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js\"></script>\n"
163 + "<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js\"></script>\n");
166 // javascript for launching file in Jalview
167 htmlSvg.append("<script language=\"JavaScript\">\n");
168 htmlSvg.append("function openJalviewUsingCurrentUrl(){\n");
170 " var json = JSON.parse(document.getElementById(\"seqData\").innerHTML);\n");
172 " var jalviewVersion = json['appSettings'].version;\n");
173 htmlSvg.append(" var url = json['appSettings'].webStartUrl;\n");
175 " var myForm = document.createElement(\"form\");\n\n");
176 htmlSvg.append(" var heap = document.createElement(\"input\");\n");
177 htmlSvg.append(" heap.setAttribute(\"name\", \"jvm-max-heap\") ;\n");
178 htmlSvg.append(" heap.setAttribute(\"value\", \"2G\");\n\n");
179 htmlSvg.append(" var target = document.createElement(\"input\");\n");
180 htmlSvg.append(" target.setAttribute(\"name\", \"open\");\n");
181 htmlSvg.append(" target.setAttribute(\"value\", document.URL);\n\n");
183 " var jvVersion = document.createElement(\"input\");\n");
184 htmlSvg.append(" jvVersion.setAttribute(\"name\", \"version\") ;\n");
186 " jvVersion.setAttribute(\"value\", jalviewVersion);\n\n");
187 htmlSvg.append(" myForm.action = url;\n");
188 htmlSvg.append(" myForm.appendChild(heap);\n");
189 htmlSvg.append(" myForm.appendChild(target);\n");
190 htmlSvg.append(" myForm.appendChild(jvVersion);\n");
191 htmlSvg.append(" document.body.appendChild(myForm);\n");
192 htmlSvg.append(" myForm.submit() ;\n");
193 htmlSvg.append(" document.body.removeChild(myForm);\n");
194 htmlSvg.append("}\n");
196 if (jsonData != null)
198 // JQuery FaceBox for displaying raw BioJSON data");
199 File faceBoxJsFile = new File("examples/javascript/facebox-1.3.js");
202 htmlSvg.append(HTMLOutput.readFileAsString(faceBoxJsFile));
203 } catch (IOException e)
209 htmlSvg.append("</script>\n");
210 htmlSvg.append("</html>");
211 return htmlSvg.toString();
215 public boolean isEmbedData()
217 return Boolean.valueOf(
218 jalview.bin.Cache.getDefault("EXPORT_EMBBED_BIOJSON", "true"));
222 public boolean isLaunchInBrowserAfterExport()
228 public File getExportedFile()
230 return generatedFile;
238 setProgressMessage(null);
239 setProgressMessage(MessageManager.formatMessage(
240 "status.exporting_alignment_as_x_file", "HTML"));
241 AlignmentDimension aDimension = ap.getAlignmentDimension();
242 SVGGraphics2D idPanelGraphics = new SVGGraphics2D(
243 aDimension.getWidth(), aDimension.getHeight());
244 SVGGraphics2D alignPanelGraphics = new SVGGraphics2D(
245 aDimension.getWidth(), aDimension.getHeight());
247 String renderStyle = jalview.bin.Cache.getDefault("HTML_RENDERING",
250 // If we need to prompt, and if the GUI is visible then
251 // Prompt for rendering style
252 if (renderStyle.equalsIgnoreCase("Prompt each time") && !isHeadless())
254 HTMLOptions svgOption = new HTMLOptions();
255 renderStyle = svgOption.getValue();
257 if (renderStyle == null || svgOption.cancelled)
259 setProgressMessage(MessageManager.formatMessage(
260 "status.cancelled_image_export_operation", "HTML"));
265 if (renderStyle.equalsIgnoreCase("Lineart"))
267 idPanelGraphics.setRenderingHint(SVGHints.KEY_DRAW_STRING_TYPE,
268 SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR);
269 alignPanelGraphics.setRenderingHint(SVGHints.KEY_DRAW_STRING_TYPE,
270 SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR);
272 if (ap.av.getWrapAlignment())
274 printWrapped(aDimension.getWidth(), aDimension.getHeight(), 0,
279 printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0,
280 idPanelGraphics, alignPanelGraphics);
283 String idPanelSvgData = idPanelGraphics.getSVGDocument();
284 String alignPanelSvgData = alignPanelGraphics.getSVGDocument();
285 String jsonData = getBioJSONData();
286 String htmlData = getHtml(idPanelSvgData, alignPanelSvgData, jsonData,
287 ap.av.getWrapAlignment());
288 FileOutputStream out = new FileOutputStream(generatedFile);
289 out.write(htmlData.getBytes());
292 setProgressMessage(MessageManager
293 .formatMessage("status.export_complete", "HTML"));
295 } catch (OutOfMemoryError err)
297 System.out.println("########################\n" + "OUT OF MEMORY "
298 + generatedFile + "\n" + "########################");
299 new OOMWarning("Creating Image for " + generatedFile, err);
300 } catch (Exception e)
303 setProgressMessage(MessageManager
304 .formatMessage("info.error_creating_file", "HTML"));