X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqCanvas.java;h=36ae6827bf689684bbdf29dac6806f5c2ce2489b;hb=2630344183a212a726d06d7d7749de39404018d9;hp=772459269f0e3f806a56b662dc1a2e685f7dfe3b;hpb=06f2d682b8b68f630596e5ffa503fe0a32388002;p=jalview.git diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index 7724592..36ae682 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -411,6 +411,13 @@ public class SeqCanvas extends JComponent implements ViewportListenerI // lcimg is a local *copy* of img which we'll draw selectImage on top of BufferedImage lcimg = buildLocalImage(selectImage); g.drawImage(lcimg, 0, 0, this); + + } + + if (av.cursorMode) + { + drawCursor(g, ranges.getStartRes(), ranges.getEndRes(), + ranges.getStartSeq(), ranges.getEndSeq()); } } @@ -509,6 +516,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); g2d.drawImage(selectImage, 0, 0, this); } + g2d.dispose(); return lcimg; @@ -1142,13 +1150,6 @@ public class SeqCanvas extends JComponent implements ViewportListenerI } } } - - if (av.cursorMode && cursorY == i && cursorX >= startRes - && cursorX <= endRes) - { - seqRdr.drawCursor(nextSeq, cursorX, (cursorX - startRes) * charWidth, - offset + ((i - startSeq) * charHeight)); - } } if (av.getSelectionGroup() != null @@ -1246,6 +1247,96 @@ public class SeqCanvas extends JComponent implements ViewportListenerI return selectionImage; } + /** + * Draw the cursor as a separate image and overlay + * + * @param startRes + * start residue of area to draw cursor in + * @param endRes + * end residue of area to draw cursor in + * @param startSeq + * start sequence of area to draw cursor in + * @param endSeq + * end sequence of are to draw cursor in + * @return a transparent image of the same size as the sequence canvas, with + * the cursor drawn on it, if any + */ + private void drawCursor(Graphics g, int startRes, int endRes, + int startSeq, + int endSeq) + { + // convert the cursorY into a position on the visible alignment + int cursor_ypos = av.getAlignment().getHiddenSequences() + .findIndexWithoutHiddenSeqs(cursorY); + + // don't do work unless we have to + if (!av.getAlignment().getHiddenSequences().isHidden(cursorY) + && cursor_ypos >= startSeq && cursor_ypos <= endSeq) + { + int yoffset = 0; + int xoffset = 0; + int startx = startRes; + int endx = endRes; + + // convert the cursorX into a position on the visible alignment + int cursor_xpos = av.getAlignment().getHiddenColumns() + .findColumnPosition(cursorX); + + if (av.getAlignment().getHiddenColumns().isVisible(cursorX)) + { + + if (av.getWrapAlignment()) + { + // work out the correct offsets for the cursor + int charHeight = av.getCharHeight(); + int charWidth = av.getCharWidth(); + int canvasWidth = getWidth(); + int canvasHeight = getHeight(); + + // 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; + + endx = startx + cWidth - 1; + int ypos = hgap; // vertical offset + + // iterate down the wrapped panels + while ((ypos <= canvasHeight) && (endx < cursor_xpos)) + { + // update vertical offset + ypos += cHeight + getAnnotationHeight() + hgap; + + // update horizontal offset + startx += cWidth; + endx = startx + cWidth - 1; + } + yoffset = ypos; + xoffset = labelWidthWest; + } + + // now check if cursor is within range for x values + if (cursor_xpos >= startx && cursor_xpos <= endx) + { + // get the character the cursor is drawn at + SequenceI seq = av.getAlignment().getSequenceAt(cursorY); + char s = seq.getCharAt(cursorX); + + seqRdr.drawCursor(g, s, + xoffset + (cursor_xpos - startx) * av.getCharWidth(), + yoffset + (cursor_ypos - startSeq) * av.getCharHeight()); + } + } + } + } + + /* * Set up graphics for selection group */ @@ -1661,6 +1752,12 @@ public class SeqCanvas extends JComponent implements ViewportListenerI repaint(); return; } + else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT)) + { + fastPaint = false; + repaint(); + return; + } int scrollX = 0; if (eventName.equals(ViewportRanges.STARTRES) @@ -1712,7 +1809,14 @@ public class SeqCanvas extends JComponent implements ViewportListenerI } else if (eventName.equals(ViewportRanges.STARTRESANDSEQ)) { - fastPaint(scrollX, 0); + if (av.getWrapAlignment()) + { + fastPaintWrapped(scrollX); + } + else + { + fastPaint(scrollX, 0); + } // bizarrely, we only need to scroll on the x value here as fastpaint // copies the full height of the image anyway. Passing in the y value // causes nasty repaint artefacts, which only disappear on a full