*/
package jalview.gui;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.HiddenColumns;
-import jalview.datamodel.SearchResultsI;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
-import jalview.datamodel.VisibleContigsIterator;
-import jalview.renderer.ScaleRenderer;
-import jalview.renderer.ScaleRenderer.ScaleMark;
-import jalview.util.Comparison;
-import jalview.viewmodel.ViewportListenerI;
-import jalview.viewmodel.ViewportRanges;
-
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JPanel;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.SearchResultsI;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.datamodel.VisibleContigsIterator;
+import jalview.renderer.ScaleRenderer;
+import jalview.renderer.ScaleRenderer.ScaleMark;
+import jalview.util.Comparison;
+import jalview.viewmodel.ViewportListenerI;
+import jalview.viewmodel.ViewportRanges;
+
/**
* The Swing component on which the alignment sequences, and annotations (if
* shown), are drawn. This includes scales above, left and right (if shown) in
@SuppressWarnings("serial")
public class SeqCanvas extends JPanel 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;
private int wrappedVisibleWidths; // number of wrapped widths displayed
// Don't do this! Graphics handles are supposed to be transient
- //private Graphics2D gg;
+ // private Graphics2D gg;
/**
* Creates a new SeqCanvas object.
public SequenceRenderer getSequenceRenderer()
{
- return seqRdr;
+ return seqRdr;
}
public FeatureRenderer getFeatureRenderer()
int yPos = ypos + charHeight;
int startX = startx;
int endX = endx;
-
+
if (av.hasHiddenColumns())
{
HiddenColumns hiddenColumns = av.getAlignment().getHiddenColumns();
}
}
-
/*
* white fill the space for the scale
*/
}
}
-
// System.err.println(">>> FastPaint to " + transX + " " + transY + " "
// + horizontal + " " + vertical + " " + startRes + " " + endRes
// + " " + startSeq + " " + endSeq);
drawSelectionGroup((Graphics2D) g, startRes, endRes, startSeq,
endSeq);
fastPaint = false;
- // System.out.println("SeqCanvas fast paint");
}
else
{
- // System.out.println("SeqCanvas full paint");
-
// 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 (av.getWrapAlignment())
{
- drawWrappedPanel(gg, width, height, ranges.getStartRes());
+ drawWrappedPanel(gg, getWidth(), getHeight(), ranges.getStartRes());
}
else
{
drawCursor(g, startRes, endRes, startSeq, endSeq);
}
}
-
+
/**
* Draw an alignment panel for printing
*
{
drawPanel(g1, startRes, endRes, startSeq, endSeq, 0);
- drawSelectionGroup((Graphics2D) g1, startRes, endRes,
- startSeq, endSeq);
+ drawSelectionGroup((Graphics2D) g1, startRes, endRes, startSeq, endSeq);
}
/**
if (group != null)
{
drawWrappedSelection((Graphics2D) g, group, canvasWidth, canvasHeight,
- startRes);
+ startRes);
}
}
FontMetrics fm = getFontMetrics(av.getFont());
int labelWidth = 0;
-
+
if (av.getScaleRightWrapped() || av.getScaleLeftWrapped())
{
labelWidth = getLabelWidth(fm);
int currentWidth = 0;
while ((currentWidth < wrappedVisibleWidths) && (start < maxWidth))
{
- int endColumn = Math
- .min(maxWidth, start + wrappedWidthInResidues - 1);
+ int endColumn = Math.min(maxWidth,
+ start + wrappedWidthInResidues - 1);
drawWrappedWidth(g, ypos, start, endColumn, canvasHeight);
ypos += wrappedRepeatHeightPx;
start += wrappedWidthInResidues;
* - start with space above plus sequences
*/
wrappedRepeatHeightPx = wrappedSpaceAboveAlignment;
- wrappedRepeatHeightPx += av.getAlignment().getHeight()
- * charHeight;
+ wrappedRepeatHeightPx += av.getAlignment().getHeight() * charHeight;
/*
* add annotations panel height if shown
* compute width in residues; this also sets East and West label widths
*/
int wrappedWidthInResidues = getWrappedCanvasWidth(canvasWidth);
-
+ av.setWrappedWidth(wrappedWidthInResidues); // update model accordingly
/*
* limit visibleWidths to not exceed width of alignment
*/
int charWidth = av.getCharWidth();
int xOffset = labelWidthWest
+ ((startColumn - ranges.getStartRes()) % viewportWidth)
- * charWidth;
+ * charWidth;
g.translate(xOffset, 0);
if (av.getScaleRightWrapped())
{
int x = labelWidthWest + viewportWidth * charWidth;
-
+
g.translate(x, 0);
drawVerticalScale(g, startCol, endColumn, ypos, false);
g.translate(-x, 0);
*/
g.translate(labelWidthWest, 0);
g.setColor(Color.white);
- g.fillRect(0, ypos - wrappedSpaceAboveAlignment, viewportWidth
- * charWidth + labelWidthWest, wrappedSpaceAboveAlignment);
+ g.fillRect(0, ypos - wrappedSpaceAboveAlignment,
+ viewportWidth * charWidth + labelWidthWest,
+ wrappedSpaceAboveAlignment);
g.setColor(Color.black);
g.translate(-labelWidthWest, 0);
* Draw a selection group over a wrapped alignment
*/
private void drawWrappedSelection(Graphics2D g, SequenceGroup group,
- int canvasWidth,
- int canvasHeight, int startRes)
+ 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);
-
+ 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())
* the cursor drawn on it, if any
*/
private void drawCursor(Graphics g, int startRes, int endRes,
- int startSeq,
- int endSeq)
+ int startSeq, int endSeq)
{
// convert the cursorY into a position on the visible alignment
int cursor_ypos = cursorY;
}
}
-
/**
* Draw a selection group over an unwrapped alignment
*
int startRes, int endRes, int startSeq, int endSeq, int offset)
{
int charWidth = av.getCharWidth();
-
+
if (!av.hasHiddenColumns())
{
drawPartialGroupOutline(g, group, startRes, endRes, startSeq, endSeq,
blockStart = region[0];
g.translate(screenY * charWidth, 0);
- drawPartialGroupOutline(g, group,
- blockStart, blockEnd, startSeq, endSeq, offset);
+ drawPartialGroupOutline(g, group, blockStart, blockEnd, startSeq,
+ endSeq, offset);
g.translate(-screenY * charWidth, 0);
screenY += blockEnd - blockStart + 1;
g.drawLine(sx + xwidth, oldY, sx + xwidth, sy);
}
}
-
+
/**
* Highlights search results in the visible region by rendering as white text
* on a black background. Any previous highlighting is removed. Answers true
return highlightSearchResults(results, false);
}
-
+
/**
* Highlights search results in the visible region by rendering as white text
* on a black background. Any previous highlighting is removed. Answers true
{
firstCol = alignment.getHiddenColumns()
.absoluteToVisibleColumn(firstCol);
- lastCol = alignment.getHiddenColumns().absoluteToVisibleColumn(lastCol);
+ lastCol = alignment.getHiddenColumns()
+ .absoluteToVisibleColumn(lastCol);
}
int transX = (firstCol - ranges.getStartRes()) * av.getCharWidth();
int transY = (firstSeq - ranges.getStartSeq()) * av.getCharHeight();
try
{
-
+
Graphics gg = img.getGraphics();
-
+
calculateWrappedGeometry(getWidth(), getHeight());
/*
if (scrollX < 0)
{
int startRes = ranges.getStartRes();
- drawWrappedWidth(gg, wrappedSpaceAboveAlignment, startRes, startRes
- - scrollX - 1, getHeight());
+ drawWrappedWidth(gg, wrappedSpaceAboveAlignment, startRes,
+ startRes - scrollX - 1, getHeight());
}
else
{
drawWrappedDecorators(gg, ranges.getStartRes());
gg.dispose();
-
+
repaint();
} finally
{
}
Graphics gg = img.getGraphics();
-
+
ViewportRanges ranges = av.getRanges();
int viewportWidth = ranges.getViewportWidth();
int charWidth = av.getCharWidth();
*/
int visibleWidths = wrappedVisibleWidths;
int canvasHeight = getHeight();
- boolean lastWidthPartHeight = (wrappedVisibleWidths * wrappedRepeatHeightPx) > canvasHeight;
+ boolean lastWidthPartHeight = (wrappedVisibleWidths
+ * wrappedRepeatHeightPx) > canvasHeight;
if (lastWidthPartHeight)
{
/*
* white fill first to erase annotations
*/
-
-
+
gg.translate(xOffset, 0);
gg.setColor(Color.white);
- gg.fillRect(labelWidthWest, ypos,
- (endRes - startRes + 1) * charWidth, wrappedRepeatHeightPx);
+ gg.fillRect(labelWidthWest, ypos, (endRes - startRes + 1) * charWidth,
+ wrappedRepeatHeightPx);
gg.translate(-xOffset, 0);
drawWrappedWidth(gg, ypos, startRes, endRes, canvasHeight);
-
+
}
/*
gg.fillRect(0, canvasHeight - heightBelow, getWidth(), heightBelow);
}
gg.dispose();
- }
+ }
/**
* Shifts the visible alignment by the specified number of columns - left if
if (y + wrappedRepeatHeightPx < canvasHeight - wrappedRepeatHeightPx
&& (xpos + viewportWidth <= xMax))
{
- gg.copyArea(labelWidthWest, y + wrappedRepeatHeightPx, -positions
- * charWidth, heightToCopy, widthToCopy,
+ gg.copyArea(labelWidthWest, y + wrappedRepeatHeightPx,
+ -positions * charWidth, heightToCopy, widthToCopy,
-wrappedRepeatHeightPx);
}
y += wrappedRepeatHeightPx;
gg.dispose();
}
-
/**
* Redraws any positions in the search results in the visible region of a
* wrapped alignment. Any highlights are drawn depending on the search results
}
int firstVisibleColumn = ranges.getStartRes();
- int lastVisibleColumn = ranges.getStartRes() + repeats
- * ranges.getViewportWidth() - 1;
+ int lastVisibleColumn = ranges.getStartRes()
+ + repeats * ranges.getViewportWidth() - 1;
AlignmentI alignment = av.getAlignment();
if (av.hasHiddenColumns())
int gapHeight = charHeight * (av.getScaleAboveWrapped() ? 2 : 1);
-
Graphics gg = img.getGraphics();
for (int seqNo = ranges.getStartSeq(); seqNo <= ranges
* transX: offset from left edge of canvas to residue position
*/
int transX = labelWidthWest
- + ((displayColumn - ranges.getStartRes()) % wrappedWidth)
- * av.getCharWidth();
+ + ((displayColumn - ranges.getStartRes())
+ % wrappedWidth) * av.getCharWidth();
/*
* transY: offset from top edge of canvas to residue position
}
}
}
-
+
gg.dispose();
return matchFound;