Takes string[] instead of seq[]
[jalview.git] / src / jalview / appletgui / IdCanvas.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 \r
26 public class IdCanvas\r
27     extends Panel\r
28 {\r
29   protected AlignViewport av;\r
30 \r
31   protected boolean showScores = true;\r
32 \r
33   protected int maxIdLength = -1;\r
34   protected String maxIdStr = null;\r
35   Image image;\r
36   Graphics gg;\r
37   int imgHeight = 0;\r
38   boolean fastPaint = false;\r
39 \r
40   java.util.Vector searchResults;\r
41 \r
42   public IdCanvas(AlignViewport av)\r
43   {\r
44     setLayout(null);\r
45     this.av = av;\r
46     PaintRefresher.Register(this, av.alignment);\r
47   }\r
48 \r
49   public void drawIdString(Graphics gg, SequenceI s, int i, int starty,\r
50                            int ypos)\r
51   {\r
52     int charHeight = av.getCharHeight();\r
53 \r
54     if (searchResults != null && searchResults.contains(s))\r
55     {\r
56       gg.setColor(Color.black);\r
57       gg.fillRect(0, ((i - starty) * charHeight) + ypos,\r
58                   getSize().width, charHeight);\r
59       gg.setColor(Color.white);\r
60     }\r
61     else if (av.getSelectionGroup() != null &&\r
62              av.getSelectionGroup().getSequences(false).contains(s))\r
63     {\r
64       gg.setColor(Color.lightGray);\r
65       gg.fillRect(0, ((i - starty) * charHeight) + ypos,\r
66                   getSize().width, charHeight);\r
67       gg.setColor(Color.white);\r
68     }\r
69     else\r
70     {\r
71       gg.setColor(s.getColor());\r
72       gg.fillRect(0, ((i - starty) * charHeight) + ypos,\r
73                   getSize().width, charHeight);\r
74       gg.setColor(Color.black);\r
75     }\r
76 \r
77 \r
78     gg.drawString( s.getDisplayId(av.getShowJVSuffix()), 0,\r
79                   ((i - starty) * charHeight) + ypos +\r
80                   charHeight - (charHeight / 5));\r
81 \r
82   }\r
83 \r
84   public void fastPaint(int vertical)\r
85   {\r
86     if (gg == null)\r
87     {\r
88       repaint();\r
89       return;\r
90     }\r
91 \r
92     gg.copyArea(0, 0, getSize().width, imgHeight, 0, -vertical * av.charHeight);\r
93 \r
94     int ss = av.startSeq, es = av.endSeq, transY = 0;\r
95     if (vertical > 0) // scroll down\r
96     {\r
97       ss = es - vertical;\r
98       if (ss < av.startSeq) // ie scrolling too fast, more than a page at a time\r
99       {\r
100         ss = av.startSeq;\r
101       }\r
102       else\r
103       {\r
104         transY = imgHeight - vertical * av.charHeight;\r
105       }\r
106     }\r
107     else if (vertical < 0)\r
108     {\r
109       es = ss - vertical;\r
110       if (es > av.endSeq)\r
111       {\r
112         es = av.endSeq;\r
113       }\r
114     }\r
115 \r
116     gg.translate(0, transY);\r
117 \r
118     drawIds(ss, es);\r
119 \r
120     gg.translate(0, -transY);\r
121 \r
122     fastPaint = true;\r
123     repaint();\r
124   }\r
125 \r
126   public void update(Graphics g)\r
127   {\r
128     paint(g);\r
129   }\r
130 \r
131   public void paint(Graphics g)\r
132   {\r
133     if (getSize().height < 0 || getSize().width < 0)\r
134     {\r
135       return;\r
136     }\r
137     if (fastPaint)\r
138     {\r
139       fastPaint = false;\r
140       g.drawImage(image, 0, 0, this);\r
141       return;\r
142     }\r
143 \r
144     imgHeight = getSize().height;\r
145     imgHeight -= imgHeight % av.charHeight;\r
146 \r
147     if (imgHeight < 1)\r
148     {\r
149       return;\r
150     }\r
151 \r
152     if (image == null || imgHeight != image.getHeight(this))\r
153     {\r
154       image = createImage(getSize().width, imgHeight);\r
155       gg = image.getGraphics();\r
156       gg.setFont(av.getFont());\r
157     }\r
158 \r
159     //Fill in the background\r
160     gg.setColor(Color.white);\r
161     Font italic = new Font(av.getFont().getName(), Font.ITALIC,\r
162                            av.getFont().getSize());\r
163     gg.setFont(italic);\r
164 \r
165     gg.fillRect(0, 0, getSize().width, getSize().height);\r
166     drawIds(av.getStartSeq(), av.endSeq);\r
167     g.drawImage(image, 0, 0, this);\r
168   }\r
169 \r
170   void drawIds(int starty, int endy)\r
171   {\r
172     Color currentColor = Color.white;\r
173     Color currentTextColor = Color.black;\r
174     Font italic = new Font(av.getFont().getName(), Font.ITALIC,\r
175                              av.getFont().getSize());\r
176 \r
177     if (av.getWrapAlignment())\r
178     {\r
179       int annotationHeight = 0;\r
180       AnnotationLabels labels = null;\r
181 \r
182       if(av.showAnnotation)\r
183       {\r
184         AnnotationPanel ap = new AnnotationPanel(av);\r
185         annotationHeight = ap.adjustPanelHeight();\r
186         labels = new AnnotationLabels(av);\r
187       }\r
188 \r
189       int hgap = av.charHeight;\r
190       if (av.scaleAboveWrapped)\r
191         hgap += av.charHeight;\r
192 \r
193       int cHeight = av.getAlignment().getHeight() * av.charHeight\r
194           + hgap\r
195           + annotationHeight;\r
196 \r
197         int rowSize = av.getEndRes() - av.getStartRes();\r
198 \r
199         // Draw the rest of the panels\r
200         for (int ypos = hgap, row = av.startRes;\r
201                 (ypos <= getSize().height) && (row < av.alignment.getWidth());\r
202                 ypos += cHeight, row += rowSize)\r
203         {\r
204             for (int i = starty; i < av.alignment.getHeight(); i++)\r
205             {\r
206                 SequenceI s = av.alignment.getSequenceAt(i);\r
207                 gg.setFont(italic);\r
208                 drawIdString(gg, s, i, 0, ypos);\r
209             }\r
210 \r
211             if(labels!=null)\r
212             {\r
213               gg.translate(0, ypos+(av.getAlignment().getHeight() * av.charHeight));\r
214               labels.drawComponent(gg, getSize().width);\r
215               gg.translate(0, -ypos-(av.getAlignment().getHeight() * av.charHeight));\r
216             }\r
217         }\r
218 \r
219     }\r
220     else\r
221     {\r
222 \r
223       //Now draw the id strings\r
224       for (int i = starty; i < endy; i++)\r
225       {\r
226         // Selected sequence colours\r
227 \r
228         if (searchResults != null &&\r
229             searchResults.contains(av.alignment.getSequenceAt(i)))\r
230         {\r
231           gg.setColor(Color.black);\r
232           currentColor = Color.black;\r
233           currentTextColor = Color.white;\r
234         }\r
235         else if (av.getSelectionGroup() != null\r
236                  &&\r
237                  av.getSelectionGroup().getSequences(false).contains(av.alignment.\r
238             getSequenceAt(i)))\r
239         {\r
240           currentColor = Color.lightGray;\r
241           currentTextColor = Color.black;\r
242         }\r
243         else\r
244         {\r
245           currentColor = av.alignment.getSequenceAt(i).getColor();\r
246           currentTextColor = Color.black;\r
247         }\r
248 \r
249         gg.setColor(currentColor);\r
250 \r
251         gg.fillRect(0,\r
252                     ((i - starty) * av.charHeight),\r
253                     getSize().width,\r
254                     av.charHeight);\r
255 \r
256         gg.setColor(currentTextColor);\r
257 \r
258         gg.drawString(av.alignment.getSequenceAt(i)\r
259             .getDisplayId(av.getShowJVSuffix()), 0,\r
260                       ((i - starty) * av.charHeight) +\r
261                       av.charHeight - (av.charHeight / 5));\r
262       }\r
263 \r
264       // add a border\r
265       gg.setColor(Color.white);\r
266       gg.fillRect(getSize().width - 4, 0, 4, getSize().height);\r
267     }\r
268 \r
269   }\r
270 \r
271   public void setHighlighted(java.util.Vector found)\r
272   {\r
273     searchResults = found;\r
274     repaint();\r
275   }\r
276 }\r