blob: 1931c1ba98068f4337e2603c232711e6a8d46e7b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.builds.ui.console;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.builds.core.IBuild;
import org.eclipse.mylyn.builds.core.IBuildPlan;
import org.eclipse.mylyn.builds.internal.core.operations.OperationChangeEvent;
import org.eclipse.mylyn.builds.internal.core.operations.OperationChangeListener;
import org.eclipse.mylyn.builds.internal.core.operations.RefreshOperation;
import org.eclipse.mylyn.internal.builds.ui.BuildsUiInternal;
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.eclipse.ui.console.MessageConsole;
/**
* @author Steffen Pingel
*/
public class BuildConsoleManager {
private final Map<IBuild, BuildConsole> consoleByBuild;
private final IConsoleManager consoleManager;
private final IConsoleListener listener = new IConsoleListener() {
public void consolesAdded(IConsole[] consoles) {
// ignore
}
public void consolesRemoved(IConsole[] consoles) {
for (IConsole console : consoles) {
if (BuildConsole.CONSOLE_TYPE.equals(console.getType())) {
Object build = ((MessageConsole) console).getAttribute(BuildConsole.ATTRIBUTE_BUILD);
if (build instanceof IBuild) {
disposeConsole((IBuild) build);
}
}
}
}
};
public BuildConsoleManager() {
consoleByBuild = new HashMap<IBuild, BuildConsole>();
consoleManager = ConsolePlugin.getDefault().getConsoleManager();
consoleManager.addConsoleListener(listener);
}
protected void disposeConsole(IBuild build) {
BuildConsole console = consoleByBuild.get(build);
if (console != null) {
console.close();
consoleByBuild.remove(build);
}
}
public BuildConsole showConsole(IBuild build) {
Assert.isNotNull(build);
BuildConsole console = consoleByBuild.get(build);
if (console == null) {
console = new BuildConsole(consoleManager, BuildsUiInternal.getModel(), build);
consoleByBuild.put(build, console);
}
console.show();
return console;
}
public void showConsole(final IBuildPlan plan) {
if (plan.getLastBuild() != null) {
showConsole(plan.getLastBuild());
} else {
RefreshOperation operation = BuildsUiInternal.getFactory().getRefreshOperation(plan);
operation.addOperationChangeListener(new OperationChangeListener() {
@Override
public void done(OperationChangeEvent event) {
event.getOperation().getService().getRealm().asyncExec(new Runnable() {
public void run() {
if (plan.getLastBuild() != null) {
showConsole(plan.getLastBuild());
}
}
});
}
});
operation.execute();
}
}
public void stop() {
consoleManager.removeConsoleListener(listener);
}
}