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
43 public HtmlSvgOutput(AlignmentPanel ap)
49 public void exportHTML(String outputFile)
54 if (outputFile == null)
56 outputFile = getOutputFile();
58 generatedFile = new File(outputFile);
59 } catch (NoFileSelectedException e)
61 setProgressMessage(MessageManager.formatMessage(
62 "status.cancelled_image_export_operation", "HTML"));
66 setProgressMessage(MessageManager.formatMessage(
67 "info.error_creating_file", "HTML"));
71 new Thread(this).start();
75 static JalviewFileChooser getHTMLChooser()
77 return new jalview.io.JalviewFileChooser(
78 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
79 new String[] { "html" },
80 new String[] { "Hypertext Markup Language" },
81 "Hypertext Markup Language");
84 public int printUnwrapped(int pwidth, int pheight, int pi,
85 Graphics idGraphics, Graphics alignmentGraphics)
86 throws PrinterException
88 return ap.printUnwrapped(pwidth, pheight, pi, idGraphics,
92 public int printWrapped(int pwidth, int pheight, int pi, Graphics... pg)
93 throws PrinterException
95 return ap.printWrappedAlignment(pwidth, pheight, pi, pg[0]);
98 private String getHtml(String titleSvg, String alignmentSvg,
99 String jsonData, boolean wrapped)
101 StringBuilder htmlSvg = new StringBuilder();
102 htmlSvg.append("<html>\n");
103 if (jsonData != null)
105 htmlSvg.append("<button onclick=\"javascipt:openJalviewUsingCurrentUrl();\">Launch in Jalview</button> ");
106 htmlSvg.append("<input type=\"submit\" value=\"View raw BioJSON Data\" onclick=\"jQuery.facebox({ div:'#seqData' }); return false;\" />");
107 htmlSvg.append("<div style=\"display: none;\" name=\"seqData\" id=\"seqData\" >"
108 + jsonData + "</div>");
109 htmlSvg.append("<br/> ");
111 htmlSvg.append("\n<style type=\"text/css\"> "
112 + "div.parent{ width:100%;<!-- overflow: auto; -->}\n"
113 + "div.titlex{ width:11%; float: left; }\n"
114 + "div.align{ width:89%; float: right; }\n"
115 + "div.main-container{ border: 2px solid blue; border: 2px solid blue; width: 99%; min-height: 99%; }\n"
116 + ".sub-category-container {overflow-y: scroll; overflow-x: hidden; width: 100%; height: 100%;}\n"
117 + "object {pointer-events: none;}");
118 if (jsonData != null)
120 // facebox style sheet for displaying raw BioJSON data
121 htmlSvg.append("#facebox { position: absolute; top: 0; left: 0; z-index: 100; text-align: left; }\n"
122 + "#facebox .popup{ position:relative; border:3px solid rgba(0,0,0,0); -webkit-border-radius:5px;"
123 + "-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);"
124 + "box-shadow:0 0 18px rgba(0,0,0,0.4); }\n"
125 + "#facebox .content { display:table; width: 98%; padding: 10px; background: #fff; -webkit-border-radius:4px; -moz-border-radius:4px;"
126 + " border-radius:4px; }\n"
127 + "#facebox .content > p:first-child{ margin-top:0; }\n"
128 + "#facebox .content > p:last-child{ margin-bottom:0; }\n"
129 + "#facebox .close{ position:absolute; top:5px; right:5px; padding:2px; background:#fff; }\n"
130 + "#facebox .close img{ opacity:0.3; }\n"
131 + "#facebox .close:hover img{ opacity:1.0; }\n"
132 + "#facebox .loading { text-align: center; }\n"
133 + "#facebox .image { text-align: center;}\n"
134 + "#facebox img { border: 0; margin: 0; }\n"
135 + "#facebox_overlay { position: fixed; top: 0px; left: 0px; height:100%; width:100%; }\n"
136 + ".facebox_hide { z-index:-100; }\n"
137 + ".facebox_overlayBG { background-color: #000; z-index: 99; }");
139 htmlSvg.append("</style>");
142 htmlSvg.append("<div class=\"main-container\" \n>");
143 htmlSvg.append("<div class=\"titlex\">\n");
144 htmlSvg.append("<div class=\"sub-category-container\"> \n");
145 htmlSvg.append(titleSvg);
146 htmlSvg.append("</div>");
147 htmlSvg.append("</div>\n\n<!-- ========================================================================================== -->\n\n");
148 htmlSvg.append("<div class=\"align\" >");
150 "<div class=\"sub-category-container\"> <div style=\"overflow-x: scroll;\">")
151 .append(alignmentSvg).append("</div></div>").append("</div>");
152 htmlSvg.append("</div>");
154 htmlSvg.append("<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js\"></script>\n"
155 + "<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js\"></script>\n"
157 + "var subCatContainer = $(\".sub-category-container\");\n"
158 + "subCatContainer.scroll(\nfunction() {\n"
159 + "subCatContainer.scrollTop($(this).scrollTop());\n});\n");
161 htmlSvg.append("</script>\n");
165 htmlSvg.append("<div>\n")
166 .append(alignmentSvg).append("</div>");
167 htmlSvg.append("<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js\"></script>\n"
168 + "<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js\"></script>\n");
171 // javascript for launching file in Jalview
172 htmlSvg.append("<script language=\"JavaScript\">\n");
173 htmlSvg.append("function openJalviewUsingCurrentUrl(){\n");
174 htmlSvg.append(" var json = JSON.parse(document.getElementById(\"seqData\").innerHTML);\n");
175 htmlSvg.append(" var jalviewVersion = json['appSettings'].version;\n");
176 htmlSvg.append(" var url = json['appSettings'].webStartUrl;\n");
177 htmlSvg.append(" var myForm = document.createElement(\"form\");\n\n");
178 htmlSvg.append(" var heap = document.createElement(\"input\");\n");
179 htmlSvg.append(" heap.setAttribute(\"name\", \"jvm-max-heap\") ;\n");
180 htmlSvg.append(" heap.setAttribute(\"value\", \"2G\");\n\n");
181 htmlSvg.append(" var target = document.createElement(\"input\");\n");
182 htmlSvg.append(" target.setAttribute(\"name\", \"open\");\n");
183 htmlSvg.append(" target.setAttribute(\"value\", document.URL);\n\n");
184 htmlSvg.append(" var jvVersion = document.createElement(\"input\");\n");
185 htmlSvg.append(" jvVersion.setAttribute(\"name\", \"version\") ;\n");
186 htmlSvg.append(" 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(jalview.bin.Cache.getDefault(
218 "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,
287 jsonData, ap.av.getWrapAlignment());
288 FileOutputStream out = new FileOutputStream(generatedFile);
289 out.write(htmlData.getBytes());
292 setProgressMessage(MessageManager.formatMessage(
293 "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.formatMessage(
304 "info.error_creating_file", "HTML"));