FeatureRenderer takes alignmentPanel
[jalview.git] / src / jalview / io / HTMLOutput.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 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(AlignmentPanel ap, SequenceRenderer sr, FeatureRenderer fr1)\r
36   {\r
37     this.av = ap.av;\r
38     this.sr = sr;\r
39 \r
40     fr = new FeatureRenderer(ap);\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       for (int res = 0; res < seq.getLength(); res++)\r
143       {\r
144         if (!jalview.util.Comparison.isGap(seq.getCharAt(res)))\r
145         {\r
146           color = sr.getResidueBoxColour(seq, res);\r
147 \r
148           color = fr.findFeatureColour(color, seq, res);\r
149         }\r
150         else\r
151         {\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         {\r
205           out.println("<td colspan=\"7\">&nbsp;</td>");\r
206         }\r
207         else\r
208         {\r
209           out.println("<td colspan=\"6\">&nbsp;</td>");\r
210         }\r
211 \r
212         for (int i = startRes + 10; i < endRes; i += 10)\r
213         {\r
214           out.println("<td colspan=\"9\">" + i + "<br>|</td><td></td>");\r
215         }\r
216 \r
217         out.println("</tr>");\r
218       }\r
219 \r
220       int startPos, endPos;\r
221       for (int s = 0; s < al.getHeight(); s++)\r
222       {\r
223         out.println("<tr>");\r
224         seq = al.getSequenceAt(s);\r
225 \r
226         startPos = seq.findPosition(startRes);\r
227         endPos = seq.findPosition(endRes) - 1;\r
228 \r
229         String id = seq.getDisplayId(av.getShowJVSuffix());\r
230 \r
231         out.println("<td nowrap>" + id +\r
232                     "&nbsp;&nbsp;</td>");\r
233 \r
234         if (av.getScaleLeftWrapped())\r
235         {\r
236           if (startPos > seq.getEnd() || endPos == 0)\r
237           {\r
238             out.println("<td nowrap>&nbsp;</td>");\r
239           }\r
240           else\r
241           {\r
242             out.println("<td nowrap>" + startPos +\r
243                         "&nbsp;&nbsp;</td>");\r
244           }\r
245         }\r
246 \r
247         for (int res = startRes; res < endRes; res++)\r
248         {\r
249           if (!jalview.util.Comparison.isGap(seq.getCharAt(res)))\r
250           {\r
251             color = sr.getResidueBoxColour(seq, res);\r
252 \r
253             color = fr.findFeatureColour(color, seq, res);\r
254           }\r
255           else\r
256           {\r
257             color = Color.white;\r
258           }\r
259 \r
260           if (color.getRGB() < -1)\r
261           {\r
262             out.println("<td bgcolor=\"#" +\r
263                         jalview.util.Format.getHexString(color) + "\">" +\r
264                         seq.getCharAt(res) + "</td>");\r
265           }\r
266           else\r
267           {\r
268             out.println("<td>" + seq.getCharAt(res) + "</td>");\r
269           }\r
270 \r
271         }\r
272 \r
273         if (av.getScaleRightWrapped() &&\r
274             endRes < startRes + av.getWrappedWidth())\r
275         {\r
276           out.println("<td colspan=\"" +\r
277                       (startRes + av.getWrappedWidth() - endRes) + "\">"\r
278                       + "&nbsp;&nbsp;</td>");\r
279         }\r
280 \r
281         if (av.getScaleRightWrapped() && startPos < endPos)\r
282         {\r
283           out.println("<td nowrap>&nbsp;" + endPos +\r
284                       "&nbsp;&nbsp;</td>");\r
285         }\r
286 \r
287         out.println("</tr>");\r
288       }\r
289 \r
290       if (endRes < al.getWidth())\r
291       {\r
292         out.println("<tr><td height=\"5\"></td></tr>");\r
293       }\r
294     }\r
295 \r
296     out.println("</table>");\r
297     out.println("</table>");\r
298   }\r
299 \r
300   public static String getImageMapHTML()\r
301   {\r
302     return new String(\r
303         "<html>\n"\r
304         + "<head>\n"\r
305         + "<script language=\"JavaScript\">\n"\r
306         + "var ns4 = document.layers;\n"\r
307         + "var ns6 = document.getElementById && !document.all;\n"\r
308         + "var ie4 = document.all;\n"\r
309         + "offsetX = 0;\n"\r
310         + "offsetY = 20;\n"\r
311         + "var toolTipSTYLE=\"\";\n"\r
312         + "function initToolTips()\n"\r
313         + "{\n"\r
314         + "  if(ns4||ns6||ie4)\n"\r
315         + "  {\n"\r
316         + "    if(ns4) toolTipSTYLE = document.toolTipLayer;\n"\r
317         + "    else if(ns6) toolTipSTYLE = document.getElementById(\"toolTipLayer\").style;\n"\r
318         + "    else if(ie4) toolTipSTYLE = document.all.toolTipLayer.style;\n"\r
319         + "    if(ns4) document.captureEvents(Event.MOUSEMOVE);\n"\r
320         + "    else\n"\r
321         + "    {\n"\r
322         + "      toolTipSTYLE.visibility = \"visible\";\n"\r
323         + "      toolTipSTYLE.display = \"none\";\n"\r
324         + "    }\n"\r
325         + "    document.onmousemove = moveToMouseLoc;\n"\r
326         + "  }\n"\r
327         + "}\n"\r
328         + "function toolTip(msg, fg, bg)\n"\r
329         + "{\n"\r
330         + "  if(toolTip.arguments.length < 1) // hide\n"\r
331         + "  {\n"\r
332         + "    if(ns4) toolTipSTYLE.visibility = \"hidden\";\n"\r
333         + "    else toolTipSTYLE.display = \"none\";\n"\r
334         + "  }\n"\r
335         + "  else // show\n"\r
336         + "  {\n"\r
337         + "    if(!fg) fg = \"#555555\";\n"\r
338         + "    if(!bg) bg = \"#FFFFFF\";\n"\r
339         + "    var content =\n"\r
340         + "    '<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"' + fg + '\"><td>' +\n"\r
341         + "    '<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" bgcolor=\"' + bg + \n"\r
342         +\r
343         "    '\"><td align=\"center\"><font face=\"sans-serif\" color=\"' + fg +\n"\r
344         + "    '\" size=\"-2\">&nbsp;' + msg +\n"\r
345         + "    '&nbsp;</font></td></table></td></table>';\n"\r
346         + "    if(ns4)\n"\r
347         + "    {\n"\r
348         + "      toolTipSTYLE.document.write(content);\n"\r
349         + "      toolTipSTYLE.document.close();\n"\r
350         + "      toolTipSTYLE.visibility = \"visible\";\n"\r
351         + "    }\n"\r
352         + "    if(ns6)\n"\r
353         + "    {\n"\r
354         +\r
355         "      document.getElementById(\"toolTipLayer\").innerHTML = content;\n"\r
356         + "      toolTipSTYLE.display='block'\n"\r
357         + "    }\n"\r
358         + "    if(ie4)\n"\r
359         + "    {\n"\r
360         + "      document.all(\"toolTipLayer\").innerHTML=content;\n"\r
361         + "      toolTipSTYLE.display='block'\n"\r
362         + "    }\n"\r
363         + "  }\n"\r
364         + "}\n"\r
365         + "function moveToMouseLoc(e)\n"\r
366         + "{\n"\r
367         + "  if(ns4||ns6)\n"\r
368         + "  {\n"\r
369         + "    x = e.pageX;\n"\r
370         + "    y = e.pageY;\n"\r
371         + "  }\n"\r
372         + "  else\n"\r
373         + "  {\n"\r
374         + "    x = event.x + document.body.scrollLeft;\n"\r
375         + "    y = event.y + document.body.scrollTop;\n"\r
376         + "  }\n"\r
377         + "  toolTipSTYLE.left = x + offsetX;\n"\r
378         + "  toolTipSTYLE.top = y + offsetY;\n"\r
379         + "  return true;\n"\r
380         + "}\n"\r
381         + "</script>\n"\r
382         + "</head>\n"\r
383         + "<body>\n"\r
384         + "<div id=\"toolTipLayer\" style=\"position:absolute; visibility: hidden\"></div>\n"\r
385         + "<script language=\"JavaScript\"><!--\n"\r
386         + "initToolTips(); //--></script>\n");\r
387 \r
388   }\r
389 }\r