/******************************************************************************* * Copyright (c) 2014 Bruno Medeiros and other Contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.lang.ide.ui.tools.console; import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.source.ISharedTextColors; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.console.IOConsole; import melnorme.lang.ide.ui.tools.console.ToolsConsole.IOConsoleOutputStreamExt; import melnorme.util.swt.jface.text.ColorManager; public abstract class AbstractProcessMessageConsole extends IOConsole { public static class ProcessMessageConsole extends AbstractProcessMessageConsole { protected ProcessMessageConsole(String name, ImageDescriptor imageDescriptor) { super(name, imageDescriptor); postToUI_initOutputStreamColors(); } } public final IOConsoleOutputStreamExt stdOut; public final IOConsoleOutputStreamExt stdErr; public volatile boolean disposed; /** * Note: subclasse must call {@link #postToUI_initOutputStreamColors()} after all members * have been initialized. */ protected AbstractProcessMessageConsole(String name, ImageDescriptor imageDescriptor) { super(name, imageDescriptor); stdOut = new IOConsoleOutputStreamExt(newOutputStream()); stdErr = new IOConsoleOutputStreamExt(newOutputStream()); stdErr.console().setActivateOnWrite(true); } protected void postToUI_initOutputStreamColors() { // BM: it's not clear to me if a Color can be created outside UI thread, so do asyncExec // I would think one cant, but some Platform code (ProcessConsole) does freely create Color instances // on the UI thread, so maybe the asyncExec is not necessary. Display.getDefault().asyncExec(new Runnable() { @Override public void run() { ui_initStreamColors(); } }); } /** Initialize stream colors. This method is only called in the UI thread. */ protected void ui_initStreamColors() { assertTrue(disposed == false); } /** * Dispose this class, by running the actual disposing to the UI thread. */ @Override protected final void dispose() { // Disposing in UI thread is one way to solve certain concurrency issues arising with the use of this class. Display.getDefault().asyncExec(new Runnable() { @Override public void run() { disposed = true; disposeDo(); } }); } protected void disposeDo() { assertTrue(Display.getCurrent() != null); super.dispose(); // run actual dispose code } protected ISharedTextColors getColorManager() { return ColorManager.getDefault(); } }