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()) {
\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
184 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
186 oldstartx = startx;
\r
188 oldstarty = starty;
\r
194 else if (oldstartx < startx)
\r
196 // This is dragging horizontal scrollbar to the right
\r
198 int delx = (int)((startx - oldstartx) * charWidth);
\r
199 int delx2 = (int)((oldendx - startx + 1) * charWidth);
\r
201 gg.copyArea(delx,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),-delx,0);
\r
203 if (startx > oldendx)
\r
204 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
206 drawPanel(gg,oldendx+1,endx,starty,endy,startx,starty,0);
\r
209 oldstartx = startx;
\r
212 } else if (oldstartx > startx)
\r
214 // Horizontal scrollbar pulled to the left
\r
216 int delx = (int)((oldstartx - startx) * charWidth);
\r
217 int delx2 = (int)((endx - oldstartx +1) * charWidth);
\r
219 gg.copyArea(0,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),delx,0);
\r
221 if (oldstartx > endx) {
\r
222 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
224 drawPanel(gg,startx,oldstartx-1,starty,endy,startx,starty,0);
\r
227 oldstartx = startx;
\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
235 gg.copyArea(0,dely,(int)((endx-startx+1)*charWidth),dely2,0,-dely);
\r
237 if (starty > oldendy) {
\r
238 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
240 drawPanel(gg,startx,endx,oldendy,endy,startx,starty,0);
\r
243 oldstarty = starty;
\r
246 } else if (oldstarty > starty) {
\r
248 // Vertical scrollbar up
\r
249 int dely = AlignmentUtil.getPixelHeight(endy,oldendy,charHeight);
\r
250 int dely2 = AlignmentUtil.getPixelHeight(oldstarty,endy,charHeight);
\r
252 gg.copyArea(0,0,(int)((endx-startx+1)*charWidth),dely2,0,dely);
\r
254 if (oldstarty > endy) {
\r
255 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
257 drawPanel(gg,startx,endx,starty,oldstarty,startx,starty,0);
\r
260 oldstarty = starty;
\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
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
275 g.drawImage(img,0,0,this);
\r
282 public void drawPanel(Graphics g,int x1,int x2, int y1, int y2,int startx, int starty,int offset) {
\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
294 g.setFont(av.getFont());
\r
295 double charWidth = av.getCharWidth();
\r
296 int charHeight = av.getCharHeight();
\r
297 RendererI sr = av.getRenderer();
\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
306 if (sr instanceof SequenceRenderer)
\r
307 pid = AAFrequency.calculate(tmpseq,x1,x2);
\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
316 if (y2 > starty && y1 < av.getEndSeq())
\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
327 SequenceGroup group;
\r
328 for (int i = y1 ; i < y2 ;i++)
\r
331 /* if (av.getSelection().contains(av.getAlignment().getSequenceAt(i))) {
\r
333 System.out.println("use feature renderer");
\r
334 } else if ( i == 0) {
\r
336 } else if (av.getAlignment().getSequenceAt(i).getName().equals("CpG")) {
\r
338 System.out.println("cg renderer");
\r
341 nextSeq = av.getAlignment().getSequenceAt(i);
\r
342 group = av.alignment.findGroup( nextSeq );
\r
345 r.drawSequence(g, group.cs, nextSeq,
\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
356 r.drawSequence(g, cs, nextSeq,
\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
372 public int groupX, groupY, groupendX, groupendY;
\r
375 public void fillBackground(Graphics g,Color c, int x1,int y1,int width,int height) {
\r
377 g.fillRect(x1,y1,width,height);
\r
380 public int getChunkWidth() {
\r