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