import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
+import java.awt.Graphics2D;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.ComponentAdapter;
}
/**
- * DOCUMENT ME!
- *
- * @param pg
- * DOCUMENT ME!
- * @param pwidth
- * DOCUMENT ME!
- * @param pheight
- * DOCUMENT ME!
- * @param pi
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- *
- * @throws PrinterException
- * DOCUMENT ME!
- */
- /**
* Draws the alignment image, including sequence ids, sequences, and
* annotation labels and annotations if shown, on either one or two Graphics
- * context.
+ * contexts.
*
* @param pageWidth
+ * in pixels
* @param pageHeight
- * @param pi
+ * in pixels
+ * @param pageIndex
+ * (0, 1, ...)
* @param idGraphics
* the graphics context for sequence ids and annotation labels
* @param alignmentGraphics
* @return
* @throws PrinterException
*/
- public int printUnwrapped(int pageWidth, int pageHeight, int pi,
+ public int printUnwrapped(int pageWidth, int pageHeight, int pageIndex,
Graphics idGraphics, Graphics alignmentGraphics)
throws PrinterException
{
: idWidth;
FontMetrics fm = getFontMetrics(av.getFont());
- int charHeight = av.getCharHeight();
- int scaleHeight = charHeight + fm.getDescent();
+ final int charHeight = av.getCharHeight();
+ final int scaleHeight = charHeight + fm.getDescent();
idGraphics.setColor(Color.white);
idGraphics.fillRect(0, 0, pageWidth, pageHeight);
/*
* How many sequences and residues can we fit on a printable page?
*/
- int totalRes = (pageWidth - idWidth) / av.getCharWidth();
+ final int totalRes = (pageWidth - idWidth) / av.getCharWidth();
- int totalSeq = (pageHeight - scaleHeight) / charHeight - 1;
+ final int totalSeq = (pageHeight - scaleHeight) / charHeight - 1;
- int alignmentWidth = av.getAlignment().getWidth();
- int pagesWide = (alignmentWidth / totalRes) + 1;
+ final int alignmentWidth = av.getAlignment().getWidth();
+ final int pagesWide = (alignmentWidth / totalRes) + 1;
- final int startRes = (pi % pagesWide) * totalRes;
- int endRes = (startRes + totalRes) - 1;
+ final int startRes = (pageIndex % pagesWide) * totalRes;
+ final int endRes = Math.min(startRes + totalRes - 1,
+ alignmentWidth - 1);
- if (endRes > (alignmentWidth - 1))
- {
- endRes = alignmentWidth - 1;
- }
-
- final int startSeq = (pi / pagesWide) * totalSeq;
- int endSeq = startSeq + totalSeq;
-
- int alignmentHeight = av.getAlignment().getHeight();
- if (endSeq > alignmentHeight)
- {
- endSeq = alignmentHeight;
- }
+ final int startSeq = (pageIndex / pagesWide) * totalSeq;
+ final int alignmentHeight = av.getAlignment().getHeight();
+ final int endSeq = Math.min(startSeq + totalSeq, alignmentHeight);
int pagesHigh = ((alignmentHeight / totalSeq) + 1) * pageHeight;
pagesHigh /= pageHeight;
- if (pi >= (pagesWide * pagesHigh))
+ if (pageIndex >= (pagesWide * pagesHigh))
{
return Printable.NO_SUCH_PAGE;
}
* then reset to top left (0, 0)
*/
idGraphics.translate(0, scaleHeight);
- idGraphics.setFont(getIdPanel().getIdCanvas().getIdfont());
- Color currentColor = null;
- Color currentTextColor = null;
+ IdCanvas idCanvas = getIdPanel().getIdCanvas();
+ List<SequenceI> selection = av.getSelectionGroup() == null ? null
+ : av.getSelectionGroup().getSequences(null);
+ idCanvas.drawIds((Graphics2D) idGraphics, av, startSeq, endSeq - 1,
+ selection);
- SequenceI seq;
- for (int i = startSeq; i < endSeq; i++)
- {
- seq = av.getAlignment().getSequenceAt(i);
- if ((av.getSelectionGroup() != null)
- && av.getSelectionGroup().getSequences(null).contains(seq))
- {
- /*
- * gray out ids of sequences in selection group (if any)
- */
- currentColor = Color.gray;
- currentTextColor = Color.black;
- }
- else
- {
- currentColor = av.getSequenceColour(seq);
- currentTextColor = Color.black;
- }
-
- idGraphics.setColor(currentColor);
- idGraphics.fillRect(0, (i - startSeq) * charHeight, idWidth,
- charHeight);
-
- idGraphics.setColor(currentTextColor);
-
- int xPos = 0;
- String displayId = seq.getDisplayId(av.getShowJVSuffix());
- if (av.isRightAlignIds())
- {
- fm = idGraphics.getFontMetrics();
- xPos = idWidth - fm.stringWidth(displayId) - 4;
- }
-
- idGraphics.drawString(displayId, xPos,
- (((i - startSeq) * charHeight) + charHeight)
- - (charHeight / 5));
- }
idGraphics.setFont(av.getFont());
idGraphics.translate(0, -scaleHeight);
*/
alignmentGraphics.translate(alignmentGraphicsOffset, scaleHeight);
getSeqPanel().seqCanvas.drawPanelForPrinting(alignmentGraphics, startRes,
- endRes, startSeq, endSeq);
+ endRes, startSeq, endSeq - 1);
alignmentGraphics.translate(-alignmentGraphicsOffset, 0);
if (av.isShowAnnotation() && (endSeq == alignmentHeight))
List<SequenceI> searchResults;
- FontMetrics fm;
-
- AnnotationLabels labels = null;
-
AnnotationPanel ap;
private Font idfont;
/**
* DOCUMENT ME!
*
- * @param gg
+ * @param g
* DOCUMENT ME!
* @param hiddenRows
* true - check and display hidden row marker if need be
* @param ypos
* DOCUMENT ME!
*/
- public void drawIdString(Graphics2D gg, boolean hiddenRows, SequenceI s,
+ public void drawIdString(Graphics2D g, boolean hiddenRows, SequenceI s,
int i, int starty, int ypos)
{
int xPos = 0;
if ((searchResults != null) && searchResults.contains(s))
{
- gg.setColor(Color.black);
- gg.fillRect(0, ((i - starty) * charHeight) + ypos, getWidth(),
+ g.setColor(Color.black);
+ g.fillRect(0, ((i - starty) * charHeight) + ypos, getWidth(),
charHeight);
- gg.setColor(Color.white);
+ g.setColor(Color.white);
}
else if ((av.getSelectionGroup() != null)
&& av.getSelectionGroup().getSequences(null).contains(s))
{
- gg.setColor(Color.lightGray);
- gg.fillRect(0, ((i - starty) * charHeight) + ypos, getWidth(),
+ g.setColor(Color.lightGray);
+ g.fillRect(0, ((i - starty) * charHeight) + ypos, getWidth(),
charHeight);
- gg.setColor(Color.white);
+ g.setColor(Color.white);
}
else
{
- gg.setColor(av.getSequenceColour(s));
- gg.fillRect(0, ((i - starty) * charHeight) + ypos, getWidth(),
+ g.setColor(av.getSequenceColour(s));
+ g.fillRect(0, ((i - starty) * charHeight) + ypos, getWidth(),
charHeight);
- gg.setColor(Color.black);
+ g.setColor(Color.black);
}
if (av.isRightAlignIds())
{
+ FontMetrics fm = g.getFontMetrics();
xPos = panelWidth
- fm.stringWidth(s.getDisplayId(av.getShowJVSuffix())) - 4;
}
- gg.drawString(s.getDisplayId(av.getShowJVSuffix()), xPos,
+ g.drawString(s.getDisplayId(av.getShowJVSuffix()), xPos,
(((i - starty + 1) * charHeight) + ypos) - (charHeight / 5));
if (hiddenRows)
{
- drawMarker(i, starty, ypos);
+ drawMarker(g, av, i, starty, ypos);
}
}
gg.translate(0, transY);
- drawIds(ss, es);
+ drawIds(gg, av, ss, es, searchResults);
gg.translate(0, -transY);
gg.setColor(Color.white);
gg.fillRect(0, 0, getWidth(), imgHeight);
- drawIds(av.getRanges().getStartSeq(), av.getRanges().getEndSeq());
+ drawIds(gg, av, av.getRanges().getStartSeq(), av.getRanges().getEndSeq(), searchResults);
g.drawImage(image, 0, 0, this);
}
/**
- * DOCUMENT ME!
+ * Draws sequence ids from sequence index starty to endy (inclusive), with the
+ * font and other display settings configured on the viewport. Ids of
+ * sequences included in the selection are coloured grey, otherwise the
+ * current id colour for the sequence id is used.
*
+ * @param g
+ * @param alignViewport
* @param starty
- * DOCUMENT ME!
* @param endy
- * DOCUMENT ME!
+ * @param selection
*/
- void drawIds(int starty, int endy)
+ void drawIds(Graphics2D g, AlignViewport alignViewport, final int starty,
+ final int endy, List<SequenceI> selection)
{
- if (av.isSeqNameItalics())
+ Font font = alignViewport.getFont();
+ if (alignViewport.isSeqNameItalics())
{
- setIdfont(new Font(av.getFont().getName(), Font.ITALIC,
- av.getFont().getSize()));
+ setIdfont(new Font(font.getName(), Font.ITALIC,
+ font.getSize()));
}
else
{
- setIdfont(av.getFont());
+ setIdfont(font);
}
- gg.setFont(getIdfont());
- fm = gg.getFontMetrics();
+ g.setFont(getIdfont());
+ FontMetrics fm = g.getFontMetrics();
- if (av.antiAlias)
+ if (alignViewport.antiAlias)
{
- gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
}
boolean hasHiddenRows = av.hasHiddenRows();
- if (av.getWrapAlignment())
+ if (alignViewport.getWrapAlignment())
{
drawIdsWrapped(starty, hasHiddenRows);
return;
}
- // No need to hang on to labels if we're not wrapped
- labels = null;
-
// Now draw the id strings
int panelWidth = getWidth();
int xPos = 0;
- SequenceI sequence;
// Now draw the id strings
for (int i = starty; i <= endy; i++)
{
- sequence = av.getAlignment().getSequenceAt(i);
+ SequenceI sequence = alignViewport.getAlignment().getSequenceAt(i);
if (sequence == null)
{
continue;
}
- if (hasHiddenRows || av.isDisplayReferenceSeq())
+ if (hasHiddenRows || alignViewport.isDisplayReferenceSeq())
{
- setHiddenFont(sequence);
+ g.setFont(getHiddenFont(sequence, alignViewport));
}
// Selected sequence colours
- if ((searchResults != null) && searchResults.contains(sequence))
+ if (selection != null && selection.contains(sequence))
{
currentColor = Color.black;
currentTextColor = Color.white;
}
else
{
- currentColor = av.getSequenceColour(sequence);
+ currentColor = alignViewport.getSequenceColour(sequence);
currentTextColor = Color.black;
}
- gg.setColor(currentColor);
+ g.setColor(currentColor);
- gg.fillRect(0, (i - starty) * av.getCharHeight(), getWidth(),
- av.getCharHeight());
+ int charHeight = alignViewport.getCharHeight();
+ g.fillRect(0, (i - starty) * charHeight,
+ getWidth(), charHeight);
- gg.setColor(currentTextColor);
+ g.setColor(currentTextColor);
- String string = sequence.getDisplayId(av.getShowJVSuffix());
+ String string = sequence
+ .getDisplayId(alignViewport.getShowJVSuffix());
- if (av.isRightAlignIds())
+ if (alignViewport.isRightAlignIds())
{
xPos = panelWidth - fm.stringWidth(string) - 4;
}
- gg.drawString(string, xPos,
- (((i - starty) * av.getCharHeight()) + av.getCharHeight())
- - (av.getCharHeight() / 5));
+ g.drawString(string, xPos, (((i - starty) * charHeight) + charHeight)
+ - (charHeight / 5));
if (hasHiddenRows)
{
- drawMarker(i, starty, 0);
+ drawMarker(g, alignViewport, i, starty, 0);
}
}
}
int annotationHeight = 0;
+ AnnotationLabels labels = null;
if (av.isShowAnnotation())
{
if (ap == null)
}
annotationHeight = ap.adjustPanelHeight();
- if (labels == null)
- {
- labels = new AnnotationLabels(av);
- }
+ labels = new AnnotationLabels(av);
}
int hgap = av.getCharHeight();
SequenceI s = av.getAlignment().getSequenceAt(i);
if (hasHiddenRows || av.isDisplayReferenceSeq())
{
- setHiddenFont(s);
+ gg.setFont(getHiddenFont(s, av));
}
else
{
}
}
- void drawMarker(int i, int starty, int yoffset)
+ /**
+ * Draws a marker (a blue right-pointing triangle) between sequences to
+ * indicate hidden sequences.
+ *
+ * @param g
+ * @param alignViewport
+ * @param seqIndex
+ * @param starty
+ * @param yoffset
+ */
+ void drawMarker(Graphics2D g, AlignViewport alignViewport, int seqIndex, int starty, int yoffset)
{
-
- SequenceI[] hseqs = av.getAlignment()
+ SequenceI[] hseqs = alignViewport.getAlignment()
.getHiddenSequences().hiddenSequences;
// Use this method here instead of calling hiddenSeq adjust
// 3 times.
int hSize = hseqs.length;
- int hiddenIndex = i;
- int lastIndex = i - 1;
- int nextIndex = i + 1;
+ int hiddenIndex = seqIndex;
+ int lastIndex = seqIndex - 1;
+ int nextIndex = seqIndex + 1;
for (int j = 0; j < hSize; j++)
{
}
}
+ /*
+ * are we below or above the hidden sequences?
+ */
boolean below = (hiddenIndex > lastIndex + 1);
boolean above = (nextIndex > hiddenIndex + 1);
- gg.setColor(Color.blue);
+ g.setColor(Color.blue);
+ int charHeight = av.getCharHeight();
+
+ /*
+ * vertices of the triangle, below or above hidden seqs
+ */
+ int[] xPoints = new int[]
+ { getWidth() - charHeight,
+ getWidth() - charHeight, getWidth() };
+ int yShift = seqIndex - starty;
+
if (below)
{
- gg.fillPolygon(
- new int[]
- { getWidth() - av.getCharHeight(),
- getWidth() - av.getCharHeight(), getWidth() },
- new int[]
- { (i - starty) * av.getCharHeight() + yoffset,
- (i - starty) * av.getCharHeight() + yoffset
- + av.getCharHeight() / 4,
- (i - starty) * av.getCharHeight() + yoffset },
- 3);
+ int[] yPoints = new int[] { yShift * charHeight + yoffset,
+ yShift * charHeight + yoffset + charHeight / 4,
+ yShift * charHeight + yoffset };
+ g.fillPolygon(xPoints, yPoints, 3);
}
if (above)
{
- gg.fillPolygon(
- new int[]
- { getWidth() - av.getCharHeight(),
- getWidth() - av.getCharHeight(), getWidth() },
- new int[]
- { (i - starty + 1) * av.getCharHeight() + yoffset,
- (i - starty + 1) * av.getCharHeight() + yoffset
- - av.getCharHeight() / 4,
- (i - starty + 1) * av.getCharHeight() + yoffset },
- 3);
-
+ yShift++;
+ int[] yPoints = new int[] { yShift * charHeight + yoffset,
+ yShift * charHeight + yoffset - charHeight / 4,
+ yShift * charHeight + yoffset };
+ g.fillPolygon(xPoints, yPoints, 3);
}
}
- void setHiddenFont(SequenceI seq)
+ /**
+ * Answers the standard sequence id font, or a bold font if the sequence is
+ * set as reference or a hidden group representative
+ *
+ * @param seq
+ * @param alignViewport
+ * @return
+ */
+ private Font getHiddenFont(SequenceI seq, AlignViewport alignViewport)
{
- Font bold = new Font(av.getFont().getName(), Font.BOLD,
- av.getFont().getSize());
-
if (av.isReferenceSeq(seq) || av.isHiddenRepSequence(seq))
{
- gg.setFont(bold);
- }
- else
- {
- gg.setFont(getIdfont());
+ return new Font(av.getFont().getName(), Font.BOLD,
+ av.getFont().getSize());
}
+ return getIdfont();
}
/**