refactored and patched for JAL-721
authorjprocter <Jim Procter>
Tue, 14 Dec 2010 10:39:18 +0000 (10:39 +0000)
committerjprocter <Jim Procter>
Tue, 14 Dec 2010 10:39:18 +0000 (10:39 +0000)
src/jalview/appletgui/AlignFrame.java
src/jalview/io/AlignmentProperties.java [new file with mode: 0644]

index 9f77772..ffe445b 100755 (executable)
@@ -796,38 +796,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     }
     else if (source == alProperties)
     {
-      StringBuffer contents = new StringBuffer();
-
-      float avg = 0;
-      int min = Integer.MAX_VALUE, max = 0;
-      for (int i = 0; i < viewport.alignment.getHeight(); i++)
-      {
-        int size = viewport.alignment.getSequenceAt(i).getEnd()
-                - viewport.alignment.getSequenceAt(i).getStart();
-        avg += size;
-        if (size > max)
-          max = size;
-        if (size < min)
-          min = size;
-      }
-      avg = avg / (float) viewport.alignment.getHeight();
-
-      contents.append("\nSequences: " + viewport.alignment.getHeight());
-      contents.append("\nMinimum Sequence Length: " + min);
-      contents.append("\nMaximum Sequence Length: " + max);
-      contents.append("\nAverage Length: " + (int) avg);
-
-      if (((Alignment) viewport.alignment).alignmentProperties != null)
-      {
-        Hashtable props = ((Alignment) viewport.alignment).alignmentProperties;
-        Enumeration en = props.keys();
-        while (en.hasMoreElements())
-        {
-          String key = en.nextElement().toString();
-          contents.append("\n" + key + "\t" + props.get(key));
-        }
-      }
-
+      StringBuffer contents = new jalview.io.AlignmentProperties(viewport.alignment).formatAsString();
       CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
       cap.setText(contents.toString());
       Frame frame = new Frame();
diff --git a/src/jalview/io/AlignmentProperties.java b/src/jalview/io/AlignmentProperties.java
new file mode 100644 (file)
index 0000000..45d46d8
--- /dev/null
@@ -0,0 +1,133 @@
+/**
+ * 
+ */
+package jalview.io;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.PrintWriter;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+
+/**
+ * Render associated attributes of an alignment. The heart of this code was refactored from jalview.gui.AlignFrame and jalview.appletgui.AlignFrame 
+ * TODO: consider extending the html renderer to annotate elements with CSS ids enabling finer output format control.
+ * 
+ */
+public class AlignmentProperties
+{
+  AlignmentI alignment;
+
+  public AlignmentProperties(AlignmentI alignment)
+  {
+    this.alignment = alignment;
+  }
+
+  /**
+   * render the alignment's properties report as text or an HTML fragment
+   * @param pw
+   * @param html
+   */
+  public void writeProperties(PrintWriter pw, boolean html)
+  {
+    final String nl = html ? "<br>" : "\n";
+    float avg = 0;
+    int min = Integer.MAX_VALUE, max = 0;
+    for (int i = 0; i < alignment.getHeight(); i++)
+    {
+      int size = 1 + alignment.getSequenceAt(i).getEnd()
+              - alignment.getSequenceAt(i).getStart();
+      avg += size;
+      if (size > max)
+        max = size;
+      if (size < min)
+        min = size;
+    }
+    avg = avg / (float) alignment.getHeight();
+    pw.append(nl);
+    pw.append("Sequences: " + alignment.getHeight());
+    pw.append(nl);
+    pw.append("Minimum Sequence Length: " + min);
+    pw.append(nl);
+    pw.append("Maximum Sequence Length: " + max);
+    pw.append(nl);
+    pw.append("Average Length: " + (int) avg);
+
+    if (((Alignment) alignment).alignmentProperties != null)
+    {
+      pw.append(nl);
+      pw.append(nl);
+      if (html)
+      {
+        pw.append("<table border=\"1\">");
+      }
+      Hashtable props = ((Alignment) alignment).alignmentProperties;
+      Enumeration en = props.keys();
+      while (en.hasMoreElements())
+      {
+        String key = en.nextElement().toString();
+        String vals = props.get(key).toString();
+        if (html)
+        {
+          // wrap the text in the table
+          StringBuffer val = new StringBuffer();
+          int pos = 0, npos;
+          do
+          {
+            npos = vals.indexOf("\n", pos);
+            if (npos == -1)
+            {
+              val.append(vals.substring(pos));
+            }
+            else
+            {
+              val.append(vals.substring(pos, npos));
+              val.append("<br>");
+            }
+            pos = npos + 1;
+          } while (npos != -1);
+          pw.append("<tr><td>" + key + "</td><td>" + val + "</td></tr>");
+        }
+        else
+        {
+          pw.append("\n" + key + "\t" + vals);
+        }
+      }
+      if (html)
+      {
+        pw.append("</table>");
+      }
+    }
+  }
+
+  /**
+   * generate a report as plain text
+   * 
+   * @return
+   */
+  public StringBuffer formatAsString()
+  {
+    return formatReport(false);
+  }
+
+  protected StringBuffer formatReport(boolean html)
+  {
+    StringWriter content = new StringWriter();
+    writeProperties(new PrintWriter(content), html);
+    return content.getBuffer();
+  }
+
+  /**
+   * generate a report as a fragment of html
+   * 
+   * @return
+   */
+  public StringBuffer formatAsHtml()
+  {
+    return formatReport(true);
+  }
+
+}