elementAt instead of get for 1.1 compatibility
[jalview.git] / src / jalview / appletgui / SequenceRenderer.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.appletgui;\r
21 \r
22 import java.awt.*;\r
23 \r
24 import jalview.datamodel.*;\r
25 import jalview.schemes.*;\r
26 \r
27 public class SequenceRenderer\r
28 {\r
29   AlignViewport av;\r
30   FontMetrics fm;\r
31   boolean renderGaps = true;\r
32   SequenceGroup currentSequenceGroup = null;\r
33   SequenceGroup[] allGroups = null;\r
34   Color resBoxColour;\r
35   Graphics graphics;\r
36   boolean forOverview = false;\r
37 \r
38   public SequenceRenderer(AlignViewport av)\r
39   {\r
40     this.av = av;\r
41   }\r
42 \r
43   /**\r
44    * DOCUMENT ME!\r
45    *\r
46    * @param b DOCUMENT ME!\r
47    */\r
48   public void prepare(Graphics g, boolean renderGaps)\r
49   {\r
50       graphics = g;\r
51       fm = g.getFontMetrics();\r
52 \r
53       this.renderGaps = renderGaps;\r
54     }\r
55 \r
56   public Color getResidueBoxColour(SequenceI seq, int i)\r
57   {\r
58     allGroups = av.alignment.findAllGroups(seq);\r
59 \r
60     if (inCurrentSequenceGroup(i))\r
61     {\r
62       if (currentSequenceGroup.getDisplayBoxes())\r
63       {\r
64         getBoxColour(currentSequenceGroup.cs, seq, i);\r
65       }\r
66     }\r
67     else if (av.getShowBoxes())\r
68     {\r
69         getBoxColour(av.globalColourScheme, seq, i);\r
70     }\r
71 \r
72     return resBoxColour;\r
73     }\r
74 \r
75   void getBoxColour(ColourSchemeI cs, SequenceI seq, int i)\r
76   {\r
77     if (cs != null)\r
78     {\r
79       resBoxColour = cs.findColour(seq.getSequence(i, i + 1), i);\r
80     }\r
81     else if(forOverview && !jalview.util.Comparison.isGap(seq.getCharAt(i)))\r
82     {\r
83         resBoxColour = Color.lightGray;\r
84     }\r
85     else\r
86     {\r
87       resBoxColour = Color.white;\r
88     }\r
89 \r
90   }\r
91 \r
92   public Color findSequenceColour(SequenceI seq, int i)\r
93   {\r
94     allGroups = av.alignment.findAllGroups(seq);\r
95     drawBoxes(seq, i,i, 0);\r
96     return resBoxColour;\r
97   }\r
98 \r
99   public void drawSequence(SequenceI seq, SequenceGroup[] sg,\r
100                            int start, int end,  int y1)\r
101   {\r
102     allGroups = sg;\r
103 \r
104     drawBoxes(seq, start, end,  y1);\r
105 \r
106     if(av.validCharWidth)\r
107     {\r
108       drawText(seq, start, end, y1);\r
109     }\r
110   }\r
111 \r
112   public void drawBoxes(SequenceI seq, int start, int end,  int y1)\r
113   {\r
114     int i = start;\r
115     int length = seq.getLength();\r
116 \r
117     int curStart = -1;\r
118     int curWidth = av.charWidth;\r
119 \r
120     Color tempColour = null;\r
121     while (i <= end)\r
122     {\r
123       resBoxColour = Color.white;\r
124       if(i < length)\r
125       {\r
126         if (inCurrentSequenceGroup(i))\r
127         {\r
128           if (currentSequenceGroup.getDisplayBoxes())\r
129           {\r
130             getBoxColour(currentSequenceGroup.cs, seq, i);\r
131           }\r
132         }\r
133         else if (av.getShowBoxes())\r
134         {\r
135           getBoxColour(av.getGlobalColourScheme(), seq, i);\r
136         }\r
137       }\r
138 \r
139 \r
140       if (resBoxColour != tempColour)\r
141       {\r
142         if (tempColour != null)\r
143         {\r
144           graphics.fillRect(av.charWidth * (curStart - start), y1, curWidth,\r
145                             av.charHeight);\r
146         }\r
147         graphics.setColor(resBoxColour);\r
148 \r
149         curStart = i;\r
150         curWidth = av.charWidth;\r
151         tempColour = resBoxColour;\r
152 \r
153       }\r
154       else\r
155       {\r
156         curWidth += av.charWidth;\r
157       }\r
158 \r
159       i++;\r
160     }\r
161 \r
162     graphics.fillRect(av.charWidth * (curStart - start), y1, curWidth, av.charHeight);\r
163   }\r
164 \r
165   public void drawText(SequenceI seq, int start, int end, int y1)\r
166   {\r
167 \r
168     y1 += av.charHeight - av.charHeight / 5;  // height/5 replaces pady\r
169 \r
170     int charOffset = 0;\r
171 \r
172     // Need to find the sequence position here.\r
173     if(end+1>=seq.getLength())\r
174           end = seq.getLength()-1;\r
175 \r
176     char s = ' ';\r
177 \r
178     for (int i = start; i <= end; i++)\r
179     {\r
180       graphics.setColor(Color.black);\r
181 \r
182       s = seq.getCharAt(i);\r
183       if (!renderGaps && jalview.util.Comparison.isGap(s))\r
184       {\r
185         continue;\r
186       }\r
187 \r
188       if (inCurrentSequenceGroup(i))\r
189       {\r
190         if (!currentSequenceGroup.getDisplayText())\r
191         {\r
192           continue;\r
193         }\r
194 \r
195         if (currentSequenceGroup.getColourText())\r
196         {\r
197           getBoxColour(currentSequenceGroup.cs, seq, i);\r
198           graphics.setColor(resBoxColour.darker());\r
199         }\r
200       }\r
201       else\r
202       {\r
203         if (!av.getShowText())\r
204         {\r
205           continue;\r
206         }\r
207 \r
208         if (av.getColourText())\r
209         {\r
210           getBoxColour(av.getGlobalColourScheme(), seq, i);\r
211           if (av.getShowBoxes())\r
212           {\r
213             graphics.setColor(resBoxColour.darker());\r
214           }\r
215           else\r
216           {\r
217             graphics.setColor(resBoxColour);\r
218           }\r
219         }\r
220       }\r
221 \r
222       charOffset = (av.charWidth - fm.charWidth(s)) / 2;\r
223       graphics.drawString(String.valueOf(s),\r
224                          charOffset + av.charWidth * (i - start),\r
225                         y1 );\r
226     }\r
227 \r
228   }\r
229 \r
230   boolean inCurrentSequenceGroup(int res)\r
231   {\r
232     if (allGroups == null)\r
233     {\r
234       return false;\r
235     }\r
236 \r
237     for (int i = 0; i < allGroups.length; i++)\r
238     {\r
239       if (allGroups[i].getStartRes() <= res && allGroups[i].getEndRes() >= res)\r
240       {\r
241         currentSequenceGroup = allGroups[i];\r
242         return true;\r
243       }\r
244     }\r
245 \r
246     return false;\r
247   }\r
248 \r
249   public void drawHighlightedText(SequenceI seq, int start, int end, int x1, int y1)\r
250   {\r
251     int pady = av.charHeight / 5;\r
252     int charOffset = 0;\r
253     graphics.setColor(Color.black);\r
254     graphics.fillRect(x1, y1, av.charWidth * (end - start + 1), av.charHeight);\r
255     graphics.setColor(Color.white);\r
256 \r
257     char s = '~';\r
258     // Need to find the sequence position here.\r
259     if(av.validCharWidth)\r
260     {\r
261       for (int i = start; i <= end; i++)\r
262       {\r
263         if (i < seq.getLength())\r
264         {\r
265           s = seq.getSequence().charAt(i);\r
266         }\r
267 \r
268         charOffset = (av.charWidth - fm.charWidth(s)) / 2;\r
269         graphics.drawString(String.valueOf(s),\r
270                             charOffset + x1 + av.charWidth * (i - start),\r
271                             y1 + av.charHeight - pady);\r
272       }\r
273     }\r
274   }\r
275 \r
276   public void drawCursor(SequenceI seq, int res, int x1, int y1)\r
277   {\r
278     int pady = av.charHeight / 5;\r
279     int charOffset = 0;\r
280     graphics.setColor(Color.black);\r
281     graphics.fillRect(x1, y1, av.charWidth, av.charHeight);\r
282     graphics.setColor(Color.white);\r
283 \r
284     graphics.setColor(Color.white);\r
285 \r
286     char s = seq.getCharAt(res);\r
287     if (av.validCharWidth)\r
288     {\r
289 \r
290       charOffset = (av.charWidth - fm.charWidth(s)) / 2;\r
291       graphics.drawString(String.valueOf(s),\r
292                           charOffset + x1,\r
293                           (y1 + av.charHeight) - pady);\r
294     }\r
295     }\r
296 \r
297 }\r