IndentingPrintWriterpublic class IndentingPrintWriter extends PrintWriter Lightweight wrapper around {@link PrintWriter} that automatically indents
newlines based on internal state. It also automatically wraps long lines
based on given line length.
Delays writing indent until first actual write on a newline, enabling indent
modification after newline. |
Fields Summary |
---|
private final String | mSingleIndent | private final int | mWrapLength | private StringBuilder | mIndentBuilderMutable version of current indent | private char[] | mCurrentIndentCache of current {@link #mIndentBuilder} value | private int | mCurrentLengthLength of current line being built, excluding any indent | private boolean | mEmptyLineFlag indicating if we're currently sitting on an empty line, and that
next write should be prefixed with the current indent. |
Constructors Summary |
---|
public IndentingPrintWriter(Writer writer, String singleIndent)
this(writer, singleIndent, -1);
| public IndentingPrintWriter(Writer writer, String singleIndent, int wrapLength)
super(writer);
mSingleIndent = singleIndent;
mWrapLength = wrapLength;
|
Methods Summary |
---|
public void | decreaseIndent()
mIndentBuilder.delete(0, mSingleIndent.length());
mCurrentIndent = null;
| public void | increaseIndent()
mIndentBuilder.append(mSingleIndent);
mCurrentIndent = null;
| private void | maybeWriteIndent()
if (mEmptyLine) {
mEmptyLine = false;
if (mIndentBuilder.length() != 0) {
if (mCurrentIndent == null) {
mCurrentIndent = mIndentBuilder.toString().toCharArray();
}
super.write(mCurrentIndent, 0, mCurrentIndent.length);
}
}
| public void | printHexPair(java.lang.String key, int value)
print(key + "=0x" + Integer.toHexString(value) + " ");
| public void | printPair(java.lang.String key, java.lang.Object value)
print(key + "=" + String.valueOf(value) + " ");
| public void | write(char[] buf, int offset, int count)
final int indentLength = mIndentBuilder.length();
final int bufferEnd = offset + count;
int lineStart = offset;
int lineEnd = offset;
// March through incoming buffer looking for newlines
while (lineEnd < bufferEnd) {
char ch = buf[lineEnd++];
mCurrentLength++;
if (ch == '\n") {
maybeWriteIndent();
super.write(buf, lineStart, lineEnd - lineStart);
lineStart = lineEnd;
mEmptyLine = true;
mCurrentLength = 0;
}
// Wrap if we've pushed beyond line length
if (mWrapLength > 0 && mCurrentLength >= mWrapLength - indentLength) {
if (!mEmptyLine) {
// Give ourselves a fresh line to work with
super.write('\n");
mEmptyLine = true;
mCurrentLength = lineEnd - lineStart;
} else {
// We need more than a dedicated line, slice it hard
maybeWriteIndent();
super.write(buf, lineStart, lineEnd - lineStart);
super.write('\n");
mEmptyLine = true;
lineStart = lineEnd;
mCurrentLength = 0;
}
}
}
if (lineStart != lineEnd) {
maybeWriteIndent();
super.write(buf, lineStart, lineEnd - lineStart);
}
|
|