X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=c8a2ec90ef9b6646fd22d77ec69ccb030ed0d602;hb=5f4f772b4ce40f2ea987cb03dd2c06ec1f48ba67;hp=4e789b9f580c05ae3c079faea99552da0c195547;hpb=461d9cd18036c268ae890fcf2418e9ac181b3c61;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 4e789b9..c8a2ec9 100644 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -44,7 +44,7 @@ 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; @@ -243,6 +243,7 @@ public class SeqPanel extends JPanel */ public SeqPanel(AlignViewport viewport, AlignmentPanel alignPanel) { + setName("SeqPanel"); seqARep = new SequenceAnnotationReport(true); ToolTipManager.sharedInstance().registerComponent(this); ToolTipManager.sharedInstance().setInitialDelay(0); @@ -276,6 +277,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 @@ -342,6 +346,9 @@ public class SeqPanel extends JPanel /** * 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 @@ -423,8 +430,7 @@ public class SeqPanel extends JPanel if (editCommand != null && editCommand.getSize() > 0) { ap.alignFrame.addHistoryItem(editCommand); - av.firePropertyChange("alignment", null, - av.getAlignment().getSequences()); + ap.av.notifyAlignment(); } } finally { @@ -477,47 +483,80 @@ public class SeqPanel extends JPanel void moveCursor(int dx, int dy) { - seqCanvas.cursorX += dx; - seqCanvas.cursorY += dy; - + moveCursor(dx, dy,false); + } + void moveCursor(int dx, int dy, boolean nextWord) + { HiddenColumns hidden = av.getAlignment().getHiddenColumns(); - if (av.hasHiddenColumns() && !hidden.isVisible(seqCanvas.cursorX)) + if (nextWord) { - int original = seqCanvas.cursorX - dx; int maxWidth = av.getAlignment().getWidth(); - - if (!hidden.isVisible(seqCanvas.cursorX)) - { - int visx = hidden.absoluteToVisibleColumn(seqCanvas.cursorX - dx); - int[] region = hidden.getRegionWithEdgeAtRes(visx); - - if (region != null) // just in case + 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; + do + { + lastP = p; + lastR = r; + if (dy != 0) { - if (dx == 1) + r += dy; + if (r < 0) { - // moving right - seqCanvas.cursorX = region[1] + 1; + r = 0; } - else if (dx == -1) + if (r >= maxHeight) { - // moving left - seqCanvas.cursorX = region[0] - 1; + r = maxHeight - 1; } + seqAtRow = av.getAlignment().getSequenceAt(r); } - seqCanvas.cursorX = (seqCanvas.cursorX < 0) ? 0 : seqCanvas.cursorX; - } + 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 { + int maxWidth = av.getAlignment().getWidth(); + seqCanvas.cursorX = nextVisible(hidden, maxWidth, seqCanvas.cursorX, dx); + seqCanvas.cursorY += dy; + } + scrollToVisible(false); + } - if (seqCanvas.cursorX >= maxWidth - || !hidden.isVisible(seqCanvas.cursorX)) + private int nextVisible(HiddenColumns hidden,int maxWidth, int original, int dx) + { + int newCursorX=original+dx; + if (av.hasHiddenColumns() && !hidden.isVisible(newCursorX)) + { + int visx = hidden.absoluteToVisibleColumn(newCursorX - dx); + int[] region = hidden.getRegionWithEdgeAtRes(visx); + + if (region != null) // just in case { - seqCanvas.cursorX = original; + if (dx == 1) + { + // moving right + newCursorX = region[1] + 1; + } + else if (dx == -1) + { + // moving left + newCursorX = region[0] - 1; + } } } - - scrollToVisible(false); + newCursorX = (newCursorX < 0) ? 0 : newCursorX; + if (newCursorX >= maxWidth + || !hidden.isVisible(newCursorX)) + { + newCursorX = original; + } + return newCursorX; } - /** * Scroll to make the cursor visible in the viewport. * @@ -909,11 +948,12 @@ public class SeqPanel extends JPanel AlignFrame af = Desktop.getAlignFrameFor(complement); FeatureRendererModel fr2 = af.getFeatureRenderer(); - int j = results.getSize(); + List matches = results.getResults(); + int j = matches.size(); List infos = new ArrayList<>(); for (int i = 0; i < j; i++) { - SearchResultMatchI match = results.getResults().get(i); + SearchResultMatchI match = matches.get(i); int pos = match.getStart(); if (pos == match.getEnd()) { @@ -1084,7 +1124,7 @@ public class SeqPanel extends JPanel pos); if (mf != null) { - unshownFeatures = seqARep.appendFeatures(tooltipText, + unshownFeatures += seqARep.appendFeatures(tooltipText, pos, mf, fr2, MAX_TOOLTIP_LENGTH); } } @@ -1141,7 +1181,8 @@ public class SeqPanel extends JPanel String tooltip = AnnotationPanel.buildToolTip(anns[rowIndex], column, anns); - if (!tooltip.equals(lastTooltip)) + boolean tooltipChanged = tooltip == null ? lastTooltip != null : !tooltip.equals(lastTooltip); + if (tooltipChanged) { lastTooltip = tooltip; lastFormattedTooltip = tooltip == null ? null @@ -2762,7 +2803,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; @@ -2939,5 +2980,4 @@ public class SeqPanel extends JPanel ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true, true); } - }