/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.tools.internal.ui.console; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; 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; import tern.eclipse.ide.tools.internal.ui.TernToolsUIMessages; import tern.eclipse.ide.ui.ImageResource; import tern.eclipse.ide.ui.console.ITernConsole; import tern.eclipse.ide.ui.console.LineType; /** * Tern repository console. * */ public class TernRepositoryConsole extends MessageConsole implements ITernConsole { private static TernRepositoryConsole INSTANCE; private boolean showOnMessage; private IConsoleManager consoleManager; private final ConsoleDocument document; private boolean visible = false; private MessageConsoleStream[] streams = new MessageConsoleStream[LineType .values().length]; private boolean initialized; public TernRepositoryConsole() { super(TernToolsUIMessages.TernRepository_name, ImageResource .getImageDescriptor(ImageResource.IMG_LOGO)); consoleManager = ConsolePlugin.getDefault().getConsoleManager(); document = new ConsoleDocument(); } protected void init() { // Called when console is added to the console view super.init(); // Ensure that initialization occurs in the ui thread Display.getDefault().asyncExec(new Runnable() { public void run() { initializeStreams(); dump(); } }); } private void initializeStreams() { synchronized (document) { if (!initialized) { for (int i = 0; i < streams.length; i++) { streams[i] = newMessageStream(); } // install colors for (int i = 0; i < LineType.values().length; i++) { initializeStream(LineType.values()[i]); } initialized = true; } } } private void initializeStream(LineType lineType) { Color color = createColor(Display.getDefault(), lineType); streams[lineType.ordinal()].setColor(color); } /** * Returns a color instance based on data from a preference field. */ private Color createColor(Display display, LineType lineType) { RGB rgb = getRGB(lineType); return new Color(display, rgb); } public RGB getRGB(LineType lineType) { switch (lineType) { case PROCESS_INFO: return new RGB(0, 108, 54); case PROCESS_ERROR: return new RGB(255, 0, 0); default: return new RGB(0, 64, 128); } } private void dump() { synchronized (document) { visible = true; ConsoleDocument.ConsoleLine[] lines = document.getLines(); for (int i = 0; i < lines.length; i++) { ConsoleDocument.ConsoleLine line = lines[i]; doAppendLine(line.getType(), line.getLine()); } document.clear(); } } @Override public void doAppendLine(final LineType lineType, final String line) { Job appendJob = new Job( TernToolsUIMessages.TernRepositoryConsoleJob_name) { @Override protected IStatus run(IProgressMonitor monitor) { internalDoAppendLine(lineType, line); return Status.OK_STATUS; } }; appendJob.setPriority(Job.LONG); appendJob.schedule(); } private void internalDoAppendLine(LineType lineType, String line) { showConsole(); synchronized (document) { if (visible) { streams[lineType.ordinal()].println(line); } else { document.appendConsoleLine(lineType, line); } } } private void showConsole() { show(false); } @Override protected void dispose() { // Here we can't call super.dispose() because we actually want the // partitioner to remain // connected, but we won't show lines until the console is added to the // console manager // again. // Called when console is removed from the console view synchronized (document) { visible = false; } } /** * Show the console. * * @param showNoMatterWhat * ignore preferences if <code>true</code> */ public void show(boolean showNoMatterWhat) { // showOnMessage = true; if (showNoMatterWhat || showOnMessage) { if (!visible) { TernRepositoryConsoleHelper.showConsole(this); } else { consoleManager.showConsoleView(this); } } } /** * Used to notify this console of lifecycle methods <code>init()</code> and * <code>dispose()</code>. */ public class MyLifecycle implements org.eclipse.ui.console.IConsoleListener { public void consolesAdded(IConsole[] consoles) { for (int i = 0; i < consoles.length; i++) { IConsole console = consoles[i]; if (console == TernRepositoryConsole.this) { init(); } } } public void consolesRemoved(IConsole[] consoles) { for (int i = 0; i < consoles.length; i++) { IConsole console = consoles[i]; if (console == TernRepositoryConsole.this) { ConsolePlugin.getDefault().getConsoleManager() .removeConsoleListener(this); dispose(); } } } } public static TernRepositoryConsole getConsole() { if (INSTANCE == null) { INSTANCE = new TernRepositoryConsole(); } return INSTANCE; } }