package NET.worlds.scape; import java.io.OutputStream; import java.io.PrintStream; public class IndentStream extends PrintStream { private boolean _atstart = true; private int _indent = 0; public IndentStream(OutputStream os) { super(os); } public IndentStream(OutputStream os, boolean flush) { super(os, flush); } public void indent(int step) { this._indent += step; } public void indent() { this.indent(2); } public void undent(int step) { if (this._indent >= step) { this._indent -= step; } else { this._indent = 0; } } public void undent() { this.undent(2); } public int curIndent() { return this._indent; } private void startLine() { for (int i = 0; i < this._indent; i++) { super.write(32); } this._atstart = false; } @Override public void write(int b) { if (b == 10) { this._atstart = true; } else if (this._atstart) { this.startLine(); } super.write(b); } @Override public void write(byte[] b, int off, int len) { while (len > 0) { int firstlen = 0; while (firstlen < len && b[off + firstlen] != 10) { firstlen++; } if (firstlen > 0) { if (this._atstart) { this.startLine(); } super.write(b, off, firstlen); off += firstlen; len -= firstlen; this._atstart = false; firstlen = 0; } while (firstlen < len && b[off + firstlen] == 10) { firstlen++; } if (firstlen > 0) { super.write(b, off, firstlen); off += firstlen; len -= firstlen; this._atstart = true; } } } }