package jalview.gui; import java.awt.*; import java.awt.event.*; import jalview.datamodel.*; import javax.swing.*; import jalview.schemes.*; public class SeqPanel extends JPanel { public AlignmentI align; 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; public SeqPanel(AlignViewport av, AlignmentPanel p) { this.av = av; this.align = av.getAlignment(); seqCanvas = new SeqCanvas(av); setLayout(new BorderLayout()); add(seqCanvas, BorderLayout.CENTER); parent = p; addMouseMotionListener( new MouseMotionAdapter() { public void mouseMoved(MouseEvent evt) { doMouseMoved(evt); } public void mouseDragged(MouseEvent evt) { doMouseDragged(evt); } }); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { doMouseReleased(evt); } public void mousePressed(MouseEvent evt) { doMousePressed(evt); } }); repaint(); } public void doMouseReleased(MouseEvent evt) { int x = evt.getX(); int res = (int)(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; parent.RefreshPanels(); repaint(); } public void doMousePressed(MouseEvent evt) { int seq; int res; int x = evt.getX(); int y = evt.getY(); res = (int)(x/av.getCharWidth()) + av.getStartRes(); seq = (y)/av.getCharHeight() + av.getStartSeq(); if (seq < align.getHeight() && res < align.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 == (align.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 = (int)(evt.getX()/av.getCharWidth()) + av.getStartRes(); int seq = (evt.getY())/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 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 = (int)(x/av.getCharWidth()) + av.getStartRes(); if (res < 0) {res = 0;} if (res != lastres) { if (startseq != -1) { // Group editing if (av.getGroupEdit()) { SequenceGroup sg = align.findGroup(startseq); if (res < align.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().substring(j,j+1).equals(align.getGapCharacter()) && !s.getSequence().substring(j,j+1).equals(" ")) { res = j+1; System.out.print("\07"); System.out.flush(); flag = true; } } } } } 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 < align.getHeight(); k++) { if (align.getSequenceAt(k) == s) { found = true; sno = k; break; } } if (found && sno != -1) { if (res < align.getWidth() && res > lastres) { for (int j = lastres; j < res; j++) insertChar(j,sno); int index = align.findIndex(s); if (index != -1) drawChars(index,index+1,lastres); } else if (res < align.getWidth() && res < lastres) { for (int j = res; j < lastres; j++) { deleteChar(j,res,sno); startres = res; } int index = align.findIndex(s); if (index != -1) drawChars(index,index+1,res); } } } lastres = res; } else { if (res < align.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 < align.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) { align.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter().charAt(0)); } public void deleteChar(int j, int res, int sno) { if (align.getSequenceAt(sno).getSequence().substring(j,j+1).equals(".") || align.getSequenceAt(sno).getSequence().substring(j,j+1).equals("-") || align.getSequenceAt(sno).getSequence().substring(j,j+1).equals(" ") ) { align.getSequenceAt(sno).deleteCharAt(j); } align.getWidth(); repaint(); } public void setColourScheme(ColourSchemeI cs) { seqCanvas.cs = cs; seqCanvas.paintFlag = true; repaint(); } public ColourSchemeI getColourScheme() { return seqCanvas.cs; } }