{
continue;
}
-
- if (validateSequences && comp instanceof AlignmentPanel
- && source instanceof AlignmentPanel)
+ if (comp instanceof AlignmentPanel)
+ {
+ if (validateSequences && source instanceof AlignmentPanel)
+ {
+ validateSequences(((AlignmentPanel) source).av.getAlignment(),
+ ((AlignmentPanel) comp).av.getAlignment());
+ }
+ if (alignmentChanged)
+ {
+ ((AlignmentPanel) comp).alignmentChanged();
+ }
+ }
+ else if (comp instanceof IdCanvas)
{
- validateSequences(((AlignmentPanel) source).av.getAlignment(),
- ((AlignmentPanel) comp).av.getAlignment());
+ // BH 2019.04.22 fixes JS problem of repaint() consolidation
+ // that occurs in JavaScript but not Java [JAL-3226]
+ ((IdCanvas) comp).fastPaint = false;
}
-
- if (comp instanceof AlignmentPanel && alignmentChanged)
+ else if (comp instanceof SeqCanvas)
{
- ((AlignmentPanel) comp).alignmentChanged();
+ // BH 2019.04.22 fixes JS problem of repaint() consolidation
+ // that occurs in JavaScript but not Java [JAL-3226]
+ ((SeqCanvas) comp).fastPaint = false;
}
-
comp.repaint();
}
}
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;
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());
*/
private boolean followHighlight = true;
- private boolean disableFastPaint; // BH 2019.04.18
-
- /**
- * BH 2019.04.18 When gap filling is on and a modification is made to fill
- * those, we need to disallow fast painting for paste just once
- *
- * @return
- */
- public boolean isFastPaintDisabled()
- {
- boolean ret = disableFastPaint;
- disableFastPaint = false;
- return ret;
- }
+ // private boolean disableFastPaint; // BH 2019.04.18
+ //
+ // /**
+ // * BH 2019.04.18 When gap filling is on and a modification is made to fill
+ // * those, we need to disallow fast painting for paste just once
+ // *
+ // * @return
+ // */
+ // public boolean isFastPaintDisabled()
+ // {
+ // boolean ret = disableFastPaint;
+ // disableFastPaint = false;
+ // return ret;
+ // }
/**
* Property change listener for changes in alignment
{
if (isPadGaps())
{
- if (alignment.padGaps())
- {
- // the new alignment has been modified -- can't fast paint
- disableFastPaint = true;
- }
+ alignment.padGaps();
+ // if (alignment.padGaps())
+ // {
+ // // the new alignment has been modified -- can't fast paint
+ // disableFastPaint = true;
+ // }
}
if (autoCalculateConsensus)
{