From 6c889c6524f1ba8f56dbea5211b44753846a1bdf Mon Sep 17 00:00:00 2001 From: jprocter Date: Tue, 14 Dec 2010 10:39:18 +0000 Subject: [PATCH] refactored and patched for JAL-721 --- src/jalview/appletgui/AlignFrame.java | 33 +------- src/jalview/io/AlignmentProperties.java | 133 +++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 32 deletions(-) create mode 100644 src/jalview/io/AlignmentProperties.java diff --git a/src/jalview/appletgui/AlignFrame.java b/src/jalview/appletgui/AlignFrame.java index 9f77772..ffe445b 100755 --- a/src/jalview/appletgui/AlignFrame.java +++ b/src/jalview/appletgui/AlignFrame.java @@ -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 index 0000000..45d46d8 --- /dev/null +++ b/src/jalview/io/AlignmentProperties.java @@ -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 ? "
" : "\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(""); + } + 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("
"); + } + pos = npos + 1; + } while (npos != -1); + pw.append(""); + } + else + { + pw.append("\n" + key + "\t" + vals); + } + } + if (html) + { + pw.append("
" + key + "" + val + "
"); + } + } + } + + /** + * 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); + } + +} -- 1.7.10.2