import jalview.datamodel.SequenceI;
import jalview.renderer.AnnotationRenderer;
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;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
+import java.beans.PropertyChangeEvent;
-public class AnnotationPanel extends Panel implements AwtRenderPanelI,
- AdjustmentListener, ActionListener, MouseListener,
- MouseMotionListener
+public class AnnotationPanel extends Panel
+ implements AwtRenderPanelI, AdjustmentListener, ActionListener,
+ MouseListener, MouseMotionListener, ViewportListenerI
{
AlignViewport av;
public static int GRAPH_HEIGHT = 40;
- boolean MAC = false;
+// boolean MAC = false;
public final AnnotationRenderer renderer;
public AnnotationPanel(AlignmentPanel ap)
{
new jalview.util.Platform();
- MAC = Platform.isAMac();
+// MAC = Platform.isAMac();
this.ap = ap;
av = ap.av;
setLayout(null);
// ap.annotationScroller.getVAdjustable().addAdjustmentListener( this );
renderer = new AnnotationRenderer();
+
+ av.getRanges().addPropertyChangeListener(this);
}
public AnnotationPanel(AlignViewport av)
{
this.av = av;
renderer = new AnnotationRenderer();
+
}
@Override
if (anot.length < av.getColumnSelection().getMax())
{
- Annotation[] temp = new Annotation[av.getColumnSelection().getMax() + 2];
+ Annotation[] temp = new Annotation[av.getColumnSelection().getMax()
+ + 2];
System.arraycopy(anot, 0, temp, 0, anot.length);
anot = temp;
aa[activeRow].annotations = anot;
if (evt.getActionCommand().equals(REMOVE))
{
- for (int sel : av.getColumnSelection().getSelected())
+ for (int index : av.getColumnSelection().getSelected())
{
- // TODO: JAL-2001 check if applet has faulty 'REMOVE' selected columns
- // of
- // annotation if selection includes hidden columns
- anot[sel] = null;
+ if (av.getAlignment().getHiddenColumns().isVisible(index))
+ {
+ anot[index] = null;
+ }
}
}
else if (evt.getActionCommand().equals(LABEL))
{
// TODO: JAL-2001 - provide a fast method to list visible selected
// columns
- if (!av.getColumnSelection().isVisible(index))
+ if (!av.getAlignment().getHiddenColumns().isVisible(index))
{
continue;
}
for (int index : av.getColumnSelection().getSelected())
{
- if (!av.getColumnSelection().isVisible(index))
+ if (!av.getAlignment().getHiddenColumns().isVisible(index))
{
continue;
}
for (int index : av.getColumnSelection().getSelected())
{
- if (!av.getColumnSelection().isVisible(index))
+ if (!av.getAlignment().getHiddenColumns().isVisible(index))
{
continue;
}
anot[index] = new Annotation(label, "", type, 0);
}
- anot[index].secondaryStructure = type != 'S' ? type : label
- .length() == 0 ? ' ' : label.charAt(0);
+ anot[index].secondaryStructure = type != 'S' ? type
+ : label.length() == 0 ? ' ' : label.charAt(0);
anot[index].displayCharacter = label;
}
}
{
activeRow = i;
}
- else if (aa[i].graph > 0)
+ else if (aa[i].graph != AlignmentAnnotation.NO_GRAPH)
{
// Stretch Graph
graphStretch = i;
}
}
- if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK
+ if ((evt.getModifiersEx()
+ & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK
&& activeRow != -1)
{
if (av.getColumnSelection() == null
{
if (graphStretch > -1)
{
- av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight += graphStretchY
- - evt.getY();
- if (av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight < 0)
+ av.getAlignment()
+ .getAlignmentAnnotation()[graphStretch].graphHeight += graphStretchY
+ - evt.getY();
+ if (av.getAlignment()
+ .getAlignmentAnnotation()[graphStretch].graphHeight < 0)
{
- av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight = 0;
+ av.getAlignment()
+ .getAlignmentAnnotation()[graphStretch].graphHeight = 0;
}
graphStretchY = evt.getY();
av.calcPanelHeight();
needValidating = true;
- ap.paintAlignment(true);
+ // TODO: only update overview visible geometry
+ ap.paintAlignment(true, false);
}
else
{
}
}
- int column = evt.getX() / av.getCharWidth() + av.getStartRes();
+ int column = evt.getX() / av.getCharWidth()
+ + av.getRanges().getStartRes();
if (av.hasHiddenColumns())
{
- column = av.getColumnSelection().adjustForHiddenColumns(column);
+ column = av.getAlignment().getHiddenColumns()
+ .visibleToAbsoluteColumn(column);
}
if (row > -1 && column < aa[row].annotations.length
StringBuilder text = new StringBuilder();
text.append(MessageManager.getString("label.column")).append(" ")
.append(column + 1);
- if (aa[row].annotations[column].description != null)
+ String description = aa[row].annotations[column].description;
+ if (description != null && description.length() > 0)
{
- text.append(" ").append(aa[row].annotations[column].description);
+ text.append(" ").append(description);
}
/*
char residue = seqref.getCharAt(column);
if (!Comparison.isGap(residue))
{
+ text.append(" ");
+ String name;
+ if (av.getAlignment().isNucleotide())
+ {
+ name = ResidueProperties.nucleotideName
+ .get(String.valueOf(residue));
+ text.append(" Nucleotide: ")
+ .append(name != null ? name : residue);
+ }
+ else
+ {
+ name = 'X' == residue ? "X"
+ : ('*' == residue ? "STOP"
+ : ResidueProperties.aa2Triplet
+ .get(String.valueOf(residue)));
+ text.append(" Residue: ")
+ .append(name != null ? name : residue);
+ }
int residuePos = seqref.findPosition(column);
- text.append(": ").append(residue).append(" (")
- .append(residuePos).append(")");
+ text.append(" (").append(residuePos).append(")");
+ // int residuePos = seqref.findPosition(column);
+ // text.append(residue).append(" (")
+ // .append(residuePos).append(")");
}
}
}
gg.setColor(Color.white);
gg.fillRect(0, 0, getSize().width, getSize().height);
- drawComponent(gg, av.startRes, av.endRes + 1);
+ drawComponent(gg, av.getRanges().getStartRes(),
+ av.getRanges().getEndRes() + 1);
g.drawImage(image, 0, 0, this);
}
public void fastPaint(int horizontal)
{
- if (horizontal == 0
+ if (horizontal == 0 || gg == null
|| av.getAlignment().getAlignmentAnnotation() == null
|| av.getAlignment().getAlignmentAnnotation().length < 1)
{
gg.copyArea(0, 0, imgWidth, getSize().height,
-horizontal * av.getCharWidth(), 0);
- int sr = av.startRes, er = av.endRes + 1, transX = 0;
+ int sr = av.getRanges().getStartRes(),
+ er = av.getRanges().getEndRes() + 1, transX = 0;
if (horizontal > 0) // scrollbar pulled right, image to the left
{
return null;
}
}
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt)
+ {
+ // Respond to viewport range changes (e.g. alignment panel was scrolled)
+ // 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 (evt.getPropertyName().equals(ViewportRanges.STARTRES))
+ {
+ fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
+ }
+ else if (evt.getPropertyName().equals(ViewportRanges.STARTRESANDSEQ))
+ {
+ fastPaint(((int[]) evt.getNewValue())[0]
+ - ((int[]) evt.getOldValue())[0]);
+ }
+ else if (evt.getPropertyName().equals(ViewportRanges.MOVE_VIEWPORT))
+ {
+ repaint();
+ }
+ }
}