gg.copyArea(horizontal * charWidth, vertical * charHeight,
img.getWidth(), img.getHeight(), -horizontal * charWidth,
-vertical * charHeight);
+
+ /** @j2sNative xxi = this.img */
+
gg.translate(transX, transY);
drawPanel(gg, startRes, endRes, startSeq, endSeq, 0);
gg.translate(-transX, -transY);
public void paintComponent(Graphics g)
{
- if (av.getAlignPanel().getHoldRepaint())
- {
- return;
- }
int charHeight = av.getCharHeight();
int charWidth = av.getCharWidth();
- int availWidth = getWidth();
- int availHeight = getHeight();
+ int width = getWidth();
+ int height = getHeight();
- availWidth -= (availWidth % charWidth);
- availHeight -= (availHeight % charHeight);
+ width -= (width % charWidth);
+ height -= (height % charHeight);
// BH 2019 can't possibly fastPaint if either width or height is 0
- if (availWidth == 0 || availHeight == 0)
+ if (width == 0 || height == 0)
{
return;
}
// 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 || availWidth != img.getWidth()
- || availHeight != img.getHeight())
+ if (img == null || width != img.getWidth()
+ || height != img.getHeight())
{
- img = new BufferedImage(availWidth, availHeight,
- BufferedImage.TYPE_INT_RGB);
+ img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
}
Graphics2D gg = (Graphics2D) img.getGraphics();
}
gg.setColor(Color.white);
- gg.fillRect(0, 0, availWidth, availHeight);
+ gg.fillRect(0, 0, img.getWidth(), img.getHeight());
if (av.getWrapAlignment())
{
- drawWrappedPanel(gg, availWidth, availHeight, ranges.getStartRes());
+ drawWrappedPanel(gg, width, height, ranges.getStartRes());
}
else
{
}
/**
- * Using the current font, determine fields labelWidthEast and labelWidthWest,
- * and return the number of residues that can fill the remaining width.
+ * Returns the visible width of the canvas in residues, after allowing for
+ * East or West scales (if shown)
*
- * @param width
+ * @param canvasWidth
* the width in pixels (possibly including scales)
*
- * @return the visible width in residues, after allowing for East or West
- * scales (if shown)
- *
+ * @return
*/
- public int getWrappedCanvasWidth(int width)
+ public int getWrappedCanvasWidth(int canvasWidth)
{
int charWidth = av.getCharWidth();
FontMetrics fm = getFontMetrics(av.getFont());
- int labelWidth = (av.getScaleRightWrapped() || av.getScaleLeftWrapped()
- ? getLabelWidth(fm)
- : 0);
+ int labelWidth = 0;
+
+ if (av.getScaleRightWrapped() || av.getScaleLeftWrapped())
+ {
+ labelWidth = getLabelWidth(fm);
+ }
labelWidthEast = av.getScaleRightWrapped() ? labelWidth : 0;
labelWidthWest = av.getScaleLeftWrapped() ? labelWidth : 0;
- return (width - labelWidthEast - labelWidthWest) / charWidth;
+ return (canvasWidth - 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 availWidth
+ * @param canvasWidth
* available width in pixels
- * @param availHeight
+ * @param canvasHeight
* available height in pixels
* @param startColumn
* the first column (0...) of the alignment to draw
*/
- public void drawWrappedPanel(Graphics g, int availWidth, int availHeight,
- final int startColumn)
+ public void drawWrappedPanel(Graphics g, int canvasWidth,
+ int canvasHeight, final int startColumn)
{
- int wrappedWidthInResidues = calculateWrappedGeometry(availWidth,
- availHeight);
+ int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth,
+ canvasHeight);
av.setWrappedWidth(wrappedWidthInResidues);
// we need to call this again to make sure the startColumn +
// wrappedWidthInResidues values are used to calculate wrappedVisibleWidths
// correctly.
- calculateWrappedGeometry(availWidth, availHeight);
+ calculateWrappedGeometry(canvasWidth, canvasHeight);
/*
* draw one width at a time (excluding any scales shown),
{
int endColumn = Math
.min(maxWidth, start + wrappedWidthInResidues - 1);
- drawWrappedWidth(g, ypos, start, endColumn, availHeight);
+ drawWrappedWidth(g, ypos, start, endColumn, canvasHeight);
ypos += wrappedRepeatHeightPx;
start += wrappedWidthInResidues;
currentWidth++;
* <li>whether scales are shown left, right or above the alignment</li>
* </ul>
*
- * @param availWidth
- * @param availHeight
+ * @param canvasWidth
+ * @param canvasHeight
* @return the number of residue columns in each width
*/
- protected int calculateWrappedGeometry(int availWidth, int availHeight)
+ protected int calculateWrappedGeometry(int canvasWidth, int canvasHeight)
{
int charHeight = av.getCharHeight();
* ensuring a part height includes at least one sequence
*/
ViewportRanges ranges = av.getRanges();
- wrappedVisibleWidths = availHeight / wrappedRepeatHeightPx;
- int remainder = availHeight % wrappedRepeatHeightPx;
+ wrappedVisibleWidths = canvasHeight / wrappedRepeatHeightPx;
+ int remainder = canvasHeight % wrappedRepeatHeightPx;
if (remainder >= (wrappedSpaceAboveAlignment + charHeight))
{
wrappedVisibleWidths++;
/*
* compute width in residues; this also sets East and West label widths
*/
- int wrappedWidthInResidues = getWrappedCanvasWidth(availWidth);
+ int wrappedWidthInResidues = getWrappedCanvasWidth(canvasWidth);
/*
* limit visibleWidths to not exceed width of alignment
public void propertyChange(PropertyChangeEvent evt)
{
String eventName = evt.getPropertyName();
-
- // BH 2019.07.27 removes dead code introduced in aad3650 and simplifies
- // logic, emphasizing no check for ENDRES or ENDSEQ
-
- // Both scrolling and resizing change viewport ranges: scrolling changes
- // both start and end points, but resize only changes end values.
- // Here we only want to fastpaint on a scroll, with resize using a normal
- // paint, so scroll events are identified as changes to the horizontal or
- // vertical start value.
-
- // Make sure we're not trying to draw a panel
- // larger than the visible window
- int scrollX = 0;
- int scrollY = 0;
- switch (eventName)
+ // System.err.println(">>SeqCanvas propertyChange " + eventName);
+ if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
{
- case SequenceGroup.SEQ_GROUP_CHANGED:
fastPaint = true;
repaint();
return;
- case ViewportRanges.MOVE_VIEWPORT:
+ }
+ else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
+ {
fastPaint = false;
+ // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT");
repaint();
return;
- case ViewportRanges.STARTSEQ:
- // meaning STARTOREND
- // 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();
- break;
- 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;
}
- ViewportRanges vpRanges = av.getRanges();
- int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
- scrollX = Math.max(Math.min(scrollX, range), -range);
- // only STARTRES or STARTRESANDSEQ:
- if (av.getWrapAlignment())
- {
- fastPaintWrapped(scrollX);
- }
- else
+ int scrollX = 0;
+ if (eventName.equals(ViewportRanges.STARTRES)
+ || eventName.equals(ViewportRanges.STARTRESANDSEQ))
{
- fastPaint(scrollX, scrollY);
- }
+ // Make sure we're not trying to draw a panel
+ // larger than the visible window
+ if (eventName.equals(ViewportRanges.STARTRES))
+ {
+ scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
+ }
+ else
+ {
+ scrollX = ((int[]) evt.getNewValue())[0]
+ - ((int[]) evt.getOldValue())[0];
+ }
+ ViewportRanges vpRanges = av.getRanges();
- // BH 2019.07.27 was:
- // if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
- // {
- // fastPaint = true;
- // repaint();
- // return;
- // }
- // else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
- // {
- // fastPaint = false;
- // // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT");
- // repaint();
- // return;
- // }
- //
- // if (eventName.equals(ViewportRanges.STARTRES)
- // || eventName.equals(ViewportRanges.STARTRESANDSEQ))
- // {
- // // Make sure we're not trying to draw a panel
- // // larger than the visible window
- // if (eventName.equals(ViewportRanges.STARTRES))
- // {
- // scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
- // }
- // else
- // {
- // scrollX = ((int[]) evt.getNewValue())[0]
- // - ((int[]) evt.getOldValue())[0];
- // }
- // ViewportRanges vpRanges = av.getRanges();
- //
- // int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
- // if (scrollX > range)
- // {
- // scrollX = range;
- // }
- // else if (scrollX < -range)
- // {
- // scrollX = -range;
- // }
- // }
+ int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
+ if (scrollX > range)
+ {
+ scrollX = range;
+ }
+ else if (scrollX < -range)
+ {
+ scrollX = -range;
+ }
+ }
// Both scrolling and resizing change viewport ranges: scrolling changes
// both start and end points, but resize only changes end values.
// Here we only want to fastpaint on a scroll, with resize using a normal
// paint, so scroll events are identified as changes to the horizontal or
// vertical start value.
- // BH 2019.07.27 was:
- // if (eventName.equals(ViewportRanges.STARTRES))
- // {
- // if (av.getWrapAlignment())
- // {
- // fastPaintWrapped(scrollX);
- // }
- // else
- // {
- // fastPaint(scrollX, 0);
- // }
- // }
- // else if (eventName.equals(ViewportRanges.STARTSEQ))
- // {
- // // scroll
- // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
- // }
- // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
- // {
- // if (av.getWrapAlignment())
- // {
- // fastPaintWrapped(scrollX);
- // }
- // else
- // {
- // fastPaint(scrollX, 0);
- // }
- // }
- //
- // BH oops!
- //
- // else if (eventName.equals(ViewportRanges.STARTSEQ))
- // {
- // // scroll
- // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
- // }
- // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
- // {
- // if (av.getWrapAlignment())
- // {
- // fastPaintWrapped(scrollX);
- // }
- // }
+ if (eventName.equals(ViewportRanges.STARTRES))
+ {
+ if (av.getWrapAlignment())
+ {
+ fastPaintWrapped(scrollX);
+ }
+ else
+ {
+ fastPaint(scrollX, 0);
+ }
+ }
+ else if (eventName.equals(ViewportRanges.STARTSEQ))
+ {
+ // scroll
+ fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+ }
+ else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ {
+ if (av.getWrapAlignment())
+ {
+ fastPaintWrapped(scrollX);
+ }
+ else
+ {
+ fastPaint(scrollX, 0);
+ }
+ }
+ else if (eventName.equals(ViewportRanges.STARTSEQ))
+ {
+ // scroll
+ fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+ }
+ else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ {
+ if (av.getWrapAlignment())
+ {
+ fastPaintWrapped(scrollX);
+ }
+ }
}
/**