package org.erlide.ui.console;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleListener;
import org.eclipse.ui.console.IConsoleManager;
import org.erlide.backend.BackendCore;
import org.erlide.backend.api.BackendData;
import org.erlide.backend.api.IBackend;
import org.erlide.backend.api.IBackendListener;
import org.erlide.util.ErlLogger;
import org.erlide.util.IDisposable;
import com.google.common.collect.Maps;
public class ErlConsoleManager
implements IDisposable, IBackendListener, IConsoleListener {
private final Map<IBackend, IErlangConsole> consoles;
private final Map<IErlangConsole, IErlangConsolePage> pages;
private final IConsoleManager conMan;
private static final String CONSOLE_VIEW_ID = "org.eclipse.ui.console.ConsoleView";
public ErlConsoleManager() {
consoles = Maps.newHashMap();
pages = Maps.newHashMap();
final ConsolePlugin consolePlugin = ConsolePlugin.getDefault();
conMan = consolePlugin.getConsoleManager();
BackendCore.getBackendManager().addBackendListener(this);
}
@Override
public void runtimeAdded(final IBackend b) {
if (b == null) {
return;
}
final BackendData data = b.getData();
if (!data.hasConsole()) {
return;
}
ErlLogger.debug("console ADDED to " + data);
final ErlangConsole console = new ErlangConsole(b);
conMan.addConsoles(new IConsole[] { console });
consoles.put(b, console);
}
@Override
public void runtimeRemoved(final IBackend b) {
ErlLogger.debug("console REMOVED from " + b.getName());
final IConsole console = consoles.get(b);
if (console == null) {
return;
}
conMan.removeConsoles(new IConsole[] { console });
}
public void addPage(final IErlangConsole console, final IErlangConsolePage page) {
pages.put(console, page);
}
public void removePage(final IErlangConsole console) {
pages.remove(console);
}
public IErlangConsolePage getPage(final IErlangConsole console) {
return pages.get(console);
}
public IErlangConsole getConsole(final IBackend backend) {
return consoles.get(backend);
}
@Override
public void dispose() {
BackendCore.getBackendManager().removeBackendListener(this);
}
@Override
public void moduleLoaded(final IBackend backend, final IProject project,
final String moduleName) {
}
@Override
public void consolesAdded(final IConsole[] cons) {
boolean erl = false;
for (final IConsole con : cons) {
if (con instanceof IErlangConsole) {
erl = true;
break;
}
}
if (erl) {
final IWorkbench workbench = PlatformUI.getWorkbench();
final IWorkbenchWindow activeWorkbenchWindow = workbench
.getActiveWorkbenchWindow();
if (activeWorkbenchWindow != null) {
final IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
try {
activePage.showView(CONSOLE_VIEW_ID);
} catch (final PartInitException e) {
// ignore
}
}
}
}
@Override
public void consolesRemoved(final IConsole[] cons) {
}
}