JAL-2831 Added move viewport event and set up cursor code to use it
authorkiramt <k.mourao@dundee.ac.uk>
Tue, 14 Nov 2017 10:15:46 +0000 (10:15 +0000)
committerkiramt <k.mourao@dundee.ac.uk>
Tue, 14 Nov 2017 10:15:46 +0000 (10:15 +0000)
src/jalview/gui/AnnotationPanel.java
src/jalview/gui/IdCanvas.java
src/jalview/gui/ScalePanel.java
src/jalview/gui/SeqCanvas.java
src/jalview/gui/SeqPanel.java
src/jalview/viewmodel/ViewportRanges.java

index ef41047..438e81b 100755 (executable)
@@ -1190,5 +1190,9 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       fastPaint(((int[]) evt.getNewValue())[0]
               - ((int[]) evt.getOldValue())[0]);
     }
+    else if (evt.getPropertyName().equals(ViewportRanges.MOVE_VIEWPORT))
+    {
+      repaint();
+    }
   }
 }
index 235dea0..085b259 100755 (executable)
@@ -569,5 +569,9 @@ public class IdCanvas extends JPanel implements ViewportListenerI
       fastPaint(((int[]) evt.getNewValue())[1]
               - ((int[]) evt.getOldValue())[1]);
     }
+    else if (propertyName.equals(ViewportRanges.MOVE_VIEWPORT))
+    {
+      repaint();
+    }
   }
 }
index 2dc198e..798c833 100755 (executable)
@@ -550,7 +550,8 @@ public class ScalePanel extends JPanel
     // paint, so scroll events are identified as changes to the horizontal or
     // vertical start value.
     if (evt.getPropertyName().equals(ViewportRanges.STARTRES)
-            || evt.getPropertyName().equals(ViewportRanges.STARTRESANDSEQ))
+            || evt.getPropertyName().equals(ViewportRanges.STARTRESANDSEQ)
+            || evt.getPropertyName().equals(ViewportRanges.MOVE_VIEWPORT))
     {
       // scroll event, repaint panel
       repaint();
index 6919f8a..66739e0 100755 (executable)
@@ -1661,6 +1661,12 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
       repaint();
       return;
     }
+    else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
+    {
+      fastPaint = false;
+      repaint();
+      return;
+    }
 
     int scrollX = 0;
     if (eventName.equals(ViewportRanges.STARTRES)
index 2223ee5..9a5f6c6 100644 (file)
@@ -320,13 +320,13 @@ public class SeqPanel extends JPanel
   void setCursorRow()
   {
     seqCanvas.cursorY = getKeyboardNo1() - 1;
-    scrollToVisible();
+    scrollToVisible(true);
   }
 
   void setCursorColumn()
   {
     seqCanvas.cursorX = getKeyboardNo1() - 1;
-    scrollToVisible();
+    scrollToVisible(true);
   }
 
   void setCursorRowAndColumn()
@@ -339,7 +339,7 @@ public class SeqPanel extends JPanel
     {
       seqCanvas.cursorX = getKeyboardNo1() - 1;
       seqCanvas.cursorY = getKeyboardNo2() - 1;
-      scrollToVisible();
+      scrollToVisible(true);
     }
   }
 
@@ -348,7 +348,7 @@ public class SeqPanel extends JPanel
     SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
 
     seqCanvas.cursorX = sequence.findIndex(getKeyboardNo1()) - 1;
-    scrollToVisible();
+    scrollToVisible(true);
   }
 
   void moveCursor(int dx, int dy)
@@ -376,10 +376,16 @@ public class SeqPanel extends JPanel
       }
     }
 
-    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)
     {
@@ -400,20 +406,37 @@ public class SeqPanel extends JPanel
     }
 
     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())
+      {
+        av.getRanges().scrollToWrappedVisible(seqCanvas.cursorX);
+      }
+      else
+      {
+        av.getRanges().scrollToVisible(seqCanvas.cursorX,
+                seqCanvas.cursorY);
+      }
     }
     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);
index 4bdaa81..9a1e13c 100644 (file)
@@ -41,6 +41,8 @@ public class ViewportRanges extends ViewportProperties
 
   public static final String STARTRESANDSEQ = "startresandseq";
 
+  public static final String MOVE_VIEWPORT = "move_viewport";
+
   private boolean wrappedMode = false;
 
   // start residue of viewport
@@ -593,7 +595,7 @@ public class ViewportRanges extends ViewportProperties
     {
       scrollUp(false);
     }
-
+    
     HiddenColumns hidden = al.getHiddenColumns();
     while (x < hidden.adjustForHiddenColumns(startRes))
     {
@@ -612,6 +614,40 @@ public class ViewportRanges extends ViewportProperties
   }
 
   /**
+   * Set the viewport location so that a position is visible
+   * 
+   * @param x
+   *          column to be visible
+   * @param y
+   *          row to be visible
+   */
+  public boolean setViewportLocation(int x, int y)
+  {
+    // if (x,y) is already visible don't do anything
+    boolean changedLocation = false;
+    if (startRes > x || x > endRes || startSeq > y && y > endSeq)
+    {
+      int width = getViewportWidth();
+      int[] oldresvalues = updateStartEndRes(x, x + width - 1);
+
+      int startseq = y;
+      int height = getViewportHeight();
+      if (startseq + height - 1 > getVisibleAlignmentHeight() - 1)
+      {
+        startseq = getVisibleAlignmentHeight() - height;
+      }
+      int[] oldseqvalues = updateStartEndSeq(startseq,
+              startseq + height - 1);
+
+      int[] old = new int[] { oldresvalues[0], oldseqvalues[0] };
+      int[] newresseq = new int[] { startRes, startSeq };
+      changedLocation = true;
+      changeSupport.firePropertyChange(MOVE_VIEWPORT, old, newresseq);
+    }
+    return changedLocation;
+  }
+
+  /**
    * Adjust sequence position for page up. Fires a property change event.
    */
   public void pageUp()