JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / analysis / AlignmentAnnotationUtils.java
index b5f77fd..ca618e3 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ * 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.
+ *  
+ * 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/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.analysis;
 
 import jalview.datamodel.AlignmentAnnotation;
@@ -63,6 +83,14 @@ public class AlignmentAnnotationUtils
 
     for (AlignmentAnnotation aa : annotations)
     {
+      /*
+       * Ignore non-positional annotations, can't render these against an
+       * alignment
+       */
+      if (aa.annotations == null)
+      {
+        continue;
+      }
       if (forSequences != null
               && (aa.sequenceRef != null && forSequences
                       .contains(aa.sequenceRef)))
@@ -129,21 +157,28 @@ public class AlignmentAnnotationUtils
       }
     }
     /*
-     * finally add the 'composite group labels' to the appropriate lists,
-     * depending on whether the group is identified as visible or hidden
+     * Finally add the 'composite group labels' to the appropriate lists,
+     * depending on whether the group is identified as visible or hidden. Don't
+     * add the same label more than once (there may be many graph groups that
+     * generate it).
      */
     for (String calcId : groupLabels.keySet())
     {
       for (int group : groupLabels.get(calcId).keySet())
       {
         final List<String> groupLabel = groupLabels.get(calcId).get(group);
+        // don't want to duplicate 'same types in different order'
+        Collections.sort(groupLabel);
         if (visibleGraphGroups.get(group))
         {
           if (!shownTypes.containsKey(calcId))
           {
             shownTypes.put(calcId, new ArrayList<List<String>>());
           }
-          shownTypes.get(calcId).add(groupLabel);
+          if (!shownTypes.get(calcId).contains(groupLabel))
+          {
+            shownTypes.get(calcId).add(groupLabel);
+          }
         }
         else
         {
@@ -151,7 +186,10 @@ public class AlignmentAnnotationUtils
           {
             hiddenTypes.put(calcId, new ArrayList<List<String>>());
           }
-          hiddenTypes.get(calcId).add(groupLabel);
+          if (!hiddenTypes.get(calcId).contains(groupLabel))
+          {
+            hiddenTypes.get(calcId).add(groupLabel);
+          }
         }
       }
     }
@@ -196,8 +234,7 @@ public class AlignmentAnnotationUtils
    * @param anns
    * @return
    */
-  public static List<AlignmentAnnotation> asList(
-          AlignmentAnnotation[] anns)
+  public static List<AlignmentAnnotation> asList(AlignmentAnnotation[] anns)
   {
     // TODO use AlignmentAnnotationI instead when it exists
     return (anns == null ? Collections.<AlignmentAnnotation> emptyList()