| // Copyright 2017 The Bazel Authors. All rights reserved. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| package com.google.devtools.bazel.e4b; | |
| import com.google.devtools.bazel.e4b.command.CommandConsole; | |
| import com.google.devtools.bazel.e4b.command.CommandConsole.CommandConsoleFactory; | |
| import java.io.IOException; | |
| import java.io.OutputStream; | |
| import org.eclipse.swt.graphics.Color; | |
| import org.eclipse.swt.widgets.Display; | |
| 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 org.eclipse.ui.console.MessageConsoleStream; | |
| /** Implementation of {@link CommandConsoleFactory} using Eclipse's console */ | |
| class CommandConsoleFactoryImpl implements CommandConsoleFactory { | |
| private static class CommandConsoleImpl implements CommandConsole { | |
| private MessageConsole console; | |
| CommandConsoleImpl(MessageConsole console) { | |
| this.console = console; | |
| } | |
| @Override | |
| public OutputStream createOutputStream() { | |
| return console.newMessageStream(); | |
| } | |
| @Override | |
| public OutputStream createErrorStream() { | |
| // Get the error stream for the given console (a stream that print in red). | |
| final MessageConsoleStream errorStream = console.newMessageStream(); | |
| Display display = Display.getCurrent(); | |
| if (display == null) { | |
| display = Display.getDefault(); | |
| } | |
| display.asyncExec(() -> errorStream.setColor(new Color(null, 255, 0, 0))); | |
| return errorStream; | |
| } | |
| } | |
| @Override | |
| public CommandConsole get(String name, String title) throws IOException { | |
| MessageConsole console = findConsole(name); | |
| MessageConsoleStream stream = console.newMessageStream(); | |
| stream.setActivateOnWrite(true); | |
| stream.write("*** " + title + " ***\n"); | |
| return new CommandConsoleImpl(console); | |
| } | |
| // Taken from the eclipse website, find a console | |
| private static MessageConsole findConsole(String name) { | |
| ConsolePlugin plugin = ConsolePlugin.getDefault(); | |
| IConsoleManager conMan = plugin.getConsoleManager(); | |
| IConsole[] existing = conMan.getConsoles(); | |
| for (int i = 0; i < existing.length; i++) { | |
| if (name.equals(existing[i].getName())) { | |
| return (MessageConsole) existing[i]; | |
| } | |
| } | |
| // no console found, so create a new one | |
| MessageConsole myConsole = new MessageConsole(name, null); | |
| conMan.addConsoles(new IConsole[] {myConsole}); | |
| return myConsole; | |
| } | |
| } |