@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;
private final SequenceRenderer seqRdr;
- private boolean fastPaint = false;
+ boolean fastPaint = false;
private boolean fastpainting = false;
public void fastPaint(int horizontal, int vertical)
{
- // System.err.println("<<SeqCanvas fastPaint " + fastpainting + " "
- // + horizontal + " " + vertical);
// effectively:
// if (horizontal != 0 && vertical != 0)
// throw new InvalidArgumentException();
@Override
public void paintComponent(Graphics g)
{
+
int charHeight = av.getCharHeight();
int charWidth = av.getCharWidth();
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;
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
|| 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());
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)
{
}
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())