import jalview.datamodel.*;\r
import javax.swing.*;\r
import jalview.schemes.*;\r
+import jalview.analysis.*;\r
\r
\r
public class SeqPanel extends JPanel\r
{\r
\r
- public AlignmentI align;\r
public SeqCanvas seqCanvas;\r
public AlignmentPanel parent;\r
\r
public boolean editFlag;\r
protected AlignViewport av;\r
\r
- public SeqPanel(AlignViewport av, AlignmentPanel p) {\r
- this.av = av;\r
- this.align = av.getAlignment();\r
+ // if character is inserted or deleted, we will need to recalculate the conservation\r
+ int seqEditOccurred = -1;\r
\r
- seqCanvas = new SeqCanvas(av);\r
+ public SeqPanel(AlignViewport avp, AlignmentPanel p) {\r
+ this.av = avp;\r
+\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
+ endres = res;\r
\r
// This is to detect edits - we're at the end of an edit if mouse is up\r
- editFlag = false;\r
- startseq = -1;\r
- startres = -1;\r
- lastres = -1;\r
+ editFlag = false;\r
+ startseq = -1;\r
+ startres = -1;\r
+ lastres = -1;\r
+ if(seqEditOccurred>-1)\r
+ updateConservation(seqEditOccurred);\r
+\r
+ seqEditOccurred = -1;\r
\r
parent.RefreshPanels();\r
repaint();\r
}\r
\r
public void doMousePressed(MouseEvent evt) {\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 < align.getHeight() && res < align.getSequenceAt(seq).getLength())\r
+ if (seq < av.getAlignment().getHeight() && res < av.getAlignment().getSequenceAt(seq).getLength())\r
{\r
//char resstr = align.getSequenceAt(seq).getSequence().charAt(res);\r
// Find the residue's position in the sequence (res is the position\r
\r
startseq = seq;\r
\r
- if (startseq == (align.getHeight()-1)) {\r
+ if (startseq == (av.getAlignment().getHeight()-1)) {\r
padseq = 1;\r
} else {\r
padseq = 1;\r
\r
public void doMouseMoved(MouseEvent evt)\r
{\r
+ int res=0, seq=0;\r
+ int x = evt.getX();\r
+ int y = evt.getY();\r
+ if(av.wrapAlignment)\r
+ {\r
+ y -= 2*av.charHeight;\r
+ int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight;\r
+\r
+\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
+ seq = y / av.getCharHeight() + av.getStartSeq();\r
+\r
+ // chunkHeight = (da.getHeight() + 2)*charHeight;\r
+ // startx += chunkWidth;\r
+ }\r
+ else\r
+ {\r
+ res = x / av.getCharWidth() + av.getStartRes();\r
+ seq = y / av.getCharHeight() + av.getStartSeq();\r
+ }\r
+\r
\r
- int res = (int)(evt.getX()/av.getCharWidth()) + av.getStartRes();\r
- int seq = (evt.getY())/av.getCharHeight() + av.getStartSeq();\r
if(seq>=av.getAlignment().getHeight())\r
return;\r
\r
if(obj!=null)\r
aa = obj.toString();\r
\r
- StringBuffer text = new StringBuffer("Sequence " +seq+" ID: "+av.getAlignment().getSequenceAt(seq).getName());\r
+ StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+av.getAlignment().getSequenceAt(seq).getName());\r
if(aa!="")\r
text.append(" Residue: "+aa+" ("+ av.getAlignment().getSequenceAt(seq).findPosition(res)+")");\r
\r
public void doMouseDragged(MouseEvent evt) {\r
// If we're dragging we're editing\r
editFlag = true;\r
-\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
\r
// Group editing\r
if (av.getGroupEdit()) {\r
- SequenceGroup sg = align.findGroup(startseq);\r
+ SequenceGroup sg = av.getAlignment().findGroup(startseq);\r
\r
- if (res < align.getWidth() && res < lastres) {\r
+ if(sg!=null)\r
+ if (res < av.getAlignment().getWidth() && res < lastres)\r
+ {\r
boolean flag = false;\r
- for (int i= 0 ; i < sg.getSize(); i++) {\r
+ for (int i= 0 ; i < sg.getSize(); i++)\r
+ {\r
SequenceI s = (SequenceI)sg.getSequenceAt(i);\r
- for (int j=lastres-1; j >= res; j--) {\r
- if (!flag) {\r
- if (!s.getSequence().substring(j,j+1).equals(align.getGapCharacter()) &&\r
- !s.getSequence().substring(j,j+1).equals(" ")) {\r
+ for (int j=lastres-1; j >= res; j--)\r
+ {\r
+ if (!flag)\r
+ {\r
+ if (s.getSequence().charAt(j)!=av.getAlignment().getGapCharacter() &&\r
+ s.getSequence().charAt(j)==' ')\r
+ {\r
res = j+1;\r
- System.out.print("\07");\r
- System.out.flush();\r
flag = true;\r
}\r
}\r
}\r
}\r
\r
+ if(sg!=null)\r
for (int i= 0 ; i < sg.getSize(); i++)\r
{\r
SequenceI s = (SequenceI)sg.getSequenceAt(i);\r
boolean found = false;\r
int sno = -1;\r
- for (int k = 0; k < align.getHeight(); k++)\r
+ for (int k = 0; k < av.getAlignment().getHeight(); k++)\r
{\r
- if (align.getSequenceAt(k) == s)\r
+ if (av.getAlignment().getSequenceAt(k) == s)\r
{\r
found = true;\r
sno = k;\r
}\r
}\r
if (found && sno != -1) {\r
- if (res < align.getWidth() && res > lastres)\r
+ if (res < av.getAlignment().getWidth() && res > lastres)\r
{\r
for (int j = lastres; j < res; j++)\r
insertChar(j,sno);\r
\r
- int index = align.findIndex(s);\r
+ int index = av.getAlignment().findIndex(s);\r
if (index != -1)\r
drawChars(index,index+1,lastres);\r
\r
\r
- } else if (res < align.getWidth() && res < lastres)\r
+ } else if (res < av.getAlignment().getWidth() && res < lastres)\r
{\r
for (int j = res; j < lastres; j++)\r
{\r
deleteChar(j,res,sno);\r
startres = res;\r
}\r
- int index = align.findIndex(s);\r
+ int index = av.getAlignment().findIndex(s);\r
if (index != -1)\r
drawChars(index,index+1,res);\r
\r
} else {\r
\r
\r
- if (res < align.getWidth() && res > lastres) {\r
+ if (res < av.getAlignment().getWidth() && res > lastres) {\r
// dragging to the right\r
for (int j = lastres; j < res; j++)\r
- {\r
insertChar(j,startseq);\r
- }\r
+\r
drawChars(startseq,startseq+1,lastres);\r
\r
- } else if (res < align.getWidth() && res < lastres) {\r
+ } else if (res < av.getAlignment().getWidth() && res < lastres)\r
+ {\r
\r
// dragging to the left\r
for (int j = res; j < lastres; j++) {\r
\r
public void insertChar(int j, int seq)\r
{\r
- align.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter().charAt(0));\r
+ av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter());\r
+ seqEditOccurred=seq;\r
}\r
\r
- public void deleteChar(int j, int res, int sno)\r
+ public void deleteChar(int j, int res, int seq)\r
{\r
\r
- if (align.getSequenceAt(sno).getSequence().substring(j,j+1).equals(".") ||\r
- align.getSequenceAt(sno).getSequence().substring(j,j+1).equals("-") ||\r
- align.getSequenceAt(sno).getSequence().substring(j,j+1).equals(" ") )\r
+ if (av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='.' ||\r
+ av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='-' ||\r
+ av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)==' ' )\r
{\r
- align.getSequenceAt(sno).deleteCharAt(j);\r
+ av.getAlignment().getSequenceAt(seq).deleteCharAt(j);\r
}\r
\r
- align.getWidth();\r
+ av.getAlignment().getWidth();\r
repaint();\r
+ seqEditOccurred=seq;\r
+ }\r
+\r
+\r
+ void updateConservation(int i)\r
+ {\r
+ Alignment al = (Alignment) av.getAlignment();\r
+ SequenceGroup sg = av.alignment.findGroup( al.getSequenceAt(i));\r
+ if(sg==null || !(sg.cs instanceof ConservationColourScheme))\r
+ return;\r
+\r
+ Conservation c = sg.getConservation();\r
+\r
+ c = new Conservation("All", al.cons,\r
+ ResidueProperties.propHash, 3, sg.sequences, 0,\r
+ al.getWidth());\r
+ c.calculate();\r
+ c.verdict(false, 100);\r
+ sg.setConservation(c);\r
+ ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
+ ccs.conserve = c;\r
}\r
\r
- public void setColourScheme(ColourSchemeI cs)\r
+\r
+ public void setColourScheme(ColourSchemeI cs, boolean showConservation)\r
{\r
- seqCanvas.cs = cs;\r
- seqCanvas.paintFlag = true;\r
+ seqCanvas.paintFlag = true;\r
+ if (av.getSelection().size() == 0)\r
+ {\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
+ sg.cs = cs;\r
+ if(!showConservation\r
+ && !(sg.cs instanceof Blosum62ColourScheme)\r
+ && sg.cs instanceof ConservationColourScheme)\r
+ {\r
+ // remove ConservationColouring from existing Conservation group\r
+ ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
+ sg.cs = ccs.cs;\r
+ }\r
+ else if(showConservation && !(sg.cs instanceof ConservationColourScheme))\r
+ {\r
+ // add ConservationColouring to new group\r
+ Conservation c = sg.getConservation();\r
+ Alignment al = (Alignment) av.getAlignment();\r
+ c = new Conservation("All", al.cons,\r
+ ResidueProperties.propHash, 3, sg.sequences, 0,\r
+ al.getWidth() );\r
+ c.calculate();\r
+ c.verdict(false, 100);\r
+ sg.setConservation(c);\r
+ sg.cs = new ConservationColourScheme(sg);\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ SequenceGroup sg = av.alignment.findGroup((Sequence)av.sel.sequenceAt(0));\r
+\r
+ if( isNewSelection(sg) )\r
+ {\r
+ sg = av.getAlignment().addGroup();\r
+ for (int i=0; i < av.getSelection().size(); i++)\r
+ {\r
+ av.alignment.removeFromGroup(av.alignment.findGroup( (Sequence) av.\r
+ sel.sequenceAt(i)),\r
+ (Sequence) av.sel.sequenceAt(i));\r
+ av.alignment.addToGroup(sg, (Sequence) av.sel.sequenceAt(i));\r
+ }\r
+ }\r
+\r
+\r
+ sg.cs = cs;\r
+\r
+ // Selection is made, we only want to change the conservationColour for selected group\r
+ if( showConservation\r
+ && !(sg.cs instanceof ConservationColourScheme)\r
+ && !(sg.cs instanceof Blosum62ColourScheme))\r
+ {\r
+ Conservation c = sg.getConservation();\r
+ Alignment al = (Alignment) av.getAlignment();\r
+\r
+ c = new Conservation("All", al.cons,\r
+ ResidueProperties.propHash, 3, sg.sequences, 0,\r
+ al.getWidth() );\r
+ c.calculate();\r
+ c.verdict(false, 100);\r
+ sg.setConservation(c);\r
+ sg.cs = new ConservationColourScheme(sg);\r
+ }\r
+ else if( !showConservation && sg.cs instanceof ConservationColourScheme)\r
+ {\r
+ ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
+ sg.cs = ccs.cs;\r
+ }\r
+ }\r
repaint();\r
}\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
+ for(int i=0; i<sg.getSize(); i++)\r
+ if( !av.getSelection().contains( sg.getSequenceAt(i) ))\r
+ return true;\r
+\r
+ return false;\r
+ }\r
+\r
+\r
public ColourSchemeI getColourScheme()\r
{\r
- return seqCanvas.cs;\r
+ if(av.getSelection().size()>0)\r
+ return av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)).cs;\r
+ else\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