/*******************************************************************************
 * Copyright (c) 2000, 2006 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.jface.action;

/**
 * A contribution manager organizes contributions to such UI components
 * as menus, toolbars and status lines.
 * <p>
 * A contribution manager keeps track of a list of contribution
 * items. Each contribution item may has an optional identifier, which can be used
 * to retrieve items from a manager, and for positioning items relative to
 * each other. The list of contribution items can be subdivided into named groups 
 * using special contribution items that serve as group markers.
 * </p>
 * <p>
 * The <code>IContributionManager</code> interface provides general
 * protocol for adding, removing, and retrieving contribution items.
 * It also provides convenience methods that make it convenient
 * to contribute actions. This interface should be implemented
 * by all objects that wish to manage contributions.
 * </p>
 * <p>
 * There are several implementions of this interface in this package,
 * including ones for menus ({@link MenuManager <code>MenuManager</code>}),
 * tool bars ({@link ToolBarManager <code>ToolBarManager</code>}),
 * and status lines ({@link StatusLineManager <code>StatusLineManager</code>}).
 * </p>
 */
public interface IContributionManager {
    /**
     * Adds an action as a contribution item to this manager.
     * Equivalent to <code>add(new ActionContributionItem(action))</code>.
     *
     * @param action the action, this cannot be <code>null</code>
     */
    public void add(IAction action);

    /**
     * Adds a contribution item to this manager.
     *
     * @param item the contribution item, this cannot be <code>null</code>
     */
    public void add(IContributionItem item);

    /**
     * Adds a contribution item for the given action at the end of the group
     * with the given name.
     * Equivalent to
     * <code>appendToGroup(groupName,new ActionContributionItem(action))</code>.
     *
     * @param groupName the name of the group
     * @param action the action
     * @exception IllegalArgumentException if there is no group with
     *   the given name
     */
    public void appendToGroup(String groupName, IAction action);

    /**
     * Adds a contribution item to this manager at the end of the group
     * with the given name.
     *
     * @param groupName the name of the group
     * @param item the contribution item
     * @exception IllegalArgumentException if there is no group with
     *   the given name
     */
    public void appendToGroup(String groupName, IContributionItem item);

    /**
     * Finds the contribution item with the given id.
     *
     * @param id the contribution item id
     * @return the contribution item, or <code>null</code> if
     *   no item with the given id can be found
     */
    public IContributionItem find(String id);

    /**
     * Returns all contribution items known to this manager.
     *
     * @return a list of contribution items
     */
    public IContributionItem[] getItems();

    /**
     * Returns the overrides for the items of this manager.
     * 
     * @return the overrides for the items of this manager
     * @since 2.0 
     */
    public IContributionManagerOverrides getOverrides();

    /**
     * Inserts a contribution item for the given action after the item 
     * with the given id.
     * Equivalent to
     * <code>insertAfter(id,new ActionContributionItem(action))</code>.
     *
     * @param id the contribution item id
     * @param action the action to insert
     * @exception IllegalArgumentException if there is no item with
     *   the given id
     */
    public void insertAfter(String id, IAction action);

    /**
     * Inserts a contribution item after the item with the given id.
     *
     * @param id the contribution item id
     * @param item the contribution item to insert
     * @exception IllegalArgumentException if there is no item with
     *   the given id
     */
    public void insertAfter(String id, IContributionItem item);

    /**
     * Inserts a contribution item for the given action before the item 
     * with the given id.
     * Equivalent to
     * <code>insertBefore(id,new ActionContributionItem(action))</code>.
     *
     * @param id the contribution item id
     * @param action the action to insert
     * @exception IllegalArgumentException if there is no item with
     *   the given id
     */
    public void insertBefore(String id, IAction action);

    /**
     * Inserts a contribution item before the item with the given id.
     *
     * @param id the contribution item id
     * @param item the contribution item to insert
     * @exception IllegalArgumentException if there is no item with
     *   the given id
     */
    public void insertBefore(String id, IContributionItem item);

    /**
     * Returns whether the list of contributions has recently changed and
     * has yet to be reflected in the corresponding widgets.
     *
     * @return <code>true</code> if this manager is dirty, and <code>false</code>
     *   if it is up-to-date
     */
    public boolean isDirty();

    /**
     * Returns whether this manager has any contribution items.
     *
     * @return <code>true</code> if there are no items, and
     *   <code>false</code> otherwise
     */
    public boolean isEmpty();

    /**
     * Marks this contribution manager as dirty.
     */
    public void markDirty();

    /**
     * Adds a contribution item for the given action at the beginning of the 
     * group with the given name.
     * Equivalent to
     * <code>prependToGroup(groupName,new ActionContributionItem(action))</code>.
     *
     * @param groupName the name of the group
     * @param action the action
     * @exception IllegalArgumentException if there is no group with
     *   the given name
     */
    public void prependToGroup(String groupName, IAction action);

    /**
     * Adds a contribution item to this manager at the beginning of the 
     * group with the given name.
     *
     * @param groupName the name of the group
     * @param item the contribution item
     * @exception IllegalArgumentException if there is no group with
     *   the given name
     */
    public void prependToGroup(String groupName, IContributionItem item);

    /**
     * Removes and returns the contribution item with the given id from this manager.  
     * Returns <code>null</code> if this manager has no contribution items
     * with the given id.
     *
     * @param id the contribution item id
     * @return the item that was found and removed, or <code>null</code> if none
     */
    public IContributionItem remove(String id);

    /**
     * Removes the given contribution item from the contribution items
     * known to this manager.
     *
     * @param item the contribution item
     * @return the <code>item</code> parameter if the item was removed,
     *   and <code>null</code> if it was not found
     */
    public IContributionItem remove(IContributionItem item);

    /**
     * Removes all contribution items from this manager.
     */
    public void removeAll();

    /**
     * Updates this manager's underlying widget(s) with any changes which
     * have been made to it or its items.  Normally changes to a contribution
     * manager merely mark it as dirty, without updating the underlying widgets.
     * This brings the underlying widgets up to date with any changes.
     *
     * @param force <code>true</code> means update even if not dirty,
     *   and <code>false</code> for normal incremental updating
     */
    public void update(boolean force);
}
