blob: 18adbdaa8c3471ab37b8a9dad5ba49ba1452cf07 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2007, 2017 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.nico.ui.util;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.statet.ecommons.ts.core.Tool;
import org.eclipse.statet.ecommons.ts.core.ToolRunnable;
import org.eclipse.statet.ecommons.ts.core.ToolService;
import org.eclipse.statet.ecommons.ui.util.UIAccess;
import org.eclipse.statet.internal.nico.ui.Messages;
import org.eclipse.statet.nico.core.runtime.IConsoleService;
import org.eclipse.statet.nico.core.runtime.IRemoteEngineController;
import org.eclipse.statet.nico.core.runtime.IToolEventHandler;
import org.eclipse.statet.nico.core.runtime.ToolController;
import org.eclipse.statet.nico.core.runtime.ToolProcess;
import org.eclipse.statet.nico.ui.NicoUI;
/**
* @see IToolEventHandler#SCHEDULE_QUIT_EVENT_ID
*/
public class QuitHandler implements IToolEventHandler {
private static class UIRunnable implements Runnable {
private ToolController fController;
private String fDialogTitle;
private String fDialogMessage;
private String[] fDialogOptions;
private volatile int fResult;
@Override
public void run() {
final IWorkbenchWindow window = UIAccess.getActiveWorkbenchWindow(true);
final MessageDialog dialog = new MessageDialog(window.getShell(), fDialogTitle, null,
fDialogMessage, MessageDialog.QUESTION, fDialogOptions, 0 );
fResult = dialog.open();
if (fResult == 1) {
try {
window.run(true, true, new IRunnableWithProgress() {
@Override
public void run(final IProgressMonitor monitor) throws InvocationTargetException {
try {
fController.kill(monitor);
} catch (final CoreException e) {
throw new InvocationTargetException(e);
}
}
});
}
catch (final InvocationTargetException e) {
StatusManager.getManager().handle(new Status(IStatus.ERROR, NicoUI.BUNDLE_ID, -1,
Messages.TerminatingMonitor_Force_error_message, e.getTargetException()),
StatusManager.LOG | StatusManager.SHOW);
}
catch (final InterruptedException e) {
}
}
}
}
@Override
public IStatus execute(final String id, final ToolService service, final Map<String, Object> data,
final IProgressMonitor monitor) {
final IConsoleService console = (IConsoleService) service;
if (PlatformUI.getWorkbench().isClosing()) {
final ToolController controller = console.getController();
if (controller != null) {
if (console.getTool().isProvidingFeatureSet(IRemoteEngineController.FEATURE_SET_ID)) {
try {
((IRemoteEngineController) controller).disconnect(monitor);
return Status.CANCEL_STATUS;
}
catch (final CoreException e) {}
}
try {
controller.kill(monitor);
return Status.CANCEL_STATUS;
}
catch (final CoreException e) {}
}
return Status.CANCEL_STATUS;
}
final ToolRunnable[] quitRunnables = (ToolRunnable[]) data.get("scheduledQuitTasks");
if (quitRunnables.length == 0) {
return Status.OK_STATUS; // run default = schedule quit
}
final UIRunnable runner = new UIRunnable();
runner.fController = console.getController();
final ToolProcess process = runner.fController.getTool();
runner.fDialogTitle = NLS.bind(Messages.TerminatingMonitor_title, process.getLabel(Tool.DEFAULT_LABEL));
runner.fDialogMessage = NLS.bind(Messages.TerminatingMonitor_message, process.getLabel(Tool.LONG_LABEL));
runner.fDialogOptions = new String[] {
Messages.TerminatingMonitor_WaitButton_label,
Messages.TerminatingMonitor_ForceButton_label,
Messages.TerminatingMonitor_CancelButton_label
};
UIAccess.getDisplay().syncExec(runner);
if (runner.fResult == 2) {
runner.fController.cancelQuit();
}
return Status.CANCEL_STATUS; // do nothing
}
}