X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=def4be1889ce022c8cc387a5cfc42bf01ef2dc54;hb=4bf989253d9dfaaf960a7522e7b4841eb5fe6f84;hp=6bc1ad8ee880c33b4cd2507f03aed30a338fbe3b;hpb=3cdfc5e46776dbb8127f0a5b64df3545b988e3d9;p=jalview.git
diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java
index 6bc1ad8..def4be1 100644
--- a/src/jalview/gui/SeqPanel.java
+++ b/src/jalview/gui/SeqPanel.java
@@ -20,6 +20,24 @@
*/
package jalview.gui;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Point;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.ToolTipManager;
+
import jalview.api.AlignViewportI;
import jalview.bin.Cache;
import jalview.commands.EditCommand;
@@ -29,6 +47,7 @@ import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.ColumnSelection;
import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.MappedFeatures;
import jalview.datamodel.SearchResultMatchI;
import jalview.datamodel.SearchResults;
import jalview.datamodel.SearchResultsI;
@@ -50,23 +69,7 @@ import jalview.util.MessageManager;
import jalview.util.Platform;
import jalview.viewmodel.AlignmentViewport;
import jalview.viewmodel.ViewportRanges;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Point;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.awt.event.MouseWheelEvent;
-import java.awt.event.MouseWheelListener;
-import java.util.Collections;
-import java.util.List;
-
-import javax.swing.JPanel;
-import javax.swing.SwingUtilities;
-import javax.swing.ToolTipManager;
+import jalview.viewmodel.seqfeatures.FeatureRendererModel;
/**
* DOCUMENT ME!
@@ -204,8 +207,6 @@ public class SeqPanel extends JPanel
StringBuffer keyboardNo2;
- java.net.URL linkImageURL;
-
private final SequenceAnnotationReport seqARep;
StringBuilder tooltipText = new StringBuilder();
@@ -226,8 +227,7 @@ public class SeqPanel extends JPanel
*/
public SeqPanel(AlignViewport viewport, AlignmentPanel alignPanel)
{
- linkImageURL = getClass().getResource("/images/link.gif");
- seqARep = new SequenceAnnotationReport(linkImageURL.toString());
+ seqARep = new SequenceAnnotationReport(true);
ToolTipManager.sharedInstance().registerComponent(this);
ToolTipManager.sharedInstance().setInitialDelay(0);
ToolTipManager.sharedInstance().setDismissDelay(10000);
@@ -255,11 +255,6 @@ public class SeqPanel extends JPanel
int wrappedBlock = -1;
- MousePos findMousePosition(MouseEvent evt)
- {
- return findMousePosition(evt, null);
- }
-
/**
* Computes the column and sequence row (and possibly annotation row when in
* wrapped mode) for the given mouse position
@@ -267,22 +262,15 @@ public class SeqPanel extends JPanel
* @param evt
* @return
*/
- MousePos findMousePosition(MouseEvent evt, String debug)
+ MousePos findMousePosition(MouseEvent evt)
{
- int col = findColumn(evt, debug);
+ int col = findColumn(evt);
int seqIndex = -1;
int annIndex = -1;
int y = evt.getY();
int charHeight = av.getCharHeight();
int alignmentHeight = av.getAlignment().getHeight();
- if (debug != null)
- {
- System.out.println(String.format(
- "%s: charHeight %d alHeight %d canvasWidth %d canvasHeight %d",
- debug, charHeight, alignmentHeight, seqCanvas.getWidth(),
- seqCanvas.getHeight()));
- }
if (av.getWrapAlignment())
{
seqCanvas.calculateWrappedGeometry(seqCanvas.getWidth(),
@@ -343,11 +331,6 @@ public class SeqPanel extends JPanel
*/
int findColumn(MouseEvent evt)
{
- return findColumn(evt, null);
- }
-
- int findColumn(MouseEvent evt, String debug)
- {
int res = 0;
int x = evt.getX();
@@ -368,14 +351,6 @@ public class SeqPanel extends JPanel
int y = evt.getY();
y = Math.max(0, y - hgap);
x -= seqCanvas.getLabelWidthWest();
- if (debug != null)
- {
- System.out.println(
- String.format("%s: %s %d x %d labelWest %d charWidth %d ",
- debug, Thread.currentThread().getName(),
- System.currentTimeMillis(), x,
- seqCanvas.getLabelWidthWest(), charWidth));
- }
if (x < 0)
{
// mouse is over left scale
@@ -389,10 +364,6 @@ public class SeqPanel extends JPanel
}
if (x >= cwidth * charWidth)
{
- if (debug != null)
- {
- System.out.println(debug + ": cwidth = " + cwidth);
- }
// mouse is over right scale
return -1;
}
@@ -861,11 +832,11 @@ public class SeqPanel extends JPanel
* the start of the highlighted region.
*/
@Override
- public void highlightSequence(SearchResultsI results)
+ public String highlightSequence(SearchResultsI results)
{
if (results == null || results.equals(lastSearchResults))
{
- return;
+ return null;
}
lastSearchResults = results;
@@ -891,6 +862,78 @@ public class SeqPanel extends JPanel
{
setStatusMessage(results);
}
+ // JAL-3303 feature suppressed for now pending review
+ return null; // results.isEmpty() ? null : getHighlightInfo(results);
+ }
+
+ /**
+ * temporary hack: answers a message suitable to show on structure hover
+ * label. This is normally null. It is a peptide variation description if
+ *
+ * - results are a single residue in a protein alignment
+ * - there is a mapping to a coding sequence (codon)
+ * - there are one or more SNP variant features on the codon
+ *
+ * in which case the answer is of the format (e.g.) "p.Glu388Asp"
+ *
+ * @param results
+ * @return
+ */
+ private String getHighlightInfo(SearchResultsI results)
+ {
+ /*
+ * ideally, just find mapped CDS (as we don't care about render style here);
+ * for now, go via split frame complement's FeatureRenderer
+ */
+ AlignViewportI complement = ap.getAlignViewport().getCodingComplement();
+ if (complement == null)
+ {
+ return null;
+ }
+ AlignFrame af = Desktop.getAlignFrameFor(complement);
+ FeatureRendererModel fr2 = af.getFeatureRenderer();
+
+ int j = results.getSize();
+ List infos = new ArrayList<>();
+ for (int i = 0; i < j; i++)
+ {
+ SearchResultMatchI match = results.getResults().get(i);
+ int pos = match.getStart();
+ if (pos == match.getEnd())
+ {
+ SequenceI seq = match.getSequence();
+ SequenceI ds = seq.getDatasetSequence() == null ? seq
+ : seq.getDatasetSequence();
+ MappedFeatures mf = fr2
+ .findComplementFeaturesAtResidue(ds, pos);
+ if (mf != null)
+ {
+ for (SequenceFeature sf : mf.features)
+ {
+ String pv = mf.findProteinVariants(sf);
+ if (pv.length() > 0 && !infos.contains(pv))
+ {
+ infos.add(pv);
+ }
+ }
+ }
+ }
+ }
+
+ if (infos.isEmpty())
+ {
+ return null;
+ }
+ StringBuilder sb = new StringBuilder();
+ for (String info : infos)
+ {
+ if (sb.length() > 0)
+ {
+ sb.append("|");
+ }
+ sb.append(info);
+ }
+ return sb.toString();
}
@Override
@@ -997,25 +1040,56 @@ public class SeqPanel extends JPanel
* add features that straddle the gap (pos may be the residue before or
* after the gap)
*/
+ int unshownFeatures = 0;
if (av.isShowSequenceFeatures())
{
List features = ap.getFeatureRenderer()
.findFeaturesAtColumn(sequence, column + 1);
- seqARep.appendFeatures(tooltipText, pos, features,
- this.ap.getSeqPanel().seqCanvas.fr);
+ unshownFeatures = seqARep.appendFeatures(tooltipText, pos,
+ features, this.ap.getSeqPanel().seqCanvas.fr,
+ MAX_TOOLTIP_LENGTH);
+
+ /*
+ * add features in CDS/protein complement at the corresponding
+ * position if configured to do so
+ */
+ if (av.isShowComplementFeatures())
+ {
+ if (!Comparison.isGap(sequence.getCharAt(column)))
+ {
+ AlignViewportI complement = ap.getAlignViewport()
+ .getCodingComplement();
+ AlignFrame af = Desktop.getAlignFrameFor(complement);
+ FeatureRendererModel fr2 = af.getFeatureRenderer();
+ MappedFeatures mf = fr2.findComplementFeaturesAtResidue(sequence,
+ pos);
+ if (mf != null)
+ {
+ unshownFeatures = seqARep.appendFeatures(tooltipText,
+ pos, mf, fr2, MAX_TOOLTIP_LENGTH);
+ }
+ }
+ }
}
- if (tooltipText.length() == 6) //
+ if (tooltipText.length() == 6) // ""
{
setToolTipText(null);
lastTooltip = null;
}
else
{
- if (tooltipText.length() > MAX_TOOLTIP_LENGTH) // constant
+ if (tooltipText.length() > MAX_TOOLTIP_LENGTH)
{
tooltipText.setLength(MAX_TOOLTIP_LENGTH);
tooltipText.append("...");
}
+ if (unshownFeatures > 0)
+ {
+ tooltipText.append("
").append("... ").append("")
+ .append(MessageManager.formatMessage(
+ "label.features_not_shown", unshownFeatures))
+ .append("");
+ }
String textString = tooltipText.toString();
if (lastTooltip == null || !lastTooltip.equals(textString))
{
@@ -1126,7 +1200,7 @@ public class SeqPanel extends JPanel
{
char sequenceChar = sequence.getCharAt(column);
int pos = sequence.findPosition(column);
- setStatusMessage(sequence, seqIndex, sequenceChar, pos);
+ setStatusMessage(sequence.getName(), seqIndex, sequenceChar, pos);
return pos;
}
@@ -1142,7 +1216,7 @@ public class SeqPanel extends JPanel
* Sequence 6 ID: O.niloticus.3 Nucleotide: Uracil (2)
*
*
- * @param sequence
+ * @param seqName
* @param seqIndex
* sequence position in the alignment (1..)
* @param sequenceChar
@@ -1150,7 +1224,7 @@ public class SeqPanel extends JPanel
* @param residuePos
* the sequence residue position (if not over a gap)
*/
- protected void setStatusMessage(SequenceI sequence, int seqIndex,
+ protected void setStatusMessage(String seqName, int seqIndex,
char sequenceChar, int residuePos)
{
StringBuilder text = new StringBuilder(32);
@@ -1160,7 +1234,7 @@ public class SeqPanel extends JPanel
*/
String seqno = seqIndex == -1 ? "" : " " + (seqIndex + 1);
text.append("Sequence").append(seqno).append(" ID: ")
- .append(sequence.getName());
+ .append(seqName);
String residue = null;
@@ -1205,7 +1279,8 @@ public class SeqPanel extends JPanel
{
return;
}
- SequenceI ds = al.getSequenceAt(sequenceIndex).getDatasetSequence();
+ SequenceI alignedSeq = al.getSequenceAt(sequenceIndex);
+ SequenceI ds = alignedSeq.getDatasetSequence();
for (SearchResultMatchI m : results.getResults())
{
SequenceI seq = m.getSequence();
@@ -1217,8 +1292,8 @@ public class SeqPanel extends JPanel
if (seq == ds)
{
int start = m.getStart();
- setStatusMessage(seq, sequenceIndex, seq.getCharAt(start - 1),
- start);
+ setStatusMessage(alignedSeq.getName(), sequenceIndex,
+ seq.getCharAt(start - 1), start);
return;
}
}
@@ -1983,7 +2058,7 @@ public class SeqPanel extends JPanel
return;
}
- if (evt.getClickCount() > 1)
+ if (evt.getClickCount() > 1 && av.isShowSequenceFeatures())
{
sg = av.getSelectionGroup();
if (sg != null && sg.getSize() == 1
@@ -2188,11 +2263,11 @@ public class SeqPanel extends JPanel
final int column = pos.column;
final int seq = pos.seqIndex;
SequenceI sequence = av.getAlignment().getSequenceAt(seq);
- List features = ap.getFeatureRenderer()
- .findFeaturesAtColumn(sequence, column + 1);
-
- PopupMenu pop = new PopupMenu(ap, null, features);
- pop.show(this, evt.getX(), evt.getY());
+ if (sequence != null)
+ {
+ PopupMenu pop = new PopupMenu(ap, sequence, column);
+ pop.show(this, evt.getX(), evt.getY());
+ }
}
/**
@@ -2686,7 +2761,7 @@ public class SeqPanel extends JPanel
* Map sequence selection
*/
SequenceGroup sg = MappingUtils.mapSequenceGroup(seqsel, sourceAv, av);
- av.setSelectionGroup(sg);
+ av.setSelectionGroup(sg != null && sg.getSize() > 0 ? sg : null);
av.isSelectionGroupChanged(true);
/*