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