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