Jalview 2.8 Source Header
[jalview.git] / src / jalview / gui / AnnotationLabels.java
index 6d32c04..1577477 100755 (executable)
@@ -1,13 +1,13 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * 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
  * 
  * 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.
- * 
+ *  
  * 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 
@@ -23,6 +23,7 @@ import java.util.regex.Pattern;
 import java.awt.*;
 import java.awt.datatransfer.*;
 import java.awt.event.*;
+import java.awt.geom.AffineTransform;
 import java.awt.image.*;
 import javax.swing.*;
 
@@ -114,6 +115,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
 
     addMouseListener(this);
     addMouseMotionListener(this);
+    addMouseWheelListener(ap.annotationPanel);
   }
 
   public AnnotationLabels(AlignViewport av)
@@ -143,7 +145,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
   void getSelectedRow(int y)
   {
     int height = 0;
-    AlignmentAnnotation[] aa = ap.av.getAlignment().getAlignmentAnnotation();
+    AlignmentAnnotation[] aa = ap.av.getAlignment()
+            .getAlignmentAnnotation();
     selectedRow = -2;
     if (aa != null)
     {
@@ -175,7 +178,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
    */
   public void actionPerformed(ActionEvent evt)
   {
-    AlignmentAnnotation[] aa = ap.av.getAlignment().getAlignmentAnnotation();
+    AlignmentAnnotation[] aa = ap.av.getAlignment()
+            .getAlignmentAnnotation();
 
     if (evt.getActionCommand().equals(ADDNEW))
     {
@@ -244,8 +248,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     ap.validateAnnotationDimensions(false);
     ap.addNotify();
     ap.repaint();
-    //validate();
-    //ap.paintAlignment(true);
+    // validate();
+    // ap.paintAlignment(true);
   }
 
   /**
@@ -311,7 +315,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
       {
         end = ap.av.getAlignment().getAlignmentAnnotation().length - 1;
       }
-      AlignmentAnnotation endAA = ap.av.getAlignment().getAlignmentAnnotation()[end];
+      AlignmentAnnotation endAA = ap.av.getAlignment()
+              .getAlignmentAnnotation()[end];
 
       ap.av.getAlignment().getAlignmentAnnotation()[end] = startAA;
       ap.av.getAlignment().getAlignmentAnnotation()[start] = endAA;
@@ -404,40 +409,51 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     if (selectedRow > -1
             && ap.av.getAlignment().getAlignmentAnnotation().length > selectedRow)
     {
-      AlignmentAnnotation aa = ap.av.getAlignment().getAlignmentAnnotation()[selectedRow];
-      
+      AlignmentAnnotation aa = ap.av.getAlignment()
+              .getAlignmentAnnotation()[selectedRow];
+
       StringBuffer desc = new StringBuffer();
       if (aa.description != null
               && !aa.description.equals("New description"))
       {
-        // TODO: we could refactor and merge this code with the code in jalview.gui.SeqPanel.mouseMoved(..) that formats sequence feature tooltips
+        // TODO: we could refactor and merge this code with the code in
+        // jalview.gui.SeqPanel.mouseMoved(..) that formats sequence feature
+        // tooltips
         desc.append(aa.getDescription(true).trim());
         // check to see if the description is an html fragment.
-        if (desc.length()<6 || (desc.substring(0,6).toLowerCase().indexOf("<html>")<0))
+        if (desc.length() < 6
+                || (desc.substring(0, 6).toLowerCase().indexOf("<html>") < 0))
         {
           // clean the description ready for embedding in html
-          desc = new StringBuffer(Pattern.compile("<").matcher(desc).replaceAll("&lt;"));        
+          desc = new StringBuffer(Pattern.compile("<").matcher(desc)
+                  .replaceAll("&lt;"));
           desc.insert(0, "<html>");
-        } else {
-               // remove terminating html if any
-               int i=desc.substring(desc.length()-7).toLowerCase().lastIndexOf("</html>");
-               if (i>-1) {
-                 desc.setLength(desc.length()-7+i);
-               }
+        }
+        else
+        {
+          // remove terminating html if any
+          int i = desc.substring(desc.length() - 7).toLowerCase()
+                  .lastIndexOf("</html>");
+          if (i > -1)
+          {
+            desc.setLength(desc.length() - 7 + i);
+          }
         }
         if (aa.hasScore())
         {
           desc.append("<br/>");
         }
-        
-        
-      } else {
+
+      }
+      else
+      {
         // begin the tooltip's html fragment
         desc.append("<html>");
       }
       if (aa.hasScore())
       {
-        // TODO: limit precision of score to avoid noise from imprecise doubles (64.7 becomes 64.7+/some tiny value).
+        // TODO: limit precision of score to avoid noise from imprecise doubles
+        // (64.7 becomes 64.7+/some tiny value).
         desc.append(" Score: " + aa.score);
       }
 
@@ -460,7 +476,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
    */
   public void mouseClicked(MouseEvent evt)
   {
-    AlignmentAnnotation[] aa = ap.av.getAlignment().getAlignmentAnnotation();
+    AlignmentAnnotation[] aa = ap.av.getAlignment()
+            .getAlignmentAnnotation();
     if (SwingUtilities.isLeftMouseButton(evt))
     {
       if (selectedRow > -1 && selectedRow < aa.length)
@@ -469,7 +486,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
         {
           if (evt.getClickCount() >= 2)
           {
-            // todo: make the ap scroll to the selection - not necessary, first click highlights/scrolls, second selects
+            // todo: make the ap scroll to the selection - not necessary, first
+            // click highlights/scrolls, second selects
             ap.seqPanel.ap.idPanel.highlightSearchResults(null);
             ap.av.setSelectionGroup(// new SequenceGroup(
             aa[selectedRow].groupRef); // );
@@ -637,7 +655,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
           {
             public void actionPerformed(ActionEvent e)
             {
-              
+
               // TODO: pass on reference
               // to ap
               // so the
@@ -832,12 +850,16 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     int x = 0;
     int graphExtras = 0;
     int offset = 0;
-
+    Font baseFont = g.getFont();
+    FontMetrics baseMetrics = fm;
+    int ofontH = fontHeight;
+    boolean visible = true;
     if (aa != null)
     {
       hasHiddenRows = false;
       for (int i = 0; i < aa.length; i++)
       {
+        visible = true;
         g.setColor(Color.black);
 
         if (!aa[i].visible)
@@ -870,30 +892,55 @@ public class AnnotationLabels extends JPanel implements MouseListener,
               groupSize++;
             }
           }
-
           if (groupSize * (fontHeight + 8) < aa[i].height)
           {
             graphExtras = (aa[i].height - (groupSize * (fontHeight + 8))) / 2;
           }
-
-          for (int gg = 0; gg < aa.length; gg++)
+          else
           {
-            if (aa[gg].graphGroup == aa[i].graphGroup)
+            // scale font to fit
+            float h = aa[i].height / (float) groupSize, s;
+            if (h < 9)
+            {
+              visible = false;
+            }
+            else
             {
-              x = width - fm.stringWidth(aa[gg].label) - 3;
-              g.drawString(aa[gg].label, x, y - graphExtras);
-              if (aa[gg].annotations[0] != null)
+              fontHeight = -8 + (int) h;
+              s = ((float) fontHeight) / (float) ofontH;
+              Font f = baseFont.deriveFont(AffineTransform
+                      .getScaleInstance(s, s));
+              g.setFont(f);
+              fm = g.getFontMetrics();
+              graphExtras = (aa[i].height - (groupSize * (fontHeight + 8))) / 2;
+            }
+          }
+          if (visible)
+          {
+            for (int gg = 0; gg < aa.length; gg++)
+            {
+              if (aa[gg].graphGroup == aa[i].graphGroup)
               {
-                g.setColor(aa[gg].annotations[0].colour);
-              }
+                x = width - fm.stringWidth(aa[gg].label) - 3;
+                g.drawString(aa[gg].label, x, y - graphExtras);
+
+                if (aa[gg]._linecolour != null)
+                {
 
-              g.drawLine(x, y - graphExtras - 3,
-                      x + fm.stringWidth(aa[gg].label), y - graphExtras - 3);
+                  g.setColor(aa[gg]._linecolour);
+                  g.drawLine(x, y - graphExtras + 3,
+                          x + fm.stringWidth(aa[gg].label), y - graphExtras
+                                  + 3);
+                }
 
-              g.setColor(Color.black);
-              graphExtras += fontHeight + 8;
+                g.setColor(Color.black);
+                graphExtras += fontHeight + 8;
+              }
             }
           }
+          g.setFont(baseFont);
+          fm = baseMetrics;
+          fontHeight = ofontH;
         }
         else
         {