timing of 'on load' output before any gui thread operations
[jalview.git] / src / jalview / io / AnnotationFile.java
index a936dac..6285cf1 100755 (executable)
@@ -33,13 +33,45 @@ public class AnnotationFile
       "JALVIEW_ANNOTATION\n"\r
       + "# Created: "\r
       + new java.util.Date() + "\n\n");\r
-\r
+  /**\r
+   * convenience method for pre-2.4 feature files which have no view, hidden columns or hidden row keywords.\r
+   * @param annotations\r
+   * @param groups\r
+   * @param properties\r
+   * @return feature file as a string.\r
+   */\r
   public String printAnnotations(AlignmentAnnotation[] annotations,\r
                                  Vector groups,\r
                                  Hashtable properties)\r
   {\r
+    return printAnnotations(annotations, groups,\r
+            properties, null);\r
+\r
+  }\r
+  /**\r
+   * hold all the information about a particular view definition\r
+   * read from or written out in an annotations file.\r
+   */\r
+  public class ViewDef {\r
+    public String viewname;\r
+    public HiddenSequences hidseqs;\r
+    public ColumnSelection hiddencols;\r
+    public Vector visibleGroups;\r
+    public ViewDef(String viewname, HiddenSequences hidseqs,\r
+            ColumnSelection hiddencols)\r
+    {\r
+      this.viewname = viewname;\r
+      this.hidseqs = hidseqs;\r
+      this.hiddencols = hiddencols;\r
+    }\r
+  }\r
+  public String printAnnotations(AlignmentAnnotation[] annotations,\r
+          Vector groups,\r
+          Hashtable properties, ViewDef[] views)\r
+  {\r
     if (annotations != null)\r
     {\r
+      boolean oneColour = true;\r
       AlignmentAnnotation row;\r
       String comma;\r
       SequenceI refSeq = null;\r
@@ -55,12 +87,13 @@ public class AnnotationFile
       {\r
         row = annotations[i];\r
 \r
-        if (!row.visible)\r
+        if (!row.visible && !row.hasScore())\r
         {\r
           continue;\r
         }\r
 \r
         color = null;\r
+        oneColour = true;\r
 \r
         if (row.sequenceRef == null)\r
         {\r
@@ -125,7 +158,7 @@ public class AnnotationFile
           text.append(row.description + "\t");\r
         }\r
 \r
-        for (int j = 0; j < row.annotations.length; j++)\r
+        for (int j = 0; row.annotations!=null && j < row.annotations.length; j++)\r
         {\r
           if (refSeq != null &&\r
               jalview.util.Comparison.isGap(refSeq.getCharAt(j)))\r
@@ -151,6 +184,11 @@ public class AnnotationFile
 \r
             if (row.annotations[j] != null)\r
             {\r
+              if(color!=null && !color.equals(row.annotations[j].colour))\r
+              {\r
+                oneColour = false;\r
+              }\r
+\r
               color = row.annotations[j].colour;\r
               if (row.annotations[j].value != 0f)\r
               {\r
@@ -169,12 +207,12 @@ public class AnnotationFile
           text.append("|");\r
         }\r
 \r
-        if(!Float.isNaN(row.score))\r
+        if(row.hasScore())\r
           text.append("\t"+row.score);\r
 \r
         text.append("\n");\r
 \r
-        if (color != null && color != java.awt.Color.black)\r
+        if (color != null && color != java.awt.Color.black && oneColour)\r
         {\r
           colours.append("COLOUR\t"\r
                          + row.label + "\t"\r
@@ -214,7 +252,7 @@ public class AnnotationFile
       }\r
 \r
     }\r
-\r
+    \r
     return text.toString();\r
   }\r
 \r
@@ -486,7 +524,7 @@ public class AnnotationFile
 \r
         annotation = new AlignmentAnnotation(label,\r
                                              description,\r
-                                             annotations,\r
+                                             (index==0) ? null : annotations,\r
                                              0,\r
                                              0,\r
                                              graphStyle);\r
@@ -578,7 +616,8 @@ public class AnnotationFile
 \r
     }\r
 \r
-    if (displayChar.length() > 1\r
+    if (displayChar!=null\r
+        && displayChar.length() > 1\r
         &&  desc!=null\r
         && desc.length() == 1)\r
     {\r
@@ -586,7 +625,14 @@ public class AnnotationFile
       displayChar = desc;\r
       desc = tmp;\r
     }\r
-\r
+    /*\r
+     * In principle, this code will ensure that the Annotation element generated is renderable by any of the applet or application rendering code\r
+     * but instead we check for null strings when the display character is rendered. \r
+    if (displayChar==null)\r
+    {\r
+      displayChar="";\r
+    }\r
+    */\r
     Annotation anot = new Annotation(displayChar, desc, ss, value);\r
 \r
     anot.colour = colour;\r
@@ -867,4 +913,33 @@ public class AnnotationFile
       al.setProperty(key,value);\r
     }\r
   }\r
+\r
+  /**\r
+   * Write annotations as a CSV file of the form 'label, value, value, ...' for each row.\r
+   * @param annotations\r
+   * @return CSV file as a string.\r
+   */\r
+  public String printCSVAnnotations(AlignmentAnnotation[] annotations)\r
+  {\r
+    StringBuffer sp = new StringBuffer();\r
+    for (int i=0; i<annotations.length; i++)\r
+    {\r
+      String atos = annotations[i].toString();\r
+      int p = 0;\r
+      do {\r
+        int cp = atos.indexOf("\n", p);\r
+        sp.append(annotations[i].label);\r
+        sp.append(",");\r
+        if (cp>p)\r
+        {\r
+          sp.append(atos.substring(p, cp+1));\r
+        } else {\r
+          sp.append(atos.substring(p));\r
+          sp.append("\n");\r
+        }\r
+        p = cp+1;\r
+      } while (p>0);\r
+    }\r
+    return sp.toString();\r
+  }\r
 }\r