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