\r
import java.awt.*;\r
import javax.swing.*;\r
-import java.util.*;\r
+import java.awt.event.*;\r
import jalview.datamodel.*;\r
import jalview.schemes.*;\r
import jalview.analysis.*;\r
\r
public class SeqCanvas extends JPanel\r
{\r
+ ColourSchemeI globalColorScheme = null;\r
Image img;\r
Graphics gg;\r
int imgWidth;\r
int chunkHeight;\r
int chunkWidth;\r
\r
- ColourSchemeI cs = new ZappoColourScheme();\r
\r
public SeqCanvas(AlignViewport av)\r
{\r
this.av = av;\r
setLayout(new BorderLayout());\r
+\r
}\r
\r
- public void drawScale(int startx, int endx,double charWidth, int charHeight,int ypos) {\r
+ public void drawScale(int startx, int endx,int charWidth, int charHeight,int ypos) {\r
int scalestartx = startx - startx%10 + 10;\r
\r
gg.setColor(Color.black);\r
int endx = av.getEndRes();\r
int endy = av.getEndSeq();\r
\r
- double charWidth = av.getCharWidth();\r
- int charHeight = av.getCharHeight();\r
+ int charWidth = av.getCharWidth();\r
+ int charHeight = av.getCharHeight();\r
\r
- chunkWidth = (int)(getWidth()/charWidth);\r
+ chunkWidth = getWidth()/charWidth;\r
chunkHeight = (da.getHeight() + 2)*charHeight;\r
\r
av.setChunkHeight(chunkHeight);\r
{\r
// This is dragging horizontal scrollbar to the right\r
\r
- int delx = (int)((startx - oldstartx) * charWidth);\r
- int delx2 = (int)((oldendx - startx + 1) * charWidth);\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
{\r
// Horizontal scrollbar pulled to the left\r
\r
- int delx = (int)((oldstartx - startx) * charWidth);\r
- int delx2 = (int)((endx - oldstartx +1) * charWidth);\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
int dely = AlignmentUtil.getPixelHeight(oldstarty,starty,charHeight);\r
int dely2 = AlignmentUtil.getPixelHeight(starty,oldendy,charHeight);\r
\r
- gg.copyArea(0,dely,(int)((endx-startx+1)*charWidth),dely2,0,-dely);\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
int dely = AlignmentUtil.getPixelHeight(endy,oldendy,charHeight);\r
int dely2 = AlignmentUtil.getPixelHeight(oldstarty,endy,charHeight);\r
\r
- gg.copyArea(0,0,(int)((endx-startx+1)*charWidth),dely2,0,dely);\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
oldendy = endy;\r
}\r
\r
- if ((oldendy -oldstarty) > (int)((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) + " " + (int)(getWidth()/av.getCharWidth()) + " " + getWidth() + " " + av.getCharWidth());\r
+ System.out.println("Corrds " + (oldendy-oldstarty) + " " + (getWidth()/av.getCharWidth()) + " " + getWidth() + " " + av.getCharWidth());\r
}\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
*/\r
\r
g.setFont(av.getFont());\r
- double charWidth = av.getCharWidth();\r
- int charHeight = av.getCharHeight();\r
+ int charWidth = av.getCharWidth();\r
+ int charHeight = av.getCharHeight();\r
RendererI sr = av.getRenderer();\r
\r
\r
{\r
fillBackground(g,\r
Color.WHITE,\r
- (int)((x1-startx)*charWidth),\r
+ (x1-startx)*charWidth,\r
offset + AlignmentUtil.getPixelHeight(starty,y1,av.getCharHeight()),\r
- (int)((x2-x1+1)*charWidth),\r
+ (x2-x1+1)*charWidth,\r
offset + AlignmentUtil.getPixelHeight(y1,y2,av.getCharHeight()));\r
}\r
\r
SequenceI nextSeq;\r
- SequenceGroup group;\r
+ SequenceGroup group=null;\r
+ boolean newGroup=false;\r
+ int sx, sy, ex, ey;\r
+ int oldStartX=0,oldEndX=0,oldY=0;\r
for (int i = y1 ; i < y2 ;i++)\r
{\r
- /* if (av.getSelection().contains(av.getAlignment().getSequenceAt(i))) {\r
- r = fr;\r
- System.out.println("use feature renderer");\r
- } else if ( i == 0) {\r
- // r = br;\r
- } else if (av.getAlignment().getSequenceAt(i).getName().equals("CpG")) {\r
- r = cgr;\r
- System.out.println("cg renderer");\r
- }\r
-*/\r
nextSeq = av.getAlignment().getSequenceAt(i);\r
- group = av.alignment.findGroup( nextSeq );\r
- if( group!=null )\r
- {\r
- sr.drawSequence(g, group.cs, nextSeq,\r
- x1,\r
- x2,\r
- (int) ( (x1 - startx) * charWidth),\r
- offset + AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight()),\r
- charWidth, charHeight,\r
- false, group.getDisplayBoxes(), group.getDisplayText(), group.getColourText(),\r
- null, i);\r
- }\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
+\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
+\r
+\r
+ if( group!=null )\r
{\r
- sr.drawSequence(g, cs, nextSeq,\r
- x1,\r
- x2,\r
- (int) ( (x1 - startx) * charWidth),\r
- offset + AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight()),\r
- charWidth,charHeight,\r
- showScores, av.getShowBoxes(), av.getShowText(), av.getColourText(),\r
- null, i);\r
\r
- }\r
+ g.setColor(Color.GREEN);\r
\r
+ sx = (group.getStartRes()-startx)*charWidth;\r
+ sy = offset + AlignmentUtil.getPixelHeight(starty, i, av.getCharHeight());\r
+ ex = (group.getEndRes()+1-startx)*charWidth;\r
+ ey = offset + AlignmentUtil.getPixelHeight(starty, i+1, av.getCharHeight());\r
\r
- }\r
\r
+ if (newGroup)\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
+ }\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
+ oldStartX = sx;\r
+ oldEndX = ex;\r
+ oldY = ey;\r
+\r
+ }\r
+\r
+ }\r
\r
+ /// Highlight search Results once all sequences have been drawn\r
if(displaySearch)\r
{\r
for(int r=0; r<searchResults.length; r+=3)\r
ssr.drawHighlightedText(g, av.getAlignment().getSequenceAt(searchSeq),\r
searchStart,\r
searchEnd,\r
- (int) ( (searchStart - startx) * charWidth),\r
+ (searchStart - startx) * charWidth,\r
offset +\r
AlignmentUtil.getPixelHeight(starty, searchSeq,\r
charHeight),\r
- (int) charWidth,\r
+ charWidth,\r
charHeight);\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
// if character is inserted or deleted, we will need to recalculate the conservation\r
int seqEditOccurred = -1;\r
\r
- public SeqPanel(AlignViewport av, AlignmentPanel p) {\r
- this.av = av;\r
+ public SeqPanel(AlignViewport avp, AlignmentPanel p) {\r
+ this.av = avp;\r
\r
- seqCanvas = new SeqCanvas(av);\r
+ seqCanvas = new SeqCanvas(avp);\r
setLayout(new BorderLayout());\r
add(seqCanvas, BorderLayout.CENTER);\r
\r
public void mouseMoved(MouseEvent evt)\r
{ doMouseMoved(evt); }\r
public void mouseDragged(MouseEvent evt)\r
- { doMouseDragged(evt); }\r
+ {\r
+ if(av.groupDefiningMode)\r
+ doMouseDraggedDefineMode(evt);\r
+ else\r
+ doMouseDragged(evt);\r
+ }\r
});\r
\r
addMouseListener( new MouseAdapter()\r
{\r
public void mouseReleased(MouseEvent evt)\r
- { doMouseReleased(evt); }\r
+ {\r
+ if(av.groupDefiningMode)\r
+ doMouseReleasedDefineMode(evt);\r
+ else\r
+ doMouseReleased(evt);\r
+ }\r
public void mousePressed(MouseEvent evt)\r
- { doMousePressed(evt); }\r
+ {\r
+ if(av.groupDefiningMode)\r
+ doMousePressedDefineMode(evt);\r
+ else\r
+ doMousePressed(evt);\r
+ }\r
\r
});\r
repaint();\r
public void doMouseReleased(MouseEvent evt) {\r
\r
int x = evt.getX();\r
- int res = (int)(x/av.getCharWidth()) + av.getStartRes();\r
+ int res = x/av.getCharWidth() + av.getStartRes();\r
\r
endres = res;\r
\r
}\r
\r
public void doMousePressed(MouseEvent evt) {\r
- parent.alignFrame.addHistoryItem("sequence edit");\r
+ parent.alignFrame.addHistoryItem("sequence edit");\r
int seq;\r
int res;\r
\r
int x = evt.getX();\r
int y = evt.getY();\r
\r
- res = (int)(x/av.getCharWidth()) + av.getStartRes();\r
- seq = (y)/av.getCharHeight() + av.getStartSeq();\r
+ res = x/av.getCharWidth() + av.getStartRes();\r
+ seq = y/av.getCharHeight() + av.getStartSeq();\r
\r
if (seq < av.getAlignment().getHeight() && res < av.getAlignment().getSequenceAt(seq).getLength())\r
{\r
int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight;\r
\r
\r
- res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + (int)(x/av.getCharWidth()) + av.getStartRes();\r
+ res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + x/av.getCharWidth() + av.getStartRes();\r
\r
System.out.println( ((y/chunkHeight)*(getWidth()/av.charWidth)) +" "+((x / av.getCharWidth()) + av.getStartRes()) );\r
y %= chunkHeight;\r
}\r
else\r
{\r
- res = (int) (x / av.getCharWidth()) + av.getStartRes();\r
+ res = x / av.getCharWidth() + av.getStartRes();\r
seq = y / av.getCharHeight() + av.getStartSeq();\r
}\r
\r
editFlag = true;\r
int x = evt.getX();\r
\r
- int res = (int)(x/av.getCharWidth()) + av.getStartRes();\r
+ int res = x/av.getCharWidth() + av.getStartRes();\r
if (res < 0) {res = 0;}\r
\r
if (res != lastres) {\r
seqCanvas.paintFlag = true;\r
if (av.getSelection().size() == 0)\r
{\r
- seqCanvas.cs = cs;\r
+ seqCanvas.globalColorScheme = cs;\r
for (int i = 0; i < av.alignment.getGroups().size();i++)\r
{\r
SequenceGroup sg = (SequenceGroup)av.alignment.getGroups().elementAt(i);\r
\r
boolean isNewSelection(SequenceGroup sg)\r
{\r
+ if(sg==null)\r
+ return true;\r
+\r
if(sg.getSize()!=av.getSelection().size())\r
return true;\r
\r
if(av.getSelection().size()>0)\r
return av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)).cs;\r
else\r
- return seqCanvas.cs;\r
+ return seqCanvas.globalColorScheme;\r
+ }\r
+\r
+ public void doMousePressedDefineMode(MouseEvent evt)\r
+ {\r
+ int res = evt.getX()/av.getCharWidth() + av.getStartRes();\r
+ int seq = evt.getY()/av.getCharHeight() + av.getStartSeq();\r
+\r
+ stretchGroup = av.alignment.findGroup((Sequence)av.getAlignment().getSequenceAt(seq));\r
+\r
+ if(stretchGroup!=null && stretchGroup.getEndRes()==res)\r
+ {\r
+ // Edit end res position of selected group\r
+ changeEndRes = true;\r
+ }\r
+ else if(stretchGroup!=null && stretchGroup.getStartRes()==res)\r
+ {\r
+ // Edit end res position of selected group\r
+ changeStartRes = true;\r
+ }\r
+\r
+\r
+ }\r
+\r
+ boolean changeEndRes = false;\r
+ boolean changeStartRes = false;\r
+ SequenceGroup stretchGroup = null;\r
+\r
+ public void doMouseReleasedDefineMode(MouseEvent evt)\r
+ {\r
+ changeEndRes = false;\r
+ changeStartRes = false;\r
+ }\r
+\r
+ public void doMouseDraggedDefineMode(MouseEvent evt)\r
+ {\r
+ int res = evt.getX()/av.getCharWidth() + av.getStartRes();\r
+ int seq = evt.getY()/av.getCharHeight() + av.getStartSeq();\r
+\r
+ if(res<av.getStartRes())\r
+ res = av.getStartRes();\r
+ else if(res>av.getEndRes())\r
+ res = av.getEndRes();\r
+\r
+ if(changeEndRes)\r
+ {\r
+ if(res>stretchGroup.getStartRes()-1)\r
+ stretchGroup.setEndRes( res );\r
+ }\r
+ else if(changeStartRes)\r
+ {\r
+ if(res<stretchGroup.getEndRes()+1)\r
+ stretchGroup.setStartRes( res );\r
+ }\r
+ seqCanvas.paintFlag = true;\r
+ repaint();\r
+\r
}\r
+\r
}\r
\r
\r
\r
import jalview.datamodel.*;\r
import jalview.schemes.*;\r
-\r
import java.awt.*;\r
import java.util.*;\r
\r
public class SequenceRenderer implements RendererI\r
{\r
+ AlignViewport av;\r
FontMetrics fm;\r
boolean renderGaps = true;\r
+ SequenceGroup currentSequenceGroup = null;\r
+ Color color;\r
+\r
+ public SequenceRenderer(AlignViewport av)\r
+ {\r
+ this.av = av;\r
+ }\r
+\r
\r
public void renderGaps(boolean b)\r
{\r
return c;\r
}\r
\r
+ public void drawSequence(Graphics g,SequenceI seq,SequenceGroup sg, int start, int end, int x1, int y1, int width, int height, Vector pid, int seqnum)\r
+ {\r
+ currentSequenceGroup = sg;\r
\r
- public void drawSequence(Graphics g,ColourSchemeI cs,SequenceI seq,int start, int end, int x1, int y1, double width, int height,boolean showScores, boolean displayBoxes, boolean displayText, boolean colourText,Vector freq, int seqnum) {\r
-\r
+ drawBoxes(g, seq, start, end, x1, y1, (int) width, height, pid);\r
\r
- if (displayBoxes)\r
- drawBoxes(g,cs,seq,start,end,x1,y1,(int)width, height,freq);\r
+ fm = g.getFontMetrics();\r
+ drawText(g,seq,start,end,x1,y1,(int)width,height);\r
\r
- if (displayText)\r
- {\r
- fm = g.getFontMetrics();\r
- drawText(g,cs,colourText,seq,start,end,x1,y1,(int)width,height);\r
- }\r
}\r
\r
- public void drawBoxes(Graphics g,ColourSchemeI cs, SequenceI seq,int start, int end, int x1, int y1, int width, int height,Vector freq) {\r
+ public void drawBoxes(Graphics g, SequenceI seq,int start, int end, int x1, int y1, int width, int height,Vector freq) {\r
int i = start;\r
int length = seq.getLength();\r
\r
int curStart = x1;\r
int curWidth = width;\r
\r
+ if(currentSequenceGroup!=null && currentSequenceGroup.getDisplayBoxes())\r
+ {\r
+ curStart = currentSequenceGroup.getStartRes();\r
+ curWidth = currentSequenceGroup.getEndRes();\r
+ }\r
+\r
// int threshold = 80;\r
\r
- while (i <= end && i < length) {\r
- Color c = getResidueBoxColour(cs,seq,i);\r
+ while (i <= end && i < length)\r
+ {\r
+ if(inCurrentSequenceGroup(i))\r
+ {\r
+ color = getResidueBoxColour(currentSequenceGroup.cs, seq, i);\r
+ }\r
+ else\r
+ color = getResidueBoxColour(av.getGlobalColourScheme(), seq, i);\r
\r
// Hashtable hash = (Hashtable)freq.elementAt(i-start);\r
// String s = (String)hash.get("maxResidue");\r
}\r
}*/\r
\r
- if (c != currentColor || c != null)\r
+ if (color != currentColor || color != null)\r
{\r
g.fillRect(x1+width*(curStart-start),y1,curWidth,height);\r
\r
- currentColor = c;\r
- g.setColor(c);\r
+ currentColor = color;\r
+ g.setColor(color);\r
\r
curStart = i;\r
curWidth = width;\r
g.fillRect(x1+width*(curStart-start),y1,curWidth,height);\r
}\r
\r
- public void drawText(Graphics g, ColourSchemeI cs, boolean colText, SequenceI seq,int start, int end, int x1, int y1, int width, int height)\r
+ public void drawText(Graphics g, SequenceI seq,int start, int end, int x1, int y1, int width, int height)\r
{\r
int pady = height/5;\r
int charOffset=0;\r
if(!renderGaps && (s=='-' || s=='.' || s==' '))\r
continue;\r
\r
- if (colText)\r
+\r
+ if (inCurrentSequenceGroup(i))\r
{\r
- Color c = getResidueBoxColour(cs, seq, i);\r
- g.setColor(c.darker());\r
+ if(!currentSequenceGroup.getDisplayText())\r
+ continue;\r
+\r
+ if(currentSequenceGroup.getColourText())\r
+ g.setColor(getResidueBoxColour(currentSequenceGroup.cs, seq, i).darker());\r
}\r
+ else\r
+ g.setColor(Color.black);\r
\r
charOffset = (width - fm.charWidth(s))/2;\r
-\r
-\r
g.drawString(String.valueOf(s), charOffset + x1 + width * (i - start), y1 + height - pady);\r
}\r
+\r
+\r
+ }\r
+\r
+ boolean inCurrentSequenceGroup(int res)\r
+ {\r
+ if(currentSequenceGroup==null)\r
+ return false;\r
+\r
+ return (currentSequenceGroup.getStartRes()<=res && currentSequenceGroup.getEndRes()>=res)?true:false;\r
}\r
\r
public void drawHighlightedText(Graphics g, SequenceI seq,int start, int end, int x1, int y1, int width, int height)\r