sequence is char []
[jalview.git] / src / jalview / appletgui / SequenceRenderer.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 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.getCharAt(i), 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     if(seq==null)\r
103       return;\r
104 \r
105     allGroups = sg;\r
106 \r
107     drawBoxes(seq, start, end,  y1);\r
108 \r
109     if(av.validCharWidth)\r
110     {\r
111       drawText(seq, start, end, y1);\r
112     }\r
113   }\r
114 \r
115   public void drawBoxes(SequenceI seq, int start, int end,  int y1)\r
116   {\r
117     int i = start;\r
118     int length = seq.getLength();\r
119 \r
120     int curStart = -1;\r
121     int curWidth = av.charWidth;\r
122 \r
123     Color tempColour = null;\r
124     while (i <= end)\r
125     {\r
126       resBoxColour = Color.white;\r
127       if(i < length)\r
128       {\r
129         if (inCurrentSequenceGroup(i))\r
130         {\r
131           if (currentSequenceGroup.getDisplayBoxes())\r
132           {\r
133             getBoxColour(currentSequenceGroup.cs, seq, i);\r
134           }\r
135         }\r
136         else if (av.getShowBoxes())\r
137         {\r
138           getBoxColour(av.getGlobalColourScheme(), seq, i);\r
139         }\r
140       }\r
141 \r
142 \r
143       if (resBoxColour != tempColour)\r
144       {\r
145         if (tempColour != null)\r
146         {\r
147           graphics.fillRect(av.charWidth * (curStart - start), y1, curWidth,\r
148                             av.charHeight);\r
149         }\r
150         graphics.setColor(resBoxColour);\r
151 \r
152         curStart = i;\r
153         curWidth = av.charWidth;\r
154         tempColour = resBoxColour;\r
155 \r
156       }\r
157       else\r
158       {\r
159         curWidth += av.charWidth;\r
160       }\r
161 \r
162       i++;\r
163     }\r
164 \r
165     graphics.fillRect(av.charWidth * (curStart - start), y1, curWidth, av.charHeight);\r
166   }\r
167 \r
168   public void drawText(SequenceI seq, int start, int end, int y1)\r
169   {\r
170    Font boldFont = null;\r
171    boolean bold = false;\r
172    if(av.upperCasebold)\r
173    {\r
174      boldFont = new Font(av.getFont().getName(), Font.BOLD, av.charHeight);\r
175 \r
176      graphics.setFont(av.getFont());\r
177    }\r
178 \r
179     y1 += av.charHeight - av.charHeight / 5;  // height/5 replaces pady\r
180 \r
181     int charOffset = 0;\r
182 \r
183     // Need to find the sequence position here.\r
184     if(end+1>=seq.getLength())\r
185           end = seq.getLength()-1;\r
186 \r
187     char s = ' ';\r
188 \r
189     for (int i = start; i <= end; i++)\r
190     {\r
191       graphics.setColor(Color.black);\r
192 \r
193       s = seq.getCharAt(i);\r
194       if (!renderGaps && jalview.util.Comparison.isGap(s))\r
195       {\r
196         continue;\r
197       }\r
198 \r
199       if (inCurrentSequenceGroup(i))\r
200       {\r
201         if (!currentSequenceGroup.getDisplayText())\r
202         {\r
203           continue;\r
204         }\r
205 \r
206         if (currentSequenceGroup.getColourText())\r
207         {\r
208           getBoxColour(currentSequenceGroup.cs, seq, i);\r
209           graphics.setColor(resBoxColour.darker());\r
210         }\r
211       }\r
212       else\r
213       {\r
214         if (!av.getShowText())\r
215         {\r
216           continue;\r
217         }\r
218 \r
219         if (av.getColourText())\r
220         {\r
221           getBoxColour(av.getGlobalColourScheme(), seq, i);\r
222           if (av.getShowBoxes())\r
223           {\r
224             graphics.setColor(resBoxColour.darker());\r
225           }\r
226           else\r
227           {\r
228             graphics.setColor(resBoxColour);\r
229           }\r
230         }\r
231       }\r
232 \r
233       if (av.upperCasebold)\r
234       {\r
235         fm = graphics.getFontMetrics();\r
236         if ('A' <= s && s <= 'Z')\r
237         {\r
238           if(!bold)\r
239           {\r
240 \r
241             graphics.setFont(boldFont);\r
242           }\r
243           bold = true;\r
244         }\r
245         else if(bold)\r
246         {\r
247           graphics.setFont(av.font);\r
248           bold = false;\r
249         }\r
250 \r
251       }\r
252 \r
253       charOffset = (av.charWidth - fm.charWidth(s)) / 2;\r
254       graphics.drawString(String.valueOf(s),\r
255                          charOffset + av.charWidth * (i - start),\r
256                         y1 );\r
257     }\r
258 \r
259   }\r
260 \r
261   boolean inCurrentSequenceGroup(int res)\r
262   {\r
263     if (allGroups == null)\r
264     {\r
265       return false;\r
266     }\r
267 \r
268     for (int i = 0; i < allGroups.length; i++)\r
269     {\r
270       if (allGroups[i].getStartRes() <= res && allGroups[i].getEndRes() >= res)\r
271       {\r
272         currentSequenceGroup = allGroups[i];\r
273         return true;\r
274       }\r
275     }\r
276 \r
277     return false;\r
278   }\r
279 \r
280   public void drawHighlightedText(SequenceI seq, int start, int end, int x1, int y1)\r
281   {\r
282     int pady = av.charHeight / 5;\r
283     int charOffset = 0;\r
284     graphics.setColor(Color.black);\r
285     graphics.fillRect(x1, y1, av.charWidth * (end - start + 1), av.charHeight);\r
286     graphics.setColor(Color.white);\r
287 \r
288     char s = '~';\r
289     // Need to find the sequence position here.\r
290     if(av.validCharWidth)\r
291     {\r
292       for (int i = start; i <= end; i++)\r
293       {\r
294         if (i < seq.getLength())\r
295         {\r
296           s = seq.getCharAt(i);\r
297         }\r
298 \r
299         charOffset = (av.charWidth - fm.charWidth(s)) / 2;\r
300         graphics.drawString(String.valueOf(s),\r
301                             charOffset + x1 + av.charWidth * (i - start),\r
302                             y1 + av.charHeight - pady);\r
303       }\r
304     }\r
305   }\r
306 \r
307   public void drawCursor(SequenceI seq, int res, int x1, int y1)\r
308   {\r
309     int pady = av.charHeight / 5;\r
310     int charOffset = 0;\r
311     graphics.setColor(Color.black);\r
312     graphics.fillRect(x1, y1, av.charWidth, av.charHeight);\r
313     graphics.setColor(Color.white);\r
314 \r
315     graphics.setColor(Color.white);\r
316 \r
317     char s = seq.getCharAt(res);\r
318     if (av.validCharWidth)\r
319     {\r
320 \r
321       charOffset = (av.charWidth - fm.charWidth(s)) / 2;\r
322       graphics.drawString(String.valueOf(s),\r
323                           charOffset + x1,\r
324                           (y1 + av.charHeight) - pady);\r
325     }\r
326     }\r
327 \r
328 }\r