+ 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();
+ }
+