X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqCanvas.java;h=537af58e6d5b8fde5317c50400d7b2e9dfd30739;hb=1213d49ca3df8f48360da857121805d088c13aab;hp=c99041baaba1066ee692eb0ca1b54a830a1e20a2;hpb=b1f1dafab890809e47d9b3e7b54aa300ebe6d7a1;p=jalview.git diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index c99041b..537af58 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -20,18 +20,6 @@ */ 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; @@ -47,6 +35,19 @@ import java.util.List; import javax.swing.JPanel; +import jalview.api.SequenceRenderer; +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 @@ -56,8 +57,9 @@ import javax.swing.JPanel; @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; @@ -75,7 +77,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI private final SequenceRenderer seqRdr; - private boolean fastPaint = false; + boolean fastPaint = false; private boolean fastpainting = false; @@ -95,7 +97,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI 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. @@ -106,7 +108,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI { this.av = ap.av; fr = new FeatureRenderer(ap); - seqRdr = new SequenceRenderer(av); + seqRdr = new jalview.gui.SequenceRenderer(av); setLayout(new BorderLayout()); PaintRefresher.Register(this, av.getSequenceSetId()); setBackground(Color.white); @@ -116,7 +118,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI public SequenceRenderer getSequenceRenderer() { - return seqRdr; + return seqRdr; } public FeatureRenderer getFeatureRenderer() @@ -202,7 +204,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI int yPos = ypos + charHeight; int startX = startx; int endX = endx; - + if (av.hasHiddenColumns()) { HiddenColumns hiddenColumns = av.getAlignment().getHiddenColumns(); @@ -238,7 +240,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } } - /* * white fill the space for the scale */ @@ -288,8 +289,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI public void fastPaint(int horizontal, int vertical) { - // System.err.println("<>> FastPaint to " + transX + " " + transY + " " + // jalview.bin.Console.errPrintln(">>> FastPaint to " + transX + " " + transY + " " // + horizontal + " " + vertical + " " + startRes + " " + endRes // + " " + startSeq + " " + endSeq); @@ -358,14 +356,14 @@ public class SeqCanvas extends JPanel implements ViewportListenerI /** @j2sNative xxi = this.img */ gg.translate(transX, transY); - drawPanel(gg, startRes, endRes, startSeq, endSeq, 0); + drawPanel(seqRdr, gg, startRes, endRes, startSeq, endSeq, 0); gg.translate(-transX, -transY); gg.dispose(); // Call repaint on alignment panel so that repaints from other alignment // panel components can be aggregated. Otherwise performance of the // overview window and others may be adversely affected. - // System.out.println("SeqCanvas fastPaint() repaint() request..."); + // jalview.bin.Console.outPrintln("SeqCanvas fastPaint() repaint() request..."); av.getAlignPanel().repaint(); } finally { @@ -376,6 +374,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI @Override public void paintComponent(Graphics g) { + int charHeight = av.getCharHeight(); int charWidth = av.getCharWidth(); @@ -385,7 +384,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI width -= (width % charWidth); height -= (height % charHeight); - // BH 2019 can't possibly fastPaint if width and height are 0 + // BH 2019 can't possibly fastPaint if either width or height is 0 + if (width == 0 || height == 0) { return; @@ -396,15 +396,29 @@ public class SeqCanvas extends JPanel implements ViewportListenerI int startSeq = ranges.getStartSeq(); int endRes = ranges.getEndRes(); int endSeq = ranges.getEndSeq(); - if (av.isFastPaintDisabled()) - { - fastPaint = false; - } - // System.err.println(">>SeqCanvas paintComponent " + fastPaint + "\n" - // + getVisibleRect() + "\n" + g.getClipBounds()); - // System.err.println(">>>>>>>>>>>>>>>>SeqCanvas paintComponent " - // + startRes + " " + endRes + " " + startSeq + " " + endSeq); + // [JAL-3226] problem that JavaScript (or Java) may consolidate multiple + // repaint() requests in unpredictable ways. In this case, the issue was + // that in response to a CTRL-C/CTRL-V paste request, in Java a fast + // repaint request preceded two full requests, thus resulting + // in a full request for paint. In constrast, in JavaScript, the three + // requests were bundled together into one, so the fastPaint flag was + // still present for the second and third request. + // + // This resulted in incomplete painting. + // + // The solution was to set seqCanvas.fastPaint and idCanvas.fastPaint false + // in PaintRefresher when the target to be painted is one of those two + // components. + // + // BH 2019.04.22 + // + // An initial idea; can be removed once we determine this issue is closed: + // if (av.isFastPaintDisabled()) + // { + // fastPaint = false; + // } + Rectangle vis, clip; if (img != null && (fastPaint @@ -413,25 +427,21 @@ public class SeqCanvas extends JPanel implements ViewportListenerI || vis.height != clip.height)) { g.drawImage(img, 0, 0, this); - // System.err.println(">>>>>>>>>>>>>>>>SeqCanvas paintComponent FAST"); 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 - */ + // 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 || width != img.getWidth() || height != img.getHeight()) { img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } - + Graphics2D gg = (Graphics2D) img.getGraphics(); gg.setFont(av.getFont()); @@ -446,11 +456,11 @@ public class SeqCanvas extends JPanel implements ViewportListenerI if (av.getWrapAlignment()) { - drawWrappedPanel(gg, width, height, ranges.getStartRes()); + drawWrappedPanel(seqRdr, gg, getWidth(), getHeight(), ranges.getStartRes()); } else { - drawPanel(gg, startRes, endRes, startSeq, endSeq, 0); + drawPanel(seqRdr,gg, startRes, endRes, startSeq, endSeq, 0); } drawSelectionGroup(gg, startRes, endRes, startSeq, endSeq); @@ -464,7 +474,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI drawCursor(g, startRes, endRes, startSeq, endSeq); } } - + /** * Draw an alignment panel for printing * @@ -482,10 +492,10 @@ public class SeqCanvas extends JPanel implements ViewportListenerI public void drawPanelForPrinting(Graphics g1, int startRes, int endRes, int startSeq, int endSeq) { - drawPanel(g1, startRes, endRes, startSeq, endSeq, 0); + SequenceRenderer localSeqR = new jalview.gui.SequenceRenderer(av); + drawPanel(localSeqR,g1, startRes, endRes, startSeq, endSeq, 0); - drawSelectionGroup((Graphics2D) g1, startRes, endRes, - startSeq, endSeq); + drawSelectionGroup((Graphics2D) g1, startRes, endRes, startSeq, endSeq); } /** @@ -503,13 +513,14 @@ public class SeqCanvas extends JPanel implements ViewportListenerI public void drawWrappedPanelForPrinting(Graphics g, int canvasWidth, int canvasHeight, int startRes) { - drawWrappedPanel(g, canvasWidth, canvasHeight, startRes); + SequenceRenderer localSeqR = new jalview.gui.SequenceRenderer(av); + drawWrappedPanel(localSeqR, g, canvasWidth, canvasHeight, startRes); SequenceGroup group = av.getSelectionGroup(); if (group != null) { drawWrappedSelection((Graphics2D) g, group, canvasWidth, canvasHeight, - startRes); + startRes); } } @@ -529,7 +540,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI FontMetrics fm = getFontMetrics(av.getFont()); int labelWidth = 0; - + if (av.getScaleRightWrapped() || av.getScaleLeftWrapped()) { labelWidth = getLabelWidth(fm); @@ -542,6 +553,20 @@ public class SeqCanvas extends JPanel implements ViewportListenerI return (canvasWidth - labelWidthEast - labelWidthWest) / charWidth; } + public int getMinimumWrappedCanvasWidth() + { + int charWidth = av.getCharWidth(); + FontMetrics fm = getFontMetrics(av.getFont()); + int labelWidth = 0; + if (av.getScaleRightWrapped() || av.getScaleLeftWrapped()) + { + labelWidth = getLabelWidth(fm); + } + labelWidthEast = av.getScaleRightWrapped() ? labelWidth : 0; + labelWidthWest = av.getScaleLeftWrapped() ? labelWidth : 0; + return labelWidthEast + labelWidthWest + charWidth; + } + /** * Returns a pixel width sufficient to show the largest sequence coordinate * (end position) in the alignment, calculated as the FontMetrics width of @@ -586,7 +611,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * @param startColumn * the first column (0...) of the alignment to draw */ - public void drawWrappedPanel(Graphics g, int canvasWidth, + public void drawWrappedPanel(SequenceRenderer seqRdr, Graphics g, int canvasWidth, int canvasHeight, final int startColumn) { int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth, @@ -613,9 +638,9 @@ public class SeqCanvas extends JPanel implements ViewportListenerI int currentWidth = 0; while ((currentWidth < wrappedVisibleWidths) && (start < maxWidth)) { - int endColumn = Math - .min(maxWidth, start + wrappedWidthInResidues - 1); - drawWrappedWidth(g, ypos, start, endColumn, canvasHeight); + int endColumn = Math.min(maxWidth, + start + wrappedWidthInResidues - 1); + drawWrappedWidth(seqRdr, g, ypos, start, endColumn, canvasHeight); ypos += wrappedRepeatHeightPx; start += wrappedWidthInResidues; currentWidth++; @@ -654,8 +679,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * - start with space above plus sequences */ wrappedRepeatHeightPx = wrappedSpaceAboveAlignment; - wrappedRepeatHeightPx += av.getAlignment().getHeight() - * charHeight; + wrappedRepeatHeightPx += av.getAlignment().getHeight() * charHeight; /* * add annotations panel height if shown @@ -683,7 +707,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * 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 */ @@ -709,7 +733,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * @param endColumn * @param canvasHeight */ - protected void drawWrappedWidth(Graphics g, final int ypos, + protected void drawWrappedWidth(SequenceRenderer seqRdr, Graphics g, final int ypos, final int startColumn, final int endColumn, final int canvasHeight) { @@ -726,7 +750,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI int charWidth = av.getCharWidth(); int xOffset = labelWidthWest + ((startColumn - ranges.getStartRes()) % viewportWidth) - * charWidth; + * charWidth; g.translate(xOffset, 0); @@ -738,7 +762,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI g.fillRect(0, ypos, (endx - startColumn + 1) * charWidth, wrappedRepeatHeightPx); - drawPanel(g, startColumn, endx, 0, av.getAlignment().getHeight() - 1, + drawPanel(seqRdr, g, startColumn, endx, 0, av.getAlignment().getHeight() - 1, ypos); int cHeight = av.getAlignment().getHeight() * av.getCharHeight(); @@ -793,7 +817,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI if (av.getScaleRightWrapped()) { int x = labelWidthWest + viewportWidth * charWidth; - + g.translate(x, 0); drawVerticalScale(g, startCol, endColumn, ypos, false); g.translate(-x, 0); @@ -805,8 +829,9 @@ public class SeqCanvas extends JPanel implements ViewportListenerI */ 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); @@ -877,38 +902,26 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * 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) { @@ -916,22 +929,23 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } 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()) @@ -952,6 +966,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * are hidden column markers in the visible region, then each sub-region * between the markers is drawn separately, followed by the hidden column * marker. + * @param localSeqR - sequence renderer implementation - when null, uses the one used for rendering interactive GUI * * @param g1 * the graphics context, positioned at the first residue to be drawn @@ -966,15 +981,19 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * @param yOffset * vertical offset at which to draw (for wrapped alignments) */ - public void drawPanel(Graphics g1, final int startRes, final int endRes, + public void drawPanel(SequenceRenderer localSeqR, Graphics g1, final int startRes, final int endRes, final int startSeq, final int endSeq, final int yOffset) { int charHeight = av.getCharHeight(); int charWidth = av.getCharWidth(); + if (localSeqR==null) + { + localSeqR = seqRdr; + } if (!av.hasHiddenColumns()) { - draw(g1, startRes, endRes, startSeq, endSeq, yOffset); + draw(localSeqR, g1, startRes, endRes, startSeq, endSeq, yOffset); } else { @@ -998,7 +1017,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI */ g1.translate(screenY * charWidth, 0); - draw(g1, blockStart, blockEnd, startSeq, endSeq, yOffset); + draw(localSeqR, g1, blockStart, blockEnd, startSeq, endSeq, yOffset); /* * draw the downline of the hidden column marker (ScalePanel draws the @@ -1023,6 +1042,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI /** * Draws a region of the visible alignment + * @param seqRdr * * @param g1 * @param startRes @@ -1036,7 +1056,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * @param yOffset * vertical offset at which to draw (for wrapped alignments) */ - private void draw(Graphics g, int startRes, int endRes, int startSeq, + private void draw(SequenceRenderer seqRdr, Graphics g, int startRes, int endRes, int startSeq, int endSeq, int offset) { int charHeight = av.getCharHeight(); @@ -1189,8 +1209,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * 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; @@ -1261,7 +1280,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } } - /** * Draw a selection group over an unwrapped alignment * @@ -1284,7 +1302,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI int startRes, int endRes, int startSeq, int endSeq, int offset) { int charWidth = av.getCharWidth(); - + if (!av.hasHiddenColumns()) { drawPartialGroupOutline(g, group, startRes, endRes, startSeq, endSeq, @@ -1307,8 +1325,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI 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; @@ -1380,8 +1398,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } else if (inGroup) { - drawVerticals(g, sx, xwidth, visWidth, oldY, sy); - drawHorizontals(g, sx, xwidth, visWidth, top, bottom); + drawVerticals(g, sx, xwidth, visWidth, oldY, bottom); + drawHorizontals(g, sx, xwidth, visWidth, top, bottom+1); // reset top and bottom top = -1; @@ -1392,8 +1410,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI if (inGroup) { sy = verticalOffset + ((i - startSeq) * charHeight); - drawVerticals(g, sx, xwidth, visWidth, oldY, sy); - drawHorizontals(g, sx, xwidth, visWidth, top, bottom); + drawVerticals(g, sx, xwidth, visWidth, oldY, bottom); + drawHorizontals(g, sx, xwidth, visWidth, top, bottom+1); } } } @@ -1477,7 +1495,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI 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 @@ -1493,7 +1511,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI 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 @@ -1651,13 +1669,14 @@ public class SeqCanvas extends JPanel implements ViewportListenerI { 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(); Graphics gg = img.getGraphics(); gg.translate(transX, transY); - drawPanel(gg, firstCol, lastCol, firstSeq, lastSeq, 0); + drawPanel(seqRdr, gg, firstCol, lastCol, firstSeq, lastSeq, 0); gg.translate(-transX, -transY); gg.dispose(); } @@ -1669,7 +1688,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI public void propertyChange(PropertyChangeEvent evt) { String eventName = evt.getPropertyName(); - // System.err.println(">>SeqCanvas propertyChange " + eventName); + // jalview.bin.Console.errPrintln(">>SeqCanvas propertyChange " + eventName); if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED)) { fastPaint = true; @@ -1679,7 +1698,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT)) { fastPaint = false; - // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT"); + // jalview.bin.Console.errPrintln("!!!! fastPaint false from MOVE_VIEWPORT"); repaint(); return; } @@ -1791,9 +1810,9 @@ public class SeqCanvas extends JPanel implements ViewportListenerI try { - + Graphics gg = img.getGraphics(); - + calculateWrappedGeometry(getWidth(), getHeight()); /* @@ -1809,8 +1828,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI if (scrollX < 0) { int startRes = ranges.getStartRes(); - drawWrappedWidth(gg, wrappedSpaceAboveAlignment, startRes, startRes - - scrollX - 1, getHeight()); + drawWrappedWidth(seqRdr,gg, wrappedSpaceAboveAlignment, startRes, + startRes - scrollX - 1, getHeight()); } else { @@ -1823,7 +1842,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI drawWrappedDecorators(gg, ranges.getStartRes()); gg.dispose(); - + repaint(); } finally { @@ -1848,7 +1867,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } Graphics gg = img.getGraphics(); - + ViewportRanges ranges = av.getRanges(); int viewportWidth = ranges.getViewportWidth(); int charWidth = av.getCharWidth(); @@ -1859,7 +1878,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI */ int visibleWidths = wrappedVisibleWidths; int canvasHeight = getHeight(); - boolean lastWidthPartHeight = (wrappedVisibleWidths * wrappedRepeatHeightPx) > canvasHeight; + boolean lastWidthPartHeight = (wrappedVisibleWidths + * wrappedRepeatHeightPx) > canvasHeight; if (lastWidthPartHeight) { @@ -1875,16 +1895,15 @@ public class SeqCanvas extends JPanel implements ViewportListenerI /* * 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); - + drawWrappedWidth(seqRdr, gg, ypos, startRes, endRes, canvasHeight); + } /* @@ -1916,7 +1935,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI if (startRes < ranges.getVisibleAlignmentWidth()) { - drawWrappedWidth(gg, ypos, startRes, endRes, canvasHeight); + drawWrappedWidth(seqRdr, gg, ypos, startRes, endRes, canvasHeight); } /* @@ -1929,7 +1948,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI gg.fillRect(0, canvasHeight - heightBelow, getWidth(), heightBelow); } gg.dispose(); - } + } /** * Shifts the visible alignment by the specified number of columns - left if @@ -2017,8 +2036,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI 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; @@ -2028,7 +2047,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI 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 @@ -2062,8 +2080,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } 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()) @@ -2076,7 +2094,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI int gapHeight = charHeight * (av.getScaleAboveWrapped() ? 2 : 1); - Graphics gg = img.getGraphics(); for (int seqNo = ranges.getStartSeq(); seqNo <= ranges @@ -2120,8 +2137,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * 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 @@ -2139,7 +2156,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI { matchFound = true; gg.translate(transX, transY); - drawPanel(gg, displayColumn, displayColumn, seqNo, seqNo, + drawPanel(seqRdr,gg, displayColumn, displayColumn, seqNo, seqNo, yOffset); gg.translate(-transX, -transY); } @@ -2148,7 +2165,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } } } - + gg.dispose(); return matchFound;