blob: 8a16940188088b841591bb78829be2f3c694ac03 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 The Regents of the University of California.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, 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
*
* LA-CC 04-115
*******************************************************************************/
package org.eclipse.ptp.debug.ui.views;
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.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.internal.ui.viewers.model.InternalTreeModelViewer;
import org.eclipse.debug.ui.AbstractDebugView;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ptp.core.elements.IPJob;
import org.eclipse.ptp.core.elements.IPProcess;
import org.eclipse.ptp.core.elements.attributes.ProcessAttributes;
import org.eclipse.ptp.core.util.BitList;
import org.eclipse.ptp.debug.core.IPSession;
import org.eclipse.ptp.debug.core.model.IPDebugElement;
import org.eclipse.ptp.debug.core.model.IPDebugTarget;
import org.eclipse.ptp.debug.internal.ui.UIDebugManager;
import org.eclipse.ptp.debug.internal.ui.actions.RegisterAction;
import org.eclipse.ptp.debug.internal.ui.actions.ResumeAction;
import org.eclipse.ptp.debug.internal.ui.actions.StepIntoAction;
import org.eclipse.ptp.debug.internal.ui.actions.StepOverAction;
import org.eclipse.ptp.debug.internal.ui.actions.StepReturnAction;
import org.eclipse.ptp.debug.internal.ui.actions.SuspendAction;
import org.eclipse.ptp.debug.internal.ui.actions.TerminateAction;
import org.eclipse.ptp.debug.internal.ui.actions.UnregisterAction;
import org.eclipse.ptp.debug.internal.ui.views.AbstractPDebugViewEventHandler;
import org.eclipse.ptp.debug.ui.IPTPDebugUIConstants;
import org.eclipse.ptp.debug.ui.PTPDebugUIPlugin;
import org.eclipse.ptp.ui.IManager;
import org.eclipse.ptp.ui.actions.ParallelAction;
import org.eclipse.ptp.ui.model.IElement;
import org.eclipse.ptp.ui.model.IElementHandler;
import org.eclipse.ptp.ui.model.IElementSet;
import org.eclipse.ptp.ui.views.IIconCanvasActionListener;
import org.eclipse.ptp.ui.views.ParallelJobsView;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.progress.WorkbenchJob;
/**
* @author clement chu
*
*/
public class ParallelDebugView extends ParallelJobsView {
// actions
protected ParallelAction resumeAction = null;
protected ParallelAction suspendAction = null;
protected ParallelAction terminateAction = null;
protected ParallelAction stepIntoAction = null;
protected ParallelAction stepOverAction = null;
protected ParallelAction stepReturnAction = null;
protected ParallelAction registerAction = null;
protected ParallelAction unregisterAction = null;
protected AbstractPDebugViewEventHandler fEventHandler = null;
protected Viewer launchViewer = null;
protected ISelectionChangedListener debugViewSelectChangedListener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (!selection.isEmpty()) {
if (selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection)selection).getFirstElement();
if (element instanceof IPDebugElement) {
if (canvas != null && !canvas.isDisposed()) {
if (getCurrentSet() != null) {
int index = getCurrentSet().findIndexByName(String.valueOf(((IPDebugElement)element).getID()));
if (index > -1) {
canvas.unselectAllElements();
canvas.selectElement(index);
canvas.setCurrentSelection(false);
refresh(false);
}
}
}
}
}
}
}
};
/*
private MouseAdapter debugViewMouseAdapter = new MouseAdapter() {
public void mouseUp(MouseEvent event) {
Object test = event.getSource();
if (test instanceof Tree) {
TreeItem[] items = ((Tree)test).getSelection();
Object[] targets = new Object[items.length];
for (int i=0; i<items.length; i++) {
targets[i] = items[i].getData();
}
selectElements(targets);
}
}
};
*/
public ParallelDebugView(IManager manager) {
super(manager);
}
public ParallelDebugView() {
this(PTPDebugUIPlugin.getUIDebugManager());
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#dispose()
*/
public void dispose() {
Viewer viewer = getDebugViewer();
if (viewer != null)
viewer.removeSelectionChangedListener(debugViewSelectChangedListener);
if (getEventHandler() != null)
getEventHandler().dispose();
super.dispose();
}
/**
* @return
*/
protected Viewer getDebugViewer() {
if (launchViewer == null) {
IWorkbenchPage page = getViewSite().getPage();
if (page == null)
return null;
IViewPart part = page.findView(IDebugUIConstants.ID_DEBUG_VIEW);
if (part == null) {
if (page == null)
return null;
try {
part = page.showView(IDebugUIConstants.ID_DEBUG_VIEW);
} catch (PartInitException e) {
return null;
}
}
if (part != null && part instanceof AbstractDebugView) {
launchViewer = ((AbstractDebugView)part).getViewer();
if (launchViewer != null)
launchViewer.addSelectionChangedListener(debugViewSelectChangedListener);
}
}
return launchViewer;
}
/*
* FIXME does not work if create a new set. Currently we can task id to identify icon, but viewer is using order
private void selectElements(final Object[] objects) {
SafeRunnable.run(new SafeRunnable() {
public void run() {
if (!canvas.isDisposed()) {
canvas.unselectAllElements();
for (int i=0; i<objects.length; i++) {
Object obj = objects[i];
int id = ((UIDebugManager) manager).getSelectedRegisteredTasks(obj);
if (id > -1) {
if (!canvas.isSelected(id))
canvas.selectElement(id);
}
}
canvas.redraw();
canvas.setCurrentSelection(false);
}
}
});
}
*/
/**
* Sets the event handler for this view
*
* @param eventHandler event handler
*/
protected void setEventHandler(AbstractPDebugViewEventHandler eventHandler) {
this.fEventHandler = eventHandler;
}
/**
* Returns the event handler for this view
*
* @return The event handler for this view
*/
protected AbstractPDebugViewEventHandler getEventHandler() {
return this.fEventHandler;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.ParallelJobView#createView(org.eclipse.swt.widgets.Composite)
*/
public void createView(Composite parent) {
super.createView(parent);
setEventHandler(new ParallelDebugViewEventHandler(this));
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelSetView#fillContextMenu(org.eclipse.jface.action.IMenuManager)
*/
protected void fillContextMenu(IMenuManager manager) {
super.fillContextMenu(manager);
manager.add(new Separator(IPTPDebugUIConstants.THREAD_GROUP));
manager.add(new Separator(IPTPDebugUIConstants.STEP_GROUP));
manager.add(new GroupMarker(IPTPDebugUIConstants.STEP_INTO_GROUP));
manager.add(new GroupMarker(IPTPDebugUIConstants.STEP_OVER_GROUP));
manager.add(new GroupMarker(IPTPDebugUIConstants.STEP_RETURN_GROUP));
manager.add(new GroupMarker(IPTPDebugUIConstants.EMPTY_STEP_GROUP));
manager.add(new Separator(IPTPDebugUIConstants.REG_GROUP));
manager.appendToGroup(IPTPDebugUIConstants.THREAD_GROUP, resumeAction);
manager.appendToGroup(IPTPDebugUIConstants.THREAD_GROUP, suspendAction);
manager.appendToGroup(IPTPDebugUIConstants.THREAD_GROUP, terminateAction);
manager.appendToGroup(IPTPDebugUIConstants.STEP_INTO_GROUP, stepIntoAction);
manager.appendToGroup(IPTPDebugUIConstants.STEP_OVER_GROUP, stepOverAction);
manager.appendToGroup(IPTPDebugUIConstants.EMPTY_STEP_GROUP, stepReturnAction);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelSetView#createToolBarActionGroup(org.eclipse.jface.action.IToolBarManager)
*/
protected void createToolBarActionGroup(IToolBarManager toolBarMgr) {
toolBarMgr.add(new Separator(IPTPDebugUIConstants.THREAD_GROUP));
toolBarMgr.add(new Separator(IPTPDebugUIConstants.STEP_GROUP));
toolBarMgr.add(new GroupMarker(IPTPDebugUIConstants.STEP_INTO_GROUP));
toolBarMgr.add(new GroupMarker(IPTPDebugUIConstants.STEP_OVER_GROUP));
toolBarMgr.add(new GroupMarker(IPTPDebugUIConstants.STEP_RETURN_GROUP));
toolBarMgr.add(new GroupMarker(IPTPDebugUIConstants.EMPTY_STEP_GROUP));
toolBarMgr.add(new Separator(IPTPDebugUIConstants.REG_GROUP));
super.createToolBarActionGroup(toolBarMgr);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelSetView#createToolBarActions(org.eclipse.jface.action.IToolBarManager)
*/
protected void createToolBarActions(IToolBarManager toolBarMgr) {
resumeAction = new ResumeAction(this);
suspendAction = new SuspendAction(this);
terminateAction = new TerminateAction(this);
stepIntoAction = new StepIntoAction(this);
stepOverAction = new StepOverAction(this);
stepReturnAction = new StepReturnAction(this);
registerAction = new RegisterAction(this);
unregisterAction = new UnregisterAction(this);
toolBarMgr.appendToGroup(IPTPDebugUIConstants.THREAD_GROUP, resumeAction);
toolBarMgr.appendToGroup(IPTPDebugUIConstants.THREAD_GROUP, suspendAction);
toolBarMgr.appendToGroup(IPTPDebugUIConstants.THREAD_GROUP, terminateAction);
toolBarMgr.appendToGroup(IPTPDebugUIConstants.STEP_INTO_GROUP, stepIntoAction);
toolBarMgr.appendToGroup(IPTPDebugUIConstants.STEP_OVER_GROUP, stepOverAction);
toolBarMgr.appendToGroup(IPTPDebugUIConstants.STEP_RETURN_GROUP, stepReturnAction);
toolBarMgr.appendToGroup(IPTPDebugUIConstants.REG_GROUP, registerAction);
toolBarMgr.appendToGroup(IPTPDebugUIConstants.REG_GROUP, unregisterAction);
super.buildInToolBarActions(toolBarMgr);
//createOrientationActions();
}
/** Create orientation actions
*
*/
protected void createOrientationActions() {
IActionBars actionBars = getViewSite().getActionBars();
IMenuManager viewMenu = actionBars.getMenuManager();
viewMenu.add(new Separator());
}
/*******************************************************************************************************************************************************************************************************************************************************************************************************
* IIconCanvasActionListener
******************************************************************************************************************************************************************************************************************************************************************************************************/
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.IIconCanvasActionListener#handleAction(int, int)
*/
public void handleAction(int type, int index) {
IElement element = canvas.getElement(index);
if (type == IIconCanvasActionListener.DOUBLE_CLICK_ACTION) {
doubleClick(element);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#doubleClick(org.eclipse.ptp.ui.model.IElement)
*/
public void doubleClick(IElement element) {
try {
registerElement(element);
} catch (CoreException e) {
PTPDebugUIPlugin.errorDialog(getViewSite().getShell(), "Error", e.getStatus());
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#getToolTipText(java.lang.Object)
*/
public String[] getToolTipText(Object obj) {
if (obj == null)
return new String[] {"", ""};
String[] header = super.getToolTipText(obj);
String variableText = ((UIDebugManager) manager).getValueText(new Integer(((IPProcess)obj).getProcessIndex()).intValue(), this);
if (variableText != null && variableText.length() > 0) {
return new String[] { header[0], variableText };
}
return header;
}
/** Register element
* @param element
* @throws CoreException
*/
public void registerElement(IElement element) throws CoreException {
if (element.isRegistered())
((UIDebugManager) manager).unregisterElements(new IElement[] { element });
else
((UIDebugManager) manager).registerElements(new IElement[] { element });
}
/** Register selected elements
* @throws CoreException
*/
public void registerSelectedElements() throws CoreException {
if (cur_element_set != null) {
((UIDebugManager) manager).registerElements(canvas.getSelectedElements());
}
}
/** Unregister selected elements
* @throws CoreException
*/
public void unregisterSelectedElements() throws CoreException {
if (cur_element_set != null) {
((UIDebugManager) manager).unregisterElements(canvas.getSelectedElements());
}
}
// Update button
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelSetView#updateAction()
*/
public void updateAction() {
super.updateAction();
IPJob job = ((UIDebugManager) manager).findJobById(getCurrentID());
boolean isDebugMode = ((UIDebugManager) manager).isDebugMode(job);
boolean isRunning = ((UIDebugManager) manager).isRunning(job);
registerAction.setEnabled(isRunning && isDebugMode);
unregisterAction.setEnabled(isRunning && isDebugMode);
suspendAction.setEnabled(isRunning && isDebugMode);
terminateAction.setEnabled(isRunning);
if (isRunning && isDebugMode) {
IElementHandler elementHandler = getCurrentElementHandler();
if (elementHandler != null) {
updateDebugButtons(job);
}
} else {
resumeAction.setEnabled(false);
stepIntoAction.setEnabled(false);
stepOverAction.setEnabled(false);
stepReturnAction.setEnabled(false);
suspendAction.setEnabled(false);
}
}
/**
* Update debug button
*/
public void updateDebugButtons(IPJob job) {
IPSession session = ((UIDebugManager) manager).getDebugSession(job);
if (session == null)
return;
IElementSet set = getCurrentSet();
if (set == null)
return;
BitList terminatedTasks = session.getPDISession().getTaskManager().getTerminatedTasks();
BitList suspendedTasks = session.getPDISession().getTaskManager().getSuspendedTasks();
BitList stepReturnTasks = session.getPDISession().getTaskManager().getCanStepReturnTasks();
if (terminatedTasks == null || suspendedTasks == null || stepReturnTasks == null)
return;
int setSize = set.size();
int totalTerminatedSize = 0;
int totalSuspendedSize = 0;
int totalStepReturnSize = 0;
if (set.isRootSet()) {
totalTerminatedSize = terminatedTasks.cardinality();
totalSuspendedSize = suspendedTasks.isEmpty() ? 0 : suspendedTasks.cardinality();
totalStepReturnSize = stepReturnTasks.isEmpty() ? 0 : stepReturnTasks.cardinality();
}
else {
try {
BitList setTasks = ((UIDebugManager) manager).getTasks(set.getID());
if (setTasks == null)
return;
setSize = setTasks.cardinality();
BitList setTerminatedTasks = session.getPDISession().getTaskManager().getTerminatedTasks(setTasks.copy());
totalTerminatedSize = setTerminatedTasks.cardinality();
// size equals: the set contains all terminated processes
if (setSize != totalTerminatedSize) {
BitList setSuspendedTasks = session.getPDISession().getTaskManager().getSuspendedTasks(setTasks.copy());
totalSuspendedSize = setSuspendedTasks.cardinality();
BitList setCanStepReturnTasks = session.getPDISession().getTaskManager().getCanStepReturnTasks(setTasks.copy());
totalStepReturnSize = setCanStepReturnTasks.cardinality();
}
} catch (CoreException e) {
PTPDebugUIPlugin.log(e);
}
}
//System.err.println("Set size: " + setSize + ", T: " + totalTerminatedSize + ", S: "+ totalSuspendedSize + ", Return: " + totalStepReturnSize);
boolean enabledTerminatedButton = (setSize != totalTerminatedSize);
terminateAction.setEnabled(enabledTerminatedButton);
if (enabledTerminatedButton) {// not all processes terminated
resumeAction.setEnabled(totalSuspendedSize > 0);
boolean enableStepButtons = (setSize == totalSuspendedSize + totalTerminatedSize);
stepIntoAction.setEnabled(enableStepButtons);
stepOverAction.setEnabled(enableStepButtons);
suspendAction.setEnabled(!enableStepButtons);
stepReturnAction.setEnabled(enableStepButtons && totalStepReturnSize > 0);
} else {// all process terminated
resumeAction.setEnabled(false);
stepIntoAction.setEnabled(false);
stepOverAction.setEnabled(false);
stepReturnAction.setEnabled(false);
suspendAction.setEnabled(false);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
super.selectionChanged(event);
ISelection selection = event.getSelection();
if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
IStructuredSelection structSelection = (IStructuredSelection)selection;
if (structSelection.size() == 1 && structSelection.getFirstElement() instanceof IElement) {
IElement element = (IElement)structSelection.getFirstElement();
if (element.isRegistered()) {
try {
focusOnDebugTarget(getJobManager().getJob(), Integer.parseInt(element.getName()));
} catch (NumberFormatException e) {
// The element name had better be the process number
}
}
}
}
}
/*
public void drawSpecial(Object obj, GC gc, int x_loc, int y_loc, int width, int height) {
super.drawSpecial(obj, gc, x_loc, y_loc, width, height);
if (cur_element_set != null && obj instanceof DebugElement) {
DebugElement element = (DebugElement)obj;
switch(element.getType()) {
case DebugElement.VALUE_DIFF:
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_BLUE));
gc.drawLine(x_loc, y_loc, x_loc+width, y_loc+height);
gc.drawLine(x_loc, y_loc+height, x_loc+width, y_loc);
break;
}
}
}
*/
/******************************************************
* focus on debug target on debug view
******************************************************/
private IDebugElement getDebugElement(IPJob job, int task_id) {
IPSession session = ((UIDebugManager)manager).getDebugSession(job);
if (session != null) {
return session.getLaunch().getDebugTarget(task_id);
/*
IPDebugTarget debugTarget = session.getLaunch().getDebugTarget(task_id);
if (debugTarget != null) {
try {
IThread[] threads = debugTarget.getThreads();
for (int i=0; i<threads.length; i++) {
IStackFrame frame = threads[i].getTopStackFrame();
if (frame != null)
return frame;
}
if (threads.length > 0) {
return threads[0];
}
}
catch (DebugException e) {
return debugTarget;
}
return debugTarget;
}
*/
}
return null;
}
public void focusOnDebugTarget(final IPJob job, final int task_id) {
WorkbenchJob wjob = new WorkbenchJob("Focusing on debug element...") {
public IStatus runInUIThread(IProgressMonitor monitor) {
Viewer viewer = getDebugViewer();
if (viewer != null) {
ISelection selection = viewer.getSelection();
//ISelection selection = getViewSite().getPage().getSelection(IDebugUIConstants.ID_DEBUG_VIEW);
if (selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection)selection).getFirstElement();
if (element instanceof IPDebugElement) {
if (((IPDebugElement)element).getID() != task_id) {
//FIXME: only work if all elements are collapse
//((TreeViewer)viewer).collapseAll();
IDebugElement focusElement = getDebugElement(job, task_id);
if (focusElement == null) {
//do nothing if cannot find debug target
return Status.CANCEL_STATUS;
}
selectOnViewer(viewer, (IPDebugElement)focusElement);
// set focus element to selected element
element = focusElement;
}
}
else {
IDebugElement focusElement = getDebugElement(job, task_id);
if (focusElement == null) {
//do nothing if cannot find debug target
return Status.CANCEL_STATUS;
}
selectOnViewer(viewer, (IDebugElement)focusElement);
// set focus element to selected element
element = focusElement;
}
if (element instanceof IStackFrame) {
//do nothing if selected element is stack frame
return Status.CANCEL_STATUS;
}
if (element instanceof IThread) {
//expand thread this thread
expandOnViewer(viewer, (IThread)element);
return Status.OK_STATUS;
}
if (element instanceof IDebugTarget) {
//expand debug target this thread
expandOnViewer(viewer, (IDebugTarget)element);
return Status.OK_STATUS;
}
//if (!((TreeViewer)viewer).getExpandedState(element)) {
//((TreeViewer)viewer).setExpandedState(element, true);
//}
}
//viewer.setSelection(new StructuredSelection(focusElement), true);
//viewer.setSelection(new StructuredSelection(focusElement.getDebugTarget()), true);
//((TreeViewer)viewer).expandAll();
}
return Status.CANCEL_STATUS;
}
};
//set job priority very low to make sure it is executed at last
wjob.setPriority(Job.DECORATE);
wjob.schedule(500);
}
private void expandOnViewer(final Viewer viewer, final IDebugElement element) {
WorkbenchJob wjob = new WorkbenchJob("Expanding on viewer...") {
public IStatus runInUIThread(IProgressMonitor monitor) {
((TreeViewer)viewer).setExpandedState(element, true);
try {
if (element instanceof IThread) {
selectOnViewer(viewer, ((IThread)element).getTopStackFrame());
return Status.OK_STATUS;
}
if (element instanceof IDebugTarget) {
IThread[] threads = ((IPDebugTarget)element).getThreads();
if (threads.length > 0) {
expandOnViewer(viewer, threads[0]);
return Status.OK_STATUS;
}
return Status.CANCEL_STATUS;
}
}
catch (DebugException e) {
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
};
//set job priority very low to make sure it is executed at last
wjob.setPriority(Job.DECORATE);
wjob.schedule();
}
private void selectOnViewer(final Viewer viewer, final IDebugElement element) {
if (element != null) {
WorkbenchJob wjob = new WorkbenchJob("Selecting debug element...") {
public IStatus runInUIThread(IProgressMonitor monitor) {
/* FIXME
* In Debug View, there is a Selection Policy. If current selected element is stack frame and its status is suspended, then it cannot allow to change selection to others.
* Now I used internal class to avoid policy checking
*/
if (viewer instanceof InternalTreeModelViewer) {
((InternalTreeModelViewer) viewer).setSelection(new StructuredSelection(element), true, true);
}
else {
viewer.setSelection(new StructuredSelection(element), true);
}
return Status.OK_STATUS;
}
};
//set job priority very low to make sure it is executed at last
wjob.setPriority(Job.DECORATE);
wjob.schedule();
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.ParallelJobsView#changeJobRefresh(org.eclipse.ptp.core.elements.IPJob, boolean)
*/
public void changeJobRefresh(IPJob job, boolean force) {
if (job != null && job.isTerminated()) {
IPSession session = ((UIDebugManager) manager).getDebugSession(job);
if (session != null) {
BitList tasks = session.getTasks();
if (!session.getPDISession().getTaskManager().isAllTerminated(tasks)) {
session.forceStoppedDebugger(ProcessAttributes.State.ERROR);
}
}
}
super.changeJobRefresh(job, force);
}
}