X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=b48861a0d34130ece6a660e774363376a6d994bf;hb=2ba9716bbffe4b35f640f8a85be4b60fe5fb2fdd;hp=e2caa413a4ecb4624168a71c704f1d12fae8e89e;hpb=c027ac12ece3a0dd85ddb12af703ad39e5e46d7c;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index e2caa41..b48861a 100755 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -4,29 +4,33 @@ import java.awt.*; import java.awt.event.*; import jalview.datamodel.*; import javax.swing.*; +import java.util.*; import jalview.schemes.*; -import jalview.analysis.*; - +import jalview.analysis.Conservation; public class SeqPanel extends JPanel { public SeqCanvas seqCanvas; - public AlignmentPanel parent; + public AlignmentPanel ap; - protected int startres; protected int lastres; - protected int endres; - protected int startseq; - protected int padseq; + int startEdit=-1; + int endEdit=-1; - public boolean editFlag; protected AlignViewport av; // if character is inserted or deleted, we will need to recalculate the conservation int seqEditOccurred = -1; + ScrollThread scrollThread = null; + boolean mouseDragging = false; + + boolean editingSeqs = false; + boolean groupEditing = false; + + public SeqPanel(AlignViewport avp, AlignmentPanel p) { this.av = avp; @@ -34,16 +38,21 @@ public class SeqPanel extends JPanel 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) { - if(evt.isShiftDown() || evt.isControlDown()) + if(av.getWrapAlignment()) + return; + if( editingSeqs ) doMouseDragged(evt); else doMouseDraggedDefineMode(evt); @@ -54,18 +63,42 @@ public class SeqPanel extends JPanel { public void mouseReleased(MouseEvent evt) { - if(evt.isShiftDown() || evt.isControlDown()) + if(av.getWrapAlignment()) + return; + if(editingSeqs) doMouseReleased(evt); else doMouseReleasedDefineMode(evt); + } public void mousePressed(MouseEvent evt) { - if(evt.isShiftDown() || evt.isControlDown()) + if(av.getWrapAlignment()) + return; + if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown()) + { + if(evt.isAltDown() || evt.isControlDown()) + groupEditing = true; + + editingSeqs = true; doMousePressed(evt); + } else doMousePressedDefineMode(evt); } + public void mouseExited(MouseEvent evt) + { + if (av.getWrapAlignment() || editingSeqs) + return; + doMouseExitedDefineMode(evt); + + } + public void mouseEntered(MouseEvent evt) + { + if (av.getWrapAlignment() || editingSeqs) + return; + doMouseEnteredDefineMode(evt); + } }); repaint(); @@ -74,28 +107,23 @@ public class SeqPanel extends JPanel public void doMouseReleased(MouseEvent evt) { - int x = evt.getX(); - int res = x/av.getCharWidth() + av.getStartRes(); - - endres = res; + if(seqEditOccurred>-1) + editOccurred(seqEditOccurred); - // 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; + editingSeqs = false; + groupEditing = false; - parent.RefreshPanels(); - repaint(); - + ap.repaint(); } public void doMousePressed(MouseEvent evt) { - parent.alignFrame.addHistoryItem("sequence edit"); + + ap.alignFrame.addHistoryItem( new HistoryItem( + "Edit Sequence",av.alignment, HistoryItem.EDIT)); + int seq; int res; @@ -105,29 +133,21 @@ public class SeqPanel extends JPanel res = x/av.getCharWidth() + av.getStartRes(); seq = y/av.getCharHeight() + av.getStartSeq(); - if (seq < av.getAlignment().getHeight() && res < av.getAlignment().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 - // in the alignment - startseq = seq; - - if (startseq == (av.getAlignment().getHeight()-1)) { - padseq = 1; - } else { - padseq = 1; - } - - startres = res; lastres = res; - - } else { + } + else + { startseq = -1; - startres = -1; lastres = -1; } + startEdit = lastres; + endEdit = lastres; + return; } @@ -147,8 +167,6 @@ public class SeqPanel extends JPanel y %= chunkHeight; seq = y / av.getCharHeight() + av.getStartSeq(); - // chunkHeight = (da.getHeight() + 2)*charHeight; - // startx += chunkWidth; } else { @@ -160,126 +178,169 @@ public class SeqPanel extends JPanel 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 " +(seq+1)+" 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 we're dragging we're editing + int res = evt.getX() / av.getCharWidth() + av.getStartRes(); + if (res < 0) + res = 0; - int res = x/av.getCharWidth() + av.getStartRes(); - if (res < 0) {res = 0;} + if (lastres == -1 || lastres == res) + return; - if (res != lastres) { - if (startseq != -1) { + boolean dragRight = true; + if (res < av.getAlignment().getWidth() && res < lastres) + dragRight = false; - // Group editing - if (evt.isControlDown()) { - SequenceGroup sg = av.getAlignment().findGroup(startseq); - if(sg!=null) - if (res < av.getAlignment().getWidth() && res < lastres) + if (res != lastres) + { + // Group editing + if (groupEditing) + { + SequenceGroup sg = av.getSelectionGroup(); + if(sg==null) { - boolean flag = false; - for (int i= 0 ; i < sg.getSize(); i++) + lastres=-1; + return; + } + + // drag to right + if(dragRight) + sg.setEndRes(sg.getEndRes() + (res-lastres)); + + // drag to left + else { - SequenceI s = (SequenceI)sg.getSequenceAt(i); - for (int j=lastres-1; j >= res; j--) + /// Are we able to delete? + // ie are all columns blank? + boolean deleteAllowed = false; + for (int s = 0; s < sg.getSize(); s++) { - if (!flag) + SequenceI seq = sg.getSequenceAt(s); + for (int j=res; j lastres) + // Not a gap, block edit not valid + res=j+1; + deleteAllowed = false; + continue; + } + deleteAllowed = true; + } + } + + if(!deleteAllowed) { - for (int j = lastres; j < res; j++) - insertChar(j,sno); - - int index = av.getAlignment().findIndex(s); - if (index != -1) - drawChars(index,index+1,lastres); - + lastres = -1; + return; + } - } 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); + sg.setEndRes(sg.getEndRes() - (lastres-res)); + } - } - } - } - lastres = res; - } else { + for (int i = 0; i < sg.getSize(); i++) + { + SequenceI s = sg.getSequenceAt(i); + int k = av.alignment.findIndex(s); + // drag to right + if (dragRight) + for (int j = lastres; j < res; j++) + insertChar(j, k); - if (res < av.getAlignment().getWidth() && res > lastres) { + // drag to left + else + { + for (int j = res; j < lastres; j++) + { + if(s.getLength()>j) + deleteChar(res, k); + } + } + } + } + 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); + 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 = lastres; j > res; j--) + { + if( jalview.util.Comparison.isGap( + av.alignment.getSequenceAt(startseq).getSequence().charAt(res))) - drawChars(startseq,startseq+1,lastres); + deleteChar(res, startseq); + else + { - } else if (res < av.getAlignment().getWidth() && res < lastres) - { + break; + } + } + } - // dragging to the left - for (int j = res; j < lastres; j++) { - deleteChar(j,res,startseq); - startres = res; - } - drawChars(startseq,startseq+1,res); - } - } - } - lastres = res; + } } + endEdit = res; + lastres = res; repaint(); - return; } public void drawChars(int seqstart, int seqend, int start) { @@ -289,63 +350,104 @@ public class SeqPanel extends JPanel public void insertChar(int j, int seq) { - av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter()); + av.alignment.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter()); seqEditOccurred=seq; } - public void deleteChar(int j, int res, int seq) + public void deleteChar(int j, int seq) { + av.alignment.getSequenceAt(seq).deleteCharAt(j); + seqEditOccurred=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(); + av.alignment.getWidth(); repaint(); - seqEditOccurred=seq; } - void updateConservation(int i) + void editOccurred(int i) { - /* Alignment al = (Alignment) av.getAlignment(); - SequenceGroup sg = av.alignment.findGroup( al.getSequenceAt(i)); - if(sg==null || !(sg.cs instanceof ConservationColourScheme)) - return; + if(endEdit==startEdit) + { + ap.alignFrame.historyList.pop(); + ap.alignFrame.updateEditMenuBar(); + } + + av.updateConservation(); + av.updateConsensus(); + + // Y O Y CLUSTALX + ColourSchemeI cs = av.getGlobalColourScheme(); + if(cs instanceof ConservationColourScheme) + { + ConservationColourScheme ccs = (ConservationColourScheme) cs; + if(ccs.cs instanceof ClustalxColourScheme) + { + Conservation c = new Conservation("All", + ResidueProperties.propHash, 3, + av.alignment.getSequences(), 0, + av.alignment.getWidth() - 1); + c.calculate(); + c.verdict(false, av.ConsPercGaps); + + ClustalxColourScheme cxs = (ClustalxColourScheme)ccs.cs; + cxs.resetClustalX(av.alignment.getSequences(), av.alignment.getWidth()); + ccs = new ConservationColourScheme(c, cxs); + av.setGlobalColourScheme(ccs); + } + } - Conservation c = sg.getConservation(); + if(cs instanceof ClustalxColourScheme) + { + ((ClustalxColourScheme)cs).resetClustalX(av.alignment.getSequences(), + av.alignment.getWidth()); + av.setGlobalColourScheme(cs); + } - 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;*/ } +////////////////////////////////////////// +/////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; - stretchGroup = av.getRubberbandGroup(); + SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(seq); + + if(sequence==null || res>sequence.getLength()) + return; + + stretchGroup = av.getSelectionGroup(); if(stretchGroup == null) - stretchGroup = av.alignment.findGroup((Sequence)av.getAlignment().getSequenceAt(seq)); + { + 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) @@ -354,13 +456,19 @@ public class SeqPanel extends JPanel SequenceGroup sg = new SequenceGroup(); sg.setStartRes(res); sg.setEndRes(res); - sg.addSequence( (Sequence)av.getAlignment().getSequenceAt(seq) ); - av.setRubberbandGroup( sg ); + 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( parent , null); + jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu( ap , null); pop.show(this, evt.getX(), evt.getY()); // edit the properties of existing group @@ -374,11 +482,10 @@ public class SeqPanel extends JPanel // Edit end res position of selected group changeStartRes = true; + stretchGroup.getWidth(); - seqCanvas.paintFlag = true; repaint(); - } boolean changeEndSeq = false; @@ -389,9 +496,33 @@ public class SeqPanel extends JPanel 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 + SliderPanel.setPIDSliderSource(ap, stretchGroup.cs, stretchGroup.getName()); + + changeEndRes = false; changeStartRes = false; stretchGroup = null; + ap.idPanel.repaint(); } @@ -401,13 +532,19 @@ public class SeqPanel extends JPanel 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 end res position of selected group + // Edit start res position of selected group changeStartRes = true; @@ -427,14 +564,13 @@ public class SeqPanel extends JPanel stretchGroup.setStartRes( res ); } - int dragDirection = 0; if (y > oldSeq) dragDirection = 1; else if (y < oldSeq) dragDirection = -1; - while (y != oldSeq) + 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) + {} + } + } +} + + }