/*******************************************************************************
 * Copyright (c) 2000, 2016 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.debug.core;


import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IBreakpointImportParticipant;

/**
 * The breakpoint manager manages the collection of breakpoints
 * in the workspace. A breakpoint suspends the execution of a
 * program being debugged. The kinds of breakpoints supported by each
 * debug architecture and the information required to create those
 * breakpoints is defined by each debug architecture.
 * Breakpoint creation is a client responsibility.
 * <p>
 * Clients interested in breakpoint change notification may
 * register with the breakpoint manager - see
 * <code>IBreakpointListener</code> and <code>IBreakpointsListener</code>
 * </p>
 * @see org.eclipse.debug.core.IBreakpointListener
 * @see org.eclipse.debug.core.IBreakpointsListener
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */
public interface IBreakpointManager {
	/**
	 * Adds the given breakpoint to the collection of registered breakpoints
	 * in the workspace and notifies all registered listeners. This has no effect
	 * if the given breakpoint is already registered.
	 *
	 * @param breakpoint the breakpoint to add
	 *
	 * @exception CoreException if adding fails. Reasons include:<ul>
	 * <li>CONFIGURATION_INVALID - the required <code>MODEL_IDENTIFIER</code> attribute
	 * 	is not set on the breakpoint marker.</li>
	 * <li>A <code>CoreException</code> occurred while verifying the <code>MODEL_IDENTIFIER</code>
	 *	attribute.</li>
	 * </ul>
	 * @since 2.0
	 */
	void addBreakpoint(IBreakpoint breakpoint) throws CoreException;

	/**
	 * Adds the given breakpoints to the collection of registered breakpoints
	 * in the workspace and notifies all registered listeners. Has no effect
	 * on breakpoints that are already registered.
	 *
	 * @param breakpoints the breakpoints to add
	 *
	 * @exception CoreException if adding fails. Reasons include:<ul>
	 * <li>CONFIGURATION_INVALID - the required <code>MODEL_IDENTIFIER</code> attribute
	 * 	is not set on a breakpoint marker.</li>
	 * <li>A <code>CoreException</code> occurred while verifying a <code>MODEL_IDENTIFIER</code>
	 *	attribute.</li>
	 * </ul>
	 * @since 2.1
	 */
	void addBreakpoints(IBreakpoint[] breakpoints) throws CoreException;

	/**
	 * Returns the breakpoint associated with the given marker or
	 * <code>null</code> if no such breakpoint exists
	 *
	 * @param marker the marker
	 * @return the breakpoint associated with the marker
	 * 	or <code>null</code> if none exists
	 * @since 2.0
	 */
	IBreakpoint getBreakpoint(IMarker marker);

	/**
	 * Returns a collection of all registered breakpoints.
	 * Returns an empty array if no breakpoints are registered.
	 *
	 * @return an array of breakpoints
	 * @since 2.0
	 */
	IBreakpoint[] getBreakpoints();

	/**
	 * Returns whether there are any registered breakpoints.
	 *
	 * @return whether there are any registered breakpoints
	 * @since 2.0
	 */
	boolean hasBreakpoints();

	/**
	 * Returns a collection of all breakpoints registered for the
	 * given debug model. Answers an empty array if no breakpoints are registered
	 * for the given debug model.
	 *
	 * @param modelIdentifier identifier of a debug model plug-in
	 * @return an array of breakpoints
	 * @since 2.0
	 */
	IBreakpoint[] getBreakpoints(String modelIdentifier);

	/**
	 * Returns whether the given breakpoint is currently
	 * registered with this breakpoint manager.
	 *
	 * @param breakpoint a breakpoint
	 * @return whether the breakpoint is registered
	 * @since 2.0
	 */
	boolean isRegistered(IBreakpoint breakpoint);

	/**
	 * Notifies all registered listeners that the given
	 * breakpoint has changed. Has no effect if the given
	 * breakpoint is not currently registered.
	 *
	 * This method is intended to be used when a breakpoint
	 * attribute is changed that does not alter the breakpoint's
	 * underlying marker, that is, when notification will not occur
	 * via the marker delta mechanism.
	 *
	 * @param breakpoint the breakpoint that has changed.
	 * @since 2.0
	 */
	void fireBreakpointChanged(IBreakpoint breakpoint);

	/**
	 * Removes the given breakpoint from the breakpoint manager, deletes
	 * the marker associated with the breakpoint if the <code>delete</code> flag
	 * is <code>true</code>, and notifies all registered
	 * listeners. Has no effect if the given breakpoint is not currently
	 * registered.
	 *
	 * @param breakpoint the breakpoint to remove
	 * @param delete whether to delete the marker associated with the
	 *  breakpoint
	 * @exception CoreException if an exception occurs while deleting the
	 * 	underlying marker.
	 * @since 2.0
	 */
	void removeBreakpoint(IBreakpoint breakpoint, boolean delete) throws CoreException;

	/**
	 * Removes the given breakpoints from the breakpoint manager, deletes
	 * the markers associated with the breakpoints if the <code>delete</code> flag
	 * is <code>true</code>, and notifies all registered
	 * listeners. Has no effect on breakpoints not currently
	 * registered.
	 *
	 * @param breakpoints the breakpoints to remove
	 * @param delete whether to delete the markers associated with the
	 *  breakpoints
	 * @exception CoreException if an exception occurs while deleting an
	 * 	underlying marker.
	 * @since 2.1
	 */
	void removeBreakpoints(IBreakpoint[] breakpoints, boolean delete) throws CoreException;

	/**
	 * Adds the given listener to the collection of registered breakpoint listeners.
	 * Has no effect if an identical listener is already registered.
	 *
	 * @param listener the listener to add
	 */
	void addBreakpointListener(IBreakpointListener listener);

	/**
	 * Removes the given listener from the collection of registered breakpoint listeners.
	 * Has no effect if an identical listener is not already registered.
	 *
	 * @param listener the listener to remove
	 */
	void removeBreakpointListener(IBreakpointListener listener);

	/**
	 * Adds the given listener to the collection of registered breakpoint listeners.
	 * Has no effect if an identical listener is already registered.
	 *
	 * @param listener the listener to add
	 * @since 2.1
	 */
	void addBreakpointListener(IBreakpointsListener listener);

	/**
	 * Removes the given listener from the collection of registered breakpoint listeners.
	 * Has no effect if an identical listener is not already registered.
	 *
	 * @param listener the listener to remove
	 * @since 2.1
	 */
	void removeBreakpointListener(IBreakpointsListener listener);

	/**
	 * Adds the given listener to the collection of registered breakpoint manager
	 * listeners. Has no effect if an identical listener is already registered.
	 *
	 * @param listener the listener to add
	 * @since 3.0
	 */
	void addBreakpointManagerListener(IBreakpointManagerListener listener);

	/**
	 * Removes the given listener from the collection of registered breakpoint manager
	 * listeners. Has no effect if an identical listener is not already registered.
	 *
	 * @param listener the listener to remove
	 * @since 3.0
	 */
	void removeBreakpointManagerListener(IBreakpointManagerListener listener);

	/**
	 * Returns whether or not this breakpoint manager is enabled.
	 * When a breakpoint manager is enabled, all breakpoints
	 * should be honored. When it is disabled, breakpoints should
	 * not be honored, regardless of each breakpoint's enabled state.
	 *
	 * @return whether or not this breakpoint manager is enabled
	 * @since 3.0
	 */
	boolean isEnabled();

	/**
	 * Sets the enabled state of this breakpoint manager. When
	 * enabled, breakpoints should be honoured. When disabled, all
	 * breakpoints should be ignored.
	 *
	 * @param enabled whether this breakpoint manager should be
	 *  enabled
	 * @since 3.0
	 */
	void setEnabled(boolean enabled);

    /**
     * Returns the name (user readable String) of the given
     * breakpoint's type or <code>null</code> if none has been
     * specified.
     *
     * @param breakpoint the breakpoint
     * @return the name of the given breakpoint's type or <code>null</code>
     * @since 3.1
     */
    String getTypeName(IBreakpoint breakpoint);

    /**
     * Returns an array of {@link IBreakpointImportParticipant}s for the given
     * breakpoint marker id, never <code>null</code>.
     *
     * @param markertype the {@link String} identifier of the marker type
     * @return an array of {@link IBreakpointImportParticipant}s for the given marker type,
     * never <code>null</code>
     * @throws CoreException if an exception occurs
     * @since 3.5
     */
    IBreakpointImportParticipant[] getImportParticipants(String markertype) throws CoreException;

	/**
	 * Returns the triggers for the breakpoints associated with the workspace or
	 * <code>null</code> if no such breakpoint exists
	 *
	 * @return the triggers breakpoint associated with the workspace or
	 *         <code>null</code> if none exists
	 * @since 3.11
	 */
	IBreakpoint[] getTriggerPoints();

	/**
	 * Adds the given breakpoint as the triggering breakpoint in the workspace
	 * and notifies all registered listeners.
	 *
	 * @param breakpoint the breakpoint to be added as the trigger point
	 *
	 * @exception CoreException if adding fails. Reasons include:
	 *                <ul>
	 *                <li>CONFIGURATION_INVALID - the required
	 *                <code>MODEL_IDENTIFIER</code> attribute is not set on the
	 *                breakpoint marker.</li>
	 *                <li>A <code>CoreException</code> occurred while verifying
	 *                the <code>MODEL_IDENTIFIER</code> attribute.</li>
	 *                </ul>
	 * @since 3.11
	 */
	void addTriggerPoint(IBreakpoint breakpoint) throws CoreException;

	/**
	 * Removes the given breakpoint as the trigger breakpoint in the workspace
	 * and notifies all registered listeners.
	 *
	 * @param breakpoint the breakpoint to be removed as the trigger point
	 *
	 * @exception CoreException if adding fails. Reasons include:
	 *                <ul>
	 *                <li>CONFIGURATION_INVALID - the required
	 *                <code>MODEL_IDENTIFIER</code> attribute is not set on the
	 *                breakpoint marker.</li>
	 *                <li>A <code>CoreException</code> occurred while verifying
	 *                the <code>MODEL_IDENTIFIER</code> attribute.</li>
	 *                </ul>
	 * @since 3.11
	 */
	void removeTriggerPoint(IBreakpoint breakpoint) throws CoreException;

	/**
	 * Removes all the trigger points from the breakpoint manager.
	 *
	 * @exception CoreException if an exception occurs while deleting an
	 *                underlying marker.
	 * @since 3.11
	 */
	void removeAllTriggerPoints() throws CoreException;

	/**
	 * Returns whether a workspace has active TriggerPoints
	 *
	 * @return return <code>true</code> if a breakpoint has active triggers and
	 *         cannot suspend and return <code>false> otherwise.
	 * @since 3.11
	 */
	boolean hasActiveTriggerPoints();

	/**
	 * Revisit all the trigger points to activate/deactivate trigger points.
	 *
	 * @param triggerPoints list of trigger points to be deactivated or
	 *            <code>null<code> to deactivate all trigger points
	 * @param enable enable if <code>true</code> or disable if <code>false</code>
	 * @since 3.11
	 */
	void enableTriggerPoints(IBreakpoint[] triggerPoints, boolean enable);

	/**
	 * Touch and refresh the display of all breakpoints.
	 *
	 * @since 3.11
	 */
	void refreshTriggerpointDisplay();

}


