/*******************************************************************************
 * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
 * 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:
 *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.launching.model;

import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;

public class XSLThread extends XSLDebugElement implements IThread
{

	/**
	 * Breakpoints this thread is suspended at or <code>null</code> if none.
	 */
	private IBreakpoint[] fBreakpoints;

	/**
	 * Whether this thread is stepping
	 */
	private boolean fStepping = false;

	/**
	 * Constructs a new thread for the given target
	 */
	public XSLThread(XSLDebugTarget target)
	{
		super(target);
	}

	public IStackFrame[] getStackFrames() throws DebugException
	{
		if (isSuspended())
		{
			return ((XSLDebugTarget) getDebugTarget()).getStackFrames();
		}
		else
		{
			return new IStackFrame[0];
		}
	}

	public boolean hasStackFrames() throws DebugException
	{
		return isSuspended();
	}

	public int getPriority() throws DebugException
	{
		return 0;
	}

	public IStackFrame getTopStackFrame() throws DebugException
	{
		IStackFrame[] frames = getStackFrames();
		if (frames.length > 0)
		{
			return frames[0];
		}
		return null;
	}

	public String getName() throws DebugException
	{
		return "Thread[1]";
	}

	public IBreakpoint[] getBreakpoints()
	{
		if (fBreakpoints == null)
		{
			return new IBreakpoint[0];
		}
		return fBreakpoints;
	}

	/**
	 * Sets the breakpoints this thread is suspended at, or <code>null</code>
	 * if none.
	 * 
	 * @param breakpoints
	 *            the breakpoints this thread is suspended at, or
	 *            <code>null</code> if none
	 */
	protected void setBreakpoints(IBreakpoint[] breakpoints)
	{
		fBreakpoints = breakpoints;
	}

	public boolean canResume()
	{
		return isSuspended();
	}

	public boolean canSuspend()
	{
		return !isSuspended();
	}

	public boolean isSuspended()
	{
		return getDebugTarget().isSuspended();
	}

	public void resume() throws DebugException
	{
		getDebugTarget().resume();
	}

	public void suspend() throws DebugException
	{
		getDebugTarget().suspend();
	}

	public boolean canStepInto()
	{
		return isSuspended();
	}

	public boolean canStepOver()
	{
		return isSuspended();
	}

	public boolean canStepReturn()
	{
		return isSuspended();
	}

	public boolean isStepping()
	{
		return fStepping;
	}

	public void stepInto() throws DebugException
	{
		((XSLDebugTarget) getDebugTarget()).stepInto();
	}

	public void stepOver() throws DebugException
	{
		((XSLDebugTarget) getDebugTarget()).stepOver();
	}

	public void stepReturn() throws DebugException
	{
		((XSLDebugTarget) getDebugTarget()).stepReturn();
	}

	public boolean canTerminate()
	{
		return !isTerminated();
	}

	public boolean isTerminated()
	{
		return getDebugTarget().isTerminated();
	}

	public void terminate() throws DebugException
	{
		getDebugTarget().terminate();
	}

	protected void setStepping(boolean stepping)
	{
		fStepping = stepping;
	}
}
