Merge branch 'patch/JAL-4260_fix_up_select_via_ruler_in_wrapped' into develop
[jalview.git] / src / jalview / gui / SeqCanvas.java
index 39039eb..a9bfbf6 100755 (executable)
@@ -35,6 +35,7 @@ import java.util.List;
 
 import javax.swing.JPanel;
 
+import jalview.api.SequenceRenderer;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SearchResultsI;
@@ -107,7 +108,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   {
     this.av = ap.av;
     fr = new FeatureRenderer(ap);
-    seqRdr = new SequenceRenderer(av);
+    seqRdr = new jalview.gui.SequenceRenderer(av);
     setLayout(new BorderLayout());
     PaintRefresher.Register(this, av.getSequenceSetId());
     setBackground(Color.white);
@@ -322,7 +323,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
 
       if (vertical > 0) // scroll down
       {
-        startSeq = endSeq - vertical;
+        startSeq = endSeq - vertical + 1;
 
         if (startSeq < ranges.getStartSeq())
         { // ie scrolling too fast, more than a page at a time
@@ -330,12 +331,12 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
         }
         else
         {
-          transY = img.getHeight() - ((vertical + 1) * charHeight);
+          transY = img.getHeight() - (vertical * charHeight);
         }
       }
-      else if (vertical < 0)
+      else if (vertical < 0) // scroll up
       {
-        endSeq = startSeq - vertical;
+        endSeq = startSeq - vertical - 1;
 
         if (endSeq > ranges.getEndSeq())
         {
@@ -343,7 +344,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
         }
       }
 
-      // jalview.bin.Console.errPrintln(">>> FastPaint to " + transX + " " + transY + " "
+      // jalview.bin.Console.errPrintln(">>> FastPaint to " + transX + " " +
+      // transY + " "
       // + horizontal + " " + vertical + " " + startRes + " " + endRes
       // + " " + startSeq + " " + endSeq);
 
@@ -355,14 +357,15 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
       /** @j2sNative xxi = this.img */
 
       gg.translate(transX, transY);
-      drawPanel(gg, startRes, endRes, startSeq, endSeq, 0);
+      drawPanel(seqRdr, gg, startRes, endRes, startSeq, endSeq, 0);
       gg.translate(-transX, -transY);
       gg.dispose();
 
       // Call repaint on alignment panel so that repaints from other alignment
       // panel components can be aggregated. Otherwise performance of the
       // overview window and others may be adversely affected.
-      // jalview.bin.Console.outPrintln("SeqCanvas fastPaint() repaint() request...");
+      // jalview.bin.Console.outPrintln("SeqCanvas fastPaint() repaint()
+      // request...");
       av.getAlignPanel().repaint();
     } finally
     {
@@ -455,11 +458,12 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
 
       if (av.getWrapAlignment())
       {
-        drawWrappedPanel(gg, getWidth(), getHeight(), ranges.getStartRes());
+        drawWrappedPanel(seqRdr, gg, getWidth(), getHeight(),
+                ranges.getStartRes());
       }
       else
       {
-        drawPanel(gg, startRes, endRes, startSeq, endSeq, 0);
+        drawPanel(seqRdr, gg, startRes, endRes, startSeq, endSeq, 0);
       }
 
       drawSelectionGroup(gg, startRes, endRes, startSeq, endSeq);
@@ -491,7 +495,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   public void drawPanelForPrinting(Graphics g1, int startRes, int endRes,
           int startSeq, int endSeq)
   {
-    drawPanel(g1, startRes, endRes, startSeq, endSeq, 0);
+    SequenceRenderer localSeqR = new jalview.gui.SequenceRenderer(av);
+    drawPanel(localSeqR, g1, startRes, endRes, startSeq, endSeq, 0);
 
     drawSelectionGroup((Graphics2D) g1, startRes, endRes, startSeq, endSeq);
   }
@@ -511,7 +516,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   public void drawWrappedPanelForPrinting(Graphics g, int canvasWidth,
           int canvasHeight, int startRes)
   {
-    drawWrappedPanel(g, canvasWidth, canvasHeight, startRes);
+    SequenceRenderer localSeqR = new jalview.gui.SequenceRenderer(av);
+    drawWrappedPanel(localSeqR, g, canvasWidth, canvasHeight, startRes);
 
     SequenceGroup group = av.getSelectionGroup();
     if (group != null)
@@ -608,8 +614,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
    * @param startColumn
    *          the first column (0...) of the alignment to draw
    */
-  public void drawWrappedPanel(Graphics g, int canvasWidth,
-          int canvasHeight, final int startColumn)
+  public void drawWrappedPanel(SequenceRenderer seqRdr, Graphics g,
+          int canvasWidth, int canvasHeight, final int startColumn)
   {
     int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth,
             canvasHeight);
@@ -637,7 +643,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     {
       int endColumn = Math.min(maxWidth,
               start + wrappedWidthInResidues - 1);
-      drawWrappedWidth(g, ypos, start, endColumn, canvasHeight);
+      drawWrappedWidth(seqRdr, g, ypos, start, endColumn, canvasHeight);
       ypos += wrappedRepeatHeightPx;
       start += wrappedWidthInResidues;
       currentWidth++;
@@ -730,8 +736,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
    * @param endColumn
    * @param canvasHeight
    */
-  protected void drawWrappedWidth(Graphics g, final int ypos,
-          final int startColumn, final int endColumn,
+  protected void drawWrappedWidth(SequenceRenderer seqRdr, Graphics g,
+          final int ypos, final int startColumn, final int endColumn,
           final int canvasHeight)
   {
     ViewportRanges ranges = av.getRanges();
@@ -759,8 +765,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     g.fillRect(0, ypos, (endx - startColumn + 1) * charWidth,
             wrappedRepeatHeightPx);
 
-    drawPanel(g, startColumn, endx, 0, av.getAlignment().getHeight() - 1,
-            ypos);
+    drawPanel(seqRdr, g, startColumn, endx, 0,
+            av.getAlignment().getHeight() - 1, ypos);
 
     int cHeight = av.getAlignment().getHeight() * av.getCharHeight();
 
@@ -964,6 +970,10 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
    * between the markers is drawn separately, followed by the hidden column
    * marker.
    * 
+   * @param localSeqR
+   *          - sequence renderer implementation - when null, uses the one used
+   *          for rendering interactive GUI
+   * 
    * @param g1
    *          the graphics context, positioned at the first residue to be drawn
    * @param startRes
@@ -977,15 +987,20 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
    * @param yOffset
    *          vertical offset at which to draw (for wrapped alignments)
    */
-  public void drawPanel(Graphics g1, final int startRes, final int endRes,
-          final int startSeq, final int endSeq, final int yOffset)
+  public void drawPanel(SequenceRenderer localSeqR, Graphics g1,
+          final int startRes, final int endRes, final int startSeq,
+          final int endSeq, final int yOffset)
   {
     int charHeight = av.getCharHeight();
     int charWidth = av.getCharWidth();
 
+    if (localSeqR == null)
+    {
+      localSeqR = seqRdr;
+    }
     if (!av.hasHiddenColumns())
     {
-      draw(g1, startRes, endRes, startSeq, endSeq, yOffset);
+      draw(localSeqR, g1, startRes, endRes, startSeq, endSeq, yOffset);
     }
     else
     {
@@ -1009,7 +1024,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
          */
         g1.translate(screenY * charWidth, 0);
 
-        draw(g1, blockStart, blockEnd, startSeq, endSeq, yOffset);
+        draw(localSeqR, g1, blockStart, blockEnd, startSeq, endSeq,
+                yOffset);
 
         /*
          * draw the downline of the hidden column marker (ScalePanel draws the
@@ -1035,6 +1051,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   /**
    * Draws a region of the visible alignment
    * 
+   * @param seqRdr
+   * 
    * @param g1
    * @param startRes
    *          offset of the first column in the visible region (0..)
@@ -1047,8 +1065,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
    * @param yOffset
    *          vertical offset at which to draw (for wrapped alignments)
    */
-  private void draw(Graphics g, int startRes, int endRes, int startSeq,
-          int endSeq, int offset)
+  private void draw(SequenceRenderer seqRdr, Graphics g, int startRes,
+          int endRes, int startSeq, int endSeq, int offset)
   {
     int charHeight = av.getCharHeight();
     int charWidth = av.getCharWidth();
@@ -1390,7 +1408,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
         else if (inGroup)
         {
           drawVerticals(g, sx, xwidth, visWidth, oldY, bottom);
-          drawHorizontals(g, sx, xwidth, visWidth, top, bottom+1);
+          drawHorizontals(g, sx, xwidth, visWidth, top, bottom);
 
           // reset top and bottom
           top = -1;
@@ -1401,8 +1419,9 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
       if (inGroup)
       {
         sy = verticalOffset + ((i - startSeq) * charHeight);
-        drawVerticals(g, sx, xwidth, visWidth, oldY, bottom);
-        drawHorizontals(g, sx, xwidth, visWidth, top, bottom+1);
+        drawVerticals(g, sx, xwidth, visWidth, oldY,
+                bottom == -1 ? sy : bottom);
+        drawHorizontals(g, sx, xwidth, visWidth, top, bottom);
       }
     }
   }
@@ -1667,7 +1686,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
       int transY = (firstSeq - ranges.getStartSeq()) * av.getCharHeight();
       Graphics gg = img.getGraphics();
       gg.translate(transX, transY);
-      drawPanel(gg, firstCol, lastCol, firstSeq, lastSeq, 0);
+      drawPanel(seqRdr, gg, firstCol, lastCol, firstSeq, lastSeq, 0);
       gg.translate(-transX, -transY);
       gg.dispose();
     }
@@ -1679,7 +1698,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   public void propertyChange(PropertyChangeEvent evt)
   {
     String eventName = evt.getPropertyName();
-    // jalview.bin.Console.errPrintln(">>SeqCanvas propertyChange " + eventName);
+    // jalview.bin.Console.errPrintln(">>SeqCanvas propertyChange " +
+    // eventName);
     if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
     {
       fastPaint = true;
@@ -1689,7 +1709,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
     {
       fastPaint = false;
-      // jalview.bin.Console.errPrintln("!!!! fastPaint false from MOVE_VIEWPORT");
+      // jalview.bin.Console.errPrintln("!!!! fastPaint false from
+      // MOVE_VIEWPORT");
       repaint();
       return;
     }
@@ -1819,7 +1840,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
       if (scrollX < 0)
       {
         int startRes = ranges.getStartRes();
-        drawWrappedWidth(gg, wrappedSpaceAboveAlignment, startRes,
+        drawWrappedWidth(seqRdr, gg, wrappedSpaceAboveAlignment, startRes,
                 startRes - scrollX - 1, getHeight());
       }
       else
@@ -1893,7 +1914,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
               wrappedRepeatHeightPx);
       gg.translate(-xOffset, 0);
 
-      drawWrappedWidth(gg, ypos, startRes, endRes, canvasHeight);
+      drawWrappedWidth(seqRdr, gg, ypos, startRes, endRes, canvasHeight);
 
     }
 
@@ -1926,7 +1947,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
 
     if (startRes < ranges.getVisibleAlignmentWidth())
     {
-      drawWrappedWidth(gg, ypos, startRes, endRes, canvasHeight);
+      drawWrappedWidth(seqRdr, gg, ypos, startRes, endRes, canvasHeight);
     }
 
     /*
@@ -2147,8 +2168,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
               {
                 matchFound = true;
                 gg.translate(transX, transY);
-                drawPanel(gg, displayColumn, displayColumn, seqNo, seqNo,
-                        yOffset);
+                drawPanel(seqRdr, gg, displayColumn, displayColumn, seqNo,
+                        seqNo, yOffset);
                 gg.translate(-transX, -transY);
               }
             }