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