/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.ivyde.internal.eclipse.ui.console;
public class ConsoleDocument {
private int[] lineTypes;
private String[] lines;
private int writeIndex = 0;
private int readIndex = 0;
private static final int BUFFER_SIZE = 200;
protected static class ConsoleLine {
private String line;
private int type;
ConsoleLine(String line, int type) {
this.line = line;
this.type = type;
}
public String getLine() {
return line;
}
public int getType() {
return type;
}
}
/**
* Creates an empty console document.
*/
public ConsoleDocument() {
// nothing to initialize
}
/**
* Clears the console document.
*/
public void clear() {
lineTypes = null;
lines = null;
writeIndex = 0;
readIndex = 0;
}
/**
* Appends a line of the specified type to the end of the console.
*/
public void appendConsoleLine(int type, String line) {
if (lines == null) {
lines = new String[BUFFER_SIZE];
lineTypes = new int[BUFFER_SIZE];
}
lines[writeIndex] = line; //$NON-NLS-1$
lineTypes[writeIndex] = type;
if (++writeIndex >= BUFFER_SIZE) {
writeIndex = 0;
}
if (writeIndex == readIndex) {
if (++readIndex >= BUFFER_SIZE) {
readIndex = 0;
}
}
}
public ConsoleLine[] getLines() {
if (isEmpty()) {
return new ConsoleLine[0];
}
ConsoleLine[] docLines = new ConsoleLine[readIndex > writeIndex ? BUFFER_SIZE : writeIndex];
int index = readIndex;
for (int i = 0; i < docLines.length; i++) {
docLines[i] = new ConsoleLine(lines[index], lineTypes[index]);
if (++index >= BUFFER_SIZE) {
index = 0;
}
}
return docLines;
}
public boolean isEmpty() {
return writeIndex == readIndex;
}
}