DBPrefix and JVSuffix added
[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().sequences.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     String string = s.getDisplayId(av.getShowDBPrefix(), av.getShowJVSuffix());\r
78 \r
79     gg.drawString(string, 0,\r
80                   ((i - starty) * charHeight) + ypos +\r
81                   charHeight - (charHeight / 5));\r
82 \r
83   }\r
84 \r
85   public void fastPaint(int vertical)\r
86   {\r
87     if (gg == null)\r
88     {\r
89       repaint();\r
90       return;\r
91     }\r
92 \r
93     gg.copyArea(0, 0, getSize().width, imgHeight, 0, -vertical * av.charHeight);\r
94 \r
95     int ss = av.startSeq, es = av.endSeq, transY = 0;\r
96     if (vertical > 0) // scroll down\r
97     {\r
98       ss = es - vertical;\r
99       if (ss < av.startSeq) // ie scrolling too fast, more than a page at a time\r
100       {\r
101         ss = av.startSeq;\r
102       }\r
103       else\r
104       {\r
105         transY = imgHeight - vertical * av.charHeight;\r
106       }\r
107     }\r
108     else if (vertical < 0)\r
109     {\r
110       es = ss - vertical;\r
111       if (es > av.endSeq)\r
112       {\r
113         es = av.endSeq;\r
114       }\r
115     }\r
116 \r
117     gg.translate(0, transY);\r
118 \r
119     drawIds(ss, es);\r
120 \r
121     gg.translate(0, -transY);\r
122 \r
123     fastPaint = true;\r
124     repaint();\r
125   }\r
126 \r
127   public void update(Graphics g)\r
128   {\r
129     paint(g);\r
130   }\r
131 \r
132   public void paint(Graphics g)\r
133   {\r
134     if (getSize().height < 0 || getSize().width < 0)\r
135     {\r
136       return;\r
137     }\r
138     if (fastPaint)\r
139     {\r
140       fastPaint = false;\r
141       g.drawImage(image, 0, 0, this);\r
142       return;\r
143     }\r
144 \r
145     imgHeight = getSize().height;\r
146     imgHeight -= imgHeight % av.charHeight;\r
147 \r
148     if (imgHeight < 1)\r
149     {\r
150       return;\r
151     }\r
152 \r
153     if (image == null || imgHeight != image.getHeight(this))\r
154     {\r
155       image = createImage(getSize().width, imgHeight);\r
156       gg = image.getGraphics();\r
157       gg.setFont(av.getFont());\r
158     }\r
159 \r
160     if(!jalview.bin.JalviewLite.AWT1)\r
161     {\r
162       MyGraphics.AntiAlias(gg);\r
163     }\r
164 \r
165 \r
166     //Fill in the background\r
167     gg.setColor(Color.white);\r
168     Font italic = new Font(av.getFont().getName(), Font.ITALIC,\r
169                            av.getFont().getSize());\r
170     gg.setFont(italic);\r
171 \r
172     gg.fillRect(0, 0, getSize().width, getSize().height);\r
173     drawIds(av.getStartSeq(), av.endSeq);\r
174     g.drawImage(image, 0, 0, this);\r
175   }\r
176 \r
177   void drawIds(int starty, int endy)\r
178   {\r
179     Color currentColor = Color.white;\r
180     Color currentTextColor = Color.black;\r
181     Font italic = new Font(av.getFont().getName(), Font.ITALIC,\r
182                              av.getFont().getSize());\r
183 \r
184     if (av.getWrapAlignment())\r
185     {\r
186       int annotationHeight = 0;\r
187       AnnotationLabels labels = null;\r
188 \r
189       if(av.showAnnotation)\r
190       {\r
191         AnnotationPanel ap = new AnnotationPanel(av);\r
192         annotationHeight = ap.adjustPanelHeight();\r
193         labels = new AnnotationLabels(av);\r
194       }\r
195 \r
196       int hgap = av.charHeight;\r
197       if (av.scaleAboveWrapped)\r
198         hgap += av.charHeight;\r
199 \r
200       int cHeight = av.getAlignment().getHeight() * av.charHeight\r
201           + hgap\r
202           + annotationHeight;\r
203 \r
204         int rowSize = av.getEndRes() - av.getStartRes();\r
205 \r
206         // Draw the rest of the panels\r
207         for (int ypos = hgap, row = av.startRes;\r
208                 (ypos <= getSize().height) && (row < av.alignment.getWidth());\r
209                 ypos += cHeight, row += rowSize)\r
210         {\r
211             for (int i = starty; i < av.alignment.getHeight(); i++)\r
212             {\r
213                 SequenceI s = av.alignment.getSequenceAt(i);\r
214                 drawIdString(gg, s, i, 0, ypos);\r
215             }\r
216 \r
217             if(labels!=null)\r
218             {\r
219               gg.setFont(av.getFont());\r
220               gg.translate(0, ypos+(av.getAlignment().getHeight() * av.charHeight));\r
221               labels.drawComponent(gg, getSize().width);\r
222               gg.translate(0, -ypos-(av.getAlignment().getHeight() * av.charHeight));\r
223               gg.setFont(italic);\r
224             }\r
225         }\r
226 \r
227     }\r
228     else\r
229     {\r
230 \r
231       //Now draw the id strings\r
232       for (int i = starty; i < endy; i++)\r
233       {\r
234         // Selected sequence colours\r
235 \r
236         if (searchResults != null &&\r
237             searchResults.contains(av.alignment.getSequenceAt(i)))\r
238         {\r
239           gg.setColor(Color.black);\r
240           currentColor = Color.black;\r
241           currentTextColor = Color.white;\r
242         }\r
243         else if (av.getSelectionGroup() != null\r
244                  &&\r
245                  av.getSelectionGroup().sequences.contains(av.alignment.\r
246             getSequenceAt(i)))\r
247         {\r
248           currentColor = Color.lightGray;\r
249           currentTextColor = Color.black;\r
250         }\r
251         else\r
252         {\r
253           currentColor = av.alignment.getSequenceAt(i).getColor();\r
254           currentTextColor = Color.black;\r
255         }\r
256 \r
257         gg.setColor(currentColor);\r
258 \r
259         gg.fillRect(0,\r
260                     ((i - starty) * av.charHeight),\r
261                     getSize().width,\r
262                     av.charHeight);\r
263 \r
264         gg.setColor(currentTextColor);\r
265         String string = av.alignment.getSequenceAt(i)\r
266             .getDisplayId(av.getShowDBPrefix(), av.getShowJVSuffix());\r
267 \r
268         gg.drawString(string, 0,\r
269                       ((i - starty) * av.charHeight) +\r
270                       av.charHeight - (av.charHeight / 5));\r
271       }\r
272 \r
273       // add a border\r
274       gg.setColor(Color.white);\r
275       gg.fillRect(getSize().width - 4, 0, 4, getSize().height);\r
276     }\r
277 \r
278   }\r
279 \r
280   public void setHighlighted(java.util.Vector found)\r
281   {\r
282     searchResults = found;\r
283     repaint();\r
284   }\r
285 }\r