|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.schema2beansdev.gen;
import java.util.*;
import java.io.*;
public class IndentingWriter extends GenBuffer {
protected boolean crDone[];
protected int indentLevel[];
protected String indentString = "\t";
public IndentingWriter(int bufferCount) {
super(bufferCount);
crDone = new boolean[bufferCount];
indentLevel = new int[bufferCount];
privateInit();
}
public IndentingWriter(IndentingWriter source) {
super(source);
indentString = source.indentString;
crDone = new boolean[bufferCount];
indentLevel = new int[bufferCount];
for (int i = 0; i < bufferCount; i++) {
crDone[i] = source.crDone[i];
indentLevel[i] = source.indentLevel[i];
}
}
public void reset() {
super.reset();
privateInit();
}
private void privateInit() {
for (int i = 0; i < bufferCount; i++) {
crDone[i] = true;
indentLevel[i] = 0;
}
}
public void writeTo(GenBuffer o) {
super.writeTo(o);
if (o instanceof IndentingWriter) {
IndentingWriter out = (IndentingWriter) o;
int minInCommonBufferCount = bufferCount;
if (out.bufferCount < bufferCount)
minInCommonBufferCount = out.bufferCount;
for (int i = 0; i < minInCommonBufferCount; i++) {
out.crDone[i] = crDone[i];
out.indentLevel[i] = indentLevel[i];
}
}
}
/**
* Insert some additional buffers.
* Previous buffers are not adjusted automatically.
* select() should be called afterwards to reestablish current buffer.
*/
public void insertAdditionalBuffers(int offset, int count) {
boolean[] newCrDone = new boolean[bufferCount + count];
// copy before and including offset
System.arraycopy(crDone, 0, newCrDone, 0, offset+1);
// copy after offset
System.arraycopy(crDone, offset+1, newCrDone,
offset + 1 + count, bufferCount - offset - 1);
// init the new elements
for (int i = 0; i < count; ++i) {
newCrDone[offset + 1 + i] = true;
}
crDone = newCrDone;
int[] newIndentLevel = new int[bufferCount + count];
// copy before and including offset
System.arraycopy(indentLevel, 0, newIndentLevel, 0, offset+1);
// copy after offset
System.arraycopy(indentLevel, offset+1, newIndentLevel,
offset + 1 + count, bufferCount - offset - 1);
// init the new elements
for (int i = 0; i < count; ++i) {
newIndentLevel[offset + 1 + i] = 0;
}
indentLevel = newIndentLevel;
super.insertAdditionalBuffers(offset, count);
}
public void setIndent(String indent) {
this.indentString = indent;
}
public String getIndent() {
return indentString;
}
public void cr() throws IOException {
listOut[curOut].append("\n");
crDone[curOut] = true;
}
public void write(String str) throws IOException {
int len = str.length();
if (len == 0)
return;
char lastChar = str.charAt(len-1);
if (lastChar == '\n') {
char firstChar = str.charAt(0);
char secondLastChar = (len <= 1) ? ' ' : str.charAt(len-2);
if (firstChar == '}' || secondLastChar == '}') {
indentLeft();
}
super.write(str.substring(0, len-1));
cr();
if (secondLastChar == '{') {
indentRight();
}
} else {
super.write(str);
}
}
public void writecr(String str) throws IOException {
super.write(str);
cr();
}
public void writecr(String s1, String s2) throws IOException {
super.write(s1, s2);
cr();
}
public void writecr(String s1, String s2, String s3) throws IOException {
super.write(s1, s2, s3);
cr();
}
public void writecr(String s1, String s2, String s3, String s4) throws IOException {
super.write(s1, s2, s3, s4);
cr();
}
public void indentRight() {
++indentLevel[curOut];
}
public void indentLeft() {
--indentLevel[curOut];
}
protected void beforeWriteHook() {
if (crDone[curOut]) {
indent();
crDone[curOut] = false;
}
}
/**
* Adds the indentString to the current buffer.
*/
public void indentOneLevel() {
listOut[curOut].append(indentString);
}
/**
* Adds indentLevel[curOut] number of indentString's to the current
* buffer. Put another way, this will indent from the left margin to
* the current indention level.
*/
public void indent() {
// This must not call a write as beforeWriteHook calls us
for (int i = 0; i < indentLevel[curOut]; ++i)
indentOneLevel();
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.