163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey/* 263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Copyright (C) 2012 The Android Open Source Project 363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * 463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * you may not use this file except in compliance with the License. 663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * You may obtain a copy of the License at 763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * 863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * 1063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Unless required by applicable law or agreed to in writing, software 1163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 1263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * See the License for the specific language governing permissions and 1463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * limitations under the License. 1563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey */ 1663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 1763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeypackage com.android.internal.util; 1863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 1963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport java.io.PrintWriter; 2063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport java.io.Writer; 2163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 2263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey/** 2363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Lightweight wrapper around {@link PrintWriter} that automatically indents 2463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * newlines based on internal state. Delays writing indent until first actual 2563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * write on a newline, enabling indent modification after newline. 2663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey */ 2763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeypublic class IndentingPrintWriter extends PrintWriter { 2863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private final String mIndent; 2963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 3063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private StringBuilder mBuilder = new StringBuilder(); 31cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown private char[] mCurrent; 3263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private boolean mEmptyLine = true; 3363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 3463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public IndentingPrintWriter(Writer writer, String indent) { 3563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey super(writer); 3663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mIndent = indent; 3763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 3863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 3963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public void increaseIndent() { 4063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mBuilder.append(mIndent); 41cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrent = null; 4263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 4363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 4463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public void decreaseIndent() { 4563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mBuilder.delete(0, mIndent.length()); 46cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrent = null; 4763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 4863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 492f036c55c0b72ac350e378c12b0571b22bc64dc1Jeff Sharkey public void printPair(String key, Object value) { 502f036c55c0b72ac350e378c12b0571b22bc64dc1Jeff Sharkey print(key + "=" + String.valueOf(value) + " "); 512f036c55c0b72ac350e378c12b0571b22bc64dc1Jeff Sharkey } 522f036c55c0b72ac350e378c12b0571b22bc64dc1Jeff Sharkey 5363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey @Override 54cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown public void write(char[] buf, int offset, int count) { 55cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown final int bufferEnd = offset + count; 56cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown int lineStart = offset; 57cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown int lineEnd = offset; 58cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown while (lineEnd < bufferEnd) { 59cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown char ch = buf[lineEnd++]; 60cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (ch == '\n') { 61cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown writeIndent(); 62cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown super.write(buf, lineStart, lineEnd - lineStart); 63cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown lineStart = lineEnd; 64cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mEmptyLine = true; 65cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 66cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 67cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown 68cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (lineStart != lineEnd) { 69cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown writeIndent(); 70cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown super.write(buf, lineStart, lineEnd - lineStart); 71cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 7263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 7363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 74cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown private void writeIndent() { 7563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (mEmptyLine) { 7663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mEmptyLine = false; 77cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (mBuilder.length() != 0) { 78cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (mCurrent == null) { 79cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrent = mBuilder.toString().toCharArray(); 80cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 81cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown super.write(mCurrent, 0, mCurrent.length); 82cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 8363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 8463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 8563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey} 86