X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fjalview%2Fgui%2FAnnotationPanel.java;h=bb311efea67a97c6482d3db8df2e6eb17b95dffa;hb=65d6d09cd08743d481d39521bb0298ea683888f8;hp=d0af0a549fc101d7b048addd9e50e9893f495dd2;hpb=59d682209891099d46b960509907c79e3fb276fe;p=jalview.git
diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java
index d0af0a5..bb311ef 100755
--- a/src/jalview/gui/AnnotationPanel.java
+++ b/src/jalview/gui/AnnotationPanel.java
@@ -1,30 +1,60 @@
/*
- * 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-Rel$$)
+ * Copyright (C) $$Year-Rel$$ 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.ToolTipManager;
/**
* AnnotationPanel displays visible portion of annotation rows below unwrapped
@@ -37,20 +67,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();
@@ -108,7 +138,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
public AnnotationPanel(AlignmentPanel ap)
{
- MAC = new jalview.util.Platform().isAMac();
+ MAC = jalview.util.Platform.isAMac();
ToolTipManager.sharedInstance().registerComponent(this);
ToolTipManager.sharedInstance().setInitialDelay(0);
@@ -210,7 +240,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
public void adjustmentValueChanged(AdjustmentEvent evt)
{
// update annotation label display
- ap.alabels.setScrollOffset(-evt.getValue());
+ ap.getAlabels().setScrollOffset(-evt.getValue());
}
/**
@@ -258,16 +288,16 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
if (evt.getActionCommand().equals(REMOVE))
{
- for (int i = 0; i < av.getColumnSelection().size(); i++)
+ for (int sel : av.getColumnSelection().getSelected())
{
- anot[av.getColumnSelection().columnAt(i)] = null;
+ anot[sel] = null;
}
}
else if (evt.getActionCommand().equals(LABEL))
{
- String exMesg = collectAnnotVals(anot, av.getColumnSelection(), LABEL);
- String label = JOptionPane.showInputDialog(this, "Enter label",
- exMesg);
+ String exMesg = collectAnnotVals(anot, LABEL);
+ String label = JOptionPane.showInputDialog(this,
+ MessageManager.getString("label.enter_label"), exMesg);
if (label == null)
{
@@ -279,12 +309,12 @@ public class AnnotationPanel extends JPanel 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))
+ {
continue;
+ }
if (anot[index] == null)
{
@@ -302,14 +332,15 @@ 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++)
+ for (int index : av.getColumnSelection().getSelected())
{
- int index = av.getColumnSelection().columnAt(i);
-
if (!av.getColumnSelection().isVisible(index))
+ {
continue;
+ }
if (anot[index] == null)
{
@@ -347,8 +378,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,46 +389,51 @@ 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++)
+ for (int index : av.getColumnSelection().getSelected())
{
- 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;
}
- private String collectAnnotVals(Annotation[] anot,
- ColumnSelection columnSelection, String label2)
+ private String collectAnnotVals(Annotation[] anot, String label2)
{
String collatedInput = "";
String last = "";
ColumnSelection viscols = av.getColumnSelection();
// TODO: refactor and save av.getColumnSelection for efficiency
- for (int i = 0; i < columnSelection.size(); i++)
+ for (int index : viscols.getSelected())
{
- 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
@@ -474,14 +510,15 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
}
}
- if (SwingUtilities.isRightMouseButton(evt) && activeRow != -1)
+ if (evt.isPopupTrigger() && activeRow != -1)
{
if (av.getColumnSelection() == null)
{
return;
}
- JPopupMenu pop = new JPopupMenu("Structure type");
+ JPopupMenu pop = new JPopupMenu(
+ MessageManager.getString("label.structure_type"));
JMenuItem item;
/*
* Just display the needed structure options
@@ -520,7 +557,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
return;
}
- ap.scalePanel.mousePressed(evt);
+ ap.getScalePanel().mousePressed(evt);
}
@@ -536,7 +573,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
graphStretch = -1;
graphStretchY = -1;
mouseDragging = false;
- ap.scalePanel.mouseReleased(evt);
+ ap.getScalePanel().mouseReleased(evt);
}
/**
@@ -548,7 +585,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
@Override
public void mouseEntered(MouseEvent evt)
{
- ap.scalePanel.mouseEntered(evt);
+ ap.getScalePanel().mouseEntered(evt);
}
/**
@@ -560,7 +597,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
@Override
public void mouseExited(MouseEvent evt)
{
- ap.scalePanel.mouseExited(evt);
+ ap.getScalePanel().mouseExited(evt);
}
/**
@@ -586,7 +623,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
}
else
{
- ap.scalePanel.mouseDragged(evt);
+ ap.getScalePanel().mouseDragged(evt);
}
}
@@ -663,7 +700,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,26 +737,21 @@ 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!
public void drawCursor(Graphics graphics, SequenceI seq, int res, int x1,
int y1)
{
- int pady = av.charHeight / 5;
+ int pady = av.getCharHeight() / 5;
int charOffset = 0;
graphics.setColor(Color.black);
- graphics.fillRect(x1, y1, av.charWidth, av.charHeight);
+ graphics.fillRect(x1, y1, av.getCharWidth(), av.getCharHeight());
if (av.validCharWidth)
{
@@ -726,9 +759,9 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
char s = seq.getCharAt(res);
- charOffset = (av.charWidth - fm.charWidth(s)) / 2;
+ charOffset = (av.getCharWidth() - fm.charWidth(s)) / 2;
graphics.drawString(String.valueOf(s), charOffset + x1,
- (y1 + av.charHeight) - pady);
+ (y1 + av.getCharHeight()) - pady);
}
}
@@ -757,16 +790,18 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
return;
}
}
- imgWidth = (av.endRes - av.startRes + 1) * av.charWidth;
+ imgWidth = (av.endRes - av.startRes + 1) * av.getCharWidth();
if (imgWidth < 1)
+ {
return;
- if (image == null || imgWidth != image.getWidth()
+ }
+ if (image == null || imgWidth != image.getWidth(this)
|| image.getHeight(this) != getHeight())
{
try
{
- image = new BufferedImage(imgWidth, ap.annotationPanel.getHeight(),
- BufferedImage.TYPE_INT_RGB);
+ image = new BufferedImage(imgWidth, ap.getAnnotationPanel()
+ .getHeight(), BufferedImage.TYPE_INT_RGB);
} catch (OutOfMemoryError oom)
{
try
@@ -802,6 +837,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 +849,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,15 +857,17 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
repaint();
return;
}
- gg.copyArea(0, 0, imgWidth, getHeight(), -horizontal * av.charWidth, 0);
-
+ long stime = System.currentTimeMillis();
+ gg.copyArea(0, 0, imgWidth, getHeight(),
+ -horizontal * av.getCharWidth(), 0);
+ long mtime = System.currentTimeMillis();
int sr = av.startRes;
int er = av.endRes + 1;
int 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)
@@ -839,9 +880,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));
+ }
}
@@ -904,7 +952,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
}
g.setColor(Color.white);
- g.fillRect(0, 0, (endRes - startRes) * av.charWidth, getHeight());
+ g.fillRect(0, 0, (endRes - startRes) * av.getCharWidth(), getHeight());
g.setFont(av.getFont());
if (fm == null)
@@ -920,7 +968,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,4 +999,23 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
{
return imgWidth;
}
+
+ private int[] bounds = new int[2];
+
+ @Override
+ public int[] getVisibleVRange()
+ {
+ if (ap != null && ap.getAlabels() != null)
+ {
+ int sOffset = -ap.getAlabels().getScrollOffset();
+ int visHeight = sOffset + ap.annotationSpaceFillerHolder.getHeight();
+ bounds[0] = sOffset;
+ bounds[1] = visHeight;
+ return bounds;
+ }
+ else
+ {
+ return null;
+ }
+ }
}