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