2.08, not 2.07
[jalview.git] / src / jalview / io / HTMLOutput.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.io;\r
20 \r
21 import java.io.*;\r
22 \r
23 import java.awt.*;\r
24 \r
25 import jalview.datamodel.*;\r
26 import jalview.gui.*;\r
27 \r
28 public class HTMLOutput\r
29 {\r
30   AlignViewport av;\r
31   SequenceRenderer sr;\r
32   FeatureRenderer fr;\r
33   Color color;\r
34 \r
35   public HTMLOutput(AlignViewport av, SequenceRenderer sr, FeatureRenderer fr)\r
36   {\r
37     this.av = av;\r
38     this.sr = sr;\r
39     this.fr = fr;\r
40 \r
41     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
42         getProperty(\r
43             "LAST_DIRECTORY"), new String[]\r
44         {"html"},\r
45         new String[]\r
46         {"HTML files"}, "HTML files");\r
47 \r
48     chooser.setFileView(new JalviewFileView());\r
49     chooser.setDialogTitle("Save as HTML");\r
50     chooser.setToolTipText("Save");\r
51 \r
52     int value = chooser.showSaveDialog(null);\r
53 \r
54     if (value == JalviewFileChooser.APPROVE_OPTION)\r
55     {\r
56       String choice = chooser.getSelectedFile().getPath();\r
57       jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
58                                     chooser.getSelectedFile().getParent());\r
59 \r
60       try\r
61       {\r
62         PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(\r
63             choice));\r
64         out.println("<HTML>");\r
65         out.println("<style type=\"text/css\">");\r
66         out.println("<!--");\r
67         out.print("td {font-family: \"" + av.getFont().getFamily() +\r
68                   "\", \"" + av.getFont().getName() + "\", mono; " +\r
69                   "font-size: " + av.getFont().getSize() + "px; ");\r
70 \r
71         if (av.getFont().getStyle() == Font.BOLD)\r
72         {\r
73           out.print("font-weight: BOLD; ");\r
74         }\r
75 \r
76         if (av.getFont().getStyle() == Font.ITALIC)\r
77         {\r
78           out.print("font-style: italic; ");\r
79         }\r
80 \r
81         out.println("text-align: center; }");\r
82 \r
83         out.println("-->");\r
84         out.println("</style>");\r
85         out.println("<BODY>");\r
86 \r
87         if (av.getWrapAlignment())\r
88         {\r
89           drawWrappedAlignment(out);\r
90         }\r
91         else\r
92         {\r
93           drawUnwrappedAlignment(out);\r
94         }\r
95 \r
96         out.println("\n</body>\n</html>");\r
97         out.close();\r
98         jalview.util.BrowserLauncher.openURL("file:///" + choice);\r
99       }\r
100       catch (Exception ex)\r
101       {\r
102         ex.printStackTrace();\r
103       }\r
104     }\r
105   }\r
106 \r
107   void drawUnwrappedAlignment(PrintWriter out)\r
108   {\r
109     out.println("<table border=\"1\"><tr><td>\n");\r
110     out.println(\r
111         "<table border=\"0\"  cellpadding=\"0\" cellspacing=\"0\">\n");\r
112 \r
113     //////////////\r
114     SequenceI seq;\r
115     AlignmentI alignment = av.getAlignment();\r
116 \r
117     // draws the top row, the measure rule\r
118     out.println("<tr><td colspan=\"6\"></td>");\r
119 \r
120     int i = 0;\r
121 \r
122     for (i = 10; i < (alignment.getWidth() - 10); i += 10)\r
123     {\r
124       out.println("<td colspan=\"9\">" + i + "<br>|</td><td></td>");\r
125     }\r
126 \r
127     out.println("<td colspan=\"3\"></td><td colspan=\"3\">" + i +\r
128                 "<br>|</td>");\r
129     out.println("</tr>");\r
130 \r
131     for (i = 0; i < alignment.getHeight(); i++)\r
132     {\r
133       seq = alignment.getSequenceAt(i);\r
134 \r
135       String id = seq.getDisplayId(av.getShowJVSuffix());\r
136 \r
137       out.println("<tr><td nowrap>" + id +\r
138                     "&nbsp;&nbsp;</td>");\r
139 \r
140 \r
141       for (int res = 0; res < seq.getLength(); res++)\r
142       {\r
143         if (!jalview.util.Comparison.isGap(seq.getCharAt(res)))\r
144         {\r
145           color = sr.getResidueBoxColour(seq, res);\r
146 \r
147           color = fr.findFeatureColour(color, seq, res);\r
148         }\r
149         else\r
150             color = Color.white;\r
151 \r
152 \r
153        if (color.getRGB() < -1)\r
154         {\r
155           out.println("<td bgcolor=\"#" +\r
156                       jalview.util.Format.getHexString(color) + "\">" +\r
157                       seq.getCharAt(res) + "</td>");\r
158         }\r
159         else\r
160         {\r
161           out.println("<td>" + seq.getCharAt(res) + "</td>");\r
162         }\r
163       }\r
164 \r
165       out.println("</tr>");\r
166     }\r
167 \r
168     //////////////\r
169     out.println("</table>");\r
170     out.println("</td></tr></table>");\r
171   }\r
172 \r
173   void drawWrappedAlignment(PrintWriter out)\r
174   {\r
175     ////////////////////////////////////\r
176     /// How many sequences and residues can we fit on a printable page?\r
177     AlignmentI al = av.getAlignment();\r
178     SequenceI seq;\r
179     String r;\r
180     String g;\r
181     String b;\r
182 \r
183     out.println("<table border=\"1\"><tr><td>\n");\r
184     out.println(\r
185         "<table border=\"0\"  cellpadding=\"0\" cellspacing=\"0\">\n");\r
186 \r
187     for (int startRes = 0; startRes < al.getWidth();\r
188          startRes += av.getWrappedWidth())\r
189     {\r
190       int endRes = startRes + av.getWrappedWidth();\r
191 \r
192       if (endRes > al.getWidth())\r
193       {\r
194         endRes = al.getWidth();\r
195       }\r
196 \r
197       if(av.getScaleAboveWrapped())\r
198       {\r
199         out.println("<tr>");\r
200 \r
201         if (av.getScaleLeftWrapped())\r
202           out.println("<td colspan=\"7\">&nbsp;</td>");\r
203         else\r
204           out.println("<td colspan=\"6\">&nbsp;</td>");\r
205 \r
206 \r
207         for (int i = startRes + 10; i < endRes; i += 10)\r
208         {\r
209           out.println("<td colspan=\"9\">" + i + "<br>|</td><td></td>");\r
210         }\r
211 \r
212         out.println("</tr>");\r
213       }\r
214 \r
215       int startPos, endPos;\r
216       for (int s = 0; s < al.getHeight(); s++)\r
217       {\r
218         out.println("<tr>");\r
219         seq = al.getSequenceAt(s);\r
220 \r
221         startPos = seq.findPosition( startRes );\r
222         endPos =   seq.findPosition( endRes )-1;\r
223 \r
224         String id = seq.getDisplayId(av.getShowJVSuffix());\r
225 \r
226         out.println("<td nowrap>" + id +\r
227                       "&nbsp;&nbsp;</td>");\r
228 \r
229 \r
230         if(av.getScaleLeftWrapped())\r
231         {\r
232           if(startPos > seq.getEnd() || endPos==0)\r
233             out.println("<td nowrap>&nbsp;</td>");\r
234           else\r
235             out.println("<td nowrap>" + startPos +\r
236                       "&nbsp;&nbsp;</td>");\r
237         }\r
238 \r
239 \r
240         for (int res = startRes; res < endRes; res++)\r
241         {\r
242           if (!jalview.util.Comparison.isGap(seq.getCharAt(res)))\r
243           {\r
244             color = sr.getResidueBoxColour(seq, res);\r
245 \r
246             color = fr.findFeatureColour(color, seq, res);\r
247           }\r
248           else\r
249             color = Color.white;\r
250 \r
251           if (color.getRGB() < -1)\r
252           {\r
253             r = Integer.toHexString(color.getRed());\r
254 \r
255             if (r.length() < 2)\r
256             {\r
257               r = "0" + r;\r
258             }\r
259 \r
260             g = Integer.toHexString(color.getGreen());\r
261 \r
262             if (g.length() < 2)\r
263             {\r
264               g = "0" + g;\r
265             }\r
266 \r
267             b = Integer.toHexString(color.getBlue());\r
268 \r
269             if (b.length() < 2)\r
270             {\r
271               b = "0" + b;\r
272             }\r
273 \r
274             out.println("<td bgcolor=\"#" + r + g + b + "\">" +\r
275                         seq.getCharAt(res) + "</td>");\r
276           }\r
277           else\r
278           {\r
279             out.println("<td>" + seq.getCharAt(res) + "</td>");\r
280           }\r
281 \r
282 \r
283         }\r
284 \r
285         if(av.getScaleRightWrapped() &&\r
286            endRes < startRes + av.getWrappedWidth())\r
287         {\r
288          out.println("<td colspan=\""+ (startRes+av.getWrappedWidth()-endRes) +"\">"\r
289                      +"&nbsp;&nbsp;</td>");\r
290        }\r
291 \r
292 \r
293         if(av.getScaleRightWrapped() && startPos<endPos)\r
294         {\r
295           out.println("<td nowrap>&nbsp;" + endPos +\r
296                       "&nbsp;&nbsp;</td>");\r
297         }\r
298 \r
299 \r
300         out.println("</tr>");\r
301       }\r
302 \r
303       if (endRes < al.getWidth())\r
304       {\r
305         out.println("<tr><td height=\"5\"></td></tr>");\r
306       }\r
307     }\r
308 \r
309     out.println("</table>");\r
310     out.println("</table>");\r
311   }\r
312 \r
313   public static String getImageMapHTML()\r
314   {\r
315     return new String(\r
316       "<html>\n"\r
317       +"<head>\n"\r
318       +"<script language=\"JavaScript\">\n"\r
319       +"var ns4 = document.layers;\n"\r
320       +"var ns6 = document.getElementById && !document.all;\n"\r
321       +"var ie4 = document.all;\n"\r
322       +"offsetX = 0;\n"\r
323       +"offsetY = 20;\n"\r
324       +"var toolTipSTYLE=\"\";\n"\r
325       +"function initToolTips()\n"\r
326       +"{\n"\r
327       +"  if(ns4||ns6||ie4)\n"\r
328       +"  {\n"\r
329       +"    if(ns4) toolTipSTYLE = document.toolTipLayer;\n"\r
330       +"    else if(ns6) toolTipSTYLE = document.getElementById(\"toolTipLayer\").style;\n"\r
331       +"    else if(ie4) toolTipSTYLE = document.all.toolTipLayer.style;\n"\r
332       +"    if(ns4) document.captureEvents(Event.MOUSEMOVE);\n"\r
333       +"    else\n"\r
334       +"    {\n"\r
335       +"      toolTipSTYLE.visibility = \"visible\";\n"\r
336       +"      toolTipSTYLE.display = \"none\";\n"\r
337       +"    }\n"\r
338       +"    document.onmousemove = moveToMouseLoc;\n"\r
339       +"  }\n"\r
340       +"}\n"\r
341       +"function toolTip(msg, fg, bg)\n"\r
342       +"{\n"\r
343       +"  if(toolTip.arguments.length < 1) // hide\n"\r
344       +"  {\n"\r
345       +"    if(ns4) toolTipSTYLE.visibility = \"hidden\";\n"\r
346       +"    else toolTipSTYLE.display = \"none\";\n"\r
347       +"  }\n"\r
348       +"  else // show\n"\r
349       +"  {\n"\r
350       +"    if(!fg) fg = \"#555555\";\n"\r
351       +"    if(!bg) bg = \"#FFFFFF\";\n"\r
352       +"    var content =\n"\r
353       +"    '<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"' + fg + '\"><td>' +\n"\r
354       +"    '<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"' + bg + \n"\r
355       +"    '\"><td align=\"center\"><font face=\"sans-serif\" color=\"' + fg +\n"\r
356       +"    '\" size=\"-2\">&nbsp;' + msg +\n"\r
357       +"    '&nbsp;</font></td></table></td></table>';\n"\r
358       +"    if(ns4)\n"\r
359       +"    {\n"\r
360       +"      toolTipSTYLE.document.write(content);\n"\r
361       +"      toolTipSTYLE.document.close();\n"\r
362       +"      toolTipSTYLE.visibility = \"visible\";\n"\r
363       +"    }\n"\r
364       +"    if(ns6)\n"\r
365       +"    {\n"\r
366       +"      document.getElementById(\"toolTipLayer\").innerHTML = content;\n"\r
367       +"      toolTipSTYLE.display='block'\n"\r
368       +"    }\n"\r
369       +"    if(ie4)\n"\r
370       +"    {\n"\r
371       +"      document.all(\"toolTipLayer\").innerHTML=content;\n"\r
372       +"      toolTipSTYLE.display='block'\n"\r
373       +"    }\n"\r
374       +"  }\n"\r
375       +"}\n"\r
376       +"function moveToMouseLoc(e)\n"\r
377       +"{\n"\r
378       +"  if(ns4||ns6)\n"\r
379       +"  {\n"\r
380       +"    x = e.pageX;\n"\r
381       +"    y = e.pageY;\n"\r
382       +"  }\n"\r
383       +"  else\n"\r
384       +"  {\n"\r
385       +"    x = event.x + document.body.scrollLeft;\n"\r
386       +"    y = event.y + document.body.scrollTop;\n"\r
387       +"  }\n"\r
388       +"  toolTipSTYLE.left = x + offsetX;\n"\r
389       +"  toolTipSTYLE.top = y + offsetY;\n"\r
390       +"  return true;\n"\r
391       +"}\n"\r
392       +"</script>\n"\r
393       +"</head>\n"\r
394       +"<body>\n"\r
395       +"<div id=\"toolTipLayer\" style=\"position:absolute; visibility: hidden\"></div>\n"\r
396       +"<script language=\"JavaScript\"><!--\n"\r
397       +"initToolTips(); //--></script>\n");\r
398 \r
399   }\r
400 }\r