/*******************************************************************************
 * 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.debug.core.DebugException;
import org.eclipse.jdt.core.dom.Message;

/**
 * Provides event and error notification for Java breakpoints. Listeners
 * register with the <code>JDIDebugModel</code>.
 * <p>
 * Since 3.5, clients can also register breakpoint listeners using the
 * <code>org.eclipse.jdt.debug.breakpointListeners</code> extension point. A
 * listener can be contributed to receive notifications from all Java
 * breakpoints or receive notifications about specific breakpoints by
 * programmatically registering the extension with a breakpoint.
 * </p>
 * <p>
 * Clients are intended to implement this interface.
 * </p>
 *
 * @since 2.0
 * @see JDIDebugModel
 * @see IJavaBreakpoint
 */
public interface IJavaBreakpointListener {

	/**
	 * Return code in response to a "breakpoint hit" notification, indicating a
	 * vote to suspend the associated thread.
	 *
	 * @since 3.0
	 */
	public static int SUSPEND = 0x0001;
	/**
	 * Return code in response to a "breakpoint hit" notification, indicating a
	 * vote to not suspend (i.e. resume) the associated thread.
	 *
	 * @since 3.0
	 */
	public static int DONT_SUSPEND = 0x0002;
	/**
	 * Return code in response to an "installing" notification, indicating a
	 * vote to install the associated breakpoint.
	 *
	 * @since 3.0
	 */
	public static int INSTALL = 0x0001;
	/**
	 * Return code in response to an "installing" notification, indicating a
	 * vote to not install the associated breakpoint.
	 *
	 * @since 3.0
	 */
	public static int DONT_INSTALL = 0x0002;
	/**
	 * Return code indicating that this listener should not be considered in a
	 * vote to suspend a thread or install a breakpoint.
	 *
	 * @since 3.0
	 */
	public static int DONT_CARE = 0x0004;

	/**
	 * Notification that the given breakpoint is about to be added to the
	 * specified target. This message is sent before the breakpoint is actually
	 * added to the debut target (i.e. this is a pre-notification).
	 *
	 * @param target
	 *            Java debug target
	 * @param breakpoint
	 *            Java breakpoint
	 */
	public void addingBreakpoint(IJavaDebugTarget target,
			IJavaBreakpoint breakpoint);

	/**
	 * Notification that the given breakpoint is about to be installed in the
	 * specified target, in the specified type. Allows this listener to vote to
	 * determine if the given breakpoint should be installed in the specified
	 * type and target. If at least one listener votes to <code>INSTALL</code>,
	 * the breakpoint will be installed. If there are no votes to install the
	 * breakpoint, there must be at least one <code>DONT_INSTALL</code> vote to
	 * cancel the installation. If all listeners vote <code>DONT_CARE</code>,
	 * the breakpoint will be installed by default.
	 *
	 * @param target
	 *            Java debug target
	 * @param breakpoint
	 *            Java breakpoint
	 * @param type
	 *            the type (class or interface) the breakpoint is about to be
	 *            installed in or <code>null</code> if the given breakpoint is
	 *            not installed in a specific type (one of
	 *            <code>IJavaClassType</code>, <code>IJavaInterfaceType</code>,
	 *            or <code>IJavaArrayType</code>)
	 * @return whether the the breakpoint should be installed in the given type
	 *         and target, or whether this listener doesn't care - one of
	 *         <code>INSTALL</code>, <code>DONT_INSTALL</code>, or
	 *         <code>DONT_CARE</code>
	 * @since 3.0
	 */
	public int installingBreakpoint(IJavaDebugTarget target,
			IJavaBreakpoint breakpoint, IJavaType type);

	/**
	 * Notification that the given breakpoint has been installed in the
	 * specified target.
	 *
	 * @param target
	 *            Java debug target
	 * @param breakpoint
	 *            Java breakpoint
	 */
	public void breakpointInstalled(IJavaDebugTarget target,
			IJavaBreakpoint breakpoint);

	/**
	 * Notification that the given breakpoint has been hit in the specified
	 * thread. Allows this listener to vote to determine if the given thread
	 * should be suspended in response to the breakpoint. If at least one
	 * listener votes to <code>SUSPEND</code>, the thread will suspend. If there
	 * are no votes to suspend the thread, there must be at least one
	 * <code>DONT_SUSPEND</code> vote to avoid the suspension (resume). If all
	 * listeners vote <code>DONT_CARE</code>, the thread will suspend by
	 * default.
	 * <p>
	 * The thread the breakpoint has been encountered in is now suspended.
	 * Listeners may query thread state and perform evaluations. All subsequent
	 * breakpoints in this thread will be ignored until voting has completed.
	 * </p>
	 *
	 * @param thread
	 *            Java thread
	 * @param breakpoint
	 *            Java breakpoint
	 * @return whether the thread should suspend or whether this listener
	 *         doesn't care - one of <code>SUSPEND</code>,
	 *         <code>DONT_SUSPEND</code>, or <code>DONT_CARE</code>
	 * @since 3.0
	 */
	public int breakpointHit(IJavaThread thread, IJavaBreakpoint breakpoint);

	/**
	 * Notification that the given breakpoint has been removed from the
	 * specified target.
	 *
	 * @param target
	 *            Java debug target
	 * @param breakpoint
	 *            Java breakpoint
	 */
	public void breakpointRemoved(IJavaDebugTarget target,
			IJavaBreakpoint breakpoint);

	/**
	 * Notification that the given breakpoint had runtime errors in its
	 * conditional expression.
	 *
	 * @param breakpoint
	 *            the breakpoint
	 * @param exception
	 *            the debug exception that occurred evaluating the breakpoint's
	 *            condition
	 */
	public void breakpointHasRuntimeException(IJavaLineBreakpoint breakpoint,
			DebugException exception);

	/**
	 * Notification that the given breakpoint has compilation errors in its
	 * conditional expression.
	 *
	 * @param breakpoint
	 *            the breakpoint
	 * @param errors
	 *            the compilation errors in the breakpoint's condition
	 */
	public void breakpointHasCompilationErrors(IJavaLineBreakpoint breakpoint,
			Message[] errors);
}
