X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationPanel.java;h=bd7d5fb78bea6d976e136d7967df91deef49f685;hb=7a1b05d3e521e5d532ad03b23a33ab21675ebd1f;hp=5c46d9561d83b57992d4ba8a8daa58f2f54f34f9;hpb=6f1c651f8d540aa7ab544d7e20940ecd78b60526;p=jalview.git diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java index 5c46d95..bd7d5fb 100755 --- a/src/jalview/gui/AnnotationPanel.java +++ b/src/jalview/gui/AnnotationPanel.java @@ -31,6 +31,7 @@ import jalview.renderer.AwtRenderPanelI; import jalview.schemes.ResidueProperties; import jalview.util.Comparison; import jalview.util.MessageManager; +import jalview.util.Platform; import jalview.viewmodel.ViewportListenerI; import jalview.viewmodel.ViewportRanges; @@ -112,7 +113,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, public volatile BufferedImage fadedImage; - Graphics2D gg; + // private Graphics2D gg; public FontMetrics fm; @@ -148,7 +149,9 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, */ public AnnotationPanel(AlignmentPanel ap) { - ToolTipManager.sharedInstance().registerComponent(this); +// setBackground(Color.white); // BH 2019 + + ToolTipManager.sharedInstance().registerComponent(this); ToolTipManager.sharedInstance().setInitialDelay(0); ToolTipManager.sharedInstance().setDismissDelay(10000); this.ap = ap; @@ -211,7 +214,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, @Override public Dimension getPreferredScrollableViewportSize() { - return getPreferredSize(); + Dimension ps = getPreferredSize(); + return new Dimension(ps.width, adjustForAlignFrame(false, ps.height)); } @Override @@ -808,7 +812,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, else { this.setToolTipText(null); - ap.alignFrame.statusBar.setText(" "); + ap.alignFrame.setStatus(" "); } } @@ -927,7 +931,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } } - ap.alignFrame.statusBar.setText(text.toString()); + ap.alignFrame.setStatus(text.toString()); } /** @@ -969,6 +973,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } private volatile boolean imageFresh = false; + private Rectangle visibleRect = new Rectangle(), clipBounds = new Rectangle(); /** * DOCUMENT ME! @@ -979,17 +984,27 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, @Override public void paintComponent(Graphics g) { - super.paintComponent(g); - + + // BH: note that this method is generally recommended to + // call super.paintComponent(g). Otherwise, the children of this + // component will not be rendered. That is not needed here + // because AnnotationPanel does not have any children. It is + // just a JPanel contained in a JViewPort. + + computeVisibleRect(visibleRect); + g.setColor(Color.white); - g.fillRect(0, 0, getWidth(), getHeight()); + g.fillRect(0, 0, visibleRect.width, visibleRect.height); if (image != null) { - if (fastPaint || (getVisibleRect().width != g.getClipBounds().width) - || (getVisibleRect().height != g.getClipBounds().height)) + // BH 2018 optimizing generation of new Rectangle(). + if (fastPaint || (visibleRect.width != (clipBounds = g.getClipBounds(clipBounds)).width) + || (visibleRect.height != clipBounds.height)) { - g.drawImage(image, 0, 0, this); + + + g.drawImage(image, 0, 0, this); fastPaint = false; return; } @@ -1000,6 +1015,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, { return; } + Graphics2D gg; if (image == null || imgWidth != image.getWidth(this) || image.getHeight(this) != getHeight()) { @@ -1035,10 +1051,14 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, gg.setColor(Color.white); gg.fillRect(0, 0, imgWidth, image.getHeight()); imageFresh = true; + } else { + gg = (Graphics2D) image.getGraphics(); + } drawComponent(gg, av.getRanges().getStartRes(), av.getRanges().getEndRes() + 1); + gg.dispose(); imageFresh = false; g.drawImage(image, 0, 0, this); } @@ -1056,7 +1076,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, */ public void fastPaint(int horizontal) { - if ((horizontal == 0) || gg == null + if ((horizontal == 0) || image == null || av.getAlignment().getAlignmentAnnotation() == null || av.getAlignment().getAlignmentAnnotation().length < 1 || av.isCalcInProgress()) @@ -1069,6 +1089,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, int er = av.getRanges().getEndRes() + 1; int transX = 0; + Graphics2D gg = (Graphics2D) image.getGraphics(); + gg.copyArea(0, 0, imgWidth, getHeight(), -horizontal * av.getCharWidth(), 0); @@ -1088,6 +1110,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, gg.translate(-transX, 0); + gg.dispose(); + fastPaint = true; // Call repaint on alignment panel so that repaints from other alignment @@ -1231,7 +1255,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, ap = null; image = null; fadedImage = null; - gg = null; +// gg = null; _mwl = null; /* @@ -1266,4 +1290,49 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, repaint(); } } + + /** + * computes the visible height of the annotation panel + * + * @param adjustPanelHeight + * - when false, just adjust existing height according to other + * windows + * @param annotationHeight + * @return height to use for the ScrollerPreferredVisibleSize + */ + public int adjustForAlignFrame(boolean adjustPanelHeight, + int annotationHeight) + { + /* + * Estimate available height in the AlignFrame for alignment + + * annotations. Deduct an estimate for title bar, menu bar, scale panel, + * hscroll, status bar, insets. + */ + int stuff = (ap.getViewName() != null ? 30 : 0) + + (Platform.isAMacAndNotJS() ? 120 : 140); + int availableHeight = ap.alignFrame.getHeight() - stuff; + int rowHeight = av.getCharHeight(); + + if (adjustPanelHeight) + { + int alignmentHeight = rowHeight * av.getAlignment().getHeight(); + + /* + * If not enough vertical space, maximize annotation height while keeping + * at least two rows of alignment visible + */ + if (annotationHeight + alignmentHeight > availableHeight) + { + annotationHeight = Math.min(annotationHeight, + availableHeight - 2 * rowHeight); + } + } + else + { + // maintain same window layout whilst updating sliders + annotationHeight = Math.min(ap.annotationScroller.getSize().height, + availableHeight - 2 * rowHeight); + } + return annotationHeight; + } }