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