X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqCanvas.java;fp=src%2Fjalview%2Fgui%2FSeqCanvas.java;h=e96270973b2dd1b2fb1f9b14e6c4c0f7d2205d13;hb=4f77328104498504339216829abf5ea87e2791ec;hp=123e649838d401e19ed9d4667303e7fa44712f79;hpb=2b8c0785318a3528e1876e8e2dd48b7d831eae69;p=jalview.git diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index 123e649..e962709 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -352,6 +352,9 @@ public class SeqCanvas extends JPanel implements ViewportListenerI gg.copyArea(horizontal * charWidth, vertical * charHeight, img.getWidth(), img.getHeight(), -horizontal * charWidth, -vertical * charHeight); + + /** @j2sNative xxi = this.img */ + gg.translate(transX, transY); drawPanel(gg, startRes, endRes, startSeq, endSeq, 0); gg.translate(-transX, -transY); @@ -372,22 +375,18 @@ public class SeqCanvas extends JPanel implements ViewportListenerI public void paintComponent(Graphics g) { - if (av.getAlignPanel().getHoldRepaint()) - { - return; - } int charHeight = av.getCharHeight(); int charWidth = av.getCharWidth(); - int availWidth = getWidth(); - int availHeight = getHeight(); + int width = getWidth(); + int height = getHeight(); - availWidth -= (availWidth % charWidth); - availHeight -= (availHeight % charHeight); + width -= (width % charWidth); + height -= (height % charHeight); // BH 2019 can't possibly fastPaint if either width or height is 0 - if (availWidth == 0 || availHeight == 0) + if (width == 0 || height == 0) { return; } @@ -437,11 +436,10 @@ public class SeqCanvas extends JPanel implements ViewportListenerI // 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 || availWidth != img.getWidth() - || availHeight != img.getHeight()) + if (img == null || width != img.getWidth() + || height != img.getHeight()) { - img = new BufferedImage(availWidth, availHeight, - BufferedImage.TYPE_INT_RGB); + img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } Graphics2D gg = (Graphics2D) img.getGraphics(); @@ -454,11 +452,11 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } gg.setColor(Color.white); - gg.fillRect(0, 0, availWidth, availHeight); + gg.fillRect(0, 0, img.getWidth(), img.getHeight()); if (av.getWrapAlignment()) { - drawWrappedPanel(gg, availWidth, availHeight, ranges.getStartRes()); + drawWrappedPanel(gg, width, height, ranges.getStartRes()); } else { @@ -526,31 +524,32 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } /** - * Using the current font, determine fields labelWidthEast and labelWidthWest, - * and return the number of residues that can fill the remaining width. + * Returns the visible width of the canvas in residues, after allowing for + * East or West scales (if shown) * - * @param width + * @param canvasWidth * the width in pixels (possibly including scales) * - * @return the visible width in residues, after allowing for East or West - * scales (if shown) - * + * @return */ - public int getWrappedCanvasWidth(int width) + public int getWrappedCanvasWidth(int canvasWidth) { int charWidth = av.getCharWidth(); FontMetrics fm = getFontMetrics(av.getFont()); - int labelWidth = (av.getScaleRightWrapped() || av.getScaleLeftWrapped() - ? getLabelWidth(fm) - : 0); + int labelWidth = 0; + + if (av.getScaleRightWrapped() || av.getScaleLeftWrapped()) + { + labelWidth = getLabelWidth(fm); + } labelWidthEast = av.getScaleRightWrapped() ? labelWidth : 0; labelWidthWest = av.getScaleLeftWrapped() ? labelWidth : 0; - return (width - labelWidthEast - labelWidthWest) / charWidth; + return (canvasWidth - labelWidthEast - labelWidthWest) / charWidth; } /** @@ -576,7 +575,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI maxWidth = Math.max(maxWidth, alignment.getSequenceAt(i).getEnd()); } - // quick int log10 int length = 0; for (int i = maxWidth; i > 0; i /= 10) { @@ -591,18 +589,18 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * window * * @param g - * @param availWidth + * @param canvasWidth * available width in pixels - * @param availHeight + * @param canvasHeight * available height in pixels * @param startColumn * the first column (0...) of the alignment to draw */ - public void drawWrappedPanel(Graphics g, int availWidth, int availHeight, - final int startColumn) + public void drawWrappedPanel(Graphics g, int canvasWidth, + int canvasHeight, final int startColumn) { - int wrappedWidthInResidues = calculateWrappedGeometry(availWidth, - availHeight); + int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth, + canvasHeight); av.setWrappedWidth(wrappedWidthInResidues); @@ -612,7 +610,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI // we need to call this again to make sure the startColumn + // wrappedWidthInResidues values are used to calculate wrappedVisibleWidths // correctly. - calculateWrappedGeometry(availWidth, availHeight); + calculateWrappedGeometry(canvasWidth, canvasHeight); /* * draw one width at a time (excluding any scales shown), @@ -627,7 +625,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI { int endColumn = Math .min(maxWidth, start + wrappedWidthInResidues - 1); - drawWrappedWidth(g, ypos, start, endColumn, availHeight); + drawWrappedWidth(g, ypos, start, endColumn, canvasHeight); ypos += wrappedRepeatHeightPx; start += wrappedWidthInResidues; currentWidth++; @@ -646,11 +644,11 @@ public class SeqCanvas extends JPanel implements ViewportListenerI *
  • whether scales are shown left, right or above the alignment
  • * * - * @param availWidth - * @param availHeight + * @param canvasWidth + * @param canvasHeight * @return the number of residue columns in each width */ - protected int calculateWrappedGeometry(int availWidth, int availHeight) + protected int calculateWrappedGeometry(int canvasWidth, int canvasHeight) { int charHeight = av.getCharHeight(); @@ -684,8 +682,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI * ensuring a part height includes at least one sequence */ ViewportRanges ranges = av.getRanges(); - wrappedVisibleWidths = availHeight / wrappedRepeatHeightPx; - int remainder = availHeight % wrappedRepeatHeightPx; + wrappedVisibleWidths = canvasHeight / wrappedRepeatHeightPx; + int remainder = canvasHeight % wrappedRepeatHeightPx; if (remainder >= (wrappedSpaceAboveAlignment + charHeight)) { wrappedVisibleWidths++; @@ -694,7 +692,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI /* * compute width in residues; this also sets East and West label widths */ - int wrappedWidthInResidues = getWrappedCanvasWidth(availWidth); + int wrappedWidthInResidues = getWrappedCanvasWidth(canvasWidth); /* * limit visibleWidths to not exceed width of alignment @@ -1681,164 +1679,92 @@ public class SeqCanvas extends JPanel implements ViewportListenerI public void propertyChange(PropertyChangeEvent evt) { String eventName = evt.getPropertyName(); - - // BH 2019.07.27 removes dead code introduced in aad3650 and simplifies - // logic, emphasizing no check for ENDRES or ENDSEQ - - // Both scrolling and resizing change viewport ranges: scrolling changes - // both start and end points, but resize only changes end values. - // Here we only want to fastpaint on a scroll, with resize using a normal - // paint, so scroll events are identified as changes to the horizontal or - // vertical start value. - - // Make sure we're not trying to draw a panel - // larger than the visible window - int scrollX = 0; - int scrollY = 0; - switch (eventName) + // System.err.println(">>SeqCanvas propertyChange " + eventName); + if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED)) { - case SequenceGroup.SEQ_GROUP_CHANGED: fastPaint = true; repaint(); return; - case ViewportRanges.MOVE_VIEWPORT: + } + else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT)) + { fastPaint = false; + // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT"); repaint(); return; - case ViewportRanges.STARTSEQ: - // meaning STARTOREND - // typically scroll, but possibly just the end changed - fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue()); - return; - case ViewportRanges.ENDRES: - case ViewportRanges.ENDSEQ: - // meaning second event along with "START" -- ENDONLY,NOTSTART - // TODO: ignore?? - return; - case ViewportRanges.STARTRES: - // meaning STARTOREND - scrollX = (int) evt.getNewValue() - (int) evt.getOldValue(); - break; - case ViewportRanges.STARTRESANDSEQ: - scrollX = ((int[]) evt.getNewValue())[0] - - ((int[]) evt.getOldValue())[0]; - scrollY = ((int[]) evt.getNewValue())[1] - - ((int[]) evt.getOldValue())[1]; - - // System.out.println("SC dx dy " + scrollX + " " + scrollY); - - if (scrollX != 0 && scrollY != 0) - { - // all sorts of problems in JavaScript if this is commented out. - repaint(); - return; - - } - break; } - ViewportRanges vpRanges = av.getRanges(); - int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1; - scrollX = Math.max(Math.min(scrollX, range), -range); - // only STARTRES or STARTRESANDSEQ: - if (av.getWrapAlignment()) - { - fastPaintWrapped(scrollX); - } - else + int scrollX = 0; + if (eventName.equals(ViewportRanges.STARTRES) + || eventName.equals(ViewportRanges.STARTRESANDSEQ)) { - fastPaint(scrollX, scrollY); - } + // Make sure we're not trying to draw a panel + // larger than the visible window + if (eventName.equals(ViewportRanges.STARTRES)) + { + scrollX = (int) evt.getNewValue() - (int) evt.getOldValue(); + } + else + { + scrollX = ((int[]) evt.getNewValue())[0] + - ((int[]) evt.getOldValue())[0]; + } + ViewportRanges vpRanges = av.getRanges(); - // BH 2019.07.27 was: - // if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED)) - // { - // fastPaint = true; - // repaint(); - // return; - // } - // else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT)) - // { - // fastPaint = false; - // // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT"); - // repaint(); - // return; - // } - // - // if (eventName.equals(ViewportRanges.STARTRES) - // || eventName.equals(ViewportRanges.STARTRESANDSEQ)) - // { - // // Make sure we're not trying to draw a panel - // // larger than the visible window - // if (eventName.equals(ViewportRanges.STARTRES)) - // { - // scrollX = (int) evt.getNewValue() - (int) evt.getOldValue(); - // } - // else - // { - // scrollX = ((int[]) evt.getNewValue())[0] - // - ((int[]) evt.getOldValue())[0]; - // } - // ViewportRanges vpRanges = av.getRanges(); - // - // int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1; - // if (scrollX > range) - // { - // scrollX = range; - // } - // else if (scrollX < -range) - // { - // scrollX = -range; - // } - // } + int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1; + if (scrollX > range) + { + scrollX = range; + } + else if (scrollX < -range) + { + scrollX = -range; + } + } // Both scrolling and resizing change viewport ranges: scrolling changes // both start and end points, but resize only changes end values. // Here we only want to fastpaint on a scroll, with resize using a normal // paint, so scroll events are identified as changes to the horizontal or // vertical start value. - // BH 2019.07.27 was: - // if (eventName.equals(ViewportRanges.STARTRES)) - // { - // if (av.getWrapAlignment()) - // { - // fastPaintWrapped(scrollX); - // } - // else - // { - // fastPaint(scrollX, 0); - // } - // } - // else if (eventName.equals(ViewportRanges.STARTSEQ)) - // { - // // scroll - // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue()); - // } - // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ)) - // { - // if (av.getWrapAlignment()) - // { - // fastPaintWrapped(scrollX); - // } - // else - // { - // fastPaint(scrollX, 0); - // } - // } - // - // BH oops! - // - // else if (eventName.equals(ViewportRanges.STARTSEQ)) - // { - // // scroll - // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue()); - // } - // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ)) - // { - // if (av.getWrapAlignment()) - // { - // fastPaintWrapped(scrollX); - // } - // } + if (eventName.equals(ViewportRanges.STARTRES)) + { + if (av.getWrapAlignment()) + { + fastPaintWrapped(scrollX); + } + else + { + fastPaint(scrollX, 0); + } + } + else if (eventName.equals(ViewportRanges.STARTSEQ)) + { + // scroll + fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue()); + } + else if (eventName.equals(ViewportRanges.STARTRESANDSEQ)) + { + if (av.getWrapAlignment()) + { + fastPaintWrapped(scrollX); + } + else + { + fastPaint(scrollX, 0); + } + } + else if (eventName.equals(ViewportRanges.STARTSEQ)) + { + // scroll + fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue()); + } + else if (eventName.equals(ViewportRanges.STARTRESANDSEQ)) + { + if (av.getWrapAlignment()) + { + fastPaintWrapped(scrollX); + } + } } /**