X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqCanvas.java;h=d110e659c29f6eb7a97729de1217d20c0d13ecc2;hb=0ebbad305e982eeda562a1842362dc415c36cc8d;hp=ac7cf1007f8d1d080cd05cca7d138976f1ae3319;hpb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;p=jalview.git diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index ac7cf10..d110e65 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 @@ -107,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); @@ -322,7 +323,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI if (vertical > 0) // scroll down { - startSeq = endSeq - vertical; + startSeq = endSeq - vertical + 1; if (startSeq < ranges.getStartSeq()) { // ie scrolling too fast, more than a page at a time @@ -330,12 +331,12 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } else { - transY = img.getHeight() - ((vertical + 1) * charHeight); + transY = img.getHeight() - (vertical * charHeight); } } - else if (vertical < 0) + else if (vertical < 0) // scroll up { - endSeq = startSeq - vertical; + endSeq = startSeq - vertical - 1; if (endSeq > ranges.getEndSeq()) { @@ -343,7 +344,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } } - // System.err.println(">>> FastPaint to " + transX + " " + transY + " " + // jalview.bin.Console.errPrintln(">>> FastPaint to " + transX + " " + + // transY + " " // + horizontal + " " + vertical + " " + startRes + " " + endRes // + " " + startSeq + " " + endSeq); @@ -355,14 +357,15 @@ 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 { @@ -455,11 +458,12 @@ public class SeqCanvas extends JPanel implements ViewportListenerI if (av.getWrapAlignment()) { - drawWrappedPanel(gg, getWidth(), getHeight(), 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); @@ -491,7 +495,8 @@ 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); } @@ -511,7 +516,8 @@ 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) @@ -550,6 +556,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 @@ -594,8 +614,8 @@ 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, - int canvasHeight, final int startColumn) + public void drawWrappedPanel(SequenceRenderer seqRdr, Graphics g, + int canvasWidth, int canvasHeight, final int startColumn) { int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth, canvasHeight); @@ -623,7 +643,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI { int endColumn = Math.min(maxWidth, start + wrappedWidthInResidues - 1); - drawWrappedWidth(g, ypos, start, endColumn, canvasHeight); + drawWrappedWidth(seqRdr, g, ypos, start, endColumn, canvasHeight); ypos += wrappedRepeatHeightPx; start += wrappedWidthInResidues; currentWidth++; @@ -690,7 +710,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 */ @@ -716,8 +736,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * @param endColumn * @param canvasHeight */ - protected void drawWrappedWidth(Graphics g, final int ypos, - final int startColumn, final int endColumn, + protected void drawWrappedWidth(SequenceRenderer seqRdr, Graphics g, + final int ypos, final int startColumn, final int endColumn, final int canvasHeight) { ViewportRanges ranges = av.getRanges(); @@ -745,8 +765,8 @@ 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, - ypos); + drawPanel(seqRdr, g, startColumn, endx, 0, + av.getAlignment().getHeight() - 1, ypos); int cHeight = av.getAlignment().getHeight() * av.getCharHeight(); @@ -950,6 +970,10 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * 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 * @param startRes @@ -963,15 +987,20 @@ 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, - final int startSeq, final int endSeq, final int yOffset) + 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 { @@ -995,7 +1024,8 @@ 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 @@ -1021,6 +1051,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI /** * Draws a region of the visible alignment * + * @param seqRdr + * * @param g1 * @param startRes * offset of the first column in the visible region (0..) @@ -1033,8 +1065,8 @@ 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, - int endSeq, int offset) + private void draw(SequenceRenderer seqRdr, Graphics g, int startRes, + int endRes, int startSeq, int endSeq, int offset) { int charHeight = av.getCharHeight(); int charWidth = av.getCharWidth(); @@ -1375,7 +1407,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } else if (inGroup) { - drawVerticals(g, sx, xwidth, visWidth, oldY, sy); + drawVerticals(g, sx, xwidth, visWidth, oldY, bottom); drawHorizontals(g, sx, xwidth, visWidth, top, bottom); // reset top and bottom @@ -1387,7 +1419,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI if (inGroup) { sy = verticalOffset + ((i - startSeq) * charHeight); - drawVerticals(g, sx, xwidth, visWidth, oldY, sy); + drawVerticals(g, sx, xwidth, visWidth, oldY, + bottom == -1 ? sy : bottom); drawHorizontals(g, sx, xwidth, visWidth, top, bottom); } } @@ -1462,14 +1495,14 @@ public class SeqCanvas extends JPanel implements ViewportListenerI // group if (sx >= 0 && sx < visWidth) { - g.drawLine(sx, oldY, sx, sy); + g.drawLine(sx, oldY, sx, sy - 1); } // if end position is visible, draw vertical line to right of // group if (sx + xwidth < visWidth) { - g.drawLine(sx + xwidth, oldY, sx + xwidth, sy); + g.drawLine(sx + xwidth, oldY, sx + xwidth, sy - 1); } } @@ -1653,7 +1686,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI 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(); } @@ -1665,7 +1698,8 @@ 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; @@ -1675,7 +1709,8 @@ 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; } @@ -1805,7 +1840,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI if (scrollX < 0) { int startRes = ranges.getStartRes(); - drawWrappedWidth(gg, wrappedSpaceAboveAlignment, startRes, + drawWrappedWidth(seqRdr, gg, wrappedSpaceAboveAlignment, startRes, startRes - scrollX - 1, getHeight()); } else @@ -1879,7 +1914,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI wrappedRepeatHeightPx); gg.translate(-xOffset, 0); - drawWrappedWidth(gg, ypos, startRes, endRes, canvasHeight); + drawWrappedWidth(seqRdr, gg, ypos, startRes, endRes, canvasHeight); } @@ -1912,7 +1947,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); } /* @@ -2133,8 +2168,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI { matchFound = true; gg.translate(transX, transY); - drawPanel(gg, displayColumn, displayColumn, seqNo, seqNo, - yOffset); + drawPanel(seqRdr, gg, displayColumn, displayColumn, seqNo, + seqNo, yOffset); gg.translate(-transX, -transY); } }