Merge branch 'bug/JAL-2842' into develop
authorJim Procter <jprocter@issues.jalview.org>
Tue, 28 Nov 2017 14:24:05 +0000 (14:24 +0000)
committerJim Procter <jprocter@issues.jalview.org>
Tue, 28 Nov 2017 14:24:05 +0000 (14:24 +0000)
1  2 
src/jalview/gui/SeqPanel.java

@@@ -320,13 -320,13 +320,13 @@@ public class SeqPanel extends JPane
    void setCursorRow()
    {
      seqCanvas.cursorY = getKeyboardNo1() - 1;
 -    scrollToVisible();
 +    scrollToVisible(true);
    }
  
    void setCursorColumn()
    {
      seqCanvas.cursorX = getKeyboardNo1() - 1;
 -    scrollToVisible();
 +    scrollToVisible(true);
    }
  
    void setCursorRowAndColumn()
      {
        seqCanvas.cursorX = getKeyboardNo1() - 1;
        seqCanvas.cursorY = getKeyboardNo2() - 1;
 -      scrollToVisible();
 +      scrollToVisible(true);
      }
    }
  
      SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
  
      seqCanvas.cursorX = sequence.findIndex(getKeyboardNo1()) - 1;
 -    scrollToVisible();
 +    scrollToVisible(true);
    }
  
    void moveCursor(int dx, int dy)
        int original = seqCanvas.cursorX - dx;
        int maxWidth = av.getAlignment().getWidth();
  
+       // TODO: once JAL-2759 is ready, change this loop to something more
+       // efficient
        while (!hidden.isVisible(seqCanvas.cursorX)
-               && seqCanvas.cursorX < maxWidth && seqCanvas.cursorX > 0)
+               && seqCanvas.cursorX < maxWidth && seqCanvas.cursorX > 0
+               && dx != 0)
        {
          seqCanvas.cursorX += dx;
        }
        }
      }
  
 -    scrollToVisible();
 +    scrollToVisible(false);
    }
  
 -  void scrollToVisible()
 +  /**
 +   * Scroll to make the cursor visible in the viewport.
 +   * 
 +   * @param jump
 +   *          just jump to the location rather than scrolling
 +   */
 +  void scrollToVisible(boolean jump)
    {
      if (seqCanvas.cursorX < 0)
      {
      }
  
      endEditing();
 -    if (av.getWrapAlignment())
 +
 +    boolean repaintNeeded = true;
 +    if (jump)
      {
 -      av.getRanges().scrollToWrappedVisible(seqCanvas.cursorX);
 +      // only need to repaint if the viewport did not move, as otherwise it will
 +      // get a repaint
 +      repaintNeeded = !av.getRanges().setViewportLocation(seqCanvas.cursorX,
 +              seqCanvas.cursorY);
      }
      else
      {
 -      av.getRanges().scrollToVisible(seqCanvas.cursorX, seqCanvas.cursorY);
 +      if (av.getWrapAlignment())
 +      {
 +        // scrollToWrappedVisible expects x-value to have hidden cols subtracted
 +        int x = av.getAlignment().getHiddenColumns()
 +                .findColumnPosition(seqCanvas.cursorX);
 +        av.getRanges().scrollToWrappedVisible(x);
 +      }
 +      else
 +      {
 +        av.getRanges().scrollToVisible(seqCanvas.cursorX,
 +                seqCanvas.cursorY);
 +      }
      }
 -    setStatusMessage(av.getAlignment().getSequenceAt(seqCanvas.cursorY),
 +
 +    if (av.getAlignment().getHiddenColumns().isVisible(seqCanvas.cursorX))
 +    {
 +      setStatusMessage(av.getAlignment().getSequenceAt(seqCanvas.cursorY),
              seqCanvas.cursorX, seqCanvas.cursorY);
 +    }
  
 -    seqCanvas.repaint();
 +    if (repaintNeeded)
 +    {
 +      seqCanvas.repaint();
 +    }
    }
  
 +
    void setSelectionAreaAtCursor(boolean topLeft)
    {
      SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);