private final SequenceRenderer seqRdr;
- boolean fastPaint = false;
+ private boolean fastPaint = false;
private boolean fastpainting = false;
@Override
public void paintComponent(Graphics g)
{
-
+ if (av.getAlignPanel().getHoldRepaint())
+ {
+ return;
+ }
int charHeight = av.getCharHeight();
int charWidth = av.getCharWidth();
- int width = getWidth();
- int height = getHeight();
-
- width -= (width % charWidth);
- height -= (height % charHeight);
+ int availWidth = getWidth();
+ int availHeight = getHeight();
- // BH 2019 can't possibly fastPaint if either width or height is 0
+ availWidth -= (availWidth % charWidth);
+ availHeight -= (availHeight % charHeight);
- if (width == 0 || height == 0)
+ if (availWidth == 0 || availHeight == 0)
{
return;
}
int endRes = ranges.getEndRes();
int endSeq = ranges.getEndSeq();
- // [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
// 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())
+ if (img == null || availWidth != img.getWidth()
+ || availHeight != img.getHeight())
{
- img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ img = new BufferedImage(availWidth, availHeight,
+ BufferedImage.TYPE_INT_RGB);
}
Graphics2D gg = (Graphics2D) img.getGraphics();
}
gg.setColor(Color.white);
- gg.fillRect(0, 0, img.getWidth(), img.getHeight());
+ gg.fillRect(0, 0, availWidth, availHeight);
if (av.getWrapAlignment())
{
- drawWrappedPanel(gg, width, height, ranges.getStartRes());
+ drawWrappedPanel(gg, availWidth, availHeight, ranges.getStartRes());
}
else
{
}
/**
- * Returns the visible width of the canvas in residues, after allowing for
- * East or West scales (if shown)
+ * Using the current font, determine fields labelWidthEast and labelWidthWest,
+ * and return the number of residues that can fill the remaining width
*
- * @param canvasWidth
+ * @param w
* the width in pixels (possibly including scales)
*
- * @return
+ * @return the visible width in residues, after allowing for East or West
+ * scales (if shown)
+ *
*/
- public int getWrappedCanvasWidth(int canvasWidth)
+ public int getWrappedCanvasWidth(int w)
{
int charWidth = av.getCharWidth();
FontMetrics fm = getFontMetrics(av.getFont());
- int labelWidth = 0;
-
- if (av.getScaleRightWrapped() || av.getScaleLeftWrapped())
- {
- labelWidth = getLabelWidth(fm);
- }
+ int labelWidth = (av.getScaleRightWrapped() || av.getScaleLeftWrapped()
+ ? getLabelWidth(fm)
+ : 0);
labelWidthEast = av.getScaleRightWrapped() ? labelWidth : 0;
labelWidthWest = av.getScaleLeftWrapped() ? labelWidth : 0;
- return (canvasWidth - labelWidthEast - labelWidthWest) / charWidth;
+ return (w - labelWidthEast - labelWidthWest) / charWidth;
}
/**
maxWidth = Math.max(maxWidth, alignment.getSequenceAt(i).getEnd());
}
+ // quick int log10
int length = 0;
for (int i = maxWidth; i > 0; i /= 10)
{
* window
*
* @param g
- * @param canvasWidth
+ * @param availWidth
* available width in pixels
- * @param canvasHeight
+ * @param availHeight
* available height in pixels
* @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(Graphics g, int availWidth, int availHeight,
+ final int startColumn)
{
- int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth,
- canvasHeight);
+ int wrappedWidthInResidues = calculateWrappedGeometry(availWidth,
+ availHeight);
av.setWrappedWidth(wrappedWidthInResidues);
// we need to call this again to make sure the startColumn +
// wrappedWidthInResidues values are used to calculate wrappedVisibleWidths
// correctly.
- calculateWrappedGeometry(canvasWidth, canvasHeight);
+ calculateWrappedGeometry(availWidth, availHeight);
/*
* draw one width at a time (excluding any scales shown),
{
int endColumn = Math
.min(maxWidth, start + wrappedWidthInResidues - 1);
- drawWrappedWidth(g, ypos, start, endColumn, canvasHeight);
+ drawWrappedWidth(g, ypos, start, endColumn, availHeight);
ypos += wrappedRepeatHeightPx;
start += wrappedWidthInResidues;
currentWidth++;
* <li>whether scales are shown left, right or above the alignment</li>
* </ul>
*
- * @param canvasWidth
- * @param canvasHeight
+ * @param availWidth
+ * @param availHeight
* @return the number of residue columns in each width
*/
- protected int calculateWrappedGeometry(int canvasWidth, int canvasHeight)
+ protected int calculateWrappedGeometry(int availWidth, int availHeight)
{
int charHeight = av.getCharHeight();
* ensuring a part height includes at least one sequence
*/
ViewportRanges ranges = av.getRanges();
- wrappedVisibleWidths = canvasHeight / wrappedRepeatHeightPx;
- int remainder = canvasHeight % wrappedRepeatHeightPx;
+ wrappedVisibleWidths = availHeight / wrappedRepeatHeightPx;
+ int remainder = availHeight % wrappedRepeatHeightPx;
if (remainder >= (wrappedSpaceAboveAlignment + charHeight))
{
wrappedVisibleWidths++;
/*
* compute width in residues; this also sets East and West label widths
*/
- int wrappedWidthInResidues = getWrappedCanvasWidth(canvasWidth);
+ int wrappedWidthInResidues = getWrappedCanvasWidth(availWidth);
/*
* limit visibleWidths to not exceed width of alignment
// Make sure we're not trying to draw a panel
// larger than the visible window
int scrollX = 0;
+ int scrollY = 0;
switch (eventName)
{
case SequenceGroup.SEQ_GROUP_CHANGED:
// typically scroll, but possibly just the end changed
fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
return;
- case ViewportRanges.ENDRES:
- case ViewportRanges.ENDSEQ:
- // meaning second event along with "START" -- ENDONLY,NOTSTART
- // TODO: ignore??
- return;
case ViewportRanges.STARTRES:
// meaning STARTOREND
scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
case ViewportRanges.STARTRESANDSEQ:
scrollX = ((int[]) evt.getNewValue())[0]
- ((int[]) evt.getOldValue())[0];
+ scrollY = ((int[]) evt.getNewValue())[1]
+ - ((int[]) evt.getOldValue())[1];
+
+ // System.out.println("SC dx dy " + scrollX + " " + scrollY);
+
+ if (scrollX != 0 && scrollY != 0)
+ {
+ // all sorts of problems in JavaScript if this is commented out.
+ repaint();
+ return;
+
+ }
break;
+ default:
+ return;
}
+
ViewportRanges vpRanges = av.getRanges();
int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
scrollX = Math.max(Math.min(scrollX, range), -range);
}
else
{
- fastPaint(scrollX, 0);
+ fastPaint(scrollX, scrollY);
}
// BH 2019.07.27 was:
return labelWidthWest;
}
+ /**
+ * Clears the flag that allows a 'fast paint' on the next repaint, so
+ * requiring a full repaint
+ */
+ public void setNoFastPaint()
+ {
+ fastPaint = false;
+ }
+
}