/*******************************************************************************
* Copyright (c) 2012 VMWare, Inc.
* 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:
* VMWare, Inc. - initial API and implementation
*******************************************************************************/
package org.grails.ide.eclipse.ui.console;
import java.util.Iterator;
import java.util.LinkedList;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IOConsole;
import org.eclipse.ui.console.IOConsoleInputStream;
import org.eclipse.ui.console.IOConsoleOutputStream;
import org.grails.ide.eclipse.longrunning.Console;
import org.grails.ide.eclipse.longrunning.ConsoleProvider;
import org.grails.ide.eclipse.longrunning.GrailsProcessManager;
import org.grails.ide.eclipse.longrunning.client.GrailsCommandExecution;
import org.grails.ide.eclipse.ui.GrailsUiActivator;
/**
* Provides outputStreams that can be used by non-ui plugins to write stuff into a console view (this assuming that
* you somehow inject an instance of this class into the core plugin.
* <p>
* See {@link GrailsUiActivator} for the code that injects this instance into {@link GrailsProcessManager} in GrailsCore plugin.
*
* @since 2.6
* @author Kris De Volder
*/
@SuppressWarnings("restriction")
public class GrailsUIConsoleProvider extends ConsoleProvider {
/**
* Maximum number of old consoles to keep open. If this number is exceeded the oldest console will
* be removed from the UI.
*/
private static final int MAX_SIZE = 5;
public static Color getOutputColor() {
return DebugUIPlugin.getPreferenceColor(IDebugPreferenceConstants.CONSOLE_SYS_OUT_COLOR);
}
public static Color getErrorColor() {
return DebugUIPlugin.getPreferenceColor(IDebugPreferenceConstants.CONSOLE_SYS_ERR_COLOR);
}
public static Color getInputColor() {
return DebugUIPlugin.getPreferenceColor(IDebugPreferenceConstants.CONSOLE_SYS_IN_COLOR);
}
private LinkedList<GrailsIOConsole> history = new LinkedList<GrailsIOConsole>();
@Override
public Console getConsole(String title, GrailsCommandExecution execution) {
final GrailsIOConsole console = new GrailsIOConsole(title, execution);
final IOConsoleInputStream in = console.getInputStream();
final IOConsoleOutputStream out = console.newOutputStream();
final IOConsoleOutputStream err = console.newOutputStream();
in.setColor(getInputColor());
out.setColor(getOutputColor());
err.setColor(getErrorColor());
add(console);
Console coreConsole = Console.make(in, out, err);
return coreConsole;
}
private void add(GrailsIOConsole console) {
history.addLast(console);
if (history.size()>MAX_SIZE) {
close(history.removeFirst());
}
console.activate();
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{ console });
}
private void close(IOConsole console) {
ConsolePlugin.getDefault().getConsoleManager().removeConsoles(new IConsole[] {console});
}
@Override
public void removeAllTerminated() {
for (Iterator<GrailsIOConsole> iterator = history.iterator(); iterator.hasNext();) {
GrailsIOConsole console = iterator.next();
if (console.isTerminated()) {
iterator.remove();
close(console);
}
}
}
}