X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationPanel.java;h=e020701f5d281e36086babc1770120b7231143c4;hb=ab43013b7e357b84b4abade0dba949668dfb2a0e;hp=ed7f35942374d955728f1dfd1ed882942f27d800;hpb=69dd054a99ba910b138e84c8db62a11ee7c3ef37;p=jalview.git diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java index ed7f359..e020701 100755 --- a/src/jalview/gui/AnnotationPanel.java +++ b/src/jalview/gui/AnnotationPanel.java @@ -1,30 +1,61 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1) + * Copyright (C) 2014 The Jalview Authors * * 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 - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * 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 * 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 . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.gui; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.*; -import javax.swing.*; - -import jalview.datamodel.*; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.Annotation; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.SequenceI; import jalview.renderer.AnnotationRenderer; import jalview.renderer.AwtRenderPanelI; +import jalview.util.MessageManager; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.AdjustmentEvent; +import java.awt.event.AdjustmentListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.awt.image.BufferedImage; + +import javax.swing.JColorChooser; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.Scrollable; +import javax.swing.SwingUtilities; +import javax.swing.ToolTipManager; /** * AnnotationPanel displays visible portion of annotation rows below unwrapped @@ -37,20 +68,20 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, MouseListener, MouseWheelListener, MouseMotionListener, ActionListener, AdjustmentListener, Scrollable { - final String HELIX = "Helix"; + String HELIX = MessageManager.getString("label.helix"); - final String SHEET = "Sheet"; + String SHEET = MessageManager.getString("label.sheet"); /** * For RNA secondary structure "stems" aka helices */ - final String STEM = "RNA Helix"; + String STEM = MessageManager.getString("label.rna_helix"); - final String LABEL = "Label"; + String LABEL = MessageManager.getString("label.label"); - final String REMOVE = "Remove Annotation"; + String REMOVE = MessageManager.getString("label.remove_annotation"); - final String COLOUR = "Colour"; + String COLOUR = MessageManager.getString("action.colour"); public final Color HELIX_COLOUR = Color.red.darker(); @@ -266,8 +297,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, else if (evt.getActionCommand().equals(LABEL)) { String exMesg = collectAnnotVals(anot, av.getColumnSelection(), LABEL); - String label = JOptionPane.showInputDialog(this, "Enter label", - exMesg); + String label = JOptionPane.showInputDialog(this, + MessageManager.getString("label.enter_label"), exMesg); if (label == null) { @@ -284,7 +315,9 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, int index = av.getColumnSelection().columnAt(i); if (!av.getColumnSelection().isVisible(index)) + { continue; + } if (anot[index] == null) { @@ -302,14 +335,16 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, else if (evt.getActionCommand().equals(COLOUR)) { Color col = JColorChooser.showDialog(this, - "Choose foreground colour", Color.black); + MessageManager.getString("label.select_foreground_colour"), Color.black); for (int i = 0; i < av.getColumnSelection().size(); i++) { int index = av.getColumnSelection().columnAt(i); if (!av.getColumnSelection().isVisible(index)) + { continue; + } if (anot[index] == null) { @@ -347,8 +382,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, aa[activeRow].hasIcons = true; } - String label = JOptionPane.showInputDialog( - "Enter a label for the structure?", symbol); + String label = JOptionPane.showInputDialog(MessageManager + .getString("label.enter_label_for_the_structure"), symbol); if (label == null) { @@ -358,28 +393,36 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, if ((label.length() > 0) && !aa[activeRow].hasText) { aa[activeRow].hasText = true; + if (evt.getActionCommand().equals(STEM)) + { + aa[activeRow].showAllColLabels = true; + } } - for (int i = 0; i < av.getColumnSelection().size(); i++) { int index = av.getColumnSelection().columnAt(i); if (!av.getColumnSelection().isVisible(index)) + { continue; + } if (anot[index] == null) { anot[index] = new Annotation(label, "", type, 0); } - anot[index].secondaryStructure = type; + + anot[index].secondaryStructure = type != 'S' ? type : label + .length() == 0 ? ' ' : label.charAt(0); anot[index].displayCharacter = label; + } } - aa[activeRow].validateRangeAndDisplay(); + av.getAlignment().validateAnnotation(aa[activeRow]); + ap.alignmentChanged(); adjustPanelHeight(); - ap.alignmentChanged(); repaint(); return; @@ -397,7 +440,9 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, int index = columnSelection.columnAt(i); // always check for current display state - just in case if (!viscols.isVisible(index)) + { continue; + } String tlabel = null; if (anot[index] != null) { // LML added stem code @@ -481,7 +526,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, return; } - JPopupMenu pop = new JPopupMenu("Structure type"); + JPopupMenu pop = new JPopupMenu( + MessageManager.getString("label.structure_type")); JMenuItem item; /* * Just display the needed structure options @@ -663,7 +709,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, && aa[row].annotations[res].description != null && aa[row].annotations[res].description.length() > 0) { - this.setToolTipText(aa[row].annotations[res].description); + this.setToolTipText(JvSwingUtils + .wrapTooltip(true, aa[row].annotations[res].description)); } else { @@ -699,16 +746,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, @Override public void mouseClicked(MouseEvent evt) { - if (activeRow != -1) - { - AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation(); - AlignmentAnnotation anot = aa[activeRow]; - - if (anot.description.equals("secondary structure")) - { - // System.out.println(anot.description+" "+anot.getRNAStruc()); - } - } + // if (activeRow != -1) + // { + // AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation(); + // AlignmentAnnotation anot = aa[activeRow]; + // } } // TODO mouseClicked-content and drawCursor are quite experimental! @@ -759,7 +801,9 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } imgWidth = (av.endRes - av.startRes + 1) * av.charWidth; if (imgWidth < 1) + { return; + } if (image == null || imgWidth != image.getWidth(this) || image.getHeight(this) != getHeight()) { @@ -802,6 +846,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } /** + * set true to enable redraw timing debug output on stderr + */ + private final boolean debugRedraw = false; + + /** * non-Thread safe repaint * * @param horizontal @@ -809,7 +858,6 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, */ public void fastPaint(int horizontal) { - if ((horizontal == 0) || gg == null || av.getAlignment().getAlignmentAnnotation() == null || av.getAlignment().getAlignmentAnnotation().length < 1 @@ -818,8 +866,9 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, repaint(); return; } + long stime = System.currentTimeMillis(); gg.copyArea(0, 0, imgWidth, getHeight(), -horizontal * av.charWidth, 0); - + long mtime = System.currentTimeMillis(); int sr = av.startRes; int er = av.endRes + 1; int transX = 0; @@ -839,9 +888,16 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, drawComponent(gg, sr, er); gg.translate(-transX, 0); - + long dtime = System.currentTimeMillis(); fastPaint = true; repaint(); + long rtime = System.currentTimeMillis(); + if (debugRedraw) + { + System.err.println("Scroll:\t" + horizontal + "\tCopyArea:\t" + + (mtime - stime) + "\tDraw component:\t" + (dtime - mtime) + + "\tRepaint call:\t" + (rtime - dtime)); + } } @@ -902,7 +958,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } fadedImage = null; } - + g.setColor(Color.white); g.fillRect(0, 0, (endRes - startRes) * av.charWidth, getHeight()); @@ -920,7 +976,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, g.setColor(Color.black); if (av.validCharWidth) { - g.drawString("Alignment has no annotations", 20, 15); + g.drawString(MessageManager + .getString("label.alignment_has_no_annotations"), 20, 15); } return; @@ -950,16 +1007,23 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, { return imgWidth; } + private int[] bounds = new int[2]; + @Override public int[] getVisibleVRange() { - if (ap!=null && ap.alabels!=null) + if (ap != null && ap.alabels != null) { - int sOffset=-ap.alabels.scrollOffset; - int visHeight = sOffset+ap.annotationSpaceFillerHolder.getHeight(); - bounds[0] = sOffset; bounds[1]=visHeight; - return bounds; - } else return null; + int sOffset = -ap.alabels.scrollOffset; + int visHeight = sOffset + ap.annotationSpaceFillerHolder.getHeight(); + bounds[0] = sOffset; + bounds[1] = visHeight; + return bounds; + } + else + { + return null; + } } }