blob: 8e9e8b393b2beafbed84a995b77d3693f3f2c8d0 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dev.util;
import java.io.PrintWriter;
import java.util.Arrays;
/**
* An abstract base type to build TextOutput implementations.
*/
public abstract class AbstractTextOutput implements TextOutput {
private final boolean compact;
private int identLevel = 0;
private int indentGranularity = 2;
private char[][] indents = new char[][] {new char[0]};
private boolean justNewlined;
private PrintWriter out;
private int position = 0;
protected AbstractTextOutput(boolean compact) {
this.compact = compact;
}
public int getPosition() {
return position;
}
public void indentIn() {
++identLevel;
if (identLevel >= indents.length) {
// Cache a new level of indentation string.
//
char[] newIndentLevel = new char[identLevel * indentGranularity];
Arrays.fill(newIndentLevel, ' ');
char[][] newIndents = new char[indents.length + 1][];
System.arraycopy(indents, 0, newIndents, 0, indents.length);
newIndents[identLevel] = newIndentLevel;
indents = newIndents;
}
}
public void indentOut() {
--identLevel;
}
public void newline() {
if (compact) {
out.print('\n');
} else {
out.print('\n');
}
position++;
justNewlined = true;
}
public void newlineOpt() {
if (!compact) {
out.print('\n');
position++;
justNewlined = true;
}
}
public void print(char c) {
maybeIndent();
out.print(c);
position++;
justNewlined = false;
}
public void print(char[] s) {
maybeIndent();
printAndCount(s);
justNewlined = false;
}
public void print(String s) {
maybeIndent();
printAndCount(s.toCharArray());
justNewlined = false;
}
public void printOpt(char c) {
if (!compact) {
maybeIndent();
out.print(c);
position += 1;
}
}
public void printOpt(char[] s) {
if (!compact) {
maybeIndent();
printAndCount(s);
}
}
public void printOpt(String s) {
if (!compact) {
maybeIndent();
printAndCount(s.toCharArray());
}
}
protected void setPrintWriter(PrintWriter out) {
this.out = out;
}
private void maybeIndent() {
if (justNewlined && !compact) {
printAndCount(indents[identLevel]);
justNewlined = false;
}
}
private void printAndCount(char[] chars) {
position += chars.length;
out.print(chars);
}
}