FileDocCategorySizeDatePackage
IndentingPrintWriter.javaAPI DocAndroid 5.1 API4427Thu Mar 12 22:22:10 GMT 2015com.android.internal.util

IndentingPrintWriter

public 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
mIndentBuilder
Mutable version of current indent
private char[]
mCurrentIndent
Cache of current {@link #mIndentBuilder} value
private int
mCurrentLength
Length of current line being built, excluding any indent
private boolean
mEmptyLine
Flag 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 voiddecreaseIndent()

        mIndentBuilder.delete(0, mSingleIndent.length());
        mCurrentIndent = null;
    
public voidincreaseIndent()

        mIndentBuilder.append(mSingleIndent);
        mCurrentIndent = null;
    
private voidmaybeWriteIndent()

        if (mEmptyLine) {
            mEmptyLine = false;
            if (mIndentBuilder.length() != 0) {
                if (mCurrentIndent == null) {
                    mCurrentIndent = mIndentBuilder.toString().toCharArray();
                }
                super.write(mCurrentIndent, 0, mCurrentIndent.length);
            }
        }
    
public voidprintHexPair(java.lang.String key, int value)

        print(key + "=0x" + Integer.toHexString(value) + " ");
    
public voidprintPair(java.lang.String key, java.lang.Object value)

        print(key + "=" + String.valueOf(value) + " ");
    
public voidwrite(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);
        }