4 import javax.swing.*;
\r
6 import jalview.datamodel.*;
\r
7 import jalview.schemes.*;
\r
8 import jalview.analysis.*;
\r
11 public class SeqCanvas extends JPanel
\r
25 public boolean paintFlag = false;
\r
26 boolean showScores = false;
\r
32 FeatureRenderer fr = new FeatureRenderer();
\r
33 BlockRenderer br = new BlockRenderer();
\r
34 CpGRenderer cgr = new CpGRenderer();
\r
36 ColourSchemeI cs = new ZappoColourScheme();
\r
38 public SeqCanvas(AlignViewport av)
\r
41 setLayout(new BorderLayout());
\r
44 public void drawScale(int startx, int endx,double charWidth, int charHeight,int ypos) {
\r
45 int scalestartx = startx - startx%10 + 10;
\r
47 gg.setColor(Color.black);
\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
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
67 public void paintComponent(Graphics g) {
\r
70 AlignmentI da = av.getAlignment();
\r
73 imgWidth != getWidth() ||
\r
74 imgHeight != getHeight() ||
\r
75 paintFlag == true) {
\r
77 imgWidth = (getWidth() > 0 ? getWidth() : 1);
\r
78 imgHeight = (getHeight() > 0 ? getHeight() : 1);
\r
80 img = createImage(imgWidth,imgHeight);
\r
81 gg = img.getGraphics();
\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
87 gg.setFont(av.getFont());
\r
97 int startx = av.getStartRes();
\r
98 int starty = av.getStartSeq();
\r
100 int endx = av.getEndRes();
\r
101 int endy = av.getEndSeq();
\r
103 double charWidth = av.getCharWidth();
\r
104 int charHeight = av.getCharHeight();
\r
106 chunkWidth = (int)(getWidth()/charWidth);
\r
107 chunkHeight = (da.getHeight() + 2)*charHeight;
\r
109 av.setChunkHeight(chunkHeight);
\r
110 av.setChunkWidth(chunkWidth);
\r
112 int offy = av.getStartSeq();
\r
114 if (oldendx == -1) {
\r
115 fillBackground(gg,Color.WHITE,0,0,imgWidth,imgHeight);
\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
124 int rowstart = starty;
\r
127 ypos = 2*charHeight;
\r
128 } else if (starty == 1) {
\r
133 if (endy > da.getHeight()) {
\r
134 endy = da.getHeight();
\r
137 if (endx > da.getWidth()) {
\r
138 endx = da.getWidth();
\r
141 if (rowstart < 2) {
\r
142 drawScale(startx,endx,charWidth,charHeight,ypos);
\r
145 drawPanel(gg,startx,endx,starty,endy,startx,starty,ypos);
\r
147 if (rowstart == 0) {
\r
148 ypos = ypos + chunkHeight;
\r
149 } else if (rowstart == 1) {
\r
150 ypos = ypos + chunkHeight;
\r
152 ypos = ypos + chunkHeight - rowstart*charHeight;
\r
155 startx += chunkWidth;
\r
156 endx = startx + chunkWidth;
\r
159 if (endx > da.getWidth()) {
\r
160 endx = da.getWidth();
\r
162 // Draw the rest of the panels
\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
168 ypos += chunkHeight;
\r
169 startx += chunkWidth;
\r
170 endx = startx + chunkWidth;
\r
172 if (endy > da.getHeight()) {
\r
173 endy = da.getHeight();
\r
176 if (endx > da.getWidth()) {
\r
177 endx = da.getWidth();
\r
182 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
184 oldstartx = startx;
\r
186 oldstarty = starty;
\r
192 else if (oldstartx < startx)
\r
194 // This is dragging horizontal scrollbar to the right
\r
196 int delx = (int)((startx - oldstartx) * charWidth);
\r
197 int delx2 = (int)((oldendx - startx + 1) * charWidth);
\r
199 gg.copyArea(delx,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),-delx,0);
\r
201 if (startx > oldendx)
\r
202 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
204 drawPanel(gg,oldendx+1,endx,starty,endy,startx,starty,0);
\r
207 oldstartx = startx;
\r
210 } else if (oldstartx > startx)
\r
212 // Horizontal scrollbar pulled to the left
\r
214 int delx = (int)((oldstartx - startx) * charWidth);
\r
215 int delx2 = (int)((endx - oldstartx +1) * charWidth);
\r
217 gg.copyArea(0,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),delx,0);
\r
219 if (oldstartx > endx) {
\r
220 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
222 drawPanel(gg,startx,oldstartx-1,starty,endy,startx,starty,0);
\r
225 oldstartx = startx;
\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
233 gg.copyArea(0,dely,(int)((endx-startx+1)*charWidth),dely2,0,-dely);
\r
235 if (starty > oldendy) {
\r
236 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
238 drawPanel(gg,startx,endx,oldendy,endy,startx,starty,0);
\r
241 oldstarty = starty;
\r
244 } else if (oldstarty > starty) {
\r
246 // Vertical scrollbar up
\r
247 int dely = AlignmentUtil.getPixelHeight(endy,oldendy,charHeight);
\r
248 int dely2 = AlignmentUtil.getPixelHeight(oldstarty,endy,charHeight);
\r
250 gg.copyArea(0,0,(int)((endx-startx+1)*charWidth),dely2,0,dely);
\r
252 if (oldstarty > endy) {
\r
253 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
255 drawPanel(gg,startx,endx,starty,oldstarty,startx,starty,0);
\r
258 oldstarty = starty;
\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
268 g.drawImage(img,0,0,this);
\r
275 public void drawPanel(Graphics g,int x1,int x2, int y1, int y2,int startx, int starty,int offset) {
\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
287 g.setFont(av.getFont());
\r
288 double charWidth = av.getCharWidth();
\r
289 int charHeight = av.getCharHeight();
\r
290 RendererI sr = av.getRenderer();
\r
293 /*Vector pid = av.getConsensus(false);
\r
295 Vector tmpseq = new Vector();
\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
303 if (sr instanceof SequenceRenderer)
\r
304 pid = AAFrequency.calculate(tmpseq,x1,x2);
\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
313 if (y2 > starty && y1 < av.getEndSeq()) {
\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
323 for (int i = y1 ; i < y2 ;i++) {
\r
327 if (av.getSelection().contains(av.getAlignment().getSequenceAt(i))) {
\r
329 System.out.println("use feature renderer");
\r
330 } else if ( i == 0) {
\r
332 } else if (av.getAlignment().getSequenceAt(i).getName().equals("CpG")) {
\r
334 System.out.println("cg renderer");
\r
338 r.drawSequence(g,cs,av.getAlignment().getSequenceAt(i),
\r
341 (int)((x1-startx)*charWidth),
\r
342 offset + AlignmentUtil.getPixelHeight(starty,i,av.getCharHeight()),
\r
344 charHeight,showScores,av.getShowBoxes(),av.getShowText(),null,i,av);
\r
351 public void fillBackground(Graphics g,Color c, int x1,int y1,int width,int height) {
\r
353 g.fillRect(x1,y1,width,height);
\r
356 public int getChunkWidth() {
\r