JAL-3103 Put jalview.jar first in getdown for .properties files. Remove now-not-neede...
[jalview.git] / src / jalview / gui / SeqCanvas.java
index c99041b..a9b9d4d 100755 (executable)
@@ -56,8 +56,8 @@ import javax.swing.JPanel;
 @SuppressWarnings("serial")
 public class SeqCanvas extends JPanel implements ViewportListenerI
 {
-  /*
-   * pixels gap between sequences and annotations when in wrapped mode
+  /**
+   * vertical gap in pixels between sequences and annotations when in wrapped mode
    */
   static final int SEQS_ANNOTATION_GAP = 3;
 
@@ -75,7 +75,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
 
   private final SequenceRenderer seqRdr;
 
-  private boolean fastPaint = false;
+  boolean fastPaint = false;
 
   private boolean fastpainting = false;
 
@@ -288,8 +288,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   public void fastPaint(int horizontal, int vertical)
   {
 
-    // System.err.println("<<SeqCanvas fastPaint " + fastpainting + " "
-    // + horizontal + " " + vertical);
     // effectively:
     // if (horizontal != 0 && vertical != 0)
     // throw new InvalidArgumentException();
@@ -376,6 +374,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   @Override
   public void paintComponent(Graphics g)
   {
+
     int charHeight = av.getCharHeight();
     int charWidth = av.getCharWidth();
 
@@ -385,7 +384,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     width -= (width % charWidth);
     height -= (height % charHeight);
 
-    // BH 2019 can't possibly fastPaint if width and height are 0
+    // BH 2019 can't possibly fastPaint if either width or height is 0
+
     if (width == 0 || height == 0)
     {
       return;
@@ -396,15 +396,29 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     int startSeq = ranges.getStartSeq();
     int endRes = ranges.getEndRes();
     int endSeq = ranges.getEndSeq();
-    if (av.isFastPaintDisabled())
-    {
-      fastPaint = false;
-    }
 
-    // System.err.println(">>SeqCanvas paintComponent " + fastPaint + "\n"
-    // + getVisibleRect() + "\n" + g.getClipBounds());
-    // System.err.println(">>>>>>>>>>>>>>>>SeqCanvas paintComponent "
-    // + startRes + " " + endRes + " " + startSeq + " " + endSeq);
+    // [JAL-3226] problem that JavaScript (or Java) may consolidate multiple
+    // repaint() requests in unpredictable ways. In this case, the issue was
+    // that in response to a CTRL-C/CTRL-V paste request, in Java a fast
+    // repaint request preceded two full requests, thus resulting
+    // in a full request for paint. In constrast, in JavaScript, the three
+    // requests were bundled together into one, so the fastPaint flag was
+    // still present for the second and third request.
+    //
+    // This resulted in incomplete painting.
+    //
+    // The solution was to set seqCanvas.fastPaint and idCanvas.fastPaint false
+    // in PaintRefresher when the target to be painted is one of those two
+    // components.
+    //
+    // BH 2019.04.22
+    //
+    // An initial idea; can be removed once we determine this issue is closed:
+    // if (av.isFastPaintDisabled())
+    // {
+    // fastPaint = false;
+    // }
+
     Rectangle vis, clip;
     if (img != null
             && (fastPaint
@@ -413,25 +427,21 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
                     || vis.height != clip.height))
     {
       g.drawImage(img, 0, 0, this);
-      // System.err.println(">>>>>>>>>>>>>>>>SeqCanvas paintComponent FAST");
       drawSelectionGroup((Graphics2D) g, startRes, endRes, startSeq,
               endSeq);
       fastPaint = false;
-      // System.out.println("SeqCanvas fast paint");
     }
     else
     {
-      // System.out.println("SeqCanvas full paint");
-      /*
-       * img is a cached version of the last view we drew.
-       * If we have no img or the size has changed, make a new one
-       */
+      // img is a cached version of the last view we drew.
+      // If we have no img or the size has changed, make a new one.
+      //
       if (img == null || width != img.getWidth()
               || height != img.getHeight())
       {
         img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
       }
-      
+
       Graphics2D gg = (Graphics2D) img.getGraphics();
       gg.setFont(av.getFont());
 
@@ -446,7 +456,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
 
       if (av.getWrapAlignment())
       {
-        drawWrappedPanel(gg, width, height, ranges.getStartRes());
+        drawWrappedPanel(gg, getWidth(), getHeight(), ranges.getStartRes());
       }
       else
       {
@@ -880,35 +890,24 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
           int canvasWidth,
           int canvasHeight, int startRes)
   {
-    int charHeight = av.getCharHeight();
-    int charWidth = av.getCharWidth();
-      
-    // height gap above each panel
-    int hgap = charHeight;
-    if (av.getScaleAboveWrapped())
-    {
-      hgap += charHeight;
-    }
-
-    int cWidth = (canvasWidth - labelWidthEast - labelWidthWest)
-            / charWidth;
-    int cHeight = av.getAlignment().getHeight() * charHeight;
-
-    int startx = startRes;
-    int endx;
-    int ypos = hgap; // vertical offset
-    int maxwidth = av.getAlignment().getVisibleWidth();
-
     // chop the wrapped alignment extent up into panel-sized blocks and treat
     // each block as if it were a block from an unwrapped alignment
     g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT,
             BasicStroke.JOIN_ROUND, 3f, new float[]
             { 5f, 3f }, 0f));
     g.setColor(Color.RED);
+
+    int charWidth = av.getCharWidth();
+    int cWidth = (canvasWidth - labelWidthEast - labelWidthWest)
+            / charWidth;
+    int startx = startRes;
+    int maxwidth = av.getAlignment().getVisibleWidth();
+    int ypos = wrappedSpaceAboveAlignment;
+
     while ((ypos <= canvasHeight) && (startx < maxwidth))
     {
       // set end value to be start + width, or maxwidth, whichever is smaller
-      endx = startx + cWidth - 1;
+      int endx = startx + cWidth - 1;
 
       if (endx > maxwidth)
       {
@@ -916,22 +915,24 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
       }
 
       g.translate(labelWidthWest, 0);
-
       drawUnwrappedSelection(g, group, startx, endx, 0,
               av.getAlignment().getHeight() - 1,
               ypos);
-
       g.translate(-labelWidthWest, 0);
 
-      // update vertical offset
-      ypos += cHeight + getAnnotationHeight() + hgap;
+      ypos += wrappedRepeatHeightPx;
 
-      // update horizontal offset
       startx += cWidth;
     }
     g.setStroke(new BasicStroke());
   }
 
+  /**
+   * Answers zero if annotations are not shown, otherwise recalculates and answers
+   * the total height of all annotation rows in pixels
+   * 
+   * @return
+   */
   int getAnnotationHeight()
   {
     if (!av.isShowAnnotation())