/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.debug.core;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.ILineBreakpoint;

/**
 * A breakpoint that suspends execution when a particular line of code is
 * reached.
 * 
 * @since 2.0
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */
public interface IJavaLineBreakpoint extends IJavaBreakpoint, ILineBreakpoint {

	/**
	 * Returns whether this breakpoint supports a conditional expression.
	 * Conditional breakpoints only suspend when their associated condition
	 * evaluates to <code>true</code>.
	 * 
	 * @return whether this breakpoint supports a condition
	 */
	public boolean supportsCondition();

	/**
	 * Returns the conditional expression associated with this breakpoint, or
	 * <code>null</code> if this breakpoint does not have a condition.
	 * 
	 * @return this breakpoint's conditional expression, or <code>null</code>
	 * @exception CoreException
	 *                if unable to access the property on this breakpoint's
	 *                underlying marker
	 */
	public String getCondition() throws CoreException;

	/**
	 * Sets the condition associated with this breakpoint. When the condition is
	 * enabled, this breakpoint will only suspend execution when the given
	 * condition evaluates to <code>true</code>. Setting the condition to
	 * <code>null</code> or an empty string removes the condition.
	 * <p>
	 * If this breakpoint does not support conditions, setting the condition has
	 * no effect.
	 * </p>
	 * 
	 * @param condition
	 *            conditional expression
	 * @exception CoreException
	 *                if unable to set the property on this breakpoint's
	 *                underlying marker
	 */
	public void setCondition(String condition) throws CoreException;

	/**
	 * Returns whether the condition on this breakpoint is enabled.
	 * 
	 * @return whether this breakpoint's condition is enabled
	 * @exception CoreException
	 *                if unable to access the property on this breakpoint's
	 *                underlying marker
	 */
	public boolean isConditionEnabled() throws CoreException;

	/**
	 * Sets the enabled state of this breakpoint's condition to the given state.
	 * When enabled, this breakpoint will only suspend when its condition
	 * evaluates to true. When disabled, this breakpoint will suspend as it
	 * would with no condition defined.
	 * 
	 * @param enabled
	 *            the enabled state of the condition
	 * 
	 * @exception CoreException
	 *                if unable to set the property on this breakpoint's
	 *                underlying marker
	 */
	public void setConditionEnabled(boolean enabled) throws CoreException;

	/**
	 * Returns whether the breakpoint suspends when the value of the condition
	 * is <code>true</code> or when the value of the condition changes.
	 * 
	 * @return <code>true</code> if this breakpoint suspends when the value of
	 *         the condition is <code>true</code>, <code>false</code> if this
	 *         breakpoint suspends when the value of the condition changes.
	 * @exception CoreException
	 *                if unable to access the property on this breakpoint's
	 *                underlying marker
	 * @since 2.1
	 */
	public boolean isConditionSuspendOnTrue() throws CoreException;

	/**
	 * Set the suspend state of this breakpoint's condition. If the value is
	 * <code>true</code>, the breakpoint will stop when the value of the
	 * condition is <code>true</code>. If the value is <code>false</code>, the
	 * breakpoint will stop when the value of the condition changes.
	 * 
	 * @param suspendOnTrue
	 *            if the condition should suspend when true
	 * 
	 * @exception CoreException
	 *                if unable to access the property on this breakpoint's
	 *                underlying marker
	 * @since 2.1
	 */
	public void setConditionSuspendOnTrue(boolean suspendOnTrue)
			throws CoreException;

}
