\r
public class SeqCanvas extends JPanel\r
{\r
- ColourSchemeI globalColorScheme = null;\r
Image img;\r
Graphics gg;\r
int imgWidth;\r
int imgHeight;\r
\r
AlignViewport av;\r
- int pady = 2;\r
- int oldstartx;\r
- int oldstarty;\r
- int oldendx;\r
- int oldendy;\r
+\r
public boolean paintFlag = false;\r
\r
boolean showScores = false;\r
{\r
this.av = av;\r
setLayout(new BorderLayout());\r
+ PaintRefresher.Register(this);\r
\r
}\r
\r
|| paintFlag)\r
{\r
\r
- imgWidth = (getWidth() > 0 ? getWidth() : 1);\r
- imgHeight = (getHeight() > 0 ? getHeight() : 1);\r
+ imgWidth = getWidth();\r
+ imgHeight = getHeight();\r
\r
img = createImage(imgWidth,imgHeight);\r
gg = img.getGraphics();\r
\r
gg.setFont(av.getFont());\r
\r
- oldstartx = -1;\r
- oldendx = -1;\r
- oldstarty = -1;\r
- oldendy = -1;\r
paintFlag = false;\r
}\r
\r
- int startx = av.getStartRes();\r
- int starty = av.getStartSeq();\r
-\r
- int endx = av.getEndRes();\r
- int endy = av.getEndSeq();\r
-\r
- int charWidth = av.getCharWidth();\r
- int charHeight = av.getCharHeight();\r
-\r
- chunkWidth = getWidth()/charWidth;\r
- chunkHeight = (da.getHeight() + 2)*charHeight;\r
+ chunkWidth = getWidth()/av.charWidth;\r
+ chunkHeight = (da.getHeight() + 2)*av.charHeight;\r
\r
av.setChunkHeight(chunkHeight);\r
av.setChunkWidth(chunkWidth);\r
\r
- int offy = av.getStartSeq();\r
\r
- if (oldendx == -1) {\r
- fillBackground(gg,Color.WHITE,0,0,imgWidth,imgHeight);\r
\r
- if (av.getWrapAlignment()) {\r
+ fillBackground(gg,Color.WHITE,0,0,imgWidth,imgHeight);\r
+\r
+ /* if (av.getWrapAlignment()) {\r
+ int offy = av.getStartSeq();\r
startx = (int)(offy/chunkWidth)*chunkWidth;\r
endx = startx + chunkWidth;\r
starty = offy%chunkHeight;\r
\r
}\r
}\r
- else\r
+ else*/\r
{\r
- drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
-\r
- oldstartx = startx;\r
- oldendx = endx;\r
- oldstarty = starty;\r
- oldendy = endy;\r
-\r
- }\r
- }\r
-\r
- else if (oldstartx < startx)\r
- {\r
- // This is dragging horizontal scrollbar to the right\r
-\r
- int delx = (startx - oldstartx) * charWidth;\r
- int delx2 = (oldendx - startx + 1) * charWidth;\r
-\r
- gg.copyArea(delx,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),-delx,0);\r
-\r
- if (startx > oldendx)\r
- drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
- else\r
- drawPanel(gg,oldendx+1,endx,starty,endy,startx,starty,0);\r
-\r
-\r
- oldstartx = startx;\r
- oldendx = endx;\r
-\r
- } else if (oldstartx > startx)\r
- {\r
- // Horizontal scrollbar pulled to the left\r
-\r
- int delx = (oldstartx - startx) * charWidth;\r
- int delx2 = (endx - oldstartx +1) * charWidth;\r
-\r
- gg.copyArea(0,0,delx2,AlignmentUtil.getPixelHeight(starty,endy,charHeight),delx,0);\r
-\r
- if (oldstartx > endx) {\r
- drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
- } else {\r
- drawPanel(gg,startx,oldstartx-1,starty,endy,startx,starty,0);\r
- }\r
-\r
- oldstartx = startx;\r
- oldendx = endx;\r
-\r
- } else if (oldstarty < starty) {\r
- // Vertical scrollbar down\r
- int dely = AlignmentUtil.getPixelHeight(oldstarty,starty,charHeight);\r
- int dely2 = AlignmentUtil.getPixelHeight(starty,oldendy,charHeight);\r
-\r
- gg.copyArea(0,dely,(endx-startx+1)*charWidth,dely2,0,-dely);\r
-\r
- if (starty > oldendy) {\r
- drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
- } else {\r
- drawPanel(gg,startx,endx,oldendy,endy,startx,starty,0);\r
- }\r
-\r
- oldstarty = starty;\r
- oldendy = endy;\r
-\r
- } else if (oldstarty > starty) {\r
-\r
- // Vertical scrollbar up\r
- int dely = AlignmentUtil.getPixelHeight(endy,oldendy,charHeight);\r
- int dely2 = AlignmentUtil.getPixelHeight(oldstarty,endy,charHeight);\r
-\r
- gg.copyArea(0,0,(endx-startx+1)*charWidth,dely2,0,dely);\r
-\r
- if (oldstarty > endy) {\r
- drawPanel(gg,startx,endx,starty,endy,startx,starty,0);\r
- } else {\r
- drawPanel(gg,startx,endx,starty,oldstarty,startx,starty,0);\r
+ drawPanel(gg,av.startRes,av.endRes,av.startSeq,av.endSeq,av.startRes,av.startSeq,0);\r
}\r
\r
- oldstarty = starty;\r
- oldendy = endy;\r
- }\r
\r
- if ((oldendy -oldstarty) > (getWidth() / av.getCharWidth())) {\r
+ /* if ((oldendy -oldstarty) > (getWidth() / av.getCharWidth())) {\r
System.out.println("LIMITS ERROR LIMITS ERROR");\r
System.out.println("Corrds " + (oldendy-oldstarty) + " " + (getWidth()/av.getCharWidth()) + " " + getWidth() + " " + av.getCharWidth());\r
- }\r
-\r
-\r
- // gg.setColor(Color.red);\r
- // gg.drawRect( groupX, groupY, groupendX-groupX, groupendY-groupY );\r
- // gg.drawRect( groupX+1, groupY+1, groupendX-groupX-2, groupendY-groupY-2 );\r
-\r
+ }*/\r
\r
g.drawImage(img,0,0,this);\r
\r
\r
public void drawPanel(Graphics g,int x1,int x2, int y1, int y2,int startx, int starty,int offset) {\r
\r
-/*\r
- Startx and starty appear to be the same as x1, y1, unless you find different\r
- x1 x2\r
- y1**************************************************\r
- * *\r
- * *\r
- * *\r
- * *\r
- **************************************************y2\r
-\r
-/*\r
- System.out.println("drawPanel called with g = " + g);\r
- System.out.println(" x1 = " + x1);\r
- System.out.println(" x2 = " + x2);\r
- System.out.println(" y1 = " + y1);\r
- System.out.println(" y2 = " + y2);\r
- System.out.println(" startx = " + startx);\r
- System.out.println(" starty = " + starty);\r
-*/\r
\r
g.setFont(av.getFont());\r
int charWidth = av.getCharWidth();\r
int charHeight = av.getCharHeight();\r
RendererI sr = av.getRenderer();\r
\r
-\r
/*Vector pid = av.getConsensus(false);\r
Vector tmpseq = new Vector();\r
for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
\r
*/\r
\r
- if (y2 > starty && y1 < av.getEndSeq())\r
+ /* if (y2 > starty && y1 < av.getEndSeq())\r
{\r
fillBackground(g,\r
- Color.WHITE,\r
+ Color.red,\r
(x1-startx)*charWidth,\r
offset + AlignmentUtil.getPixelHeight(starty,y1,av.getCharHeight()),\r
(x2-x1+1)*charWidth,\r
offset + AlignmentUtil.getPixelHeight(y1,y2,av.getCharHeight()));\r
- }\r
+ }*/\r
\r
SequenceI nextSeq;\r
SequenceGroup group=null;\r
- boolean newGroup=false;\r
- int sx, sy, ex, ey;\r
+ boolean inGroup=false; // are we in a defined group?\r
+ boolean inRB=false; //Are we in a rubberband group?\r
+ int sx=-1, sy=-1, ex=-1, ey=-1;\r
int oldStartX=0,oldEndX=0,oldY=0;\r
+ int oldRStartX=0,oldREndX=0,oldRY=0;\r
for (int i = y1 ; i < y2 ;i++)\r
{\r
nextSeq = av.getAlignment().getSequenceAt(i);\r
- if(group==null || group!=av.alignment.findGroup( nextSeq ))\r
- newGroup = true;\r
- else\r
- newGroup = false;\r
\r
- group = av.alignment.findGroup( nextSeq );\r
+ group = av.alignment.findGroup( nextSeq );\r
\r
- sr.drawSequence(g, nextSeq, group,x1,x2,\r
+ sr.drawSequence(g, nextSeq, group,x1,x2,\r
(x1 - startx) * charWidth,\r
offset + AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight()),\r
charWidth,charHeight,null, i);\r
if( group!=null )\r
{\r
\r
- g.setColor(Color.GREEN);\r
+ g.setColor(Color.lightGray);\r
\r
sx = (group.getStartRes()-startx)*charWidth;\r
sy = offset + AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight());\r
ey = offset + AlignmentUtil.getPixelHeight(starty, i+1, av.getCharHeight());\r
\r
\r
- if (newGroup)\r
+ if (!inGroup)\r
{\r
- g.drawLine(oldStartX, oldY, oldEndX, oldY); // Horizontal, bottom of old box\r
g.drawLine(sx, sy, ex, sy); // Horizontal, top of new box\r
+ inGroup=true;\r
}\r
\r
g.drawLine(sx, sy, sx, ey ); // vertical line, left hand side\r
oldY = ey;\r
\r
}\r
+ else if(inGroup)\r
+ {\r
+ g.setColor(Color.lightGray);\r
+ g.drawLine(oldStartX, oldY, oldEndX, oldY); // Horizontal, bottom of old box\r
+ }\r
+ else\r
+ inGroup = false;\r
+\r
+ group = av.getRubberbandGroup();\r
+ if( group != null && group.sequences.contains(nextSeq) )\r
+ {\r
+ g.setColor(Color.RED.brighter());\r
+ sx = (group.getStartRes() - startx) * charWidth;\r
+ sy = offset +\r
+ AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight());\r
+ ex = (group.getEndRes() + 1 - startx) * charWidth;\r
+ ey = offset +\r
+ AlignmentUtil.getPixelHeight(starty, i + 1, av.getCharHeight());\r
+\r
+ if (!inRB)\r
+ {\r
+\r
+ g.drawLine(sx, sy, ex, sy); // Horizontal, top of new box\r
+ inRB = true;\r
+ }\r
+\r
+ g.drawLine(sx, sy, sx, ey); // vertical line, left hand side\r
+ g.drawLine(ex, sy, ex, ey); // vertical line, right hand side\r
+ if (i == y2 - 1) // last line of alignment, seal the box\r
+ g.drawLine(sx, ey, ex, ey); // Horizontal, bottom of old box\r
+\r
+ oldRStartX = sx;\r
+ oldREndX = ex;\r
+ oldRY = ey;\r
+ }\r
+ else if(inRB)\r
+ {\r
+ g.setColor(Color.RED.brighter());\r
+ g.drawLine(oldRStartX, oldRY, oldREndX, oldRY); // Horizontal, bottom of old box\r
+ inRB = false;\r
+ }\r
+ else\r
+ inRB = false;\r
\r
}\r
\r
}\r
}\r
\r
-\r
-\r
-\r
- /*bg.drawImage(image,0,0,null);\r
- int size=width*height;\r
- int pixel, b, x,y;\r
- if(value!=0 )\r
- {\r
- if(painted!=null)\r
- {\r
- for(int i=0; i<size; i++)\r
- {\r
- if(painted[i] == value)\r
- {\r
- x = (i%width);\r
- y = (i-x)/width;\r
- pixel = buf.getRGB(x,y);\r
- b = pixel & 0x000000ff;\r
- pixel = (105<<24) | (0<<16)+32 | (0<<8)+32 | b;\r
- buf.setRGB(x,y,pixel);\r
- }\r
- }\r
-\r
- }\r
- else\r
- {\r
- for(int i=0; i<size; i++)\r
- {\r
- if(paintedShort[i] == value)\r
- {\r
- x = (i%width);\r
- y = (i-x)/width;\r
- pixel = buf.getRGB(x,y);\r
- b = pixel & 0x000000ff;\r
- pixel = (105<<24) | (0<<16) | (0<<8) | b;\r
- buf.setRGB(x,y,pixel);\r
- }\r
- }\r
- }\r
-\r
- }\r
- oldvalue = value;\r
- return (Image)buf;\r
-*/\r
-\r
}\r
\r
- // public int groupX, groupY, groupendX, groupendY;\r
-\r
public void fillBackground(Graphics g,Color c, int x1,int y1,int width,int height) {\r
g.setColor(c);\r
g.fillRect(x1,y1,width,height);\r