package aima.gui.fx.framework;
import java.io.IOException;
import java.io.PrintStream;
import javafx.application.Platform;
import javafx.scene.control.TextArea;
/**
* Controller class which provides functionality to use a text area as view for
* log messages and text console applications.
*
* @author Ruediger Lunde
*/
public class MessagePaneCtrl {
protected TextArea textArea;
public MessagePaneCtrl(TextArea textArea) {
this.textArea = textArea;
}
/** Removes the text from the text area. */
public void clear() {
textArea.setText("");
}
/** Prints a log message on the text area. */
public void log(final String message) {
if (Platform.isFxApplicationThread()) {
append(message);
} else {
try {
Platform.runLater(() -> append(message));
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void append(String text) {
textArea.appendText(text);
if (textArea.getLength() > 0)
textArea.selectRange(textArea.getLength() - 1, textArea.getLength());
}
/**
* Provides a print stream which can be used to redirect standard output
* streams.
*/
public PrintStream getPrintStream() {
return new PrintStream(new TextAreaOutputStream());
}
// ///////////////////////////////////////////////////////////////
// nested classes
/** Writes everything into the text area. */
private class TextAreaOutputStream extends java.io.OutputStream {
StringBuffer buffer = new StringBuffer();
String eol = System.getProperty("line.separator");
@Override
public void write(int b) throws java.io.IOException {
buffer.append(new char[] { (char) b });
if (buffer.toString().contains(eol)) {
writeBuffer();
}
}
private void writeBuffer() {
if (Platform.isFxApplicationThread())
append(buffer.toString());
else {
final String str = buffer.toString();
Platform.runLater(() -> append(str));
}
buffer = new StringBuffer();
}
@Override
public void flush() throws IOException {
writeBuffer();
super.flush();
}
}
}