package jalview.gui; import java.awt.*; import java.awt.event.*; import jalview.datamodel.*; import javax.swing.*; import jalview.schemes.*; import jalview.analysis.*; public class SeqPanel extends JPanel { public SeqCanvas seqCanvas; public AlignmentPanel parent; protected int startres; protected int lastres; protected int endres; protected int startseq; protected int padseq; public boolean editFlag; protected AlignViewport av; // if character is inserted or deleted, we will need to recalculate the conservation int seqEditOccurred = -1; public SeqPanel(AlignViewport avp, AlignmentPanel p) { this.av = avp; seqCanvas = new SeqCanvas(avp); setLayout(new BorderLayout()); add(seqCanvas, BorderLayout.CENTER); parent = p; addMouseMotionListener( new MouseMotionAdapter() { public void mouseMoved(MouseEvent evt) { doMouseMoved(evt); } public void mouseDragged(MouseEvent evt) { if(evt.isShiftDown() || evt.isControlDown()) doMouseDragged(evt); else doMouseDraggedDefineMode(evt); } }); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { if(evt.isShiftDown() || evt.isControlDown()) doMouseReleased(evt); else doMouseReleasedDefineMode(evt); } public void mousePressed(MouseEvent evt) { if(evt.isShiftDown() || evt.isControlDown()) doMousePressed(evt); else doMousePressedDefineMode(evt); } }); repaint(); } public void doMouseReleased(MouseEvent evt) { int x = evt.getX(); int res = x/av.getCharWidth() + av.getStartRes(); endres = res; // This is to detect edits - we're at the end of an edit if mouse is up editFlag = false; startseq = -1; startres = -1; lastres = -1; if(seqEditOccurred>-1) updateConservation(seqEditOccurred); seqEditOccurred = -1; parent.RefreshPanels(); repaint(); } public void doMousePressed(MouseEvent evt) { parent.alignFrame.addHistoryItem("sequence edit"); int seq; int res; int x = evt.getX(); int y = evt.getY(); res = x/av.getCharWidth() + av.getStartRes(); seq = y/av.getCharHeight() + av.getStartSeq(); if (seq < av.getAlignment().getHeight() && res < av.getAlignment().getSequenceAt(seq).getLength()) { //char resstr = align.getSequenceAt(seq).getSequence().charAt(res); // Find the residue's position in the sequence (res is the position // in the alignment startseq = seq; if (startseq == (av.getAlignment().getHeight()-1)) { padseq = 1; } else { padseq = 1; } startres = res; lastres = res; } else { startseq = -1; startres = -1; lastres = -1; } return; } public void doMouseMoved(MouseEvent evt) { int res=0, seq=0; int x = evt.getX(); int y = evt.getY(); if(av.wrapAlignment) { y -= 2*av.charHeight; int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight; res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + x/av.getCharWidth() + av.getStartRes(); y %= chunkHeight; seq = y / av.getCharHeight() + av.getStartSeq(); // chunkHeight = (da.getHeight() + 2)*charHeight; // startx += chunkWidth; } else { res = x / av.getCharWidth() + av.getStartRes(); seq = y / av.getCharHeight() + av.getStartSeq(); } if(seq>=av.getAlignment().getHeight()) return; Object obj = ResidueProperties.aa2Triplet.get( av.getAlignment().getSequenceAt(seq).getCharAt(res)+"" ) ; String aa = ""; if(obj!=null) aa = obj.toString(); StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+av.getAlignment().getSequenceAt(seq).getName()); if(aa!="") text.append(" Residue: "+aa+" ("+ av.getAlignment().getSequenceAt(seq).findPosition(res)+")"); parent.alignFrame.statusBar.setText(text.toString()); } public void doMouseDragged(MouseEvent evt) { // If we're dragging we're editing editFlag = true; int x = evt.getX(); int res = x/av.getCharWidth() + av.getStartRes(); if (res < 0) {res = 0;} if (res != lastres) { if (startseq != -1) { // Group editing if (evt.isControlDown()) { SequenceGroup sg = av.getAlignment().findGroup(startseq); if(sg!=null) if (res < av.getAlignment().getWidth() && res < lastres) { boolean flag = false; for (int i= 0 ; i < sg.getSize(); i++) { SequenceI s = (SequenceI)sg.getSequenceAt(i); for (int j=lastres-1; j >= res; j--) { if (!flag) { if (s.getSequence().charAt(j)!=av.getAlignment().getGapCharacter() && s.getSequence().charAt(j)==' ') { res = j+1; flag = true; } } } } } if(sg!=null) for (int i= 0 ; i < sg.getSize(); i++) { SequenceI s = (SequenceI)sg.getSequenceAt(i); boolean found = false; int sno = -1; for (int k = 0; k < av.getAlignment().getHeight(); k++) { if (av.getAlignment().getSequenceAt(k) == s) { found = true; sno = k; break; } } if (found && sno != -1) { if (res < av.getAlignment().getWidth() && res > lastres) { for (int j = lastres; j < res; j++) insertChar(j,sno); int index = av.getAlignment().findIndex(s); if (index != -1) drawChars(index,index+1,lastres); } else if (res < av.getAlignment().getWidth() && res < lastres) { for (int j = res; j < lastres; j++) { deleteChar(j,res,sno); startres = res; } int index = av.getAlignment().findIndex(s); if (index != -1) drawChars(index,index+1,res); } } } lastres = res; } else { if (res < av.getAlignment().getWidth() && res > lastres) { // dragging to the right for (int j = lastres; j < res; j++) insertChar(j,startseq); drawChars(startseq,startseq+1,lastres); } else if (res < av.getAlignment().getWidth() && res < lastres) { // dragging to the left for (int j = res; j < lastres; j++) { deleteChar(j,res,startseq); startres = res; } drawChars(startseq,startseq+1,res); } } } lastres = res; } repaint(); return; } public void drawChars(int seqstart, int seqend, int start) { seqCanvas.drawPanel(seqCanvas.gg, start,av.getEndRes(),seqstart,seqend,av.getStartRes(),av.getStartSeq(),0); repaint(); } public void insertChar(int j, int seq) { av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter()); seqEditOccurred=seq; } public void deleteChar(int j, int res, int seq) { if (av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='.' || av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)=='-' || av.getAlignment().getSequenceAt(seq).getSequence().charAt(j)==' ' ) { av.getAlignment().getSequenceAt(seq).deleteCharAt(j); } av.getAlignment().getWidth(); repaint(); seqEditOccurred=seq; } void updateConservation(int i) { /* Alignment al = (Alignment) av.getAlignment(); SequenceGroup sg = av.alignment.findGroup( al.getSequenceAt(i)); if(sg==null || !(sg.cs instanceof ConservationColourScheme)) return; Conservation c = sg.getConservation(); c = new Conservation("All", al.cons, ResidueProperties.propHash, 3, sg.sequences, 0, al.getWidth()); c.calculate(); c.verdict(false, 100); sg.setConservation(c); ConservationColourScheme ccs = (ConservationColourScheme)sg.cs; ccs.conserve = c;*/ } int oldSeq = -1; public void doMousePressedDefineMode(MouseEvent evt) { int res = evt.getX()/av.getCharWidth() + av.getStartRes(); int seq = evt.getY()/av.getCharHeight() + av.getStartSeq(); oldSeq = seq; stretchGroup = av.getRubberbandGroup(); if(stretchGroup == null) stretchGroup = av.alignment.findGroup((Sequence)av.getAlignment().getSequenceAt(seq)); else if(!stretchGroup.sequences.contains((Sequence)av.getAlignment().getSequenceAt(seq)) || stretchGroup.getStartRes()>res || stretchGroup.getEndRes()av.getEndRes()) res = av.getEndRes(); if(changeEndRes) { if(res>stretchGroup.getStartRes()-1) stretchGroup.setEndRes( res ); } else if(changeStartRes) { if(res oldSeq) dragDirection = 1; else if (y < oldSeq) dragDirection = -1; while (y != oldSeq) { // This routine ensures we don't skip any sequences, as the // selection is quite slow. Sequence seq = (Sequence) av.getAlignment().getSequenceAt(oldSeq); oldSeq += dragDirection; Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq); if (stretchGroup.sequences.contains(nextSeq)) { stretchGroup.deleteSequence(seq); stretchGroup.deleteSequence(nextSeq); } else { stretchGroup.addSequence(seq); stretchGroup.addSequence(nextSeq); } } oldSeq = y; seqCanvas.paintFlag = true; repaint(); } }