import java.util.*;
import java.lang.reflect.*;
-public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T>, ToJava {
+public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T>, ToJava /*, ToHTML*/ {
protected abstract String headToString();
protected abstract String headToJava();
+ protected abstract String left();
+ protected abstract String right();
+ protected abstract boolean ignoreSingleton();
- private boolean empty() {
- for(T t : this) return false;
- return true;
- }
+ private static final int MAXCHARS=40;
- 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;
+ private boolean basic() { return toString().length() < MAXCHARS; }
+ public String toPrettyString() { return toPrettyString("\n"); }
+ public StringBuffer toPrettyString(StringBuffer sb) { sb.append(this); return sb; }
+ private String toPrettyString(String nl) {
+ String str = toString();
+ if (str.length() < MAXCHARS) return str;
+ String head = headToString();
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;
- }
+ Iterator<T> iterator = iterator();
+ if (!iterator.hasNext()) return head==null ? (left()+right()) : head;
+ PrintableTree t0 = iterator.next();
+ if (!iterator.hasNext() && ignoreSingleton())
+ return t0.toPrettyString(nl);
+ ret.append(head==null?(left()+" "):(head+":"+nl));
+ boolean first = true;
+ int len = 0;
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 ");
+ 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);
- 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;
- */
+ len += s.length();
}
+ if (head==null) ret.append(" "+right());
return ret.toString();
}
+ private String cached = null;
public String toString() {
+ if (cached!=null) return cached;
StringBuffer ret = new StringBuffer();
+ int count=0;
for(T t : this) {
+ count++;
String q = t==null ? "null" : t.toString();
if (q.length() > 0) { ret.append(q); ret.append(" "); }
}
+ if (count==1 && ignoreSingleton()) { return cached = ret.toString().trim(); }
String tail = ret.toString().trim();
String head = headToString();
String h = (head!=null && !head.toString().equals("")) ? (tail.length() > 0 ? head+":" : head+"") : "";
- if (tail.length() > 0) tail = "{" + tail + "}";
- return h + tail;
+ if (tail.length() > 0) tail = left() + tail + right();
+ return cached = h + tail;
}
/** append Java code to <tt>sb</tt> which evaluates to this instance */
public void toJava(StringBuffer sb) {
sb.append("new "+this.getClass().getName()+"(null, ");
String head = headToJava();
- sb.append(head==null ? "null" : "\"" + head + "\"");
+ sb.append(head);
sb.append(", new "+this.getClass().getName()+"[] { ");
boolean first = true;
for(T t : this) {