X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FAnnotationPanel.java;h=c658811481ddaea775ed5061cd9509b7e4c77c08;hb=refs%2Fheads%2Fbug%2FJAL-2576;hp=e17ce2088f415d45d0c09758cbe0a0061db3238b;hpb=ab43013b7e357b84b4abade0dba949668dfb2a0e;p=jalview.git diff --git a/src/jalview/appletgui/AnnotationPanel.java b/src/jalview/appletgui/AnnotationPanel.java index e17ce20..c658811 100755 --- a/src/jalview/appletgui/AnnotationPanel.java +++ b/src/jalview/appletgui/AnnotationPanel.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * @@ -20,19 +20,39 @@ */ package jalview.appletgui; -import java.util.*; - -import java.awt.*; -import java.awt.event.*; - -import jalview.datamodel.*; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.Annotation; +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 java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.MenuItem; +import java.awt.Panel; +import java.awt.PopupMenu; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.AdjustmentEvent; +import java.awt.event.AdjustmentListener; +import java.awt.event.InputEvent; +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 + MouseMotionListener, ViewportListenerI { AlignViewport av; @@ -40,8 +60,6 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, int activeRow = -1; - Vector activeRes; - final String HELIX = "Helix"; final String SHEET = "Sheet"; @@ -86,7 +104,8 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, public AnnotationPanel(AlignmentPanel ap) { - MAC = new jalview.util.Platform().isAMac(); + new jalview.util.Platform(); + MAC = Platform.isAMac(); this.ap = ap; av = ap.av; setLayout(null); @@ -105,6 +124,7 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, { this.av = av; renderer = new AnnotationRenderer(); + av.getRanges().addPropertyChangeListener(this); } @Override @@ -138,15 +158,20 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, String label = ""; if (av.getColumnSelection() != null - && av.getColumnSelection().size() > 0 + && !av.getColumnSelection().isEmpty() && anot[av.getColumnSelection().getMin()] != null) + { label = anot[av.getColumnSelection().getMin()].displayCharacter; + } if (evt.getActionCommand().equals(REMOVE)) { - for (int i = 0; i < av.getColumnSelection().size(); i++) + for (int index : av.getColumnSelection().getSelected()) { - anot[av.getColumnSelection().columnAt(i)] = null; + if (av.getAlignment().getHiddenColumns().isVisible(index)) + { + anot[index] = null; + } } } else if (evt.getActionCommand().equals(LABEL)) @@ -163,12 +188,14 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, aa[activeRow].hasText = true; } - for (int i = 0; i < av.getColumnSelection().size(); i++) + for (int index : av.getColumnSelection().getSelected()) { - int index = av.getColumnSelection().columnAt(i); - - if (!av.getColumnSelection().isVisible(index)) + // TODO: JAL-2001 - provide a fast method to list visible selected + // columns + if (!av.getAlignment().getHiddenColumns().isVisible(index)) + { continue; + } if (anot[index] == null) { @@ -185,12 +212,12 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, Color col = udc.getColor(); - for (int i = 0; i < av.getColumnSelection().size(); i++) + for (int index : av.getColumnSelection().getSelected()) { - int index = av.getColumnSelection().columnAt(i); - - if (!av.getColumnSelection().isVisible(index)) + if (!av.getAlignment().getHiddenColumns().isVisible(index)) + { continue; + } if (anot[index] == null) { @@ -220,7 +247,8 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, else if (evt.getActionCommand().equals(STEM)) { type = 'S'; - symbol = "\u03C3"; + int column = av.getColumnSelection().getSelectedRanges().get(0)[0]; + symbol = aa[activeRow].getDefaultRnaHelixSymbol(column); } if (!aa[activeRow].hasIcons) @@ -244,19 +272,18 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, } } - for (int i = 0; i < av.getColumnSelection().size(); i++) + for (int index : av.getColumnSelection().getSelected()) { - int index = av.getColumnSelection().columnAt(i); - - if (!av.getColumnSelection().isVisible(index)) + if (!av.getAlignment().getHiddenColumns().isVisible(index)) + { continue; + } if (anot[index] == null) { anot[index] = new Annotation(label, "", type, 0); } - anot[index].secondaryStructure = type != 'S' ? type : label .length() == 0 ? ' ' : label.charAt(0); anot[index].displayCharacter = label; @@ -278,9 +305,13 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, ap.alignFrame, "Enter Label", 400, 200, true); if (dialog.accept) + { return dialog.getName(); + } else + { return null; + } } @Override @@ -322,7 +353,8 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK && activeRow != -1) { - if (av.getColumnSelection() == null) + if (av.getColumnSelection() == null + || av.getColumnSelection().isEmpty()) { return; } @@ -330,10 +362,8 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, PopupMenu pop = new PopupMenu( MessageManager.getString("label.structure_type")); MenuItem item; - /* - * Just display the needed structure options - */ - if (av.getAlignment().isNucleotide() == true) + + if (av.getAlignment().isNucleotide()) { item = new MenuItem(STEM); item.addActionListener(this); @@ -363,11 +393,6 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, return; } - if (aa == null) - { - return; - } - ap.scalePanel.mousePressed(evt); } @@ -440,21 +465,69 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, } } - int res = evt.getX() / av.getCharWidth() + av.getStartRes(); + int column = evt.getX() / av.getCharWidth() + + av.getRanges().getStartRes(); if (av.hasHiddenColumns()) { - res = av.getColumnSelection().adjustForHiddenColumns(res); + column = av.getAlignment().getHiddenColumns() + .adjustForHiddenColumns(column); } - if (row > -1 && res < aa[row].annotations.length - && aa[row].annotations[res] != null) + if (row > -1 && column < aa[row].annotations.length + && aa[row].annotations[column] != null) { - StringBuffer text = new StringBuffer("Sequence position " + (res + 1)); - if (aa[row].annotations[res].description != null) + StringBuilder text = new StringBuilder(); + text.append(MessageManager.getString("label.column")).append(" ") + .append(column + 1); + String description = aa[row].annotations[column].description; + if (description != null && description.length() > 0) + { + text.append(" ").append(description); + } + + /* + * if the annotation is sequence-specific, show the sequence number + * in the alignment, and (if not a gap) the residue and position + */ + SequenceI seqref = aa[row].sequenceRef; + if (seqref != null) { - text.append(" " + aa[row].annotations[res].description); + int seqIndex = av.getAlignment().findIndex(seqref); + if (seqIndex != -1) + { + text.append(", ") + .append(MessageManager.getString("label.sequence")) + .append(" ").append(seqIndex + 1); + 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(residuePos).append(")"); + // int residuePos = seqref.findPosition(column); + // text.append(residue).append(" (") + // .append(residuePos).append(")"); + } + } } + ap.alignFrame.statusBar.setText(text.toString()); } } @@ -513,15 +586,6 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, } } } - - if (activeRes == null) - { - activeRes = new Vector(); - activeRes.addElement(String.valueOf(i)); - return; - } - - activeRes.addElement(String.valueOf(i)); } @Override @@ -559,7 +623,8 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, 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); } @@ -574,13 +639,13 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, return; } - gg.copyArea(0, 0, imgWidth, getSize().height, -horizontal - * av.charWidth, 0); - int sr = av.startRes, er = av.endRes + 1, transX = 0; + gg.copyArea(0, 0, imgWidth, getSize().height, + -horizontal * av.getCharWidth(), 0); + int sr = av.getRanges().getStartRes(), er = av.getRanges().getEndRes() + 1, transX = 0; if (horizontal > 0) // scrollbar pulled right, image to the left { - transX = (er - sr - horizontal) * av.charWidth; + transX = (er - sr - horizontal) * av.getCharWidth(); sr = er - horizontal; } else if (horizontal < 0) @@ -614,7 +679,8 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, g.setFont(ofont); g.setColor(Color.white); - g.fillRect(0, 0, (endRes - startRes) * av.charWidth, getSize().height); + g.fillRect(0, 0, (endRes - startRes) * av.getCharWidth(), + getSize().height); if (fm == null) { @@ -683,6 +749,19 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI, return bounds; } else + { return null; + } + } + + @Override + public void propertyChange(PropertyChangeEvent evt) + { + // Respond to viewport range changes (e.g. alignment panel was scrolled) + if (evt.getPropertyName().equals("startres") + || evt.getPropertyName().equals("endres")) + { + fastPaint((int) evt.getNewValue() - (int) evt.getOldValue()); + } } }