No need for viewport or colourtext in renderer
[jalview.git] / src / jalview / gui / SeqCanvas.java
1 package jalview.gui;\r
2 \r
3 import java.awt.*;\r
4 import javax.swing.*;\r
5 import java.util.*;\r
6 import jalview.datamodel.*;\r
7 import jalview.schemes.*;\r
8 import jalview.analysis.*;\r
9 \r
10 \r
11 public class SeqCanvas extends JPanel\r
12 {\r
13     Image             img;\r
14     Graphics          gg;\r
15     int               imgWidth;\r
16     int               imgHeight;\r
17 \r
18     AlignViewport     av;\r
19     int pady = 2;\r
20     int oldstartx;\r
21     int oldstarty;\r
22     int oldendx;\r
23     int oldendy;\r
24 \r
25     public boolean paintFlag = false;\r
26     boolean showScores = false;\r
27 \r
28     int chunkHeight;\r
29     int chunkWidth;\r
30 \r
31     Graphics debugG;\r
32    // FeatureRenderer fr = new FeatureRenderer();\r
33   //  BlockRenderer   br = new BlockRenderer();\r
34   //  CpGRenderer     cgr = new CpGRenderer();\r
35 \r
36     ColourSchemeI    cs = new ZappoColourScheme();\r
37 \r
38     public SeqCanvas(AlignViewport av)\r
39     {\r
40         this.av         = av;\r
41        setLayout(new BorderLayout());\r
42     }\r
43 \r
44   public void drawScale(int startx, int endx,double charWidth, int charHeight,int ypos) {\r
45       int scalestartx = startx - startx%10 + 10;\r
46 \r
47       gg.setColor(Color.black);\r
48 \r
49       for (int i=scalestartx;i < endx;i+= 10) {\r
50           String string = String.valueOf(i);\r
51           gg.drawString(string,(int)((i-startx-1)*charWidth),ypos+15 - charHeight*(2));\r
52       }\r
53   }\r
54 \r
55 \r
56 /**\r
57  * Definitions of startx and endx (hopefully):\r
58  * SMJS This is what I'm working towards!\r
59  *   startx is the first residue (starting at 0) to display.\r
60  *   endx   is the last residue to display (starting at 0).\r
61  *   starty is the first sequence to display (starting at 0).\r
62  *   endy   is the last sequence to display (starting at 0).\r
63  * NOTE 1: The av limits are set in setFont in this class and\r
64  * in the adjustment listener in SeqPanel when the scrollbars move.\r
65  */\r
66 \r
67   public void paintComponent(Graphics g) {\r
68     debugG = g;\r
69 \r
70     AlignmentI da = av.getAlignment();\r
71 \r
72     if (img == null ||\r
73         imgWidth  !=  getWidth()  ||\r
74         imgHeight !=  getHeight() ||\r
75         paintFlag == true) {\r
76 \r
77       imgWidth  = (getWidth() > 0 ? getWidth() : 1);\r
78       imgHeight = (getHeight() > 0 ? getHeight() : 1);\r
79 \r
80       img = createImage(imgWidth,imgHeight);\r
81       gg  = img.getGraphics();\r
82 \r
83      // SMJS I added this in to update the AV when the size changes\r
84       //      until I figure out how this should be done\r
85       setFont(av.getFont());\r
86 \r
87       gg.setFont(av.getFont());\r
88 \r
89       paintFlag = false;\r
90 \r
91       oldstartx = -1;\r
92       oldendx   = -1;\r
93       oldstarty = -1;\r
94       oldendy   = -1;\r
95     }\r
96 \r
97     int startx = av.getStartRes();\r
98     int starty = av.getStartSeq();\r
99 \r
100     int endx   = av.getEndRes();\r
101     int endy   = av.getEndSeq();\r
102 \r
103     double charWidth  = av.getCharWidth();\r
104     int charHeight    = av.getCharHeight();\r
105 \r
106     chunkWidth = (int)(getWidth()/charWidth);\r
107     chunkHeight =  (da.getHeight() + 2)*charHeight;\r
108 \r
109     av.setChunkHeight(chunkHeight);\r
110     av.setChunkWidth(chunkWidth);\r
111 \r
112     int offy = av.getStartSeq();\r
113 \r
114     if (oldendx == -1) {\r
115       fillBackground(gg,Color.WHITE,0,0,imgWidth,imgHeight);\r
116 \r
117      if (av.getWrapAlignment()) {\r
118           startx = (int)(offy/chunkWidth)*chunkWidth;\r
119           endx   = startx + chunkWidth;\r
120           starty = offy%chunkHeight;\r
121           endy   = starty + da.getHeight();\r
122 \r
123           int ypos     = 0;\r
124           int rowstart = starty;\r
125 \r
126           if (starty == 0) {\r
127               ypos = 2*charHeight;\r
128           } else if (starty == 1) {\r
129               starty = 0;\r
130               ypos = charHeight;\r
131           }\r
132 \r
133           if (endy > da.getHeight()) {\r
134               endy = da.getHeight();\r
135           }\r
136 \r
137           if (endx > da.getWidth()) {\r
138               endx = da.getWidth();\r
139           }\r
140 \r
141           if (rowstart < 2) {\r
142               drawScale(startx,endx,charWidth,charHeight,ypos);\r
143           }\r
144 \r
145           drawPanel(gg,startx,endx,starty,endy,startx,starty,ypos);\r
146 \r
147           if (rowstart == 0) {\r
148               ypos = ypos + chunkHeight;\r
149           } else if (rowstart == 1) {\r
150               ypos = ypos + chunkHeight;\r
151           } else {\r
152               ypos   = ypos + chunkHeight - rowstart*charHeight;\r
153           }\r
154 \r
155           startx += chunkWidth;\r
156           endx   = startx + chunkWidth;\r
157           starty = 0;\r
158 \r
159           if (endx > da.getWidth()) {\r
160               endx = da.getWidth();\r
161           }\r
162           // Draw the rest of the panels\r
163 \r
164           while (ypos <= getHeight()) {\r
165               drawScale(startx,endx,charWidth,charHeight,ypos);\r
166               drawPanel(gg,startx,endx,0,da.getHeight(),startx,starty,ypos);\r
167 \r
168               ypos   += chunkHeight;\r
169               startx += chunkWidth;\r
170               endx   = startx + chunkWidth;\r
171 \r
172               if (endy > da.getHeight()) {\r
173                   endy = da.getHeight();\r
174               }\r
175 \r
176               if (endx > da.getWidth()) {\r
177                   endx = da.getWidth();\r
178               }\r
179 \r
180           }\r
181       }\r
182       else\r
183       {\r
184           drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
185 \r
186           oldstartx = startx;\r
187           oldendx   = endx;\r
188           oldstarty = starty;\r
189           oldendy   = endy;\r
190 \r
191       }\r
192     }\r
193 \r
194     else if (oldstartx < startx)\r
195     {\r
196       // This is dragging horizontal scrollbar to the right\r
197 \r
198       int delx  = (int)((startx - oldstartx) * charWidth);\r
199       int delx2 = (int)((oldendx - startx + 1)   * charWidth);\r
200 \r
201       gg.copyArea(delx,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),-delx,0);\r
202 \r
203       if (startx > oldendx)\r
204         drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
205       else\r
206         drawPanel(gg,oldendx+1,endx,starty,endy,startx,starty,0);\r
207 \r
208 \r
209       oldstartx = startx;\r
210       oldendx   = endx;\r
211 \r
212     } else if (oldstartx > startx)\r
213     {\r
214      // Horizontal scrollbar pulled to the left\r
215 \r
216       int delx  = (int)((oldstartx - startx) * charWidth);\r
217       int delx2 = (int)((endx - oldstartx +1)   * charWidth);\r
218 \r
219       gg.copyArea(0,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),delx,0);\r
220 \r
221       if (oldstartx > endx) {\r
222         drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
223       } else {\r
224         drawPanel(gg,startx,oldstartx-1,starty,endy,startx,starty,0);\r
225       }\r
226 \r
227       oldstartx = startx;\r
228       oldendx   = endx;\r
229 \r
230     }  else if (oldstarty < starty) {\r
231       // Vertical scrollbar down\r
232       int dely  = AlignmentUtil.getPixelHeight(oldstarty,starty,charHeight);\r
233       int dely2 = AlignmentUtil.getPixelHeight(starty,oldendy,charHeight);\r
234 \r
235       gg.copyArea(0,dely,(int)((endx-startx+1)*charWidth),dely2,0,-dely);\r
236 \r
237       if (starty > oldendy) {\r
238         drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
239       } else {\r
240         drawPanel(gg,startx,endx,oldendy,endy,startx,starty,0);\r
241       }\r
242 \r
243       oldstarty = starty;\r
244       oldendy   = endy;\r
245 \r
246     } else if (oldstarty > starty) {\r
247 \r
248       // Vertical scrollbar up\r
249       int dely  = AlignmentUtil.getPixelHeight(endy,oldendy,charHeight);\r
250       int dely2 = AlignmentUtil.getPixelHeight(oldstarty,endy,charHeight);\r
251 \r
252       gg.copyArea(0,0,(int)((endx-startx+1)*charWidth),dely2,0,dely);\r
253 \r
254       if (oldstarty > endy) {\r
255         drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
256       } else {\r
257         drawPanel(gg,startx,endx,starty,oldstarty,startx,starty,0);\r
258       }\r
259 \r
260       oldstarty = starty;\r
261       oldendy   = endy;\r
262     }\r
263 \r
264     if ((oldendy -oldstarty) > (int)((getWidth() / av.getCharWidth()))) {\r
265       System.out.println("LIMITS ERROR LIMITS ERROR");\r
266       System.out.println("Corrds " + (oldendy-oldstarty) + " " + (int)(getWidth()/av.getCharWidth()) + " " + getWidth() + " " + av.getCharWidth());\r
267     }\r
268 \r
269 \r
270     gg.setColor(Color.red);\r
271     gg.drawRect( groupX, groupY, groupendX-groupX, groupendY-groupY );\r
272     gg.drawRect( groupX+1, groupY+1, groupendX-groupX-2, groupendY-groupY-2 );\r
273 \r
274 \r
275     g.drawImage(img,0,0,this);\r
276 \r
277   }\r
278 \r
279 \r
280 \r
281 \r
282   public void drawPanel(Graphics g,int x1,int x2, int y1, int y2,int startx, int starty,int offset) {\r
283 \r
284 /*\r
285     System.out.println("drawPanel called with g      = " + g);\r
286     System.out.println("                      x1     = " + x1);\r
287     System.out.println("                      x2     = " + x2);\r
288     System.out.println("                      y1     = " + y1);\r
289     System.out.println("                      y2     = " + y2);\r
290     System.out.println("                      startx = " + startx);\r
291     System.out.println("                      starty = " + starty);\r
292 */\r
293 \r
294     g.setFont(av.getFont());\r
295     double            charWidth  = av.getCharWidth();\r
296     int               charHeight = av.getCharHeight();\r
297     RendererI sr = av.getRenderer();\r
298 \r
299 \r
300     /*Vector    pid    = av.getConsensus(false);\r
301     Vector tmpseq = new Vector();\r
302     for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
303         if (!av.getSelection().contains(av.getAlignment().getSequenceAt(i)))\r
304             tmpseq.addElement(av.getAlignment().getSequenceAt(i));\r
305 \r
306     if (sr instanceof SequenceRenderer)\r
307         pid    = AAFrequency.calculate(tmpseq,x1,x2);\r
308 \r
309     else if (sr instanceof GraphRenderer)\r
310         pid = AAFrequency.calculatePID(av.getAlignment().getSequenceAt(0),\r
311                                        av.getAlignment().getSequences(),\r
312                                        av.getPIDWindow(),x1,x2);\r
313 \r
314 */\r
315 \r
316     if (y2 > starty && y1 < av.getEndSeq())\r
317     {\r
318        fillBackground(g,\r
319                    Color.WHITE,\r
320                    (int)((x1-startx)*charWidth),\r
321                    offset + AlignmentUtil.getPixelHeight(starty,y1,av.getCharHeight()),\r
322                    (int)((x2-x1+1)*charWidth),\r
323                    offset + AlignmentUtil.getPixelHeight(y1,y2,av.getCharHeight()));\r
324     }\r
325 \r
326     SequenceI nextSeq;\r
327     SequenceGroup group;\r
328     for (int i = y1 ; i < y2 ;i++)\r
329     {\r
330       RendererI r = sr;\r
331     /*  if (av.getSelection().contains(av.getAlignment().getSequenceAt(i))) {\r
332           r = fr;\r
333           System.out.println("use feature renderer");\r
334       } else if ( i == 0) {\r
335         //  r = br;\r
336       } else if (av.getAlignment().getSequenceAt(i).getName().equals("CpG")) {\r
337           r = cgr;\r
338           System.out.println("cg renderer");\r
339       }\r
340 */\r
341      nextSeq = av.getAlignment().getSequenceAt(i);\r
342      group = av.alignment.findGroup( nextSeq );\r
343      if( group!=null )\r
344      {\r
345        r.drawSequence(g, group.cs, nextSeq,\r
346                       x1,\r
347                       x2,\r
348                       (int) ( (x1 - startx) * charWidth),\r
349                       offset + AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight()),\r
350                       charWidth, charHeight,\r
351                       false, group.getDisplayBoxes(), group.getDisplayText(), group.getColourText(),\r
352                       null, i);\r
353      }\r
354      else\r
355      {\r
356        r.drawSequence(g, cs, nextSeq,\r
357                       x1,\r
358                       x2,\r
359                       (int) ( (x1 - startx) * charWidth),\r
360                       offset + AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight()),\r
361                       charWidth,charHeight,\r
362                       showScores, av.getShowBoxes(),  av.getShowText(), av.getColourText(),\r
363                       null, i);\r
364 \r
365      }\r
366 \r
367 \r
368     }\r
369 \r
370   }\r
371 \r
372   public int groupX, groupY, groupendX, groupendY;\r
373 \r
374 \r
375   public void fillBackground(Graphics g,Color c, int x1,int y1,int width,int height) {\r
376     g.setColor(c);\r
377     g.fillRect(x1,y1,width,height);\r
378   }\r
379 \r
380   public int getChunkWidth() {\r
381     return chunkWidth;\r
382   }\r
383 \r
384 }\r