X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqCanvas.java;h=a9b9d4d3413c6b2677867443a4afb512348dc8da;hb=2e57729baa0bc97fc03ab1fb8eb4dbc1a12f3d9a;hp=c99041baaba1066ee692eb0ca1b54a830a1e20a2;hpb=b1f1dafab890809e47d9b3e7b54aa300ebe6d7a1;p=jalview.git diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index c99041b..a9b9d4d 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -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 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())