X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=468fadb91d40b98ccb3e31060c3647818135d229;hb=c865a01627208f07db46ae7d28c06f39d83924ee;hp=3df1dac84d44dd425b3a974e6975f9b136e8a8e7;hpb=f288996f4b49bfb065e167f18639c5941dbfcef2;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 3df1dac..468fadb 100755 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -21,13 +21,15 @@ 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; + // if character is inserted or deleted, we will need to recalculate the conservation + int seqEditOccurred = -1; - seqCanvas = new SeqCanvas(av); + public SeqPanel(AlignViewport avp, AlignmentPanel p) { + this.av = avp; + + seqCanvas = new SeqCanvas(avp); setLayout(new BorderLayout()); add(seqCanvas, BorderLayout.CENTER); @@ -36,17 +38,33 @@ public class SeqPanel extends JPanel addMouseMotionListener( new MouseMotionAdapter() { public void mouseMoved(MouseEvent evt) - { doMouseMoved(evt); } + { doMouseMoved(evt); } + public void mouseDragged(MouseEvent evt) - { doMouseDragged(evt); } + { + if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown()) + doMouseDragged(evt); + else + doMouseDraggedDefineMode(evt); + } }); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) - { doMouseReleased(evt); } + { + if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown()) + doMouseReleased(evt); + else + doMouseReleasedDefineMode(evt); + } public void mousePressed(MouseEvent evt) - { doMousePressed(evt); } + { + if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown()) + doMousePressed(evt); + else + doMousePressedDefineMode(evt); + } }); repaint(); @@ -56,15 +74,17 @@ 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); + + seqEditOccurred = -1; parent.RefreshPanels(); repaint(); @@ -72,17 +92,18 @@ public class SeqPanel extends JPanel } public void doMousePressed(MouseEvent evt) { - parent.alignFrame.addHistoryItem("sequence edit"); + parent.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 < 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 @@ -90,16 +111,17 @@ public class SeqPanel extends JPanel startseq = seq; - if (startseq == (av.getAlignment().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; @@ -119,9 +141,8 @@ public class SeqPanel extends JPanel int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight; - res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + (int)(x/av.getCharWidth()) + av.getStartRes(); + res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + x/av.getCharWidth() + av.getStartRes(); - System.out.println( ((y/chunkHeight)*(getWidth()/av.charWidth)) +" "+((x / av.getCharWidth()) + av.getStartRes()) ); y %= chunkHeight; seq = y / av.getCharHeight() + av.getStartSeq(); @@ -130,7 +151,7 @@ public class SeqPanel extends JPanel } else { - res = (int) (x / av.getCharWidth()) + av.getStartRes(); + res = x / av.getCharWidth() + av.getStartRes(); seq = y / av.getCharHeight() + av.getStartSeq(); } @@ -153,110 +174,101 @@ public class SeqPanel extends JPanel 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;} + 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()) { + if (evt.isAltDown() || evt.isControlDown()) + { SequenceGroup sg = av.getAlignment().findGroup(startseq); - - if(sg!=null) - if (res < av.getAlignment().getWidth() && res < lastres) + if (sg != null) { - boolean flag = false; - for (int i= 0 ; i < sg.getSize(); i++) + boolean deleteAllowed = false; + if (res < av.getAlignment().getWidth() && res < lastres) { - SequenceI s = (SequenceI)sg.getSequenceAt(i); - for (int j=lastres-1; j >= res; j--) + /// Are we able to delete? + boolean allGaps = true; + for (int i = 0; i < sg.getSize(); i++) { - if (!flag) + SequenceI s = sg.getSequenceAt(i); + for (int j = lastres-1; j >= res && allGaps; j--) { - if (!s.getSequence().substring(j,j+1).equals(av.getAlignment().getGapCharacter()) && - !s.getSequence().substring(j,j+1).equals(" ")) - { - res = j+1; - flag = true; - } - } - } - } - } + if (!jalview.util.Comparison.isGap(s.getSequence().charAt(j))) + { + res = j + 1; + allGaps = false; + } + } - 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); + if(!deleteAllowed && allGaps) + deleteAllowed = true; + } + } + // drag to right + if (res < av.getAlignment().getWidth() && res > lastres) + sg.setEndRes(sg.getEndRes() + 1); - } 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); + // drag to left + else if (deleteAllowed && res < av.getAlignment().getWidth() && + res < lastres) + sg.setEndRes(sg.getEndRes() - 1); - } - } - } - lastres = res; - } else { - if (res < av.getAlignment().getWidth() && res > lastres) { - // dragging to the right - for (int j = lastres; j < res; j++) - insertChar(j,startseq); + for (int i = 0; i < sg.getSize(); i++) + { + SequenceI s = sg.getSequenceAt(i); + int k = av.alignment.findIndex(s); - drawChars(startseq,startseq+1,lastres); + // drag to right + if (res < av.getAlignment().getWidth() && res > lastres) + for (int j = lastres; j < res; j++) + insertChar(j, k); - } else if (res < av.getAlignment().getWidth() && res < lastres) + // 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) { @@ -266,29 +278,25 @@ public class SeqPanel extends JPanel public void insertChar(int j, int seq) { - av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter().charAt(0)); - updateConservation(seq); + av.alignment.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter()); + seqEditOccurred=seq; } - public void deleteChar(int j, int res, int sno) + public void deleteChar(int j, int seq) { - if (av.getAlignment().getSequenceAt(sno).getSequence().substring(j,j+1).equals(".") || - av.getAlignment().getSequenceAt(sno).getSequence().substring(j,j+1).equals("-") || - av.getAlignment().getSequenceAt(sno).getSequence().substring(j,j+1).equals(" ") ) - { - av.getAlignment().getSequenceAt(sno).deleteCharAt(j); - } - updateConservation(sno); - av.getAlignment().getWidth(); + 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) { - - Alignment al = (Alignment) av.getAlignment(); + /* Alignment al = (Alignment) av.getAlignment(); SequenceGroup sg = av.alignment.findGroup( al.getSequenceAt(i)); if(sg==null || !(sg.cs instanceof ConservationColourScheme)) return; @@ -302,110 +310,158 @@ public class SeqPanel extends JPanel c.verdict(false, 100); sg.setConservation(c); ConservationColourScheme ccs = (ConservationColourScheme)sg.cs; - ccs.conserve = c; + ccs.conserve = c;*/ } - - public void setColourScheme(ColourSchemeI cs, boolean showConservation) +////////////////////////////////////////// +/////Everything below this is for defining the boundary of the rubberband +////////////////////////////////////////// + int oldSeq = -1; + public void doMousePressedDefineMode(MouseEvent evt) { - if (av.getSelection().size() == 0) + 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()= res) + { + stretchGroup = allGroups[i]; + av.setRubberbandGroup(stretchGroup); + break; + } + } + + if(stretchGroup==null) { - seqCanvas.cs = cs; - for (int i = 0; i < av.alignment.getGroups().size();i++) - { - SequenceGroup sg = (SequenceGroup)av.alignment.getGroups().elementAt(i); - sg.cs = cs; - if(!showConservation - && !(sg.cs instanceof Blosum62ColourScheme) - && sg.cs instanceof ConservationColourScheme) - { - // remove ConservationColouring from existing Conservation group - ConservationColourScheme ccs = (ConservationColourScheme)sg.cs; - sg.cs = ccs.cs; - } - else if(showConservation && !(sg.cs instanceof ConservationColourScheme)) - { - // add ConservationColouring to new group - Conservation c = sg.getConservation(); - Alignment al = (Alignment) av.getAlignment(); - c = new Conservation("All", al.cons, - ResidueProperties.propHash, 3, sg.sequences, 0, - al.getWidth() ); - c.calculate(); - c.verdict(false, 100); - sg.setConservation(c); - sg.cs = new ConservationColourScheme(sg); - } - } + // define a new group here + SequenceGroup sg = new SequenceGroup(); + sg.setStartRes(res); + sg.setEndRes(res); + sg.addSequence( (Sequence)av.getAlignment().getSequenceAt(seq) ); + av.setRubberbandGroup( sg ); + stretchGroup = sg; } - else + else if( javax.swing.SwingUtilities.isRightMouseButton(evt)) { - SequenceGroup sg = av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)); + jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu( parent , null); + pop.show(this, evt.getX(), evt.getY()); - if( isNewSelection(sg) ) - { - sg = av.getAlignment().addGroup(); - for (int i=0; i < av.getSelection().size(); i++) - { - av.alignment.removeFromGroup(av.alignment.findGroup( (Sequence) av. - sel.sequenceAt(i)), - (Sequence) av.sel.sequenceAt(i)); - av.alignment.addToGroup(sg, (Sequence) av.sel.sequenceAt(i)); - } - } + // edit the properties of existing group + } + if(stretchGroup!=null && stretchGroup.getEndRes()==res) + // Edit end res position of selected group + changeEndRes = true; - sg.cs = cs; + else if(stretchGroup!=null && stretchGroup.getStartRes()==res) + // Edit end res position of selected group + changeStartRes = true; - // Selection is made, we only want to change the conservationColour for selected group - if( showConservation - && !(sg.cs instanceof ConservationColourScheme) - && !(sg.cs instanceof Blosum62ColourScheme)) - { - Conservation c = sg.getConservation(); - Alignment al = (Alignment) av.getAlignment(); - - c = new Conservation("All", al.cons, - ResidueProperties.propHash, 3, sg.sequences, 0, - al.getWidth() ); - c.calculate(); - c.verdict(false, 100); - sg.setConservation(c); - sg.cs = new ConservationColourScheme(sg); + + seqCanvas.paintFlag = true; + repaint(); + + + } + + boolean changeEndSeq = false; + boolean changeStartSeq = false; + boolean changeEndRes = false; + boolean changeStartRes = false; + SequenceGroup stretchGroup = null; + + public void doMouseReleasedDefineMode(MouseEvent evt) + { + changeEndRes = false; + changeStartRes = false; + stretchGroup = null; + } + + + 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.getEndRes()==res) + // Edit end res position of selected group + changeEndRes = true; + + else if(stretchGroup.getStartRes()==res) + // Edit end 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( !showConservation && sg.cs instanceof ConservationColourScheme) + else if(changeStartRes) { - ConservationColourScheme ccs = (ConservationColourScheme)sg.cs; - sg.cs = ccs.cs; + if(res oldSeq) + dragDirection = 1; + else if (y < oldSeq) + dragDirection = -1; - } - seqCanvas.paintFlag = true; - repaint(); - } + 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); - boolean isNewSelection(SequenceGroup sg) - { - if(sg.getSize()!=av.getSelection().size()) - return true; + oldSeq += dragDirection; + Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq); - for(int i=0; i0) - return av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)).cs; - else - return seqCanvas.cs; - } }