JAL-1819 commented out debugging message to stderr
[jalview.git] / src / jalview / io / AnnotationFile.java
index c25d7af..7702792 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -88,8 +88,8 @@ public class AnnotationFile
   }
 
   /**
-   * convenience method for pre-2.9 annotation files which have no view, hidden
-   * columns or hidden row keywords.
+   * convenience method for pre-2.8.3 annotation files which have no view,
+   * hidden columns or hidden row keywords.
    * 
    * @param annotations
    * @param list
@@ -99,7 +99,7 @@ public class AnnotationFile
   public String printAnnotations(AlignmentAnnotation[] annotations,
           List<SequenceGroup> list, Hashtable properties)
   {
-    return printAnnotations(annotations, list, properties, null);
+    return printAnnotations(annotations, list, properties, null, null, null);
 
   }
 
@@ -140,16 +140,56 @@ public class AnnotationFile
    * @return annotation file
    */
   public String printAnnotations(AlignmentAnnotation[] annotations,
-          List<SequenceGroup> list, Hashtable properties, ViewDef[] views)
+          List<SequenceGroup> list, Hashtable properties,
+          ColumnSelection cs, AlignmentI al, ViewDef view)
   {
-    // TODO: resolve views issue : annotationFile could contain visible region,
-    // or full data + hidden region specifications for a view.
-    if (views != null)
+    if (view != null)
     {
-      // are views defined and then annotation added to alignment or the other
-      // way around ?
-
+      if (view.viewname != null)
+      {
+        text.append("VIEW_DEF\t" + view.viewname + "\n");
+      }
+      if (list == null)
+      {
+        list = view.visibleGroups;
+      }
+      if (cs == null)
+      {
+        cs = view.hiddencols;
+      }
+      if (al == null)
+      {
+        // add hidden rep sequences.
+      }
+    }
+    // first target - store and restore all settings for a view.
+    if (al != null && al.hasSeqrep())
+    {
+      text.append("VIEW_SETREF\t" + al.getSeqrep().getName() + "\n");
+    }
+    if (cs != null && cs.hasHiddenColumns())
+    {
+      text.append("VIEW_HIDECOLS\t");
+      List<int[]> hc = cs.getHiddenColumns();
+      boolean comma = false;
+      for (int[] r : hc)
+      {
+        if (!comma)
+        {
+          comma = true;
+        }
+        else
+        {
+          text.append(",");
+        }
+        text.append(r[0]);
+        text.append("-");
+        text.append(r[1]);
+      }
+      text.append("\n");
     }
+    // TODO: allow efficient recovery of annotation data shown in several
+    // different views
     if (annotations != null)
     {
       boolean oneColour = true;
@@ -201,7 +241,7 @@ public class AnnotationFile
                     && row.annotations[j].displayCharacter.length() > 0 && !row.annotations[j].displayCharacter
                     .equals(" "));
             hasGlyphs |= (row.annotations[j].secondaryStructure != 0 && row.annotations[j].secondaryStructure != ' ');
-            hasValues |= (row.annotations[j].value != Float.NaN); // NaNs can't
+            hasValues |= (!Float.isNaN(row.annotations[j].value)); // NaNs can't
             // be
             // rendered..
             hasText |= (row.annotations[j].description != null && row.annotations[j].description
@@ -291,13 +331,13 @@ public class AnnotationFile
             }
             if (hasValues)
             {
-              if (row.annotations[j].value != Float.NaN)
+              if (!Float.isNaN(row.annotations[j].value))
               {
                 text.append(comma + row.annotations[j].value);
               }
               else
               {
-                System.err.println("Skipping NaN - not valid value.");
+                // System.err.println("Skipping NaN - not valid value.");
                 text.append(comma + 0f);// row.annotations[j].value);
               }
               comma = ",";
@@ -432,7 +472,8 @@ public class AnnotationFile
         text.append(properties.get(key));
       }
       // TODO: output alignment visualization settings here if required
-
+      // iterate through one or more views, defining, marking columns and rows as visible/hidden, and emmitting view properties.
+      // View specific annotation is 
     }
 
     return text.toString();
@@ -888,6 +929,12 @@ public class AnnotationFile
           modified = true;
           continue;
         }
+        // else if (token.equalsIgnoreCase("VIEW_DEF"))
+        // {
+        // addOrSetView(al,st);
+        // modified = true;
+        // continue;
+        // }
         else if (token.equalsIgnoreCase("VIEW_SETREF"))
         {
           if (refSeq != null)
@@ -897,6 +944,19 @@ public class AnnotationFile
           modified = true;
           continue;
         }
+        else if (token.equalsIgnoreCase("VIEW_HIDECOLS"))
+        {
+          if (st.hasMoreTokens())
+          {
+            if (colSel == null)
+            {
+              colSel = new ColumnSelection();
+            }
+            parseHideCols(colSel, st.nextToken());
+          }
+          modified = true;
+          continue;
+        }
         else if (token.equalsIgnoreCase("HIDE_INSERTIONS"))
         {
           SequenceI sr = refSeq == null ? al.getSeqrep() : refSeq;
@@ -1121,6 +1181,40 @@ public class AnnotationFile
     return modified;
   }
 
+  private void parseHideCols(ColumnSelection colSel, String nextToken)
+  {
+    StringTokenizer inval = new StringTokenizer(nextToken,",");
+    while (inval.hasMoreTokens())
+    {
+      String range = inval.nextToken().trim();
+      int from, to = range.indexOf("-");
+      if (to == -1)
+      {
+        from = to = Integer.parseInt(range);
+        if (from >= 0)
+        {
+          colSel.hideColumns(from, to);
+        }
+      }
+      else
+      {
+        from = Integer.parseInt(range.substring(0, to));
+        if (to < range.length() - 1)
+        {
+          to = Integer.parseInt(range.substring(to + 1));
+        }
+        else
+        {
+          to = from;
+        }
+        if (from > 0 && to >= from)
+        {
+          colSel.hideColumns(from, to);
+        }
+      }
+    }
+  }
+
   private Object autoAnnotsKey(AlignmentAnnotation annotation,
           SequenceI refSeq, String groupRef)
   {
@@ -1691,4 +1785,19 @@ public class AnnotationFile
     }
     return sp.toString();
   }
+
+  public String printAnnotationsForView(AlignViewportI viewport)
+  {
+    return printAnnotations(viewport.isShowAnnotation() ? viewport
+            .getAlignment().getAlignmentAnnotation() : null, viewport
+            .getAlignment().getGroups(), viewport.getAlignment()
+            .getProperties(), viewport.getColumnSelection(),
+            viewport.getAlignment(), null);
+  }
+
+  public String printAnnotationsForAlignment(AlignmentI al)
+  {
+    return printAnnotations(al.getAlignmentAnnotation(), al.getGroups(),
+            al.getProperties(), null, al, null);
+  }
 }