/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.debug.model;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
/**
* @author mmarzec
*
*/
public class RobotThread extends RobotDebugElement implements IThread {
/**
* Breakpoints this thread is suspended at or <code>null</code> if none.
*/
private IBreakpoint[] breakpoints;
private boolean isStepping = false;
private boolean isSteppingOver = false;
private boolean isSteppingReturn = false;
public RobotThread(final RobotDebugTarget target) {
super(target);
}
@Override
public IStackFrame[] getStackFrames() {
final IStackFrame[] stackFrames = getDebugTarget().getStackFrames();
return stackFrames == null ? new IStackFrame[0] : stackFrames;
}
@Override
public boolean hasStackFrames() {
return isSuspended();
}
@Override
public int getPriority() {
return 0;
}
@Override
public IStackFrame getTopStackFrame() {
final IStackFrame[] frames = getStackFrames();
return frames.length > 0 ? frames[0] : null;
}
@Override
public String getName() {
return "Thread [main]";
}
@Override
public IBreakpoint[] getBreakpoints() {
return breakpoints == null ? new IBreakpoint[0] : breakpoints;
}
void setSuspendedAt(final IBreakpoint breakpoint) {
this.breakpoints = new IBreakpoint[] { breakpoint };
}
@Override
public boolean canResume() {
return isSuspended();
}
@Override
public boolean canSuspend() {
return !isSuspended() && !isTerminated();
}
@Override
public boolean isSuspended() {
return getDebugTarget().isSuspended();
}
@Override
public void resume() {
getDebugTarget().resume();
}
@Override
public void suspend() {
getDebugTarget().suspend();
}
@Override
public boolean canStepInto() {
return isSuspended();
}
@Override
public boolean canStepOver() {
return isSuspended();
}
@Override
public boolean canStepReturn() {
return isSuspended() && getDebugTarget().getCurrentKeywordsContext().size() > 1;
}
@Override
public boolean isStepping() {
return isStepping;
}
void setStepping(final boolean stepping) {
isStepping = stepping;
}
public void setSteppingOver(final boolean stepping) {
isSteppingOver = stepping;
}
boolean isSteppingOver() {
return isSteppingOver;
}
public void setSteppingReturn(final boolean stepping) {
isSteppingReturn = stepping;
}
boolean isSteppingReturn() {
return isSteppingReturn;
}
@Override
public void stepInto() {
getDebugTarget().step();
}
@Override
public void stepOver() {
isSteppingOver = true;
getDebugTarget().stepOver();
}
@Override
public void stepReturn() {
isSteppingReturn = true;
getDebugTarget().stepReturn();
}
@Override
public boolean canTerminate() {
return !isTerminated();
}
@Override
public boolean isTerminated() {
return getDebugTarget().isTerminated();
}
@Override
public void terminate() {
getDebugTarget().terminate();
}
}