fixed tibdoc
[sbp.git] / src / edu / berkeley / sbp / util / PrintableTree.java
1 package edu.berkeley.sbp.util;
2 import edu.berkeley.sbp.*;
3 import edu.berkeley.sbp.util.*;
4 import java.io.*;
5 import java.util.*;
6 import java.lang.reflect.*;
7
8 public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T>, ToJava /*, ToHTML*/ {
9
10     protected abstract String headToString();
11     protected abstract String headToJava();    
12     protected abstract String left();
13     protected abstract String right();
14     protected abstract boolean ignoreSingleton();
15
16     private static final int MAXCHARS=40;
17
18     private boolean basic() { return toString().length() < MAXCHARS; }
19     public String toPrettyString() { return toPrettyString("\n"); }
20     public StringBuffer toPrettyString(StringBuffer sb) { sb.append(this); return sb; }
21     private String toPrettyString(String nl) {
22         String str = toString();
23         if (str.length() < MAXCHARS) return str;
24         String head = headToString();
25         StringBuffer ret = new StringBuffer();
26
27         Iterator<T> iterator = iterator();
28         if (!iterator.hasNext()) return head==null ? (left()+right()) : head;
29         PrintableTree t0 = iterator.next();
30         if (!iterator.hasNext() && ignoreSingleton())
31             return t0.toPrettyString(nl);
32
33         ret.append(head==null?(left()+" "):(head+":"+nl));
34         boolean first = true;
35         int len = 0;
36         for(T t : this) {
37             String s = t.basic() ? t.toString() : t.toPrettyString(nl+"  ");
38             if (!first) {
39                 if (!t.basic())                ret.append(nl);
40                 if (s.length()+len>MAXCHARS) { ret.append(nl); len = 0; }
41                 else                         { ret.append(" "); len++; }
42             }
43             first = false;
44             ret.append(s);
45             len += s.length();
46         }
47         if (head==null) ret.append(" "+right());
48         return ret.toString();
49     }
50
51     private String cached = null;
52     public String toString() {
53         if (cached!=null) return cached;
54         StringBuffer ret = new StringBuffer();
55         int count=0;
56         for(T t : this) {
57             count++;
58             String q = t==null ? "null" : t.toString();
59             if (q.length() > 0) { ret.append(q); ret.append(" "); }
60         }
61         if (count==1 && ignoreSingleton()) { return cached = ret.toString().trim(); }
62         String tail = ret.toString().trim();
63         String head = headToString();
64         String h = (head!=null && !head.toString().equals("")) ? (tail.length() > 0 ? head+":" : head+"") : "";
65         if (tail.length() > 0) tail = left() + tail + right();
66         return cached = h + tail;
67     }
68
69     /** append Java code to <tt>sb</tt> which evaluates to this instance */
70     public void toJava(StringBuffer sb) {
71         sb.append("new "+this.getClass().getName()+"(null, ");
72         String head = headToJava();
73         sb.append(head==null ? "null" : "\"" + head + "\"");
74         sb.append(", new "+this.getClass().getName()+"[] { ");
75         boolean first = true;
76         for(T t : this) {
77             if (!first) sb.append(",\n        ");
78             if (t==null)   sb.append("null");
79             else           t.toJava(sb);
80             first = false;
81         }
82         sb.append("})");
83     }
84
85 }