checkpoint
[sbp.git] / src / edu / berkeley / sbp / util / PrintableTree.java
index a50aff9..73b7f02 100644 (file)
@@ -1,15 +1,43 @@
-package edu.berkeley.sbp;
-import edu.berkeley.sbp.*;
+package edu.berkeley.sbp.util;
 import edu.berkeley.sbp.*;
 import edu.berkeley.sbp.util.*;
 import java.io.*;
 import java.util.*;
 import java.lang.reflect.*;
 
-public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T> {
+public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T>, ToJava /*, ToHTML*/ {
 
     protected abstract String headToString();
     protected abstract String headToJava();    
+    protected abstract int    numChildren();
+
+    private static final int MAXCHARS=40;
+
+    private boolean basic() { return toString().length() < MAXCHARS; }
+    public String toPrettyString() { return toPrettyString("\n"); }
+    private String toPrettyString(String nl) {
+        String str = toString();
+        if (str.length() < MAXCHARS) return str;
+        String head = headToString();
+        StringBuffer ret = new StringBuffer();
+        if (numChildren()==0) return head==null ? "{}" : head;
+        ret.append(head==null?"{ ":(head+":"+nl));
+        boolean first = true;
+        int len = 0;
+        for(T t : this) {
+            String s = t.basic() ? t.toString() : t.toPrettyString(nl+"  ");
+            if (!first) {
+                if (!t.basic())                ret.append(nl);
+                if (s.length()+len>MAXCHARS) { ret.append(nl); len = 0; }
+                else                         { ret.append(" "); len++; }
+            }
+            first = false;
+            ret.append(s);
+            len += s.length();
+        }
+        if (head==null) ret.append(" }");
+        return ret.toString();
+    }
 
     public String toString() {
         StringBuffer ret = new StringBuffer();