boolean fastpainting = false;
+ AnnotationPanel annotations;
+
/**
* Creates a new SeqCanvas object.
*
ranges.getStartRes(), ranges.getEndRes(),
ranges.getStartSeq(), ranges.getEndSeq());
- if (fastPaint || (getVisibleRect().width != g.getClipBounds().width)
- || (getVisibleRect().height != g.getClipBounds().height))
+ if ((img != null) && (fastPaint
+ || (getVisibleRect().width != g.getClipBounds().width)
+ || (getVisibleRect().height != g.getClipBounds().height)))
{
BufferedImage lcimg = buildLocalImage(selectImage);
g.drawImage(lcimg, 0, 0, this);
}
}
+ /**
+ * Draw an alignment panel for printing
+ *
+ * @param g1
+ * Graphics object to draw with
+ * @param startRes
+ * start residue of print area
+ * @param endRes
+ * end residue of print area
+ * @param startSeq
+ * start sequence of print area
+ * @param endSeq
+ * end sequence of print area
+ */
+ public void drawPanelForPrint(Graphics g1, int startRes, int endRes,
+ int startSeq, int endSeq)
+ {
+ BufferedImage selectImage = drawSelectionGroup(startRes, endRes,
+ startSeq, endSeq);
+ drawPanel(g1, startRes, endRes, startSeq, endSeq, 0);
+ ((Graphics2D) g1).setComposite(
+ AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
+ g1.drawImage(selectImage, 0, 0, this);
+ }
+
/*
* Make a local image by combining the cached image img
* with any selection
return lcimg;
}
- private void paintSeqGroup()
- {
- fastPaint = true;
- repaint();
- }
-
+ /*
+ * Set up a buffered image of the correct height and size for the sequence canvas
+ */
private BufferedImage setupImage()
{
BufferedImage lcimg = null;
{
System.gc();
System.err.println(
- "Selection Group image OutOfMemory Redraw Error.\n" + er);
+ "Group image OutOfMemory Redraw Error.\n" + er);
new OOMWarning("Creating alignment image for display", er);
return null;
}
}
- AnnotationPanel annotations;
-
int getAnnotationHeight()
{
if (!av.isShowAnnotation())
return annotations.adjustPanelHeight();
}
- /**
- * DOCUMENT ME!
+ /*
+ * Draw an alignment panel for printing
*
* @param g1
- * DOCUMENT ME!
+ * Graphics object to draw with
* @param startRes
- * DOCUMENT ME!
+ * start residue of print area
* @param endRes
- * DOCUMENT ME!
+ * end residue of print area
* @param startSeq
- * DOCUMENT ME!
+ * start sequence of print area
* @param endSeq
- * DOCUMENT ME!
+ * end sequence of print area
* @param offset
- * DOCUMENT ME!
+ * vertical offset
*/
- public void drawPanel(Graphics g1, int startRes, int endRes,
+ private void drawPanel(Graphics g1, int startRes, int endRes,
int startSeq, int endSeq, int offset)
{
updateViewport();
// ///////////////////////////////////
SequenceGroup group = null;
-
- int sx = -1;
- int sy = -1;
- int ex = -1;
int groupIndex = -1;
- int visWidth = (endRes - startRes + 1) * charWidth;
if (av.getAlignment().getGroups().size() > 0)
{
do
{
+ drawPartialGroupOutline(g, group, startRes, endRes, startSeq,
+ endSeq, offset);
- // drawSelectionGroupPart(g, group, startRes, endRes, startSeq,
- // endSeq,offset);
- int oldY = -1;
- int i = 0;
- boolean inGroup = false;
- int top = -1;
- int bottom = -1;
-
- for (i = startSeq; i <= endSeq; i++)
- {
- // position of start residue of group relative to startRes, in pixels
- sx = (group.getStartRes() - startRes) * charWidth;
- sy = offset + ((i - startSeq) * charHeight);
- // width of group in pixels
- ex = (((group.getEndRes() + 1) - group.getStartRes()) * charWidth)
- - 1;
-
- if (sx + ex < 0 || sx > visWidth)
- {
- continue;
- }
-
- if ((sx <= (endRes - startRes) * charWidth)
- && group.getSequences(null).contains(
- av.getAlignment().getSequenceAt(i)))
- {
- if ((bottom == -1)
- && !group.getSequences(null).contains(
- av.getAlignment().getSequenceAt(i + 1)))
- {
- bottom = sy + charHeight;
- }
-
- if (!inGroup)
- {
- if (((top == -1) && (i == 0))
- || !group.getSequences(null).contains(
- av.getAlignment().getSequenceAt(i - 1)))
- {
- top = sy;
- }
-
- oldY = sy;
- inGroup = true;
-
- g.setStroke(new BasicStroke());
- g.setColor(group.getOutlineColour());
- }
- }
- else
- {
- if (inGroup)
- {
- // if start position is visible, draw vertical line to left of
- // group
- if (sx >= 0 && sx < visWidth)
- {
- g.drawLine(sx, oldY, sx, sy);
- }
-
- // if end position is visible, draw vertical line to right of
- // group
- if (sx + ex < visWidth)
- {
- g.drawLine(sx + ex, oldY, sx + ex, sy);
- }
-
- if (sx < 0)
- {
- ex += sx;
- sx = 0;
- }
-
- if (sx + ex > visWidth)
- {
- ex = visWidth;
- }
- else if (sx + ex >= (endRes - startRes + 1) * charWidth)
- {
- ex = (endRes - startRes + 1) * charWidth;
- }
-
- // draw horizontal line at top of group
- if (top != -1)
- {
- g.drawLine(sx, top, sx + ex, top);
- top = -1;
- }
-
- // draw horizontal line at bottom of group
- if (bottom != -1)
- {
- g.drawLine(sx, bottom, sx + ex, bottom);
- bottom = -1;
- }
-
- inGroup = false;
- }
- }
- }
-
- if (inGroup)
- {
- sy = offset + ((i - startSeq) * charHeight);
- if (sx >= 0 && sx < visWidth)
- {
- g.drawLine(sx, oldY, sx, sy);
- }
-
- if (sx + ex < visWidth)
- {
- g.drawLine(sx + ex, oldY, sx + ex, sy);
- }
-
- if (sx < 0)
- {
- ex += sx;
- sx = 0;
- }
-
- if (sx + ex > visWidth)
- {
- ex = visWidth;
- }
- else if (sx + ex >= (endRes - startRes + 1) * charWidth)
- {
- ex = (endRes - startRes + 1) * charWidth;
- }
-
- if (top != -1)
- {
- g.drawLine(sx, top, sx + ex, top);
- top = -1;
- }
-
- if (bottom != -1)
- {
- g.drawLine(sx, bottom - 1, sx + ex, bottom - 1);
- bottom = -1;
- }
-
- inGroup = false;
- }
-
groupIndex++;
g.setStroke(new BasicStroke());
{
if (!av.hasHiddenColumns())
{
- drawSelectionGroupPart(g, group, startRes, endRes, startSeq, endSeq,
+ drawPartialGroupOutline(g, group, startRes, endRes, startSeq, endSeq,
offset);
}
else
blockEnd = hideStart - 1;
g.translate(screenY * charWidth, 0);
- drawSelectionGroupPart(g, group,
+ drawPartialGroupOutline(g, group,
blockStart, blockEnd, startSeq, endSeq, offset);
g.translate(-screenY * charWidth, 0);
// remaining visible region to render
blockEnd = blockStart + (endRes - startRes) - screenY;
g.translate(screenY * charWidth, 0);
- drawSelectionGroupPart(g, group,
+ drawPartialGroupOutline(g, group,
blockStart, blockEnd, startSeq, endSeq, offset);
g.translate(-screenY * charWidth, 0);
/*
* Draw the selection group as a separate image and overlay
*/
- private void drawSelectionGroupPart(Graphics2D g, SequenceGroup group,
+ private void drawPartialGroupOutline(Graphics2D g, SequenceGroup group,
int startRes, int endRes, int startSeq, int endSeq,
int verticalOffset)
{
sx = 0;
}
+ // don't let width extend beyond current block, or group extent
+ // fixes JAL-2672
if (sx + xwidth >= (endRes - startRes + 1) * charWidth)
{
xwidth = (endRes - startRes + 1) * charWidth - sx;
if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
{
- paintSeqGroup();
+ fastPaint = true;
+ repaint();
}
else if (av.getWrapAlignment())
{