/****************************************************************************** * Copyright (C) 2012-2013 Jonah Graham and others * * All rights reserved. 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 * * Contributors: * Jonah Graham <jonah@kichwacoders.com> - initial API and implementation * Fabio Zadrozny <fabiofz@gmail.com> - ongoing maintenance ******************************************************************************/ 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.debug.model.remote.RemoteDebuggerConsole; import org.python.pydev.debug.newconsole.IPydevConsoleDebugTarget; import org.python.pydev.debug.newconsole.PydevConsole; import org.python.pydev.debug.newconsole.PydevConsoleCommunication; import org.python.pydev.shared_core.utils.ArrayUtils; import org.python.pydev.shared_interactive_console.console.ui.ScriptConsole; import org.python.pydev.shared_interactive_console.console.ui.ScriptConsoleManager; /** * This is used so that the interactive console can support full debug features. */ public class PyDebugTargetConsole extends PyDebugTarget implements IPydevConsoleDebugTarget { PyThreadConsole virtualConsoleThread; IThread[] virtualConsoleThreads; private ScriptConsole console; public PyDebugTargetConsole(PydevConsoleCommunication scriptConsoleCommunication, ILaunch launch, IProcess process, RemoteDebuggerConsole debugger) { super(launch, process, null, debugger, null); virtualConsoleThread = new PyThreadConsole(this); virtualConsoleThreads = new IThread[] { virtualConsoleThread }; } @Override public RemoteDebuggerConsole getDebugger() { return (RemoteDebuggerConsole) super.getDebugger(); } @Override public IThread[] getThreads() throws DebugException { if (isTerminated()) { return new IThread[0]; } IThread[] realThreads = super.getThreads(); if (realThreads != null) { return ArrayUtils.concatArrays(virtualConsoleThreads, realThreads); } else { return virtualConsoleThreads; } } private IStackFrame[] createFrames() { PyStackFrameConsole frame = new PyStackFrameConsole(virtualConsoleThread, this); return new IStackFrame[] { frame }; } @Override public void setSuspended(boolean suspended) { if (suspended != virtualConsoleThread.isSuspended()) { final int state; if (suspended) { state = DebugEvent.SUSPEND; virtualConsoleThread.setSuspended(true, createFrames()); } else { state = DebugEvent.RESUME; virtualConsoleThread.setSuspended(false, null); } fireEvent(new DebugEvent(virtualConsoleThread, state, DebugEvent.CLIENT_REQUEST)); } } @Override public String getName() throws DebugException { if (console == null) { return PydevConsole.CONSOLE_NAME; } return console.getName(); } @Override public void initialize() { super.initialize(); // We start off with a prompt active, therefore we start with the // virtual thread suspended. setSuspended(true); } @Override public void terminate() { super.terminate(); if (console != null) { ScriptConsoleManager.getInstance().close(console); } } public void setConsole(ScriptConsole console) { this.console = console; } }