X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=21d913f9c945f413895c115911b34557cdc32eef;hb=e4f893546d61b043b3381c9548f0cfbf7084fd78;hp=ab5bc491d90c26135f18bbf191ed4e1b892a734d;hpb=ffa5c07d90b4a933762a5d9faa0578c11693d63a;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index ab5bc49..21d913f 100644 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -62,6 +62,7 @@ import java.awt.event.MouseWheelListener; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.ListIterator; import javax.swing.JPanel; import javax.swing.SwingUtilities; @@ -406,8 +407,7 @@ public class SeqPanel extends JPanel implements MouseListener, } else { - av.getRanges().scrollToVisible(seqCanvas.cursorX, seqCanvas.cursorY, - av); + av.getRanges().scrollToVisible(seqCanvas.cursorX, seqCanvas.cursorY); } setStatusMessage(av.getAlignment().getSequenceAt(seqCanvas.cursorY), seqCanvas.cursorX, seqCanvas.cursorY); @@ -577,6 +577,7 @@ public class SeqPanel extends JPanel implements MouseListener, @Override public void mouseReleased(MouseEvent evt) { + boolean didDrag = mouseDragging; // did we come here after a drag mouseDragging = false; mouseWheelPressed = false; @@ -589,7 +590,7 @@ public class SeqPanel extends JPanel implements MouseListener, if (!editingSeqs) { - doMouseReleasedDefineMode(evt); + doMouseReleasedDefineMode(evt, didDrag); return; } @@ -753,8 +754,9 @@ public class SeqPanel extends JPanel implements MouseListener, /* * set status bar message, returning residue position in sequence */ + boolean isGapped = Comparison.isGap(sequence.getCharAt(column)); final int pos = setStatusMessage(sequence, column, seq); - if (ssm != null && pos > -1) + if (ssm != null && !isGapped) { mouseOverSequence(sequence, column, pos); } @@ -783,10 +785,19 @@ public class SeqPanel extends JPanel implements MouseListener, } } - if (av.isShowSequenceFeatures() && pos != -1) + /* + * add any features at the position to the tooltip; if over a gap, only + * add features that straddle the gap (pos may be the residue before or + * after the gap) + */ + if (av.isShowSequenceFeatures()) { List features = ap.getFeatureRenderer() .findFeaturesAtRes(sequence.getDatasetSequence(), pos); + if (isGapped) + { + removeAdjacentFeatures(features, column + 1, sequence); + } seqARep.appendFeatures(tooltipText, pos, features, this.ap.getSeqPanel().seqCanvas.fr.getMinMax()); } @@ -800,14 +811,43 @@ public class SeqPanel extends JPanel implements MouseListener, String textString = tooltipText.toString(); if (lastTooltip == null || !lastTooltip.equals(textString)) { - String formatedTooltipText = JvSwingUtils.wrapTooltip(true, + String formattedTooltipText = JvSwingUtils.wrapTooltip(true, textString); - setToolTipText(formatedTooltipText); + setToolTipText(formattedTooltipText); lastTooltip = textString; } } } + /** + * Removes from the list of features any that start after, or end before, the + * given column position. This allows us to retain only those features + * adjacent to a gapped position that straddle the position. Contact features + * that 'straddle' the position are also removed, since they are not 'at' the + * position. + * + * @param features + * @param column + * alignment column (1..) + * @param sequence + */ + protected void removeAdjacentFeatures(List features, + final int column, SequenceI sequence) + { + // TODO should this be an AlignViewController method (and reused by applet)? + ListIterator it = features.listIterator(); + while (it.hasNext()) + { + SequenceFeature sf = it.next(); + if (sf.isContactFeature() + || sequence.findIndex(sf.getBegin()) > column + || sequence.findIndex(sf.getEnd()) < column) + { + it.remove(); + } + } + } + private Point lastp = null; /* @@ -852,9 +892,10 @@ public class SeqPanel extends JPanel implements MouseListener, /** * Sets the status message in alignment panel, showing the sequence number - * (index) and id, residue and residue position for the given sequence and - * column position. Returns the calculated residue position in the sequence, - * or -1 for a gapped column position. + * (index) and id, and residue and residue position if not at a gap, for the + * given sequence and column position. Returns the residue position returned + * by Sequence.findPosition. Note this may be for the nearest adjacent residue + * if at a gapped position. * * @param sequence * aligned sequence object @@ -862,7 +903,8 @@ public class SeqPanel extends JPanel implements MouseListener, * alignment column * @param seq * index of sequence in alignment - * @return position of column in sequence or -1 if at a gap + * @return sequence position of residue at column, or adjacent residue if at a + * gap */ int setStatusMessage(SequenceI sequence, final int column, int seq) { @@ -876,36 +918,34 @@ public class SeqPanel extends JPanel implements MouseListener, .append(sequence.getName()); String residue = null; + /* * Try to translate the display character to residue name (null for gap). */ final String displayChar = String.valueOf(sequence.getCharAt(column)); - if (av.getAlignment().isNucleotide()) + boolean isGapped = Comparison.isGap(sequence.getCharAt(column)); + int pos = sequence.findPosition(column); + + if (!isGapped) { - residue = ResidueProperties.nucleotideName.get(displayChar); - if (residue != null) + boolean nucleotide = av.getAlignment().isNucleotide(); + if (nucleotide) { - text.append(" Nucleotide: ").append(residue); + residue = ResidueProperties.nucleotideName.get(displayChar); } - } - else - { - residue = "X".equalsIgnoreCase(displayChar) ? "X" : ("*" - .equals(displayChar) ? "STOP" : ResidueProperties.aa2Triplet - .get(displayChar)); - if (residue != null) + else { - text.append(" Residue: ").append(residue); + residue = "X".equalsIgnoreCase(displayChar) ? "X" : ("*" + .equals(displayChar) ? "STOP" + : ResidueProperties.aa2Triplet.get(displayChar)); } - } + text.append(" ").append(nucleotide ? "Nucleotide" : "Residue") + .append(": ").append(residue == null ? displayChar : residue); - int pos = -1; - if (residue != null) - { - pos = sequence.findPosition(column); text.append(" (").append(Integer.toString(pos)).append(")"); } ap.alignFrame.statusBar.setText(text.toString()); + return pos; } @@ -1545,9 +1585,20 @@ public class SeqPanel extends JPanel implements MouseListener, av.setSelectionGroup(null); } + int column = findColumn(evt); + boolean isGapped = Comparison.isGap(sequence.getCharAt(column)); + + /* + * find features at the position (if not gapped), or straddling + * the position (if at a gap) + */ List features = seqCanvas.getFeatureRenderer() .findFeaturesAtRes(sequence.getDatasetSequence(), - sequence.findPosition(findColumn(evt))); + sequence.findPosition(column)); + if (isGapped) + { + removeAdjacentFeatures(features, column, sequence); + } if (!features.isEmpty()) { @@ -1730,7 +1781,7 @@ public class SeqPanel extends JPanel implements MouseListener, List allFeatures = ap.getFeatureRenderer() .findFeaturesAtRes(sequence.getDatasetSequence(), sequence.findPosition(res)); - List links = new ArrayList(); + List links = new ArrayList<>(); for (SequenceFeature sf : allFeatures) { if (sf.links != null) @@ -1747,12 +1798,15 @@ public class SeqPanel extends JPanel implements MouseListener, } /** - * DOCUMENT ME! + * Update the display after mouse up on a selection or group * * @param evt - * DOCUMENT ME! + * mouse released event details + * @param afterDrag + * true if this event is happening after a mouse drag (rather than a + * mouse down) */ - public void doMouseReleasedDefineMode(MouseEvent evt) + public void doMouseReleasedDefineMode(MouseEvent evt, boolean afterDrag) { if (stretchGroup == null) { @@ -1761,7 +1815,8 @@ public class SeqPanel extends JPanel implements MouseListener, // always do this - annotation has own state // but defer colourscheme update until hidden sequences are passed in boolean vischange = stretchGroup.recalcConservation(true); - needOverviewUpdate |= vischange && av.isSelectionDefinedGroup(); + needOverviewUpdate |= vischange && av.isSelectionDefinedGroup() + && afterDrag; if (stretchGroup.cs != null) { stretchGroup.cs.alignmentChanged(stretchGroup, @@ -2015,11 +2070,13 @@ public class SeqPanel extends JPanel implements MouseListener, ap.getCalculationDialog().validateCalcTypes(); } - // process further ? - if (!av.followSelection) - { - return; - } + return; + } + + // process further ? + if (!av.followSelection) + { + return; } /*