Merge branch 'features/JAL-1541_BioJsMSAViewer-export-option' of https://source.jalvi...
[jalview.git] / src / jalview / analysis / AlignmentAnnotationUtils.java
index b5f77fd..9bdbf73 100644 (file)
@@ -129,21 +129,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 +158,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 +206,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()