--- /dev/null
+/**
+ *
+ */
+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);
+ }
+
+}