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