Comment out all PID and frequency calcs for the moment
[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() == true) {\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       } else*/ {\r
182           drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
183 \r
184           oldstartx = startx;\r
185           oldendx   = endx;\r
186           oldstarty = starty;\r
187           oldendy   = endy;\r
188 \r
189       }\r
190     }\r
191 \r
192     else if (oldstartx < startx)\r
193     {\r
194       // This is dragging horizontal scrollbar to the right\r
195 \r
196       int delx  = (int)((startx - oldstartx) * charWidth);\r
197       int delx2 = (int)((oldendx - startx + 1)   * charWidth);\r
198 \r
199       gg.copyArea(delx,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),-delx,0);\r
200 \r
201       if (startx > oldendx)\r
202         drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
203       else\r
204         drawPanel(gg,oldendx+1,endx,starty,endy,startx,starty,0);\r
205 \r
206 \r
207       oldstartx = startx;\r
208       oldendx   = endx;\r
209 \r
210     } else if (oldstartx > startx)\r
211     {\r
212      // Horizontal scrollbar pulled to the left\r
213 \r
214       int delx  = (int)((oldstartx - startx) * charWidth);\r
215       int delx2 = (int)((endx - oldstartx +1)   * charWidth);\r
216 \r
217       gg.copyArea(0,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),delx,0);\r
218 \r
219       if (oldstartx > endx) {\r
220         drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
221       } else {\r
222         drawPanel(gg,startx,oldstartx-1,starty,endy,startx,starty,0);\r
223       }\r
224 \r
225       oldstartx = startx;\r
226       oldendx   = endx;\r
227 \r
228     }  else if (oldstarty < starty) {\r
229       // Vertical scrollbar down\r
230       int dely  = AlignmentUtil.getPixelHeight(oldstarty,starty,charHeight);\r
231       int dely2 = AlignmentUtil.getPixelHeight(starty,oldendy,charHeight);\r
232 \r
233       gg.copyArea(0,dely,(int)((endx-startx+1)*charWidth),dely2,0,-dely);\r
234 \r
235       if (starty > oldendy) {\r
236         drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
237       } else {\r
238         drawPanel(gg,startx,endx,oldendy,endy,startx,starty,0);\r
239       }\r
240 \r
241       oldstarty = starty;\r
242       oldendy   = endy;\r
243 \r
244     } else if (oldstarty > starty) {\r
245 \r
246       // Vertical scrollbar up\r
247       int dely  = AlignmentUtil.getPixelHeight(endy,oldendy,charHeight);\r
248       int dely2 = AlignmentUtil.getPixelHeight(oldstarty,endy,charHeight);\r
249 \r
250       gg.copyArea(0,0,(int)((endx-startx+1)*charWidth),dely2,0,dely);\r
251 \r
252       if (oldstarty > endy) {\r
253         drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
254       } else {\r
255         drawPanel(gg,startx,endx,starty,oldstarty,startx,starty,0);\r
256       }\r
257 \r
258       oldstarty = starty;\r
259       oldendy   = endy;\r
260     }\r
261 \r
262     if ((oldendy -oldstarty) > (int)((getWidth() / av.getCharWidth()))) {\r
263       System.out.println("LIMITS ERROR LIMITS ERROR");\r
264       System.out.println("Corrds " + (oldendy-oldstarty) + " " + (int)(getWidth()/av.getCharWidth()) + " " + getWidth() + " " + av.getCharWidth());\r
265     }\r
266 \r
267 \r
268     g.drawImage(img,0,0,this);\r
269 \r
270   }\r
271 \r
272 \r
273 \r
274 \r
275   public void drawPanel(Graphics g,int x1,int x2, int y1, int y2,int startx, int starty,int offset) {\r
276 \r
277 /*\r
278     System.out.println("drawPanel called with g      = " + g);\r
279     System.out.println("                      x1     = " + x1);\r
280     System.out.println("                      x2     = " + x2);\r
281     System.out.println("                      y1     = " + y1);\r
282     System.out.println("                      y2     = " + y2);\r
283     System.out.println("                      startx = " + startx);\r
284     System.out.println("                      starty = " + starty);\r
285 */\r
286 \r
287     g.setFont(av.getFont());\r
288     double            charWidth  = av.getCharWidth();\r
289     int               charHeight = av.getCharHeight();\r
290     RendererI sr = av.getRenderer();\r
291 \r
292 \r
293     /*Vector    pid    = av.getConsensus(false);\r
294 \r
295     Vector tmpseq = new Vector();\r
296 \r
297     for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
298         if (!av.getSelection().contains(av.getAlignment().getSequenceAt(i)))\r
299             tmpseq.addElement(av.getAlignment().getSequenceAt(i));\r
300 \r
301 \r
302 \r
303     if (sr instanceof SequenceRenderer)\r
304         pid    = AAFrequency.calculate(tmpseq,x1,x2);\r
305 \r
306     else if (sr instanceof GraphRenderer)\r
307         pid = AAFrequency.calculatePID(av.getAlignment().getSequenceAt(0),\r
308                                        av.getAlignment().getSequences(),\r
309                                        av.getPIDWindow(),x1,x2);\r
310 \r
311 */\r
312 \r
313     if (y2 > starty && y1 < av.getEndSeq()) {\r
314 \r
315     fillBackground(g,\r
316                    Color.white,\r
317                    (int)((x1-startx)*charWidth),\r
318                    offset + AlignmentUtil.getPixelHeight(starty,y1,av.getCharHeight()),\r
319                    (int)((x2-x1+1)*charWidth),\r
320                    offset + AlignmentUtil.getPixelHeight(y1,y2,av.getCharHeight()));\r
321     }\r
322 \r
323     for (int i = y1 ; i < y2 ;i++) {\r
324 \r
325       RendererI r = sr;\r
326 /*\r
327       if (av.getSelection().contains(av.getAlignment().getSequenceAt(i))) {\r
328           r = fr;\r
329           System.out.println("use feature renderer");\r
330       } else if ( i == 0) {\r
331         //  r = br;\r
332       } else if (av.getAlignment().getSequenceAt(i).getName().equals("CpG")) {\r
333           r = cgr;\r
334           System.out.println("cg renderer");\r
335       }\r
336 */\r
337 \r
338       r.drawSequence(g,cs,av.getAlignment().getSequenceAt(i),\r
339                       x1,\r
340                       x2,\r
341                       (int)((x1-startx)*charWidth),\r
342                       offset + AlignmentUtil.getPixelHeight(starty,i,av.getCharHeight()),\r
343                       charWidth,\r
344                       charHeight,showScores,av.getShowBoxes(),av.getShowText(),null,i,av);\r
345 \r
346     }\r
347   }\r
348 \r
349 \r
350 \r
351   public void fillBackground(Graphics g,Color c, int x1,int y1,int width,int height) {\r
352     g.setColor(c);\r
353     g.fillRect(x1,y1,width,height);\r
354   }\r
355 \r
356   public int getChunkWidth() {\r
357     return chunkWidth;\r
358   }\r
359 \r
360 }\r