blob: 2ea501faa7448d45170454b01e7f606f3602507e [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.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ptp.core.elements.IPJob;
import org.eclipse.ptp.core.elements.IPProcess;
import org.eclipse.ptp.debug.core.cdi.IPCDISession;
import org.eclipse.ptp.debug.core.events.IPDebugErrorInfo;
import org.eclipse.ptp.debug.core.events.IPDebugEvent;
import org.eclipse.ptp.debug.core.events.IPDebugInfo;
import org.eclipse.ptp.debug.core.events.IPDebugRegisterInfo;
import org.eclipse.ptp.debug.internal.ui.PDebugUIUtils;
import org.eclipse.ptp.debug.internal.ui.UIDebugManager;
import org.eclipse.ptp.debug.internal.ui.views.AbstractPDebugEventHandler;
import org.eclipse.ptp.debug.ui.PTPDebugUIPlugin;
import org.eclipse.ptp.ui.model.IElement;
import org.eclipse.ptp.ui.model.IElementHandler;
/**
* @author Clement chu
*/
public class ParallelDebugViewEventHandler extends AbstractPDebugEventHandler {
/**
* Constructs a new event handler on the given view
*
* @param view signals view
*/
public ParallelDebugViewEventHandler(ParallelDebugView view) {
super(view);
}
public ParallelDebugView getPView() {
return (ParallelDebugView)getView();
}
public void refresh(boolean all) {
getPView().refresh(all);
}
protected void doHandleDebugEvent(IPDebugEvent event, IProgressMonitor monitor) {
IPDebugInfo info = event.getInfo();
IPJob job = info.getJob();
switch(event.getKind()) {
case IPDebugEvent.CREATE:
switch (event.getDetail()) {
case IPDebugEvent.DEBUGGER:
PTPDebugUIPlugin.getUIDebugManager().defaultRegister((IPCDISession)event.getSource());
refresh();
break;
case IPDebugEvent.REGISTER:
boolean refresh = true;
if (info instanceof IPDebugRegisterInfo) {
refresh = ((IPDebugRegisterInfo)info).isRefresh();
}
int[] processes = info.getAllRegisteredProcesses().toArray();
if (refresh) {
IElementHandler elementHandler = getPView().getElementHandler(job.getID());
if (elementHandler != null) {
for (int j=0; j<processes.length; j++) {
IPProcess proc = job.getProcessByIndex(processes[j]);
IElement element = elementHandler.getSetRoot().get(proc.getID());
element.setRegistered(true);
elementHandler.addRegisterElement(element);
}
}
refresh();
}
if (processes.length > 0) {
getPView().focusOnDebugTarget(job, processes[0]);
}
break;
}
break;
case IPDebugEvent.TERMINATE:
switch (event.getDetail()) {
case IPDebugEvent.DEBUGGER:
refresh(true);
break;
case IPDebugEvent.REGISTER:
boolean refresh = true;
if (info instanceof IPDebugRegisterInfo) {
refresh = ((IPDebugRegisterInfo)info).isRefresh();
}
int[] processes = info.getAllUnregisteredProcesses().toArray();
if (refresh) {
IElementHandler elementHandler = getPView().getElementHandler(job.getID());
if (elementHandler != null) {
for (int j = 0; j < processes.length; j++) {
IPProcess proc = job.getProcessByIndex(processes[j]);
IElement element = elementHandler.getSetRoot().get(proc.getID());
element.setRegistered(false);
elementHandler.removeRegisterElement(element);
}
}
refresh();
}
break;
default:
/*
if (job.getID().equals(getPView().getCurrentID())) {
BitList tsource = (BitList) job.getAttribute(IAbstractDebugger.TERMINATED_PROC_KEY);
BitList ttarget = (BitList) job.getAttribute(IAbstractDebugger.SUSPENDED_PROC_KEY);
getPView().updateTerminateButton(tsource, ttarget);
}
*/
refresh(true);
break;
}
break;
case IPDebugEvent.RESUME:
((UIDebugManager) getPView().getUIManager()).updateVariableValue(false, info.getAllRegisteredProcesses());
case IPDebugEvent.SUSPEND:
if (job.getID().equals(getPView().getCurrentID())) {
//BitList ssource = (BitList)job.getAttribute(IAbstractDebugger.SUSPENDED_PROC_KEY);
//BitList starget = (BitList)job.getAttribute(IAbstractDebugger.TERMINATED_PROC_KEY);
//getPView().updateSuspendResumeButton(ssource, starget);
if (event.getKind() == IPDebugEvent.SUSPEND) {
getPView().updateStepReturnButton(info.getAllProcesses());
PTPDebugUIPlugin.getUIDebugManager().updateVariableValueOnSuspend(info.getAllProcesses());
}
}
getPView().updateAction();
refresh();
break;
case IPDebugEvent.CHANGE:
/*
int detail = event.getDetail();
if (detail == IPDebugEvent.EVALUATION || detail == IPDebugEvent.CONTENT) {
int[] diffTasks = info.getAllProcesses().toArray();
IElementHandler elementHandler = getPView().getElementHandler(job.getID());
for (int j=0; j<diffTasks.length; j++) {
IElement element = elementHandler.getSetRoot().get(String.valueOf(diffTasks[j]));
if (element instanceof DebugElement) {
if (detail == IPDebugEvent.EVALUATION) {
((DebugElement)element).setType(DebugElement.VALUE_DIFF);
}
else {
((DebugElement)element).resetType();
}
}
}
}
*/
refresh();
break;
case IPDebugEvent.ERROR:
final IPDebugErrorInfo errInfo = (IPDebugErrorInfo)info;
PTPDebugUIPlugin.getDisplay().asyncExec(new Runnable() {
public void run() {
String msg = "Error on tasks: "+ PDebugUIUtils.showBitList(errInfo.getAllProcesses()) + " - " + errInfo.getMsg();
IStatus status = new Status(IStatus.ERROR, PTPDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, msg, null);
PTPDebugUIPlugin.errorDialog("Error", status);
}
});
refresh(true);
break;
}
}
}