fix for arrayoutofbounds bug when secondary structure element extends whole width...
[jalview.git] / src / jalview / gui / AnnotationPanel.java
index 0fb84b0..6371e86 100755 (executable)
@@ -42,7 +42,6 @@ public class AnnotationPanel
   final String COLOUR = "Colour";
   final Color HELIX_COLOUR = Color.red.darker();
   final Color SHEET_COLOUR = Color.green.darker().darker();
-
   /** DOCUMENT ME!! */
   AlignViewport av;
   AlignmentPanel ap;
@@ -71,10 +70,7 @@ public class AnnotationPanel
   public AnnotationPanel(AlignmentPanel ap)
   {
 
-    if (System.getProperty("os.name").startsWith("Mac"))
-    {
-      MAC = true;
-    }
+    MAC = new jalview.util.Platform().isAMac();
 
     ToolTipManager.sharedInstance().registerComponent(this);
     ToolTipManager.sharedInstance().setInitialDelay(0);
@@ -182,10 +178,9 @@ public class AnnotationPanel
     }
     else if (evt.getActionCommand().equals(LABEL))
     {
-      String label = JOptionPane.showInputDialog(this, "Enter Label ",
-                                                 "Enter label",
-                                                 JOptionPane.QUESTION_MESSAGE);
-
+      String exMesg = collectAnnotVals(anot, av.getColumnSelection(), LABEL);
+      String label = JOptionPane.showInputDialog(this,"Enter label",exMesg);
+      
       if (label == null)
       {
         return;
@@ -205,10 +200,10 @@ public class AnnotationPanel
 
         if (anot[index] == null)
         {
-          anot[index] = new Annotation(label, "", ' ', 0);
+          anot[index] = new Annotation(label, "", ' ', 0); // TODO: verify that null exceptions aren't raised elsewhere.
+        } else {
+          anot[index].displayCharacter = label;
         }
-
-        anot[index].displayCharacter = label;
       }
     }
     else if (evt.getActionCommand().equals(COLOUR))
@@ -289,6 +284,46 @@ public class AnnotationPanel
     return;
   }
 
+  private String collectAnnotVals(Annotation[] anot, ColumnSelection columnSelection,
+          String label2)
+  {
+    String collatedInput="";
+    String last="";
+    for (int i = 0; i < columnSelection.size(); i++)
+    {
+      int index = columnSelection.columnAt(i);
+      // always check for current display state - just in case
+      if(!av.colSel.isVisible(index))
+        continue;
+      String tlabel=null;
+      if (anot[index] != null)
+      {
+        if (label2.equals(HELIX) || label2.equals(SHEET) || label2.equals(LABEL))
+        {
+          tlabel = anot[index].description;
+          if (tlabel == null)
+          {
+            if (label2.equals(HELIX) || label2.equals(SHEET))
+            {
+              tlabel = ""+anot[index].secondaryStructure;
+            } else {
+              tlabel = ""+anot[index].displayCharacter;
+            }            
+          }
+        }
+        if (tlabel!=null && !tlabel.equals(last))
+        {
+          if (last.length()>0)
+          {
+            collatedInput+=" ";
+          }
+          collatedInput+=tlabel;
+        }
+      }
+    }
+    return collatedInput;
+  }
+
   /**
    * DOCUMENT ME!
    *
@@ -572,14 +607,14 @@ public class AnnotationPanel
     drawComponent(gg, av.startRes, av.endRes + 1);
     g.drawImage(image, 0, 0, this);
   }
-
   /**
-   * DOCUMENT ME!
+   * non-Thread safe repaint
    *
-   * @param horizontal DOCUMENT ME!
+   * @param horizontal repaint with horizontal shift in alignment
    */
   public void fastPaint(int horizontal)
   {
+
     if ( (horizontal == 0)
         || gg == null
         || av.alignment.getAlignmentAnnotation() == null
@@ -590,7 +625,6 @@ public class AnnotationPanel
       repaint();
       return;
     }
-
     gg.copyArea(0, 0, imgWidth, getHeight(), -horizontal * av.charWidth, 0);
 
     int sr = av.startRes;
@@ -614,7 +648,6 @@ public class AnnotationPanel
     gg.translate( -transX, 0);
 
     fastPaint = true;
-
     repaint();
 
   }
@@ -694,7 +727,7 @@ public class AnnotationPanel
     int lastSSX;
     int iconOffset = 0;
     boolean validRes = false;
-
+    boolean validEnd = false;
     boolean[] graphGroupDrawn = new boolean[aa.length];
 
     //\u03B2 \u03B1
@@ -828,10 +861,13 @@ public class AnnotationPanel
             && (row.annotations[column].displayCharacter.length() > 0))
         {
 
-          int charOffset = (av.charWidth -
-                            fm.charWidth(row.annotations[column].
-                                         displayCharacter.charAt(
-                                             0))) / 2;
+          int charOffset = (av.getCentreColumnLabels()) ? ((av.charWidth -
+                            fm.charsWidth(row.annotations[column].
+                                         displayCharacter.toCharArray(),0,
+                                         row.annotations[column].
+                                         displayCharacter.length())) / 2)
+                                         : (av.charWidth - fm.charWidth(row.annotations[column].
+                                                 displayCharacter.charAt(0))) / 2;
 
           if (row.annotations[column].colour == null)
             g.setColor(Color.black);
@@ -944,6 +980,9 @@ public class AnnotationPanel
       if (column >= row.annotations.length)
       {
         column = row.annotations.length - 1;
+        validEnd = false;
+      } else {
+        validEnd = true;
       }
 
       //  x ++;
@@ -991,7 +1030,7 @@ public class AnnotationPanel
           case 'E':
             g.setColor(SHEET_COLOUR);
 
-            if (row.annotations[endRes] == null
+            if (!validEnd || row.annotations[endRes] == null
                 || row.annotations[endRes].secondaryStructure != 'E')
             {
               g.fillRect(lastSSX, y + 4 + iconOffset,