blob: 015dc3a7ff155a3e1a4aa9dc17fce8067de06ac3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 SSI Schaefer IT Solutions GmbH and others.
* 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:
* SSI Schaefer IT Solutions GmbH
*******************************************************************************/
package org.eclipse.tea.core.ui;
import java.io.PrintStream;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tea.core.internal.TimeHelper;
import org.eclipse.tea.core.internal.config.CoreConfig;
import org.eclipse.tea.core.internal.config.TaskingDevelopmentConfig;
import org.eclipse.tea.core.services.TaskingLog;
import org.eclipse.tea.core.services.TaskingLog.TaskingLogQualifier;
import org.eclipse.tea.core.ui.config.TaskingConsoleConfig;
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;
import org.osgi.service.component.annotations.Component;
/**
* Console access for WAMAS IDE plug-ins. The console offers 4 streams in
* different colors for printing messages.
* <p>
* If this class is used outside the IDE, all output goes to {@code System.out}
* or {@code System.err}.
*/
@Component(service = TaskingLog.class)
@TaskingLogQualifier(headless = false)
public class TaskingConsole extends TaskingLog {
private static final String TASKING_CONSOLE = "Tasking Console";
private static final ImageDescriptor TEA_ICON = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
"resources/tea.png");
public PrintStream outInfo;
public PrintStream outStd;
public PrintStream outWrn;
public PrintStream outErr;
private MessageConsole myConsole;
private MessageConsoleStream sInfo, sStd, sWrn, sErr;
private CoreConfig cfg;
@TaskingLogInit
public void init(TaskingConsoleConfig config, TaskingDevelopmentConfig devConfig, CoreConfig coreCfg) {
this.cfg = coreCfg;
setShowDebug(devConfig.showDebugLogs);
Display.getDefault().syncExec(() -> {
boolean update = myConsole != null;
myConsole = findConsole(TASKING_CONSOLE);
if (cfg.useAccessibleMode) {
myConsole.setConsoleWidth(80);
} else {
myConsole.setConsoleWidth(0);
}
if (!update) {
// only on initial setup
sInfo = myConsole.newMessageStream();
sStd = myConsole.newMessageStream();
sWrn = myConsole.newMessageStream();
sErr = myConsole.newMessageStream();
outInfo = new PrintStream(sInfo);
outStd = new PrintStream(sStd);
outWrn = new PrintStream(sWrn);
outErr = new PrintStream(sErr);
myConsole.activate();
}
if (config.useColors) {
if (config.useDarkColors) {
sInfo.setColor(new Color(null, 164, 164, 164));
sStd.setColor(new Color(null, 255, 255, 255));
sWrn.setColor(new Color(null, 255, 190, 50));
sErr.setColor(new Color(null, 255, 100, 100));
} else {
sInfo.setColor(new Color(null, 164, 164, 164));
sStd.setColor(new Color(null, 32, 32, 32));
sWrn.setColor(new Color(null, 255, 190, 0));
sErr.setColor(new Color(null, 255, 0, 0));
}
} else {
sInfo.setColor(null);
sStd.setColor(null);
sWrn.setColor(null);
sErr.setColor(null);
}
});
}
/**
* Flushes all output streams.
*/
public void flush() {
outInfo.flush();
outStd.flush();
outWrn.flush();
outErr.flush();
}
@Override
protected void finalize() throws Throwable {
close(sInfo);
close(sStd);
close(sWrn);
close(sErr);
super.finalize();
}
private static void close(MessageConsoleStream s) {
try {
if (s != null && !s.isClosed()) {
s.close();
}
} catch (Exception e) {
// ignore it
}
}
/**
* Find a console for writing out messages. Reuse an existing one or create
* a new one.
*
* @param name
* name of the console
* @return a MessageConsole; null if we are outside the IDE
*/
private static MessageConsole findConsole(String name) {
try {
ConsolePlugin plugin = ConsolePlugin.getDefault();
IConsoleManager conMan = plugin.getConsoleManager();
IConsole[] existing = conMan.getConsoles();
for (IConsole ic : existing) {
if (name.equals(ic.getName())) {
return (MessageConsole) ic;
}
}
// no console found, so create a new one
MessageConsole myConsole = new MessageConsole(name, TEA_ICON);
// test the console
MessageConsoleStream stream = myConsole.newMessageStream();
try {
conMan.addConsoles(new IConsole[] { myConsole });
} finally {
if (!stream.isClosed()) {
stream.close();
}
}
return myConsole;
} catch (Exception ex) {
throw new RuntimeException("cannot create console", ex);
}
}
@Override
public PrintStream debug() {
return outInfo;
}
@Override
public PrintStream info() {
return outStd;
}
@Override
public PrintStream warn() {
return outWrn;
}
@Override
public PrintStream error() {
return outErr;
}
@Override
public String formatMessage(String msg) {
if (cfg == null || !cfg.useAccessibleMode) {
return super.formatMessage(msg);
}
return TimeHelper.getFormattedCurrentTime() + "\n" + msg;
}
}