/*
* 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 <http://www.gnu.org/licenses/>.
*/
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$
*/
public BufferedImage image;
- public BufferedImage fadedImage;
+ public volatile BufferedImage fadedImage;
Graphics2D gg;
/**
* Creates a new AnnotationPanel object.
- *
+ *
* @param ap
* DOCUMENT ME!
*/
/**
* DOCUMENT ME!
- *
+ *
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void adjustmentValueChanged(AdjustmentEvent evt)
{
ap.alabels.setScrollOffset(-evt.getValue());
* 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()
{
/**
* calculate the height for visible annotation, revalidating bounds where
* necessary ABSTRACT GUI METHOD
- *
+ *
* @return total height of annotation
*/
public int calcPanelHeight()
{
// setHeight of panels
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
int height = 0;
if (aa != null)
/**
* DOCUMENT ME!
- *
+ *
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void actionPerformed(ActionEvent evt)
{
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
if (aa == null)
{
return;
{
int index = av.getColumnSelection().columnAt(i);
- if (!av.colSel.isVisible(index))
+ if (!av.getColumnSelection().isVisible(index))
continue;
if (anot[index] == null)
{
int index = av.getColumnSelection().columnAt(i);
- if (!av.colSel.isVisible(index))
+ if (!av.getColumnSelection().isVisible(index))
continue;
if (anot[index] == null)
{
int index = av.getColumnSelection().columnAt(i);
- if (!av.colSel.isVisible(index))
+ if (!av.getColumnSelection().isVisible(index))
continue;
if (anot[index] == null)
anot[index].displayCharacter = label;
}
}
+ aa[activeRow].validateRangeAndDisplay();
adjustPanelHeight();
repaint();
{
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.colSel.isVisible(index))
+ if (!viscols.isVisible(index))
continue;
String tlabel = null;
if (anot[index] != null)
/**
* DOCUMENT ME!
- *
+ *
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void mousePressed(MouseEvent evt)
{
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
if (aa == null)
{
return;
/*
* Just display the needed structure options
*/
- if (av.alignment.isNucleotide() == true)
+ if (av.getAlignment().isNucleotide() == true)
{
item = new JMenuItem(STEM);
item.addActionListener(this);
/**
* DOCUMENT ME!
- *
+ *
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void mouseReleased(MouseEvent evt)
{
graphStretch = -1;
/**
* DOCUMENT ME!
- *
+ *
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void mouseEntered(MouseEvent evt)
{
ap.scalePanel.mouseEntered(evt);
/**
* DOCUMENT ME!
- *
+ *
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void mouseExited(MouseEvent evt)
{
ap.scalePanel.mouseExited(evt);
/**
* DOCUMENT ME!
- *
+ *
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void mouseDragged(MouseEvent evt)
{
if (graphStretch > -1)
{
- av.alignment.getAlignmentAnnotation()[graphStretch].graphHeight += graphStretchY
+ av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight += graphStretchY
- evt.getY();
- if (av.alignment.getAlignmentAnnotation()[graphStretch].graphHeight < 0)
+ if (av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight < 0)
{
- av.alignment.getAlignmentAnnotation()[graphStretch].graphHeight = 0;
+ av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight = 0;
}
graphStretchY = evt.getY();
adjustPanelHeight();
/**
* DOCUMENT ME!
- *
+ *
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void mouseMoved(MouseEvent evt)
{
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
if (aa == null)
{
int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
- if (av.hasHiddenColumns)
+ if (av.hasHiddenColumns())
{
res = av.getColumnSelection().adjustForHiddenColumns(res);
}
if (row > -1 && aa[row].annotations != null
- && res < (int) aa[row].annotations.length)
+ && res < aa[row].annotations.length)
{
if (aa[row].graphGroup > -1)
{
/**
* DOCUMENT ME!
- *
+ *
* @param evt
* DOCUMENT ME!
*/
+ @Override
public void mouseClicked(MouseEvent evt)
{
if (activeRow != -1)
{
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
AlignmentAnnotation anot = aa[activeRow];
if (anot.description.equals("secondary structure"))
}
}
-
+ private volatile boolean imageFresh=false;
/**
* DOCUMENT ME!
- *
+ *
* @param g
* DOCUMENT ME!
*/
+ @Override
public void paintComponent(Graphics g)
{
g.setColor(Color.white);
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
*/
{
if ((horizontal == 0) || gg == null
- || av.alignment.getAlignmentAnnotation() == null
- || av.alignment.getAlignmentAnnotation().length < 1
- || av.updatingConsensus || av.updatingConservation)
+ || av.getAlignment().getAlignmentAnnotation() == null
+ || av.getAlignment().getAlignmentAnnotation().length < 1
+ || av.isCalcInProgress())
{
repaint();
return;
repaint();
}
-
+ private volatile boolean lastImageGood=false;
/**
* DOCUMENT ME!
- *
+ *
* @param g
* DOCUMENT ME!
* @param startRes
*/
public void drawComponent(Graphics g, int startRes, int endRes)
{
- if (av.updatingConsensus || av.updatingConservation)
+ 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);
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;
}
fm = g.getFontMetrics();
}
- if ((av.alignment.getAlignmentAnnotation() == null)
- || (av.alignment.getAlignmentAnnotation().length < 1))
+ if ((av.getAlignment().getAlignmentAnnotation() == null)
+ || (av.getAlignment().getAlignmentAnnotation().length < 1))
{
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
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