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
24 public boolean paintFlag = false;
\r
26 boolean showScores = false;
\r
27 boolean displaySearch = false;
\r
28 int [] searchResults = null;
\r
33 ColourSchemeI cs = new ZappoColourScheme();
\r
35 public SeqCanvas(AlignViewport av)
\r
38 setLayout(new BorderLayout());
\r
41 public void drawScale(int startx, int endx,double charWidth, int charHeight,int ypos) {
\r
42 int scalestartx = startx - startx%10 + 10;
\r
44 gg.setColor(Color.black);
\r
46 for (int i=scalestartx;i < endx;i+= 10) {
\r
47 String string = String.valueOf(i);
\r
48 gg.drawString(string,(int)((i-startx-1)*charWidth),ypos+15 - charHeight*(2));
\r
54 * Definitions of startx and endx (hopefully):
\r
55 * SMJS This is what I'm working towards!
\r
56 * startx is the first residue (starting at 0) to display.
\r
57 * endx is the last residue to display (starting at 0).
\r
58 * starty is the first sequence to display (starting at 0).
\r
59 * endy is the last sequence to display (starting at 0).
\r
60 * NOTE 1: The av limits are set in setFont in this class and
\r
61 * in the adjustment listener in SeqPanel when the scrollbars move.
\r
64 public void paintComponent(Graphics g) {
\r
66 AlignmentI da = av.getAlignment();
\r
69 imgWidth != getWidth() ||
\r
70 imgHeight != getHeight()
\r
74 imgWidth = (getWidth() > 0 ? getWidth() : 1);
\r
75 imgHeight = (getHeight() > 0 ? getHeight() : 1);
\r
77 img = createImage(imgWidth,imgHeight);
\r
78 gg = img.getGraphics();
\r
80 gg.setFont(av.getFont());
\r
89 int startx = av.getStartRes();
\r
90 int starty = av.getStartSeq();
\r
92 int endx = av.getEndRes();
\r
93 int endy = av.getEndSeq();
\r
95 double charWidth = av.getCharWidth();
\r
96 int charHeight = av.getCharHeight();
\r
98 chunkWidth = (int)(getWidth()/charWidth);
\r
99 chunkHeight = (da.getHeight() + 2)*charHeight;
\r
101 av.setChunkHeight(chunkHeight);
\r
102 av.setChunkWidth(chunkWidth);
\r
104 int offy = av.getStartSeq();
\r
106 if (oldendx == -1) {
\r
107 fillBackground(gg,Color.WHITE,0,0,imgWidth,imgHeight);
\r
109 if (av.getWrapAlignment()) {
\r
110 startx = (int)(offy/chunkWidth)*chunkWidth;
\r
111 endx = startx + chunkWidth;
\r
112 starty = offy%chunkHeight;
\r
113 endy = starty + da.getHeight();
\r
116 int rowstart = starty;
\r
119 ypos = 2*charHeight;
\r
120 } else if (starty == 1) {
\r
125 if (endy > da.getHeight()) {
\r
126 endy = da.getHeight();
\r
129 if (endx > da.getWidth()) {
\r
130 endx = da.getWidth();
\r
133 if (rowstart < 2) {
\r
134 drawScale(startx,endx,charWidth,charHeight,ypos);
\r
137 drawPanel(gg,startx,endx,starty,endy,startx,starty,ypos);
\r
139 if (rowstart == 0) {
\r
140 ypos = ypos + chunkHeight;
\r
141 } else if (rowstart == 1) {
\r
142 ypos = ypos + chunkHeight;
\r
144 ypos = ypos + chunkHeight - rowstart*charHeight;
\r
147 startx += chunkWidth;
\r
148 endx = startx + chunkWidth;
\r
151 if (endx > da.getWidth()) {
\r
152 endx = da.getWidth();
\r
154 // Draw the rest of the panels
\r
156 while (ypos <= getHeight()) {
\r
157 drawScale(startx,endx,charWidth,charHeight,ypos);
\r
158 drawPanel(gg,startx,endx,0,da.getHeight(),startx,starty,ypos);
\r
160 ypos += chunkHeight;
\r
161 startx += chunkWidth;
\r
162 endx = startx + chunkWidth;
\r
164 if (endy > da.getHeight()) {
\r
165 endy = da.getHeight();
\r
168 if (endx > da.getWidth()) {
\r
169 endx = da.getWidth();
\r
176 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
178 oldstartx = startx;
\r
180 oldstarty = starty;
\r
186 else if (oldstartx < startx)
\r
188 // This is dragging horizontal scrollbar to the right
\r
190 int delx = (int)((startx - oldstartx) * charWidth);
\r
191 int delx2 = (int)((oldendx - startx + 1) * charWidth);
\r
193 gg.copyArea(delx,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),-delx,0);
\r
195 if (startx > oldendx)
\r
196 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
198 drawPanel(gg,oldendx+1,endx,starty,endy,startx,starty,0);
\r
201 oldstartx = startx;
\r
204 } else if (oldstartx > startx)
\r
206 // Horizontal scrollbar pulled to the left
\r
208 int delx = (int)((oldstartx - startx) * charWidth);
\r
209 int delx2 = (int)((endx - oldstartx +1) * charWidth);
\r
211 gg.copyArea(0,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),delx,0);
\r
213 if (oldstartx > endx) {
\r
214 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
216 drawPanel(gg,startx,oldstartx-1,starty,endy,startx,starty,0);
\r
219 oldstartx = startx;
\r
222 } else if (oldstarty < starty) {
\r
223 // Vertical scrollbar down
\r
224 int dely = AlignmentUtil.getPixelHeight(oldstarty,starty,charHeight);
\r
225 int dely2 = AlignmentUtil.getPixelHeight(starty,oldendy,charHeight);
\r
227 gg.copyArea(0,dely,(int)((endx-startx+1)*charWidth),dely2,0,-dely);
\r
229 if (starty > oldendy) {
\r
230 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
232 drawPanel(gg,startx,endx,oldendy,endy,startx,starty,0);
\r
235 oldstarty = starty;
\r
238 } else if (oldstarty > starty) {
\r
240 // Vertical scrollbar up
\r
241 int dely = AlignmentUtil.getPixelHeight(endy,oldendy,charHeight);
\r
242 int dely2 = AlignmentUtil.getPixelHeight(oldstarty,endy,charHeight);
\r
244 gg.copyArea(0,0,(int)((endx-startx+1)*charWidth),dely2,0,dely);
\r
246 if (oldstarty > endy) {
\r
247 drawPanel(gg,startx,endx,starty,endy,startx,starty,0);
\r
249 drawPanel(gg,startx,endx,starty,oldstarty,startx,starty,0);
\r
252 oldstarty = starty;
\r
256 if ((oldendy -oldstarty) > (int)((getWidth() / av.getCharWidth()))) {
\r
257 System.out.println("LIMITS ERROR LIMITS ERROR");
\r
258 System.out.println("Corrds " + (oldendy-oldstarty) + " " + (int)(getWidth()/av.getCharWidth()) + " " + getWidth() + " " + av.getCharWidth());
\r
262 // gg.setColor(Color.red);
\r
263 // gg.drawRect( groupX, groupY, groupendX-groupX, groupendY-groupY );
\r
264 // gg.drawRect( groupX+1, groupY+1, groupendX-groupX-2, groupendY-groupY-2 );
\r
267 g.drawImage(img,0,0,this);
\r
274 public void drawPanel(Graphics g,int x1,int x2, int y1, int y2,int startx, int starty,int offset) {
\r
277 System.out.println("drawPanel called with g = " + g);
\r
278 System.out.println(" x1 = " + x1);
\r
279 System.out.println(" x2 = " + x2);
\r
280 System.out.println(" y1 = " + y1);
\r
281 System.out.println(" y2 = " + y2);
\r
282 System.out.println(" startx = " + startx);
\r
283 System.out.println(" starty = " + starty);
\r
286 g.setFont(av.getFont());
\r
287 double charWidth = av.getCharWidth();
\r
288 int charHeight = av.getCharHeight();
\r
289 RendererI sr = av.getRenderer();
\r
292 /*Vector pid = av.getConsensus(false);
\r
293 Vector tmpseq = new Vector();
\r
294 for (int i = 0; i < av.getAlignment().getHeight(); i++)
\r
295 if (!av.getSelection().contains(av.getAlignment().getSequenceAt(i)))
\r
296 tmpseq.addElement(av.getAlignment().getSequenceAt(i));
\r
298 if (sr instanceof SequenceRenderer)
\r
299 pid = AAFrequency.calculate(tmpseq,x1,x2);
\r
301 else if (sr instanceof GraphRenderer)
\r
302 pid = AAFrequency.calculatePID(av.getAlignment().getSequenceAt(0),
\r
303 av.getAlignment().getSequences(),
\r
304 av.getPIDWindow(),x1,x2);
\r
308 if (y2 > starty && y1 < av.getEndSeq())
\r
312 (int)((x1-startx)*charWidth),
\r
313 offset + AlignmentUtil.getPixelHeight(starty,y1,av.getCharHeight()),
\r
314 (int)((x2-x1+1)*charWidth),
\r
315 offset + AlignmentUtil.getPixelHeight(y1,y2,av.getCharHeight()));
\r
319 SequenceGroup group;
\r
320 for (int i = y1 ; i < y2 ;i++)
\r
322 /* if (av.getSelection().contains(av.getAlignment().getSequenceAt(i))) {
\r
324 System.out.println("use feature renderer");
\r
325 } else if ( i == 0) {
\r
327 } else if (av.getAlignment().getSequenceAt(i).getName().equals("CpG")) {
\r
329 System.out.println("cg renderer");
\r
332 nextSeq = av.getAlignment().getSequenceAt(i);
\r
333 group = av.alignment.findGroup( nextSeq );
\r
336 sr.drawSequence(g, group.cs, nextSeq,
\r
339 (int) ( (x1 - startx) * charWidth),
\r
340 offset + AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight()),
\r
341 charWidth, charHeight,
\r
342 false, group.getDisplayBoxes(), group.getDisplayText(), group.getColourText(),
\r
347 sr.drawSequence(g, cs, nextSeq,
\r
350 (int) ( (x1 - startx) * charWidth),
\r
351 offset + AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight()),
\r
352 charWidth,charHeight,
\r
353 showScores, av.getShowBoxes(), av.getShowText(), av.getColourText(),
\r
364 for(int r=0; r<searchResults.length; r+=3)
\r
366 int searchSeq = searchResults[r];
\r
367 int searchStart = searchResults[r+1];
\r
368 int searchEnd = searchResults[r+2];
\r
370 if (searchSeq >= y1 && searchSeq <= y2)
\r
372 SequenceRenderer ssr = (SequenceRenderer) sr;
\r
373 ssr.drawHighlightedText(g, av.getAlignment().getSequenceAt(searchSeq),
\r
376 (int) ( (searchStart - startx) * charWidth),
\r
378 AlignmentUtil.getPixelHeight(starty, searchSeq,
\r
390 // public int groupX, groupY, groupendX, groupendY;
\r
392 public void fillBackground(Graphics g,Color c, int x1,int y1,int width,int height) {
\r
394 g.fillRect(x1,y1,width,height);
\r
397 public int getChunkWidth() {
\r
401 public void highlightSearchResults(int [] results)
\r
403 // results are in the order sequence, startRes, endRes
\r
405 displaySearch = false;
\r
407 displaySearch = true;
\r
409 searchResults = results;
\r