blob: 07af808f176524957cafccbbccb5c6b4f494c267 [file] [log] [blame]
package org.eclipse.ptp.debug.internal.ui.actions;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.model.ISuspendResume;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IActionDelegate2;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
/**
* @author clement
*
*/
public class ResumeAtLineActionDelegate implements IEditorActionDelegate, IViewActionDelegate, IActionDelegate2 {
private IWorkbenchPart fActivePart = null;
private IResumeAtLineTarget fPartTarget = null;
private IAction fAction = null;
private ISelectionListener fSelectionListener = new DebugSelectionListener();
protected ISuspendResume fTargetElement = null;
class DebugSelectionListener implements ISelectionListener {
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
fTargetElement = null;
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection)selection;
if (ss.size() == 1) {
Object object = ss.getFirstElement();
if (object instanceof ISuspendResume) {
fTargetElement = (ISuspendResume)object;
}
}
}
update();
}
}
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
init(action);
bindTo(targetEditor);
}
public void init(IAction action) {
this.fAction = action;
if (action != null) {
action.setText(ActionMessages.getString("ResumeAtLineActionDelegate.0"));
}
}
public void dispose() {
fActivePart.getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, fSelectionListener);
fActivePart = null;
fPartTarget = null;
}
public void runWithEvent(IAction action, Event event) {
run(action);
}
public void run(IAction action) {
if (fPartTarget != null && fTargetElement != null) {
try {
fPartTarget.resumeAtLine(fActivePart, fActivePart.getSite().getSelectionProvider().getSelection(), fTargetElement);
}
catch(CoreException e) {
ErrorDialog.openError(fActivePart.getSite().getWorkbenchWindow().getShell(), ActionMessages.getString("ResumeAtLineActionDelegate.1"), ActionMessages.getString("ResumeAtLineActionDelegate.2"), e.getStatus()); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
public void selectionChanged(IAction action, ISelection selection) {
this.fAction = action;
update();
}
protected void update() {
if (fAction == null) {
return;
}
boolean enabled = false;
if (fPartTarget != null && fTargetElement != null) {
IWorkbenchPartSite site = fActivePart.getSite();
if (site != null) {
ISelectionProvider selectionProvider = site.getSelectionProvider();
if (selectionProvider != null) {
ISelection selection = selectionProvider.getSelection();
enabled = fTargetElement.isSuspended() && fPartTarget.canResumeAtLine(fActivePart, selection, fTargetElement);
}
}
}
fAction.setEnabled(enabled);
}
public void init(IViewPart view) {
bindTo(view);
}
private void bindTo(IWorkbenchPart part) {
fActivePart = part;
if (part != null) {
part.getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, fSelectionListener);
fPartTarget = (IResumeAtLineTarget)part.getAdapter(IResumeAtLineTarget.class);
if (fPartTarget == null) {
IAdapterManager adapterManager = Platform.getAdapterManager();
// TODO: we could restrict loading to cases when the debugging context is on
if (adapterManager.hasAdapter(part, IResumeAtLineTarget.class.getName())) {
fPartTarget = (IResumeAtLineTarget)adapterManager.loadAdapter(part, IResumeAtLineTarget.class.getName());
}
}
// Force the selection update
ISelection selection = part.getSite().getWorkbenchWindow().getSelectionService().getSelection(IDebugUIConstants.ID_DEBUG_VIEW);
fSelectionListener.selectionChanged(part, selection);
}
update();
}
}