/*******************************************************************************
* Copyright (c) 2006, 2012 Wind River Systems 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:
* Wind River Systems - initial API and implementation
* Marc Khouzam (Ericsson) - Added support for multi-selection (Bug 330974)
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.ui.actions;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Immutable;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.debug.service.IMultiRunControl;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.debug.core.commands.IDebugCommandRequest;
import org.eclipse.debug.core.commands.IEnabledStateRequest;
import org.eclipse.debug.core.commands.ISuspendHandler;
/**
*
* @since 1.0
*/
@Immutable
public class DsfSuspendCommand implements ISuspendHandler {
private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker;
public DsfSuspendCommand(DsfSession session) {
fExecutor = session.getExecutor();
fTracker = new DsfServicesTracker(DsfUIPlugin.getBundleContext(), session.getId());
}
public void dispose() {
fTracker.dispose();
}
@Override
public void canExecute(final IEnabledStateRequest request) {
if (request.getElements().length == 1) {
canExecuteSingle(request);
return;
}
// Handle multi-selection
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements(), request) {
@Override public void doExecute() {
final IMultiRunControl multiRun = fTracker.getService(IMultiRunControl.class);
if (multiRun == null) {
// No multi run control service: multi selection not allowed
request.setEnabled(false);
request.done();
return;
}
// Check if some of the selections can be suspended
multiRun.canSuspendSome(
getContexts(),
new ImmediateDataRequestMonitor<Boolean>() {
@Override
protected void handleCompleted() {
request.setEnabled(isSuccess() && getData());
request.done();
}
});
}
});
}
private void canExecuteSingle(final IEnabledStateRequest request) {
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getRunControl().canSuspend(
getContext(),
new ImmediateDataRequestMonitor<Boolean>() {
@Override
protected void handleCompleted() {
request.setEnabled(isSuccess() && getData());
request.done();
}
});
}
});
}
@Override
public boolean execute(final IDebugCommandRequest request) {
if (request.getElements().length == 1) {
executeSingle(request);
return false;
}
// Handle multi-selection
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements(), request) {
@Override public void doExecute() {
final IMultiRunControl multiRun = fTracker.getService(IMultiRunControl.class);
if (multiRun == null) {
// No multi run control service: multi selection not allowed
request.done();
return;
}
multiRun.suspend(getContexts(), new ImmediateRequestMonitor());
}
});
return false;
}
private void executeSingle(IDebugCommandRequest request) {
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getRunControl().suspend(getContext(), new RequestMonitor(fExecutor, null));
}
});
}
}