JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / gui / AnnotationPanel.java
index 8a22288..3f4c92a 100755 (executable)
@@ -1,31 +1,61 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 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 <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * 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
@@ -38,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();
 
@@ -109,7 +139,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);
@@ -211,7 +241,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());
   }
 
   /**
@@ -267,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)
       {
@@ -285,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)
         {
@@ -303,14 +335,17 @@ 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)
         {
@@ -348,8 +383,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)
       {
@@ -359,27 +394,34 @@ 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;
+
       }
     }
     av.getAlignment().validateAnnotation(aa[activeRow]);
     ap.alignmentChanged();
-    
+
     adjustPanelHeight();
     repaint();
 
@@ -398,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
@@ -482,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
@@ -521,7 +566,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       return;
     }
 
-    ap.scalePanel.mousePressed(evt);
+    ap.getScalePanel().mousePressed(evt);
 
   }
 
@@ -537,7 +582,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     graphStretch = -1;
     graphStretchY = -1;
     mouseDragging = false;
-    ap.scalePanel.mouseReleased(evt);
+    ap.getScalePanel().mouseReleased(evt);
   }
 
   /**
@@ -549,7 +594,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
   @Override
   public void mouseEntered(MouseEvent evt)
   {
-    ap.scalePanel.mouseEntered(evt);
+    ap.getScalePanel().mouseEntered(evt);
   }
 
   /**
@@ -561,7 +606,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
   @Override
   public void mouseExited(MouseEvent evt)
   {
-    ap.scalePanel.mouseExited(evt);
+    ap.getScalePanel().mouseExited(evt);
   }
 
   /**
@@ -587,7 +632,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     }
     else
     {
-      ap.scalePanel.mouseDragged(evt);
+      ap.getScalePanel().mouseDragged(evt);
     }
   }
 
@@ -664,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
       {
@@ -700,21 +746,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 (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)
     {
@@ -722,9 +768,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);
     }
 
   }
@@ -753,16 +799,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(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
@@ -796,10 +844,12 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     imageFresh = false;
     g.drawImage(image, 0, 0, this);
   }
+
   /**
    * set true to enable redraw timing debug output on stderr
    */
   private final boolean debugRedraw = false;
+
   /**
    * non-Thread safe repaint
    * 
@@ -816,16 +866,17 @@ 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();
+    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)
@@ -838,12 +889,15 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     drawComponent(gg, sr, er);
 
     gg.translate(-transX, 0);
-    long dtime=System.currentTimeMillis();
+    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));
+    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));
     }
 
   }
@@ -905,9 +959,9 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       }
       fadedImage = null;
     }
-    
+
     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)
@@ -923,7 +977,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;
@@ -953,16 +1008,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.getAlabels() != null)
+    {
+      int sOffset = -ap.getAlabels().getScrollOffset();
+      int visHeight = sOffset + ap.annotationSpaceFillerHolder.getHeight();
+      bounds[0] = sOffset;
+      bounds[1] = visHeight;
+      return bounds;
+    }
+    else
     {
-    int sOffset=-ap.alabels.scrollOffset;
-    int visHeight = sOffset+ap.annotationSpaceFillerHolder.getHeight();
-    bounds[0] = sOffset; bounds[1]=visHeight;
-    return bounds;
-    } else return null;
+      return null;
+    }
   }
 }