package org.python.pydev.debug.model; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IThread; import org.python.pydev.core.log.Log; import org.python.pydev.debug.model.remote.AbstractDebuggerCommand; import org.python.pydev.debug.model.remote.RemoteDebuggerConsole; import org.python.pydev.debug.model.remote.VersionCommand; import org.python.pydev.debug.newconsole.IPydevConsoleDebugTarget; import org.python.pydev.debug.newconsole.PydevConsole; import org.python.pydev.debug.newconsole.PydevConsoleCommunication; import com.aptana.interactive_console.console.ui.ScriptConsole; import com.aptana.interactive_console.console.ui.ScriptConsoleManager; /** * This is used so that the interactive console can have a connection to the variables view. */ public class PyDebugTargetConsole extends PyDebugTarget implements IPydevConsoleDebugTarget { PyThreadConsole thread; IThread[] threads; private final PydevConsoleCommunication scriptConsoleCommunication; private ScriptConsole console; public PyDebugTargetConsole(PydevConsoleCommunication scriptConsoleCommunication, ILaunch launch, IProcess process, RemoteDebuggerConsole debugger) { super(launch, process, null, debugger, null); this.scriptConsoleCommunication = scriptConsoleCommunication; thread = new PyThreadConsole(this); threads = new IThread[] { thread }; } @Override public RemoteDebuggerConsole getDebugger() { return (RemoteDebuggerConsole) super.getDebugger(); } @Override public IThread[] getThreads() throws DebugException { if (isTerminated()) return new IThread[0]; return threads; } private IStackFrame[] createFrames() { PyStackFrameConsole frame = new PyStackFrameConsole(thread, this); return new IStackFrame[] { frame }; } public void setSuspended(boolean suspended) { if (suspended != thread.isSuspended()) { final int state; if (suspended) { state = DebugEvent.SUSPEND; thread.setSuspended(true, createFrames()); } else { state = DebugEvent.RESUME; thread.setSuspended(false, null); } fireEvent(new DebugEvent(thread, state, DebugEvent.CLIENT_REQUEST)); } } @Override public String getName() throws DebugException { if (console == null) { return PydevConsole.CONSOLE_NAME; } return console.getName(); } public void initialize() { // we post version command just for fun // it establishes the connection this.postCommand(new VersionCommand(this)); // We don't issue run command or anything similar, we just start off // suspended setSuspended(true); } @Override public void postCommand(AbstractDebuggerCommand cmd) { try { scriptConsoleCommunication.postCommand(cmd); } catch (Exception e) { Log.log(e); } } @Override public void terminate() { super.terminate(); if (console != null) { ScriptConsoleManager.getInstance().close(console); } } public void setConsole(ScriptConsole console) { this.console = console; } }