X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=3bc9bc56f33848ec04e901519cc1d0199fb423fd;hb=b42085fdaf6dbfad35130446b99406d6f183ea5a;hp=120a062aa990402706f1537c6d411e7880714f2e;hpb=1ecf6419aba86993b3c223bf5ec0fa79427baf85;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 120a062..3bc9bc5 100755 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -4,15 +4,16 @@ import java.awt.*; import java.awt.event.*; import jalview.datamodel.*; import javax.swing.*; +import java.util.*; import jalview.schemes.*; +import jalview.analysis.*; public class SeqPanel extends JPanel { - public AlignmentI align; public SeqCanvas seqCanvas; - public AlignmentPanel parent; + public AlignmentPanel ap; protected int startres; protected int lastres; @@ -21,33 +22,78 @@ public class SeqPanel extends JPanel 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(); + // if character is inserted or deleted, we will need to recalculate the conservation + int seqEditOccurred = -1; - seqCanvas = new SeqCanvas(av); + ScrollThread scrollThread = null; + boolean mouseDragging = false; + + + public SeqPanel(AlignViewport avp, AlignmentPanel p) { + this.av = avp; + + seqCanvas = new SeqCanvas(avp); setLayout(new BorderLayout()); add(seqCanvas, BorderLayout.CENTER); - parent = p; + ap = p; addMouseMotionListener( new MouseMotionAdapter() { public void mouseMoved(MouseEvent evt) - { doMouseMoved(evt); } + { + if(av.getWrapAlignment()) + return; + doMouseMoved(evt); } + public void mouseDragged(MouseEvent evt) - { doMouseDragged(evt); } + { + if(av.getWrapAlignment()) + return; + if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown()) + doMouseDragged(evt); + else + doMouseDraggedDefineMode(evt); + } }); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) - { doMouseReleased(evt); } + { + if(av.getWrapAlignment()) + return; + if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown()) + doMouseReleased(evt); + else + doMouseReleasedDefineMode(evt); + } public void mousePressed(MouseEvent evt) - { doMousePressed(evt); } + { + if(av.getWrapAlignment()) + return; + if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown()) + doMousePressed(evt); + else + doMousePressedDefineMode(evt); + } + public void mouseExited(MouseEvent evt) + { + if (av.getWrapAlignment() || evt.isShiftDown() || evt.isAltDown() || + evt.isControlDown()) + return; + doMouseExitedDefineMode(evt); + + } + public void mouseEntered(MouseEvent evt) + { + if (av.getWrapAlignment() || evt.isShiftDown() || evt.isAltDown() || + evt.isControlDown()) + return; + doMouseEnteredDefineMode(evt); + } }); repaint(); @@ -57,32 +103,35 @@ public class SeqPanel extends JPanel public void doMouseReleased(MouseEvent evt) { int x = evt.getX(); - int res = (int)(x/av.getCharWidth()) + av.getStartRes(); + int res = x/av.getCharWidth() + av.getStartRes(); - endres = res; + 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; + startseq = -1; + startres = -1; + lastres = -1; + if(seqEditOccurred>-1) + updateConservation(seqEditOccurred); - parent.RefreshPanels(); - repaint(); + seqEditOccurred = -1; + + ap.repaint(); } public void doMousePressed(MouseEvent evt) { + ap.alignFrame.addHistoryItem("sequence edit"); 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(); + res = x/av.getCharWidth() + av.getStartRes(); + seq = y/av.getCharHeight() + av.getStartSeq(); - if (seq < align.getHeight() && res < align.getSequenceAt(seq).getLength()) + 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 @@ -90,16 +139,17 @@ public class SeqPanel extends JPanel startseq = seq; - if (startseq == (align.getHeight()-1)) { + if (startseq == (av.getAlignment().getHeight() - 1)) padseq = 1; - } else { + else padseq = 1; - } startres = res; lastres = res; - } else { + } + else + { startseq = -1; startres = -1; lastres = -1; @@ -110,127 +160,178 @@ public class SeqPanel extends JPanel 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(); + + } + else + { + res = x / av.getCharWidth() + av.getStartRes(); + seq = y / av.getCharHeight() + av.getStartSeq(); + } + - 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)+"" ) ; + SequenceI sequence = av.getAlignment().getSequenceAt(seq); + if(res>sequence.getLength()) + return; + + Object obj = ResidueProperties.aa2Triplet.get( sequence.getCharAt(res)+"" ) ; String aa = ""; if(obj!=null) aa = obj.toString(); - StringBuffer text = new StringBuffer("Sequence ID: "+av.getAlignment().getSequenceAt(seq).getName()); + StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+sequence.getName()); if(aa!="") text.append(" Residue: "+aa+" ("+ av.getAlignment().getSequenceAt(seq).findPosition(res)+")"); - parent.alignFrame.statusBar.setText(text.toString()); + ap.alignFrame.statusBar.setText(text.toString()); + + // use aa to see if the mouse pointer is on a + if( av.showSequenceFeatures) + { + Vector features = sequence.getSequenceFeatures(); + Enumeration e = features.elements(); + StringBuffer sbuffer = new StringBuffer(); + + + while (e.hasMoreElements()) + { + SequenceFeature sf = (SequenceFeature) e.nextElement(); + if (sf.getStart() <= sequence.findPosition(res) && + sf.getEnd() >= sequence.findPosition(res)) + { + if(sbuffer.length()>0) + sbuffer.append("; "); + sbuffer.append(sf.getType() + " " + sf.getDescription()); + if(sf.getStatus().length()>0) + sbuffer.append(" ("+sf.getStatus()+")"); + } + + } + + ToolTipManager.sharedInstance().registerComponent(this); + this.setToolTipText(sbuffer.toString()); + } + } public void doMouseDragged(MouseEvent evt) { // If we're dragging we're editing - editFlag = true; - int x = evt.getX(); + if(lastres==-1) + return; - int res = (int)(x/av.getCharWidth()) + av.getStartRes(); - if (res < 0) {res = 0;} + int x = evt.getX(); - if (res != lastres) { - if (startseq != -1) { + int res = x/av.getCharWidth() + av.getStartRes(); + if (res < 0) + res = 0; + if (res != lastres) + { // 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++) + if (evt.isAltDown() || evt.isControlDown()) + { + SequenceGroup sg = av.getSelectionGroup(); + if(sg==null) + av.getAlignment().findGroup(startseq); + if (sg != null) { - SequenceI s = (SequenceI)sg.getSequenceAt(i); - boolean found = false; - int sno = -1; - for (int k = 0; k < align.getHeight(); k++) + boolean deleteAllowed = false; + if (res < av.getAlignment().getWidth() && res < lastres) { - if (align.getSequenceAt(k) == s) - { - found = true; - sno = k; - break; - } - } - if (found && sno != -1) { - if (res < align.getWidth() && res > lastres) + /// Are we able to delete? + boolean allGaps = true; + for (int i = 0; i < sg.getSize(); i++) { - for (int j = lastres; j < res; j++) - insertChar(j,sno); + SequenceI s = sg.getSequenceAt(i); + for (int j = lastres-1; j >= res && allGaps; j--) + { + if (!jalview.util.Comparison.isGap(s.getSequence().charAt(j))) + { + res = j + 1; + allGaps = false; + } + } - int index = align.findIndex(s); - if (index != -1) - drawChars(index,index+1,lastres); + if(!deleteAllowed && allGaps) + deleteAllowed = true; + } + } + // drag to right + if (res < av.getAlignment().getWidth() && res > lastres) + sg.setEndRes(sg.getEndRes() + 1); - } 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); + // drag to left + else if (deleteAllowed && res < av.getAlignment().getWidth() && + res < lastres) + sg.setEndRes(sg.getEndRes() - 1); - } - } - } - lastres = res; - } else { - if (res < align.getWidth() && res > lastres) { - // dragging to the right - for (int j = lastres; j < res; j++) + for (int i = 0; i < sg.getSize(); i++) { - insertChar(j,startseq); - } - drawChars(startseq,startseq+1,lastres); + SequenceI s = sg.getSequenceAt(i); + int k = av.alignment.findIndex(s); - } else if (res < align.getWidth() && res < lastres) { + // drag to right + if (res < av.getAlignment().getWidth() && res > lastres) + for (int j = lastres; j < res; j++) + insertChar(j, k); + // drag to left + else if (deleteAllowed && res < av.getAlignment().getWidth() && res < lastres) + { + for (int j = res; j < lastres; j++) + { + deleteChar(j, k); + startres = res; + } + } + } + } + } + else /////Editing a single sequence/////////// + { + if (res < av.getAlignment().getWidth() && res > lastres) + { + // dragging to the right + for (int j = lastres; j < res; j++) + insertChar(j, startseq); + } + 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); + for (int j = res; j < lastres; j++) + { + deleteChar(j, startseq); + startres = res; + } } + } - } - lastres = res; + } + lastres = res; repaint(); - return; } public void drawChars(int seqstart, int seqend, int start) { @@ -240,34 +341,295 @@ public class SeqPanel extends JPanel public void insertChar(int j, int seq) { - align.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter().charAt(0)); + av.alignment.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter()); + seqEditOccurred=seq; + } + + public void deleteChar(int j, int seq) + { + + if ( jalview.util.Comparison.isGap( av.alignment.getSequenceAt(seq).getSequence().charAt(j))) + av.alignment.getSequenceAt(seq).deleteCharAt(j); + + av.alignment.getWidth(); + repaint(); + seqEditOccurred=seq; + } + + + void updateConservation(int i) + { + av.updateConservation(); + av.updateConsensus(); } - public void deleteChar(int j, int res, int sno) +////////////////////////////////////////// +/////Everything below this is for defining the boundary of the rubberband +////////////////////////////////////////// + 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; + + SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(seq); + + if(sequence==null || res>sequence.getLength()) + return; - 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(" ") ) + stretchGroup = av.getSelectionGroup(); + + if(stretchGroup == null) + { + stretchGroup = av.alignment.findGroup( sequence ); + if(stretchGroup!=null && res>stretchGroup.getStartRes() && resres + || stretchGroup.getEndRes()= res) + { + stretchGroup = allGroups[i]; + av.setSelectionGroup(stretchGroup); + break; + } + } + + if(stretchGroup==null) { - align.getSequenceAt(sno).deleteCharAt(j); + // define a new group here + SequenceGroup sg = new SequenceGroup(); + sg.setStartRes(res); + sg.setEndRes(res); + sg.addSequence( sequence ); + av.setSelectionGroup( sg ); + stretchGroup = sg; + + if(av.getConservationSelected()) + SliderPanel.setConservationSlider(ap, av.getGlobalColourScheme(), "Background"); + if(av.getAbovePIDThreshold()) + SliderPanel.setPIDSliderSource(ap, av.getGlobalColourScheme(), "Background"); + + } + else if( javax.swing.SwingUtilities.isRightMouseButton(evt)) + { + jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu( ap , null); + pop.show(this, evt.getX(), evt.getY()); + + // edit the properties of existing group + } + + if(stretchGroup!=null && stretchGroup.getEndRes()==res) + // Edit end res position of selected group + changeEndRes = true; + + else if(stretchGroup!=null && stretchGroup.getStartRes()==res) + // Edit end res position of selected group + changeStartRes = true; + + + repaint(); + + } + + boolean changeEndSeq = false; + boolean changeStartSeq = false; + boolean changeEndRes = false; + boolean changeStartRes = false; + SequenceGroup stretchGroup = null; + + public void doMouseReleasedDefineMode(MouseEvent evt) + { + mouseDragging = false; + + if(stretchGroup==null) + return; + + if(stretchGroup.cs instanceof ClustalxColourScheme) + { + stretchGroup.cs = new ClustalxColourScheme(stretchGroup.sequences, av.alignment.getWidth()); + repaint(); + } + + else if(stretchGroup.cs instanceof ConservationColourScheme) + { + ConservationColourScheme ccs = (ConservationColourScheme)stretchGroup.cs; + stretchGroup.cs = ccs; + SliderPanel.setConservationSlider(ap, stretchGroup.cs, stretchGroup.getName()) ; + + repaint(); + } + else + { + if(stretchGroup.cs !=null && stretchGroup.cs.canThreshold()) + { + ResidueColourScheme rcs = (ResidueColourScheme) stretchGroup.cs; + SliderPanel.setPIDSliderSource(ap, stretchGroup.cs, stretchGroup.getName()); + } + + } + + + changeEndRes = false; + changeStartRes = false; + stretchGroup = null; + ap.idPanel.repaint(); + } + + + boolean remove = false; + public void doMouseDraggedDefineMode(MouseEvent evt) + { + int res = evt.getX()/av.getCharWidth() + av.getStartRes(); + int y = evt.getY()/av.getCharHeight() + av.getStartSeq(); + + if(stretchGroup==null) + return; + + if(res>av.alignment.getWidth()) + res = av.alignment.getWidth()-1; + + + if(stretchGroup.getEndRes()==res) + // Edit end res position of selected group + changeEndRes = true; + + else if(stretchGroup.getStartRes()==res) + // Edit start res position of selected group + changeStartRes = true; + + + if(resav.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 && oldSeq>0 && y 0) + running = ap.scrollUp(true); + + if (mouseDragging && evt.getY() >= getHeight() && + av.alignment.getHeight() > av.getEndSeq()) + running = ap.scrollUp(false); + + if (mouseDragging && evt.getX() < 0) + running = ap.scrollRight(true); + + else if (mouseDragging && evt.getX() >= getWidth()) + running = ap.scrollRight(false); + } + + try + { + Thread.sleep(75); + } + catch (Exception ex) + {} + } + } +} + }