package com.github.jknack.antlr4ide.ui.console; import com.google.common.base.Objects; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.debug.ui.console.ConsoleColorProvider; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.console.IOConsole; import org.eclipse.ui.console.IOConsoleOutputStream; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.spi.LoggingEvent; /** * Creates and prints to Eclipse ConsoleView. * Unfortunately it cannot be added as an appender in a * log4j.properties file. * It is added programatically in * com.github.jknack.antlr4ide.ui.Antlr4UiModule.configure() * to the logger defined in antlr4ide.core */ public class DefaultConsole extends AppenderSkeleton { @Override protected void append(LoggingEvent logEvent) { final String message = logEvent.getRenderedMessage(); final Level level = logEvent.getLevel(); final String streamId = getStreamId(level); final Display display = Display.getDefault(); final Thread thread = display.getThread(); Thread _currentThread = Thread.currentThread(); final boolean uiThread = Objects.equal(thread, _currentThread); final Runnable _function = new Runnable() { @Override public void run() { try { final IOConsole console = AntlrConsoleFactory.getConsole(); final IOConsoleOutputStream stream = console .newOutputStream(); final ConsoleColorProvider colorProvider = new ConsoleColorProvider(); final Color color = colorProvider.getColor(streamId); stream.setColor(color); stream.setActivateOnWrite(true); stream.write((message + "\n")); stream.close(); } catch (Throwable ex) { ex.printStackTrace(); } } }; final Runnable printTask = _function; if (uiThread) { printTask.run(); } else { display.syncExec(printTask); } } /** * streamId is used for selecting the color of the * ConsoleView */ private String getStreamId(Level level) { if (level == Level.FATAL || level == Level.ERROR || level == Level.WARN) { return IDebugUIConstants.ID_STANDARD_ERROR_STREAM; } return IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM; } @Override public void close() { } @Override public boolean requiresLayout() { return false; } }