/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.debug.ui.actions;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.ISuspendResume;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.actions.RetargetAction;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.contexts.DebugContextEvent;
import org.eclipse.debug.ui.contexts.IDebugContextListener;
import org.eclipse.debug.ui.contexts.IDebugContextService;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
/**
* @author Hussain Bohra
*/
public class RetargetSetNextAction extends RetargetAction {
private DebugContextListener fContextListener = new DebugContextListener();
private ISuspendResume fTargetElement = null;
class DebugContextListener implements IDebugContextListener {
protected void contextActivated(ISelection selection) {
fTargetElement = null;
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection) selection;
if (ss.size() == 1) {
fTargetElement = (ISuspendResume) DebugPlugin
.getAdapter(ss.getFirstElement(), ISuspendResume.class);
}
}
IAction action = getAction();
if (action != null) {
action.setEnabled(fTargetElement != null && hasTargetAdapter());
}
}
public void debugContextChanged(DebugContextEvent event) {
contextActivated(event.getContext());
}
}
@Override
protected boolean canPerformAction(Object target, ISelection selection, IWorkbenchPart part) {
return fTargetElement != null && ((ISetNextTarget) target).canSetNextToLine(part, selection, fTargetElement);
}
@Override
protected Class getAdapterClass() {
return ISetNextTarget.class;
}
@Override
protected String getOperationUnavailableMessage() {
// TODO Auto-generated method stub
return null;
}
@Override
protected void performAction(Object target, ISelection selection, IWorkbenchPart part) throws CoreException {
boolean result = ((ISetNextTarget) target).setNextToLine(part, selection, fTargetElement);
if (result == false) {
IStatus status = new Status(IStatus.WARNING, DebugUIPlugin.getUniqueIdentifier(),
"Unable to set the next statement to this location. The next statement cannot be set to another function/loop.");
DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), DebugUIPlugin.removeAccelerators("Set Next Statement"),
"Error", status);
}
}
/*
* (non-Javadoc)
// *
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
*/
public void dispose() {
DebugUITools.getDebugContextManager().getContextService(fWindow).removeDebugContextListener(fContextListener);
super.dispose();
}
/*
* (non-Javadoc)
*
* @seeorg.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.
* IWorkbenchWindow)
*/
public void init(IWorkbenchWindow window) {
super.init(window);
IDebugContextService service = DebugUITools.getDebugContextManager().getContextService(window);
service.addDebugContextListener(fContextListener);
ISelection activeContext = service.getActiveContext();
fContextListener.contextActivated(activeContext);
}
}