*/
public class SeqCanvas extends JComponent 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;
}
/**
- * Draw a wrapped alignment panel for printing
+ * Draws a wrapped alignment panel for printing. After drawing, the graphics
+ * origin is shifted down by the height of the image drawn.
*
* @param g
- * Graphics object to draw with
+ * Graphics object to draw with
* @param canvasWidth
- * width of drawing area
+ * width of drawing area
* @param canvasHeight
- * height of drawing area
+ * height of drawing area
* @param startRes
- * start residue of print area
+ * start residue of print area
*/
public void drawWrappedPanelForPrinting(Graphics g, int canvasWidth,
int canvasHeight, int startRes)
{
- drawWrappedPanel(g, canvasWidth, canvasHeight, startRes);
+ int heightDrawn = drawWrappedPanel(g, canvasWidth, canvasHeight,
+ startRes);
SequenceGroup group = av.getSelectionGroup();
if (group != null)
drawWrappedSelection((Graphics2D) g, group, canvasWidth, canvasHeight,
startRes);
}
+
+ /*
+ * shift graphics (0, 0) to below the region drawn
+ */
+ g.translate(0, heightDrawn);
}
/**
labelWidthWest = av.getScaleLeftWrapped() ? labelWidth : 0;
- System.out.println(Thread.currentThread().getName()
- + " " + System.currentTimeMillis() + " labelWidthWest: "
- + labelWidthWest);
return (canvasWidth - labelWidthEast - labelWidthWest) / charWidth;
}
}
/**
- * Draws as many widths of a wrapped alignment as can fit in the visible
- * window
+ * Draws as many widths of a wrapped alignment as can fit in the visible window,
+ * and returns the height drawn in pixels
*
* @param g
* @param canvasWidth
- * available width in pixels
+ * available width in pixels
* @param canvasHeight
- * available height in pixels
+ * available height in pixels
* @param startColumn
- * the first column (0...) of the alignment to draw
+ * the first column (0...) of the alignment to draw
+ *
+ * @return
*/
- public void drawWrappedPanel(Graphics g, int canvasWidth,
+ public int drawWrappedPanel(Graphics g, int canvasWidth,
int canvasHeight, final int startColumn)
{
int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth,
canvasHeight);
-
av.setWrappedWidth(wrappedWidthInResidues);
ViewportRanges ranges = av.getRanges();
}
drawWrappedDecorators(g, startColumn);
+
+ return ypos;
}
/**
// the Printable page which we need to account for here
Shape clip = g.getClip();
- if (clip == null)
- {
- g.setClip(0, 0, viewportWidth * charWidth, canvasHeight);
- }
- else
+ if (clip != null)
{
g.setClip(0, (int) clip.getBounds().getY(),
viewportWidth * charWidth, (int) clip.getBounds().getHeight());
startColumn, endx + 1);
g.translate(0, -yShift);
}
- g.setClip(clip);
+
+ if (clip != null)
+ {
+ g.setClip(clip);
+ }
+
g.translate(-xOffset, 0);
}
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())