Merge branch 'j2s/develop-toc' into j2s/develop
[jalview.git] / src / jalview / io / AnnotationFile.java
index 6834e76..8706ad5 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.
  * 
@@ -34,6 +34,8 @@ import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemeProperty;
 import jalview.schemes.ResidueProperties;
 import jalview.schemes.UserColourScheme;
+import jalview.util.Comparison;
+import jalview.util.Format;
 
 import java.io.BufferedReader;
 import java.io.FileReader;
@@ -88,8 +90,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 +101,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 +142,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;
@@ -238,8 +280,8 @@ public class AnnotationFile
             graphLine.append("\t");
             graphLine.append(row.getThreshold().label);
             graphLine.append("\t");
-            graphLine.append(jalview.util.Format.getHexString(row
-                    .getThreshold().colour));
+            graphLine
+                    .append(Format.getHexString(row.getThreshold().colour));
             graphLine.append(newline);
           }
 
@@ -270,7 +312,7 @@ public class AnnotationFile
                 && j < row.annotations.length; j++)
         {
           if (refSeq != null
-                  && jalview.util.Comparison.isGap(refSeq.getCharAt(j)))
+                  && Comparison.isGap(refSeq.getCharAt(j)))
           {
             continue;
           }
@@ -337,7 +379,7 @@ public class AnnotationFile
             {
               text.append(comma
                       + "["
-                      + jalview.util.Format
+                      + Format
                               .getHexString(row.annotations[j].colour)
                       + "]");
               comma = ",";
@@ -358,7 +400,7 @@ public class AnnotationFile
           colours.append("COLOUR\t");
           colours.append(row.label);
           colours.append("\t");
-          colours.append(jalview.util.Format.getHexString(color));
+          colours.append(Format.getHexString(color));
           colours.append(newline);
         }
         if (row.scaleColLabel || row.showAllColLabels
@@ -432,7 +474,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();
@@ -556,7 +599,7 @@ public class AnnotationFile
         }
       }
       text.append("outlineColour=");
-      text.append(jalview.util.Format.getHexString(sg.getOutlineColour()));
+      text.append(Format.getHexString(sg.getOutlineColour()));
       text.append("\t");
 
       text.append("displayBoxes=");
@@ -574,13 +617,13 @@ public class AnnotationFile
       if (sg.textColour != java.awt.Color.black)
       {
         text.append("textCol1=");
-        text.append(jalview.util.Format.getHexString(sg.textColour));
+        text.append(Format.getHexString(sg.textColour));
         text.append("\t");
       }
       if (sg.textColour2 != java.awt.Color.white)
       {
         text.append("textCol2=");
-        text.append(jalview.util.Format.getHexString(sg.textColour2));
+        text.append(Format.getHexString(sg.textColour2));
         text.append("\t");
       }
       if (sg.thresholdTextColour != 0)
@@ -592,7 +635,7 @@ public class AnnotationFile
       if (sg.idColour != null)
       {
         text.append("idColour=");
-        text.append(jalview.util.Format.getHexString(sg.idColour));
+        text.append(Format.getHexString(sg.idColour));
         text.append("\t");
       }
       if (sg.isHidereps())
@@ -888,6 +931,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 +946,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 +1183,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)
   {
@@ -1697,12 +1793,13 @@ public class AnnotationFile
     return printAnnotations(viewport.isShowAnnotation() ? viewport
             .getAlignment().getAlignmentAnnotation() : null, viewport
             .getAlignment().getGroups(), viewport.getAlignment()
-            .getProperties());
+            .getProperties(), viewport.getColumnSelection(),
+            viewport.getAlignment(), null);
   }
 
   public String printAnnotationsForAlignment(AlignmentI al)
   {
     return printAnnotations(al.getAlignmentAnnotation(), al.getGroups(),
-            al.getProperties());
+            al.getProperties(), null, al, null);
   }
 }