• Share this article:

Displaying the console in your RCP application

Thursday, October 19, 2006 - 09:06 by Wayne Beaton

This question has been asked on eclipse.newcomer a couple of times now, so I thought it might be worthwhile to put a response in the blogosphere.

How do I display the System.out console in a view in my Eclipse RCP application?

The answer has two parts. To start, you can redirect console output to an arbitrary PrintStream using System.setOut(somePrintStream);. The second part is that you need a useful PrintStream to write on.

It’s relatively easy to make a plug-in that does exactly what we need. Here’s how you construct the view.

package org.eclipse.console.ui.views;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;

public class LightweightConsoleView extends ViewPart {
private Text text;

public void createPartControl(Composite parent) {
text = new Text(parent, SWT.READ_ONLY | SWT.MULTI);
OutputStream out = new OutputStream() {
@Override
public void write(int b) throws IOException {
if (text.isDisposed()) return;
text.append(String.valueOf((char) b));
}
};
final PrintStream oldOut = System.out;
System.setOut(new PrintStream(out));
text.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
System.setOut(oldOut);
}
});
}

public void setFocus() {
text.setFocus();
}
}

You’ll notice that I’ve created a read-only Text to contain the output. Then I create an anonymous OutputStream that–when told to dump some bytes–appends output to the end of the Text; I wrap that OutputStream in a PrintStream, and we’re off to the races.

The one part that I’m not so comfortable with is making things right again after the console view closes. In this implementation, I remember where output used to be directed and reset it after the view closes. As long as this view is the only one that tries to mess with the console, this will work. As soon as another view tries, things will get a little spooky.