X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationPanel.java;h=03fbf281ef00a7f61ec4c8b323421448a176f355;hb=edc9fd41915430e69daf3bac4c3fc0451bb0ed48;hp=20d4d295acb2e6ff1d289fe904088724ef9a7db9;hpb=bb3f28791ddb1a4f55e78a3bcd2ff4a591ebe95d;p=jalview.git diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java index 20d4d29..03fbf28 100755 --- a/src/jalview/gui/AnnotationPanel.java +++ b/src/jalview/gui/AnnotationPanel.java @@ -1,18 +1,18 @@ /* * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle - * + * * This file is part of Jalview. - * + * * Jalview is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License + * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * Jalview is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.gui; @@ -20,19 +20,15 @@ package jalview.gui; import java.awt.*; import java.awt.event.*; import java.awt.image.*; -import java.util.Hashtable; - import javax.swing.*; -import jalview.analysis.AAFrequency; -import jalview.analysis.StructureFrequency; import jalview.datamodel.*; import jalview.renderer.AnnotationRenderer; import jalview.renderer.AwtRenderPanelI; /** * DOCUMENT ME! - * + * * @author $author$ * @version $Revision$ */ @@ -70,7 +66,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, public BufferedImage image; - public BufferedImage fadedImage; + public volatile BufferedImage fadedImage; Graphics2D gg; @@ -102,7 +98,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * Creates a new AnnotationPanel object. - * + * * @param ap * DOCUMENT ME! */ @@ -132,10 +128,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * DOCUMENT ME! - * + * * @param evt * DOCUMENT ME! */ + @Override public void adjustmentValueChanged(AdjustmentEvent evt) { ap.alabels.setScrollOffset(-evt.getValue()); @@ -145,7 +142,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, * Calculates the height of the annotation displayed in the annotation panel. * Callers should normally call the ap.adjustAnnotationHeight method to ensure * all annotation associated components are updated correctly. - * + * */ public int adjustPanelHeight() { @@ -163,7 +160,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * calculate the height for visible annotation, revalidating bounds where * necessary ABSTRACT GUI METHOD - * + * * @return total height of annotation */ public int calcPanelHeight() @@ -221,10 +218,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * DOCUMENT ME! - * + * * @param evt * DOCUMENT ME! */ + @Override public void actionPerformed(ActionEvent evt) { AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation(); @@ -375,12 +373,13 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, { String collatedInput = ""; String last = ""; + ColumnSelection viscols=av.getColumnSelection(); // TODO: refactor and save av.getColumnSelection for efficiency for (int i = 0; i < columnSelection.size(); i++) { int index = columnSelection.columnAt(i); // always check for current display state - just in case - if (!av.getColumnSelection().isVisible(index)) + if (!viscols.isVisible(index)) continue; String tlabel = null; if (anot[index] != null) @@ -417,10 +416,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * DOCUMENT ME! - * + * * @param evt * DOCUMENT ME! */ + @Override public void mousePressed(MouseEvent evt) { @@ -509,10 +509,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * DOCUMENT ME! - * + * * @param evt * DOCUMENT ME! */ + @Override public void mouseReleased(MouseEvent evt) { graphStretch = -1; @@ -523,10 +524,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * DOCUMENT ME! - * + * * @param evt * DOCUMENT ME! */ + @Override public void mouseEntered(MouseEvent evt) { ap.scalePanel.mouseEntered(evt); @@ -534,10 +536,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * DOCUMENT ME! - * + * * @param evt * DOCUMENT ME! */ + @Override public void mouseExited(MouseEvent evt) { ap.scalePanel.mouseExited(evt); @@ -545,10 +548,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * DOCUMENT ME! - * + * * @param evt * DOCUMENT ME! */ + @Override public void mouseDragged(MouseEvent evt) { if (graphStretch > -1) @@ -571,10 +575,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * DOCUMENT ME! - * + * * @param evt * DOCUMENT ME! */ + @Override public void mouseMoved(MouseEvent evt) { AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation(); @@ -617,7 +622,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } if (row > -1 && aa[row].annotations != null - && res < (int) aa[row].annotations.length) + && res < aa[row].annotations.length) { if (aa[row].graphGroup > -1) { @@ -670,10 +675,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, /** * DOCUMENT ME! - * + * * @param evt * DOCUMENT ME! */ + @Override public void mouseClicked(MouseEvent evt) { if (activeRow != -1) @@ -709,13 +715,14 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } } - + private volatile boolean imageFresh=false; /** * DOCUMENT ME! - * + * * @param g * DOCUMENT ME! */ + @Override public void paintComponent(Graphics g) { g.setColor(Color.white); @@ -751,15 +758,17 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, fm = gg.getFontMetrics(); gg.setColor(Color.white); gg.fillRect(0, 0, imgWidth, image.getHeight()); + imageFresh=true; } drawComponent(gg, av.startRes, av.endRes + 1); + imageFresh=false; g.drawImage(image, 0, 0, this); } /** * non-Thread safe repaint - * + * * @param horizontal * repaint with horizontal shift in alignment */ @@ -800,10 +809,10 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, repaint(); } - + private volatile boolean lastImageGood=false; /** * DOCUMENT ME! - * + * * @param g * DOCUMENT ME! * @param startRes @@ -813,18 +822,21 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, */ public void drawComponent(Graphics g, int startRes, int endRes) { + BufferedImage oldFaded=fadedImage; if (av.isCalcInProgress()) { if (image == null) { + lastImageGood=false; return; } // We'll keep a record of the old image, // and draw a faded image until the calculation // has completed - if (fadedImage == null || fadedImage.getWidth() != imgWidth - || fadedImage.getHeight() != image.getHeight()) + if (lastImageGood && (fadedImage == null || fadedImage.getWidth() != imgWidth + || fadedImage.getHeight() != image.getHeight())) { +// System.err.println("redraw faded image ("+(fadedImage==null ? "null image" : "") + " lastGood="+lastImageGood+")"); fadedImage = new BufferedImage(imgWidth, image.getHeight(), BufferedImage.TYPE_INT_RGB); @@ -838,10 +850,16 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, fadedG.drawImage(image, 0, 0, this); } + // make sure we don't overwrite the last good faded image until all calculations have finished + lastImageGood=false; } else { + if (fadedImage!=null) + { + oldFaded=fadedImage; + } fadedImage = null; } @@ -867,7 +885,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, return; } - renderer.drawComponent(this, av, g, activeRow, startRes, endRes); + lastImageGood = renderer.drawComponent(this, av, g, activeRow, startRes, endRes); + if (!lastImageGood && fadedImage==null) + { + fadedImage=oldFaded; + } } @Override