/*******************************************************************************
* 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.utils;
import static melnorme.utilbox.core.CoreUtil.array;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.MessageConsole;
import melnorme.utilbox.core.fntypes.SimpleGetter;
public class ConsoleUtils {
/** Finds an existing {@link MessageConsole} with given name.
* If it doesn't exist, create a new one. */
public static MessageConsole findOrCreateMessageConsole(String name) {
MessageConsole console = findConsole(name, MessageConsole.class);
if(console != null) {
return console;
}
// no console, so create a new one
MessageConsole msgConsole = new MessageConsole(name, null);
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { msgConsole });
return msgConsole;
}
public static <T extends IConsole> T findConsole(String name, Class<T> klass) {
IConsoleManager consoleMgr = ConsolePlugin.getDefault().getConsoleManager();
IConsole[] existing = consoleMgr.getConsoles();
for (IConsole console : existing) {
if (name.equals(console.getName()) && klass.isAssignableFrom(console.getClass())) {
return klass.cast(console);
}
}
return null;
}
/** Create a new {@link MessageConsole}.
* If an existing console already exists, remove it before adding a new one.
*/
public static MessageConsole recreateMessageConsole(String name, ImageDescriptor imageDescriptor) {
MessageConsole console = findConsole(name, MessageConsole.class);
if(console != null) {
ConsolePlugin.getDefault().getConsoleManager().removeConsoles(array(console));
}
// create a new one
MessageConsole msgConsole = new MessageConsole(name, imageDescriptor);
ConsolePlugin.getDefault().getConsoleManager().addConsoles(array(msgConsole));
return msgConsole;
}
/* ----------------- ----------------- */
public static <T extends IConsole> T getOrCreateToolsConsole(String name, boolean clearConsole,
Class<T> klass, SimpleGetter<T> consoleCreator) {
T console = findConsole(name, klass);
if(console != null) {
if(clearConsole) {
// In order to clear a console, we recreate it.
// This is to avoid using console.clearConsole() , because of poor concurrency behavior:
// if more than one cleanConsole is requested per a console lifetime,
// these aditional clears may appear out of order with regards
// to input written to the console output streams.
// since org.eclipse.ui.console_3.5.200.v20130514-0954
ConsolePlugin.getDefault().getConsoleManager().removeConsoles(array(console));
console = null;
} else {
return console;
}
}
// create a new one
console = consoleCreator.get();
ConsolePlugin.getDefault().getConsoleManager().addConsoles(array(console));
return console;
}
}