X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqCanvas.java;fp=src%2Fjalview%2Fgui%2FSeqCanvas.java;h=4f0176181c09675fdfdde261b46007e93dd8cd8b;hb=d795ef2dcdb9c14765f17fba44068e7b90f221d9;hp=66739e02126394b747dde4702f248c423c81c15a;hpb=24eed665b66cab524acc09a392af9189c4b51706;p=jalview.git diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index 66739e0..4f01761 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -365,11 +365,14 @@ public class SeqCanvas extends JComponent implements ViewportListenerI ranges.getStartRes(), ranges.getEndRes(), ranges.getStartSeq(), ranges.getEndSeq()); + BufferedImage cursorImage = drawCursor(ranges.getStartRes(), + ranges.getEndRes(), ranges.getStartSeq(), ranges.getEndSeq()); + if ((img != null) && (fastPaint || (getVisibleRect().width != g.getClipBounds().width) || (getVisibleRect().height != g.getClipBounds().height))) { - BufferedImage lcimg = buildLocalImage(selectImage); + BufferedImage lcimg = buildLocalImage(selectImage, cursorImage); g.drawImage(lcimg, 0, 0, this); fastPaint = false; } @@ -409,7 +412,7 @@ 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); + BufferedImage lcimg = buildLocalImage(selectImage, cursorImage); g.drawImage(lcimg, 0, 0, this); } } @@ -494,7 +497,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI * Make a local image by combining the cached image img * with any selection */ - private BufferedImage buildLocalImage(BufferedImage selectImage) + private BufferedImage buildLocalImage(BufferedImage selectImage, + BufferedImage cursorImage) { // clone the cached image BufferedImage lcimg = new BufferedImage(img.getWidth(), img.getHeight(), @@ -509,6 +513,12 @@ public class SeqCanvas extends JComponent implements ViewportListenerI AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); g2d.drawImage(selectImage, 0, 0, this); } + // overlay cursor on lcimg + if (cursorImage != null) + { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); + g2d.drawImage(cursorImage, 0, 0, this); + } g2d.dispose(); return lcimg; @@ -1143,12 +1153,12 @@ public class SeqCanvas extends JComponent implements ViewportListenerI } } - if (av.cursorMode && cursorY == i && cursorX >= startRes + /* 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 +1256,91 @@ 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 BufferedImage drawCursor(int startRes, int endRes, int startSeq, + int endSeq) + { + // define our cursor image + BufferedImage cursorImage = null; + + // don't do work unless we have to + if (av.cursorMode && cursorY >= startSeq && cursorY <= endSeq) + { + int yoffset = 0; + int xoffset = 0; + int startx = startRes; + int endx = endRes; + 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 < cursorX)) + { + // 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 (cursorX >= startx && cursorX <= endx) + { + // get a new image of the correct size + cursorImage = setupImage(); + Graphics2D g = (Graphics2D) cursorImage.getGraphics(); + + // get the character the cursor is drawn at + SequenceI seq = av.getAlignment().getSequenceAt(cursorY); + char s = seq.getCharAt(cursorX); + + seqRdr.drawCursor(g, s, + xoffset + (cursorX - startx) * av.getCharWidth(), + yoffset + (cursorY - startSeq) * av.getCharHeight()); + g.dispose(); + } + } + + return cursorImage; + } + + /* * Set up graphics for selection group */