From a6a702b47c13359cf2b057dd89fc7978f35fc482 Mon Sep 17 00:00:00 2001 From: gmungoc Date: Thu, 3 Aug 2017 12:45:26 +0200 Subject: [PATCH] JAL-2609 erase space below, and other fixes --- src/jalview/gui/SeqCanvas.java | 235 ++++++++++++++++++++++------------------ 1 file changed, 129 insertions(+), 106 deletions(-) diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index 785b71d..12b426d 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -270,57 +270,63 @@ public class SeqCanvas extends JComponent implements ViewportListenerI } fastpainting = true; fastPaint = true; - updateViewport(); - ViewportRanges ranges = av.getRanges(); - int startRes = ranges.getStartRes(); - int endRes = ranges.getEndRes(); - int startSeq = ranges.getStartSeq(); - int endSeq = ranges.getEndSeq(); - int transX = 0; - int transY = 0; + try + { + updateViewport(); - gg.copyArea(horizontal * charWidth, vertical * charHeight, imgWidth, - imgHeight, -horizontal * charWidth, -vertical * charHeight); + ViewportRanges ranges = av.getRanges(); + int startRes = ranges.getStartRes(); + int endRes = ranges.getEndRes(); + int startSeq = ranges.getStartSeq(); + int endSeq = ranges.getEndSeq(); + int transX = 0; + int transY = 0; - if (horizontal > 0) // scrollbar pulled right, image to the left - { - transX = (endRes - startRes - horizontal) * charWidth; - startRes = endRes - horizontal; - } - else if (horizontal < 0) - { - endRes = startRes - horizontal; - } - else if (vertical > 0) // scroll down - { - startSeq = endSeq - vertical; + gg.copyArea(horizontal * charWidth, vertical * charHeight, imgWidth, + imgHeight, -horizontal * charWidth, -vertical * charHeight); - if (startSeq < ranges.getStartSeq()) - { // ie scrolling too fast, more than a page at a time - startSeq = ranges.getStartSeq(); + if (horizontal > 0) // scrollbar pulled right, image to the left + { + transX = (endRes - startRes - horizontal) * charWidth; + startRes = endRes - horizontal; } - else + else if (horizontal < 0) { - transY = imgHeight - ((vertical + 1) * charHeight); + endRes = startRes - horizontal; } - } - else if (vertical < 0) - { - endSeq = startSeq - vertical; + else if (vertical > 0) // scroll down + { + startSeq = endSeq - vertical; - if (endSeq > ranges.getEndSeq()) + if (startSeq < ranges.getStartSeq()) + { // ie scrolling too fast, more than a page at a time + startSeq = ranges.getStartSeq(); + } + else + { + transY = imgHeight - ((vertical + 1) * charHeight); + } + } + else if (vertical < 0) { - endSeq = ranges.getEndSeq(); + endSeq = startSeq - vertical; + + if (endSeq > ranges.getEndSeq()) + { + endSeq = ranges.getEndSeq(); + } } - } - gg.translate(transX, transY); - drawPanel(gg, startRes, endRes, startSeq, endSeq, 0); - gg.translate(-transX, -transY); + gg.translate(transX, transY); + drawPanel(gg, startRes, endRes, startSeq, endSeq, 0); + gg.translate(-transX, -transY); - repaint(); - fastpainting = false; + repaint(); + } finally + { + fastpainting = false; + } } @Override @@ -1185,56 +1191,45 @@ public class SeqCanvas extends JComponent implements ViewportListenerI { String eventName = evt.getPropertyName(); - // if (av.getWrapAlignment()) - // { - // if (eventName.equals(ViewportRanges.STARTRES)) - // { - // repaint(); - // } - // } - // else - { - int scrollX = 0; - if (eventName.equals(ViewportRanges.STARTRES)) + int scrollX = 0; + if (eventName.equals(ViewportRanges.STARTRES)) + { + // Make sure we're not trying to draw a panel + // larger than the visible window + ViewportRanges vpRanges = av.getRanges(); + scrollX = (int) evt.getNewValue() - (int) evt.getOldValue(); + int range = vpRanges.getEndRes() - vpRanges.getStartRes(); + if (scrollX > range) { - // Make sure we're not trying to draw a panel - // larger than the visible window - ViewportRanges vpRanges = av.getRanges(); - scrollX = (int) evt.getNewValue() - (int) evt.getOldValue(); - int range = vpRanges.getEndRes() - vpRanges.getStartRes(); - if (scrollX > range) - { - scrollX = range; - } - else if (scrollX < -range) - { - 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. - if (eventName.equals(ViewportRanges.STARTRES)) + // 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. + if (eventName.equals(ViewportRanges.STARTRES)) + { + // scroll - startres and endres both change + if (av.getWrapAlignment()) { - // scroll - startres and endres both change - if (av.getWrapAlignment()) - { - fastPaintWrapped(scrollX); - // fastPaintWrapped(scrollX > 0 ? 1 : -1); // to debug: 1 at a time - } - else - { - fastPaint(scrollX, 0); - } + fastPaintWrapped(scrollX); } - else if (eventName.equals(ViewportRanges.STARTSEQ)) + else { - fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue()); + fastPaint(scrollX, 0); } } + else if (eventName.equals(ViewportRanges.STARTSEQ)) + { + fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue()); + } } /** @@ -1252,36 +1247,48 @@ public class SeqCanvas extends JComponent implements ViewportListenerI { /* * shift of more than one view width is - * too complicated to handle in this method + * overcomplicated to handle in this method */ fastPaint = false; repaint(); return; } - fastPaint = true; + if (fastpainting || gg == null) + { + return; + } - /* - * relocate the regions of the alignment that are still visible - */ - shiftWrappedAlignment(-scrollX); + fastPaint = true; + fastpainting = true; - /* - * add new columns (scale above, sequence, annotation) - * - at top left if scrollX < 0 - * - at right of last two widths if scrollX > 0 - * also West scale top left or East scale bottom right if shown - */ - if (scrollX < 0) + try { - fastPaintWrappedAddLeft(-scrollX); - } - else + /* + * relocate the regions of the alignment that are still visible + */ + shiftWrappedAlignment(-scrollX); + + /* + * add new columns (scale above, sequence, annotation) + * - at top left if scrollX < 0 + * - at right of last two widths if scrollX > 0 + * also West scale top left or East scale bottom right if shown + */ + if (scrollX < 0) + { + fastPaintWrappedAddLeft(-scrollX); + } + else + { + fastPaintWrappedAddRight(scrollX); + } + + repaint(); + } finally { - fastPaintWrappedAddRight(scrollX); + fastpainting = false; } - - repaint(); } /** @@ -1317,18 +1324,21 @@ public class SeqCanvas extends JComponent implements ViewportListenerI } /* - * limit visible widths to max widths of alignment + * limit visible widths to max widths of alignment, from the + * current start residue (we may be scrolled down) */ ViewportRanges ranges = av.getRanges(); - int visibleAlignmentWidth = ranges.getVisibleAlignmentWidth(); + int availableAlignmentWidth = ranges.getVisibleAlignmentWidth() + - ranges.getStartRes(); int viewportWidth = ranges.getViewportWidth(); - int maxWidths = visibleAlignmentWidth / viewportWidth; - if (visibleAlignmentWidth % viewportWidth > 0) + int maxWidths = availableAlignmentWidth / viewportWidth; + if (availableAlignmentWidth % viewportWidth > 0) { maxWidths++; } visibleWidths = Math.min(visibleWidths, maxWidths); - int widthInColumns = (getWidth() - labelWidthEast - labelWidthWest) + int canvasWidth = getWidth(); + int widthInColumns = (canvasWidth - labelWidthEast - labelWidthWest) / charWidth; /** @@ -1392,7 +1402,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI * scrolling right beyond end of alignment */ gg.setColor(Color.white); - int width = getWidth() - labelWidthWest - xOffset; + int width = canvasWidth - labelWidthWest - xOffset; gg.fillRect(labelWidthWest, ypos - hgap, width, repeatHeight); gg.setFont(av.getFont()); @@ -1410,6 +1420,17 @@ public class SeqCanvas extends JComponent implements ViewportListenerI { drawVerticalScale(gg, leftEndColumn, endRes, ypos, false); } + + /* + * and finally, white fill any space below the visible alignment + * (in case it has wrapped to just the top part of the panel) + */ + int heightBelow = canvasHeight - visibleWidths * repeatHeight; + if (heightBelow > 0) + { + gg.setColor(Color.white); + gg.fillRect(0, canvasHeight - heightBelow, canvasWidth, heightBelow); + } } /** @@ -1484,6 +1505,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI { visibleWidths++; } + // todo limit visibleWidths to not exceed width of alignment + // (don't process white space below) if (positions > 0) { -- 1.7.10.2