checkpoint
[sbp.git] / src / edu / berkeley / sbp / util / PrintableTree.java
index a50aff9..c805cab 100644 (file)
@@ -1,16 +1,79 @@
-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.*;
 
 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 {
 
     protected abstract String headToString();
     protected abstract String headToJava();    
 
 
     protected abstract String headToString();
     protected abstract String headToJava();    
 
+    private boolean empty() {
+        for(T t : this) return false;
+        return true;
+    }
+
+    private static final int MAXDEPTH=3;
+    public int depth() {
+        int depth = headToString()==null ? 0 : 1;
+        int ret = depth;
+        for(T t : this) ret = Math.max(ret, depth+t.depth());
+        return ret;
+    }
+    public String toString(int indent0, int cur, int limit) {
+        int indent = indent0;
+        String s = toString();
+        if (depth()<MAXDEPTH && s.length() < limit-cur) return s;
+        StringBuffer ret = new StringBuffer();
+
+        if (cur>indent) {
+            ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
+            cur = indent;
+        }
+        
+        String head = headToString();
+        if (head==null) {
+            ret.append("{");
+        } else {
+            ret.append(head);
+            if (empty()) return ret.toString();
+            ret.append(":");
+            indent += 2;
+            ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
+            cur = indent;
+        }
+
+        for(T t : this) {
+            s = t.toString(indent+2, cur, limit);
+            while(s.indexOf('\n') != -1) {
+                ret.append(s.substring(0, s.indexOf('\n')));
+                s = s.substring(s.indexOf('\n')+1);
+                if (s.length() > 0) ret.append("\n  ");
+            }
+            ret.append(s);
+            if (s.indexOf('\n')!=-1)
+                cur = s.length()-s.lastIndexOf('\n');
+            else
+                cur += s.length();
+            if (cur>indent) {
+                ret.append(' ');
+                cur += s.length()+1;
+            }
+        }
+        if (head==null) {
+            ret.append("}");
+        } else if (cur>indent) {
+            /*
+            indent = indent0;
+            ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
+            cur = indent;
+            */
+        }
+        return ret.toString();
+    }
+
     public String toString() {
         StringBuffer ret = new StringBuffer();
         for(T t : this) {
     public String toString() {
         StringBuffer ret = new StringBuffer();
         for(T t : this) {