X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=55f06fce3e56ad2b7c606c8dd797eaad68262c7b;hb=320583fd2ac3ea714e6afdac050961978bd34c81;hp=bb85948a7a2c9ece090e6414da9cbe7cd390ba81;hpb=af259f508805faf2da90585ee9a67cd7853bf5aa;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index bb85948..55f06fc 100644 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -25,6 +25,8 @@ import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Point; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; @@ -34,12 +36,15 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JToolTip; import javax.swing.SwingUtilities; +import javax.swing.Timer; import javax.swing.ToolTipManager; import jalview.api.AlignViewportI; -import jalview.bin.Cache; +import jalview.bin.Console; import jalview.commands.EditCommand; import jalview.commands.EditCommand.Action; import jalview.commands.EditCommand.Edit; @@ -209,9 +214,19 @@ public class SeqPanel extends JPanel private final SequenceAnnotationReport seqARep; - StringBuilder tooltipText = new StringBuilder(); + /* + * the last tooltip on mousing over the alignment (or annotation in wrapped mode) + * - the tooltip is not set again if unchanged + * - this is the tooltip text _before_ formatting as html + */ + private String lastTooltip; - String tmpString; + /* + * the last tooltip on mousing over the alignment (or annotation in wrapped mode) + * - used to decide where to place the tooltip in getTooltipLocation() + * - this is the tooltip text _after_ formatting as html + */ + private String lastFormattedTooltip; EditCommand editCommand; @@ -231,6 +246,7 @@ public class SeqPanel extends JPanel ToolTipManager.sharedInstance().registerComponent(this); ToolTipManager.sharedInstance().setInitialDelay(0); ToolTipManager.sharedInstance().setDismissDelay(10000); + this.av = viewport; setBackground(Color.white); @@ -258,6 +274,9 @@ public class SeqPanel extends JPanel /** * Computes the column and sequence row (and possibly annotation row when in * wrapped mode) for the given mouse position + *
+ * Mouse position is not set if in wrapped mode with the cursor either between + * sequences, or over the left or right vertical scale. * * @param evt * @return @@ -322,9 +341,13 @@ public class SeqPanel extends JPanel return new MousePos(col, seqIndex, annIndex); } + /** * Returns the aligned sequence position (base 0) at the mouse position, or * the closest visible one + *
+ * Returns -1 if in wrapped mode with the mouse over either left or right
+ * vertical scale.
*
* @param evt
* @return
@@ -460,8 +483,9 @@ public class SeqPanel extends JPanel
void moveCursor(int dx, int dy)
{
- moveCursor(dx, dy,false);
+ moveCursor(dx, dy, false);
}
+
void moveCursor(int dx, int dy, boolean nextWord)
{
HiddenColumns hidden = av.getAlignment().getHiddenColumns();
@@ -469,11 +493,13 @@ public class SeqPanel extends JPanel
if (nextWord)
{
int maxWidth = av.getAlignment().getWidth();
- int maxHeight=av.getAlignment().getHeight();
- SequenceI seqAtRow = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
+ int maxHeight = av.getAlignment().getHeight();
+ SequenceI seqAtRow = av.getAlignment()
+ .getSequenceAt(seqCanvas.cursorY);
// look for next gap or residue
- boolean isGap = Comparison.isGap(seqAtRow.getCharAt(seqCanvas.cursorX));
- int p = seqCanvas.cursorX,lastP,r=seqCanvas.cursorY,lastR;
+ boolean isGap = Comparison
+ .isGap(seqAtRow.getCharAt(seqCanvas.cursorX));
+ int p = seqCanvas.cursorX, lastP, r = seqCanvas.cursorY, lastR;
do
{
lastP = p;
@@ -494,19 +520,23 @@ public class SeqPanel extends JPanel
p = nextVisible(hidden, maxWidth, p, dx);
} while ((dx != 0 ? p != lastP : r != lastR)
&& isGap == Comparison.isGap(seqAtRow.getCharAt(p)));
- seqCanvas.cursorX=p;
- seqCanvas.cursorY=r;
- } else {
+ seqCanvas.cursorX = p;
+ seqCanvas.cursorY = r;
+ }
+ else
+ {
int maxWidth = av.getAlignment().getWidth();
- seqCanvas.cursorX = nextVisible(hidden, maxWidth, seqCanvas.cursorX, dx);
+ seqCanvas.cursorX = nextVisible(hidden, maxWidth, seqCanvas.cursorX,
+ dx);
seqCanvas.cursorY += dy;
}
scrollToVisible(false);
}
- private int nextVisible(HiddenColumns hidden,int maxWidth, int original, int dx)
+ private int nextVisible(HiddenColumns hidden, int maxWidth, int original,
+ int dx)
{
- int newCursorX=original+dx;
+ int newCursorX = original + dx;
if (av.hasHiddenColumns() && !hidden.isVisible(newCursorX))
{
int visx = hidden.absoluteToVisibleColumn(newCursorX - dx);
@@ -527,13 +557,13 @@ public class SeqPanel extends JPanel
}
}
newCursorX = (newCursorX < 0) ? 0 : newCursorX;
- if (newCursorX >= maxWidth
- || !hidden.isVisible(newCursorX))
+ if (newCursorX >= maxWidth || !hidden.isVisible(newCursorX))
{
newCursorX = original;
}
return newCursorX;
}
+
/**
* Scroll to make the cursor visible in the viewport.
*
@@ -589,7 +619,7 @@ public class SeqPanel extends JPanel
if (av.getAlignment().getHiddenColumns().isVisible(seqCanvas.cursorX))
{
setStatusMessage(av.getAlignment().getSequenceAt(seqCanvas.cursorY),
- seqCanvas.cursorX, seqCanvas.cursorY);
+ seqCanvas.cursorX, seqCanvas.cursorY);
}
if (repaintNeeded)
@@ -598,7 +628,6 @@ public class SeqPanel extends JPanel
}
}
-
void setSelectionAreaAtCursor(boolean topLeft)
{
SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
@@ -890,13 +919,12 @@ public class SeqPanel extends JPanel
ap.setToScrollComplementPanel(true);
}
- boolean noFastPaint = wasScrolled && av.getWrapAlignment();
- if (seqCanvas.highlightSearchResults(results, noFastPaint))
+ boolean fastPaint = !(wasScrolled && av.getWrapAlignment());
+ if (seqCanvas.highlightSearchResults(results, fastPaint))
{
setStatusMessage(results);
}
- // JAL-3303 feature suppressed for now pending review
- return null; // results.isEmpty() ? null : getHighlightInfo(results);
+ return results.isEmpty() ? null : getHighlightInfo(results);
}
/**
@@ -938,8 +966,7 @@ public class SeqPanel extends JPanel
SequenceI seq = match.getSequence();
SequenceI ds = seq.getDatasetSequence() == null ? seq
: seq.getDatasetSequence();
- MappedFeatures mf = fr2
- .findComplementFeaturesAtResidue(ds, pos);
+ MappedFeatures mf = fr2.findComplementFeaturesAtResidue(ds, pos);
if (mf != null)
{
for (SequenceFeature sf : mf.features)
@@ -1007,8 +1034,10 @@ public class SeqPanel extends JPanel
/*
* just a pixel move without change of 'cell'
*/
+ moveTooltip = false;
return;
}
+ moveTooltip = true;
lastMousePosition = mousePos;
if (mousePos.isOverAnnotation())
@@ -1024,6 +1053,7 @@ public class SeqPanel extends JPanel
lastMousePosition = null;
setToolTipText(null);
lastTooltip = null;
+ lastFormattedTooltip = null;
ap.alignFrame.setStatus("");
return;
}
@@ -1045,7 +1075,7 @@ public class SeqPanel extends JPanel
mouseOverSequence(sequence, column, pos);
}
- tooltipText.setLength(6); // Cuts the buffer back to
+ StringBuilder tooltipText = new StringBuilder(64);
SequenceGroup[] groups = av.getAlignment().findAllGroups(sequence);
if (groups != null)
@@ -1079,9 +1109,8 @@ public class SeqPanel extends JPanel
{
List
+ *
+ * Answers true if a scroll was performed, false if not - meaning either
+ * that the mouse position is within the panel, or the edge of the alignment
+ * has been reached.
+ */
+ boolean scrollOnce()
+ {
+ /*
+ * quit after mouseUp ensures interrupt in JalviewJS
+ */
+ if (!mouseDragging)
+ {
+ return false;
+ }
+
+ boolean scrolled = false;
+ ViewportRanges ranges = SeqPanel.this.av.getRanges();
+
+ /*
+ * scroll up or down
+ */
+ if (mousePos.y < 0)
+ {
+ // mouse is above this panel - try scroll up
+ scrolled = ranges.scrollUp(true);
+ }
+ else if (mousePos.y >= getHeight())
+ {
+ // mouse is below this panel - try scroll down
+ scrolled = ranges.scrollUp(false);
+ }
+
+ /*
+ * scroll left or right
+ */
+ if (mousePos.x < 0)
+ {
+ scrolled |= ranges.scrollRight(false);
+ }
+ else if (mousePos.x >= getWidth())
+ {
+ scrolled |= ranges.scrollRight(true);
+ }
+ return scrolled;
}
}
@@ -2695,7 +2806,7 @@ public class SeqPanel extends JPanel
{
if (av.getAlignment() == null)
{
- Cache.log.warn("alignviewport av SeqSetId=" + av.getSequenceSetId()
+ Console.warn("alignviewport av SeqSetId=" + av.getSequenceSetId()
+ " ViewId=" + av.getViewId()
+ " 's alignment is NULL! returning immediately.");
return;
@@ -2820,6 +2931,8 @@ public class SeqPanel extends JPanel
* if hidden column selection has changed
*/
ap.paintAlignment(hiddenChanged, hiddenChanged);
+ // propagate any selection changes
+ PaintRefresher.Refresh(ap, av.getSequenceSetId());
return true;
}