Formatted source
[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 jalview.datamodel.*;\r
22 \r
23 import jalview.gui.*;\r
24 \r
25 import jalview.schemes.*;\r
26 \r
27 import java.awt.*;\r
28 \r
29 import java.io.*;\r
30 \r
31 import java.util.*;\r
32 \r
33 import javax.swing.*;\r
34 \r
35 \r
36 public class HTMLOutput {\r
37     AlignViewport av;\r
38     SequenceRenderer sr;\r
39     Color color;\r
40 \r
41     public HTMLOutput(AlignViewport av) {\r
42         this.av = av;\r
43         sr = new SequenceRenderer(av);\r
44 \r
45         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
46                     "LAST_DIRECTORY"), new String[] { "html" },\r
47                 new String[] { "HTML files" }, "HTML files");\r
48 \r
49         chooser.setFileView(new JalviewFileView());\r
50         chooser.setDialogTitle("Save as HTML");\r
51         chooser.setToolTipText("Save");\r
52 \r
53         int value = chooser.showSaveDialog(null);\r
54 \r
55         if (value == JalviewFileChooser.APPROVE_OPTION) {\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                 PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(\r
62                             choice));\r
63                 out.println("<HTML>");\r
64                 out.println("<style type=\"text/css\">");\r
65                 out.println("<!--");\r
66                 out.print("td {font-family: \"" + av.getFont().getFamily() +\r
67                     "\", \"" + av.getFont().getName() + "\", mono; " +\r
68                     "font-size: " + av.getFont().getSize() + "px; ");\r
69 \r
70                 if (av.getFont().getStyle() == Font.BOLD) {\r
71                     out.print("font-weight: BOLD; ");\r
72                 }\r
73 \r
74                 if (av.getFont().getStyle() == Font.ITALIC) {\r
75                     out.print("font-style: italic; ");\r
76                 }\r
77 \r
78                 out.println("text-align: center; }");\r
79 \r
80                 out.println("-->");\r
81                 out.println("</style>");\r
82                 out.println("<BODY>");\r
83 \r
84                 if (av.getWrapAlignment()) {\r
85                     drawWrappedAlignment(out);\r
86                 } else {\r
87                     drawUnwrappedAlignment(out);\r
88                 }\r
89 \r
90                 out.println("\n</body>\n</html>");\r
91                 out.close();\r
92                 jalview.util.BrowserLauncher.openURL("file:///" + choice);\r
93             } catch (Exception ex) {\r
94                 ex.printStackTrace();\r
95             }\r
96         }\r
97     }\r
98 \r
99     void drawUnwrappedAlignment(PrintWriter out) {\r
100         out.println("<table border=\"1\"><tr><td>\n");\r
101         out.println(\r
102             "<table border=\"0\"  cellpadding=\"0\" cellspacing=\"0\">\n");\r
103 \r
104         //////////////\r
105         SequenceGroup[] groups;\r
106         SequenceI seq;\r
107         ColourSchemeI cs = null;\r
108         AlignmentI alignment = av.getAlignment();\r
109         String r;\r
110         String g;\r
111         String b;\r
112 \r
113         // draws the top row, the measure rule\r
114         out.println("<tr><td colspan=\"6\"></td>");\r
115 \r
116         int i = 0;\r
117 \r
118         for (i = 10; i < (alignment.getWidth() - 10); i += 10)\r
119             out.println("<td colspan=\"9\">" + i + "<br>|</td><td></td>");\r
120 \r
121         out.println("<td colspan=\"3\"></td><td colspan=\"3\">" + i +\r
122             "<br>|</td>");\r
123         out.println("</tr>");\r
124 \r
125         for (i = 0; i < alignment.getHeight(); i++) {\r
126             seq = alignment.getSequenceAt(i);\r
127             groups = alignment.findAllGroups(seq);\r
128 \r
129             if (av.getShowFullId()) {\r
130                 out.println("<tr><td nowrap>" + seq.getDisplayId() +\r
131                     "&nbsp;&nbsp;</td>");\r
132             } else {\r
133                 out.println("<tr><td nowrap>" + seq.getName() +\r
134                     "&nbsp;&nbsp;</td>");\r
135             }\r
136 \r
137             for (int res = 0; res < seq.getLength(); res++) {\r
138                 cs = av.getGlobalColourScheme();\r
139 \r
140                 if (groups != null) {\r
141                     for (int k = 0; k < groups.length; k++)\r
142                         if ((groups[k].getStartRes() <= res) &&\r
143                                 (groups[k].getEndRes() >= res)) {\r
144                             cs = groups[k].cs;\r
145 \r
146                             break;\r
147                         }\r
148                 }\r
149 \r
150                 color = sr.getResidueBoxColour(cs, seq, res);\r
151 \r
152                 if (color.getRGB() < -1) {\r
153                     out.println("<td bgcolor=\"#" +\r
154                         jalview.util.Format.getHexString(color) + "\">" +\r
155                         seq.getCharAt(res) + "</td>");\r
156                 } else {\r
157                     out.println("<td>" + seq.getCharAt(res) + "</td>");\r
158                 }\r
159             }\r
160 \r
161             out.println("</tr>");\r
162         }\r
163 \r
164         //////////////\r
165         out.println("</table>");\r
166         out.println("</td></tr></table>");\r
167     }\r
168 \r
169     void drawWrappedAlignment(PrintWriter out) {\r
170         ////////////////////////////////////\r
171         /// How many sequences and residues can we fit on a printable page?\r
172         AlignmentI al = av.getAlignment();\r
173         SequenceGroup[] groups;\r
174         SequenceI seq;\r
175         ColourSchemeI cs = null;\r
176         String r;\r
177         String g;\r
178         String b;\r
179 \r
180         out.println("<table border=\"1\"><tr><td>\n");\r
181         out.println(\r
182             "<table border=\"0\"  cellpadding=\"0\" cellspacing=\"0\">\n");\r
183 \r
184         for (int startRes = 0; startRes < al.getWidth();\r
185                 startRes += av.getChunkWidth()) {\r
186             int endRes = startRes + av.getChunkWidth();\r
187 \r
188             if (endRes > al.getWidth()) {\r
189                 endRes = al.getWidth();\r
190             }\r
191 \r
192             out.println("<tr>");\r
193             out.println("<td colspan=\"6\">&nbsp;</td>");\r
194 \r
195             for (int i = startRes + 10; i < endRes; i += 10)\r
196                 out.println("<td colspan=\"9\">" + i + "<br>|</td><td></td>");\r
197 \r
198             // out.println("<td colspan=\"3\"></td><td colspan=\"3\">" + i +\r
199             //             "<br>|</td>");\r
200             out.println("</tr>");\r
201 \r
202             for (int s = 0; s < al.getHeight(); s++) {\r
203                 out.println("<tr>");\r
204                 seq = al.getSequenceAt(s);\r
205                 groups = al.findAllGroups(seq);\r
206 \r
207                 if (av.getShowFullId()) {\r
208                     out.println("<td nowrap>" + seq.getDisplayId() +\r
209                         "&nbsp;&nbsp;</td>");\r
210                 } else {\r
211                     out.println("<td nowrap>" + seq.getName() +\r
212                         "&nbsp;&nbsp;</td>");\r
213                 }\r
214 \r
215                 for (int res = startRes; res < endRes; res++) {\r
216                     cs = av.getGlobalColourScheme();\r
217 \r
218                     if (groups != null) {\r
219                         for (int k = 0; k < groups.length; k++)\r
220                             if ((groups[k].getStartRes() <= res) &&\r
221                                     (groups[k].getEndRes() >= res)) {\r
222                                 cs = groups[k].cs;\r
223 \r
224                                 break;\r
225                             }\r
226                     }\r
227 \r
228                     color = sr.getResidueBoxColour(cs, seq, res);\r
229 \r
230                     if (color.getRGB() < -1) {\r
231                         r = Integer.toHexString(color.getRed());\r
232 \r
233                         if (r.length() < 2) {\r
234                             r = "0" + r;\r
235                         }\r
236 \r
237                         g = Integer.toHexString(color.getGreen());\r
238 \r
239                         if (g.length() < 2) {\r
240                             g = "0" + g;\r
241                         }\r
242 \r
243                         b = Integer.toHexString(color.getBlue());\r
244 \r
245                         if (b.length() < 2) {\r
246                             b = "0" + b;\r
247                         }\r
248 \r
249                         out.println("<td bgcolor=\"#" + r + g + b + "\">" +\r
250                             seq.getCharAt(res) + "</td>");\r
251                     } else {\r
252                         out.println("<td>" + seq.getCharAt(res) + "</td>");\r
253                     }\r
254                 }\r
255 \r
256                 out.println("</tr>");\r
257             }\r
258 \r
259             if (endRes < al.getWidth()) {\r
260                 out.println("<tr><td height=\"5\"></td></tr>");\r
261             }\r
262         }\r
263 \r
264         out.println("</table>");\r
265         out.println("</table>");\r
266     }\r
267 }\r