import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.model.IWorkbenchAdapter;
-public class PHPThread implements IThread {
+public class PHPThread extends PHPDebugElement implements IThread {
- private PHPStackFrame[] frames;
-
- private IDebugTarget target;
-
- private String name;
-
- private int id;
+ private PHPStackFrame[] frames; // The stackframes which belongs to this thread
+ private PHPDebugTarget target; //
+ private String name; //
+ private int id; // The port number through which we communicate to DBG
private class State {
- private boolean isSuspended = false;
-
+ private boolean isSuspended = false;
private boolean isTerminated = false;
+ private boolean isStepping = false;
- private boolean isStepping = false;
-
- boolean isSuspended() {
+ boolean isSuspended () {
return isSuspended;
}
- boolean isTerminated() {
+ boolean isTerminated () {
return isTerminated;
}
- boolean isStepping() {
+ boolean isStepping () {
return isStepping;
}
- void setSuspended(boolean suspended) {
- if (isTerminated())
- throw new IllegalStateException();
- if (suspended && isStepping())
+ void setSuspended (boolean suspended) {
+ if (isTerminated ()) {
throw new IllegalStateException();
+ }
+
+ if (suspended && isStepping ()) {
+ throw new IllegalStateException ();
+ }
+
isSuspended = suspended;
}
- void setStepping(boolean stepping) {
- if (stepping && !isSuspended())
- throw new IllegalStateException();
- if (isTerminated())
- throw new IllegalStateException();
+ void setStepping (boolean stepping) {
+ if (stepping && !isSuspended ()) {
+ throw new IllegalStateException ();
+ }
+
+ if (isTerminated ()) {
+ throw new IllegalStateException ();
+ }
+
isStepping = stepping;
}
}
}
- private final State state = new State();
+ private final State state = new State ();
+
+ /**
+ * @param target
+ * @param id The port number through which we communicate to DBG
+ */
+ public PHPThread (PHPDebugTarget target, int id) {
+ super (target);
- public PHPThread(IDebugTarget target, int id) {
this.target = target;
- this.setId(id);
+ this.setId (id);
}
- public IStackFrame[] getStackFrames() throws DebugException {
- return frames;
+ /**
+ *
+ */
+ public IStackFrame[] getStackFrames () throws DebugException {
+ if (isSuspended()) {
+ return ((PHPDebugTarget)getDebugTarget()).getStackFrames();
+ } else {
+ return new IStackFrame[0];
+ }
}
- public int getStackFramesSize() {
+ public int getStackFramesSize () {
return frames.length;
}
- public boolean hasStackFrames() {
+ public boolean hasStackFrames () {
if (frames == null) {
return false;
}
+
return frames.length > 0;
}
- public int getPriority() throws DebugException {
+ public int getPriority () throws DebugException {
return 0;
}
- public IStackFrame getTopStackFrame() throws DebugException {
+ public IStackFrame getTopStackFrame () throws DebugException {
if (frames == null || frames.length == 0) {
return null;
}
}
public IBreakpoint[] getBreakpoints() {
- return null;
+ return new IBreakpoint[0];
}
public String getModelIdentifier() {
return target;
}
- public void setDebugTarget(IDebugTarget target) {
+ public void setDebugTarget(PHPDebugTarget target) {
this.target = target;
}
return state.isSuspended;
}
- protected void prepareForResume() {
- state.setSuspended(false);
- this.frames = null;
- DebugEvent ev = new DebugEvent(this, DebugEvent.RESUME,
- DebugEvent.CLIENT_REQUEST);
- DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { ev });
+ /**
+ *
+ * Is called from PHPstackframe whenever a stepInto, stepOver or stepReturn is
+ * to be performed
+ *
+ * @param de
+ */
+ protected void prepareForResume (int de) {
+ DebugEvent ev;
+
+ state.setSuspended (false); // We will leave the suspended state
+ this.frames = null; // Reset the stackframes
+ ev = new DebugEvent (this, DebugEvent.RESUME, de); // Create an event resume by stepping
+
+ DebugPlugin.getDefault ().fireDebugEventSet (new DebugEvent[] { ev }); // Fire the event
}
- public synchronized void resume() throws DebugException {
- if (!isSuspended())
- return;
- this.prepareForResume();
- ((PHPDebugTarget) this.getDebugTarget()).getPHPDBGProxy().resume();
+ /**
+ *
+ */
+ public synchronized void resume () throws DebugException {
+ if (!isSuspended ()) { // Is the thread in suspended state?
+ return; // No, leave here
+ }
+
+ this.prepareForResume (DebugEvent.STEP_OVER); // Use a STEP_OVER here because a 0 leads to a collapsing variable tree in UI
+
+ ((PHPDebugTarget) this.getDebugTarget ()).getPHPDBGProxy ().resume ();
}
/*
* this.createName(suspensionPoint) ; this.suspend() ; }
*/
- public synchronized void suspend() throws DebugException {
- if (isSuspended())
- return;
- state.setSuspended(true);
- state.setStepping(false);
- getDebugTarget().suspend();
- DebugEvent ev = new DebugEvent(this, DebugEvent.SUSPEND,
- DebugEvent.BREAKPOINT);
- DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { ev });
+ public synchronized void suspend () throws DebugException {
+ DebugEvent ev;
+
+ if (isSuspended ()) { // Is the thread in suspend state?
+ return; // Yes, leave here
+ }
+
+ state.setSuspended (true); // Set thread to suspended state
+ state.setStepping (false); // Reset thread from stepping state
+
+ getDebugTarget ().suspend (); //
+
+ ev = new DebugEvent (this, DebugEvent.SUSPEND, DebugEvent.BREAKPOINT);
+
+ DebugPlugin.getDefault ().fireDebugEventSet (new DebugEvent[] { ev });
}
- public boolean canStepInto() {
- return isSuspended() && isStepping() && this.hasStackFrames();
+ /**
+ *
+ */
+ public boolean canStepInto () {
+ return isSuspended () && // Is the thread in suspended mode (stopped)
+ isStepping () && // and ???
+ this.hasStackFrames (); // and does this thread have stack frames?
}
- public boolean canStepOver() {
- return isSuspended() && isStepping() && this.hasStackFrames();
+ /**
+ *
+ */
+ public boolean canStepOver () {
+ return isSuspended () && // Is the thread in suspended mode (stopped)
+ isStepping () && // and ???
+ this.hasStackFrames (); // and does this thread have stack frames?
}
- public boolean canStepReturn() {
- return isSuspended() && isStepping() && this.hasStackFrames();
+ /**
+ *
+ */
+ public boolean canStepReturn () {
+ return isSuspended () && // Is the thread in suspended mode (stopped)
+ isStepping () && // and ???
+ this.hasStackFrames (); // and does this thread have stack frames?
}
- public boolean isStepping() {
- return state.isStepping();
+ /**
+ *
+ */
+ public boolean isStepping () {
+ return state.isStepping ();
}
- public void stepInto() throws DebugException {
- try { state.setStepping(true); }
+ /**
+ *
+ */
+ public void stepInto () throws DebugException {
+ try {
+ state.setStepping (true); // Store the info about what we do
+ }
catch (IllegalStateException x) {
- throw new DebugException(PHPeclipsePlugin.error(x));
+ throw new DebugException (PHPeclipsePlugin.error (x));
}
+
this.frames = null;
- frames[0].stepInto();
+
+ frames[0].stepInto ();
}
- public void stepOver() throws DebugException {
- state.setStepping(true);
+ /**
+ *
+ */
+ public void stepOver () throws DebugException {
+ state.setStepping (true);
+
this.frames = null;
- frames[0].stepOver();
+
+ frames[0].stepOver ();
}
- public void stepReturn() throws DebugException {
+ /**
+ *
+ */
+ public void stepReturn () throws DebugException {
}
- public boolean canTerminate() {
- return !isTerminated();
+ /**
+ *
+ */
+ public boolean canTerminate () {
+ return !isTerminated ();
}
- public boolean isTerminated() {
- return state.isTerminated();
+ /**
+ *
+ */
+ public boolean isTerminated () {
+ return state.isTerminated ();
}
- public synchronized void terminate() throws DebugException {
- if (isTerminated())
+ /**
+ *
+ */
+ public synchronized void terminate () throws DebugException {
+ if (isTerminated ()) {
return;
- state.setTerminated(true);
+ }
+
+ state.setTerminated (true);
this.frames = null;
- getDebugTarget().terminate();
+ getDebugTarget ().terminate ();
+ fireTerminateEvent ();
}
- public Object getAdapter(Class arg0) {
- if (IWorkbenchAdapter.class.equals(arg0)) {
+ /**
+ *
+ * @param arg0
+ * @return
+ */
+ public Object getAdapter (Class arg0) {
+ if (IWorkbenchAdapter.class.equals (arg0)) {
return new IWorkbenchAdapter() {
public Object[] getChildren(Object o) {
- Object[] children = null;
try {
- IStackFrame[] frames = getStackFrames();
- if (null != frames) {
- children = new Object[frames.length];
- for (int i = 0; i < frames.length; ++i)
- children[i] = frames[i];
- }
+ return getStackFrames ();
} catch (DebugException x) {
- PHPeclipsePlugin.log("Unable to get stack frames.", x);
- }
- return children;
+ PHPeclipsePlugin.log ("Unable to get stack frames.", x);
+ }
+
+ return new Object[0];
}
public ImageDescriptor getImageDescriptor(Object object) {
}
};
}
- return null;
+ return super.getAdapter(arg0);
}
+ /**
+ *
+ */
public void setStackFrames(PHPStackFrame[] frames) {
this.frames = frames;
}
- public String getName() {
- String name = this.name;
- if (isSuspended())
+ /**
+ *
+ */
+ public String getName () {
+ String name;
+
+ name = this.name;
+
+ if (isSuspended ()) {
name = name + " (suspended)";
+ }
+
return name;
}
- public void setName(String name) {
+ public void setName (String name) {
this.name = name;
}