/*=============================================================================#
# Copyright (c) 2000-2016 IBM Corporation 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:
# IBM Corporation - initial API and implementation
# Stephan Wahlbrink - adaptation to StatET
#=============================================================================*/
package de.walware.statet.nico.ui.console;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
import org.eclipse.debug.internal.ui.views.console.ConsoleMessages;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.ui.texteditor.IUpdate;
import de.walware.ecommons.ui.util.UIAccess;
import de.walware.statet.nico.internal.ui.Messages;
import de.walware.statet.nico.internal.ui.NicoUIPlugin;
import de.walware.statet.nico.ui.NicoUI;
import de.walware.statet.nico.ui.NicoUITools;
public class TerminateToolAction extends Action implements IUpdate {
private IProcess fProcess;
/**
* Creates a terminate action for the console
*/
public TerminateToolAction(final IProcess process) {
super(ConsoleMessages.ConsoleTerminateAction_0);
PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.CONSOLE_TERMINATE_ACTION);
fProcess = process;
setToolTipText(ConsoleMessages.ConsoleTerminateAction_1);
final ImageRegistry registry = NicoUIPlugin.getDefault().getImageRegistry();
setImageDescriptor(registry.getDescriptor(NicoUI.LOCTOOL_TERMINATE_IMAGE_ID));
setDisabledImageDescriptor(registry.getDescriptor(NicoUI.LOCTOOLD_TERMINATE_IMAGE_ID));
update();
}
@Override
public void update() {
setEnabled(fProcess.canTerminate());
}
@Override
public void run() {
try {
// killTargets(fProcess);
fProcess.terminate();
final IWorkbenchPage page = UIAccess.getActiveWorkbenchPage(false);
final IConsole console = DebugUITools.getConsole(fProcess);
if (console instanceof NIConsole) {
NicoUITools.showConsole((NIConsole) console, page, true);
}
} catch (final DebugException e) {
final int severity = e.getStatus().getSeverity();
StatusManager.getManager().handle(new Status(severity, NicoUI.PLUGIN_ID, -1, Messages.TerminateToolAction_error_message, e),
(severity >= IStatus.ERROR) ? StatusManager.LOG | StatusManager.SHOW : StatusManager.LOG);
}
}
private void killTargets(final IProcess process) throws DebugException {
final ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
final ILaunch[] launches = launchManager.getLaunches();
for (int i = 0; i < launches.length; i++) {
final ILaunch launch = launches[i];
final IProcess[] processes = launch.getProcesses();
for (int j = 0; j < processes.length; j++) {
final IProcess process2 = processes[j];
if (process2.equals(process)) {
final IDebugTarget[] debugTargets = launch.getDebugTargets();
for (int k = 0; k < debugTargets.length; k++) {
final IDebugTarget target = debugTargets[k];
if (target.canTerminate()) {
target.terminate();
}
}
return; // all possible targets have been terminated for the launch.
}
}
}
}
public void dispose() {
fProcess = null;
}
}