/*******************************************************************************
 * Copyright (c) 2005, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.menus;

import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.jface.action.ContributionManager;
import org.eclipse.ui.services.IServiceWithSources;

/**
 * <p>
 * Provides services related to the menu architecture within the workbench. It
 * can be used to contribute additional items to the menu, tool bar and status
 * line.
 * </p>
 * <p>
 * This service can be acquired from your service locator:
 * </p>
 *
 * <pre>
 * IMenuService service = (IMenuService) getSite().getService(IMenuService.class);
 * </pre>
 * <ul>
 * <li>This service is available globally.</li>
 * </ul>
 *
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 *
 * @since 3.3
 */
public interface IMenuService extends IServiceWithSources {

	/**
	 * Contribute and initialize the contribution factory. This should only be
	 * called once per factory. After the call, the factory should be treated as an
	 * unmodifiable object.
	 * <p>
	 * <b>Note:</b> factories should be removed when no longer necessary. If not,
	 * they will be removed when the IServiceLocator used to acquire this service is
	 * disposed.
	 * </p>
	 *
	 * @param factory the contribution factory. Must not be <code>null</code>
	 * @see #removeContributionFactory(AbstractContributionFactory)
	 */
	void addContributionFactory(AbstractContributionFactory factory);

	/**
	 * Remove the contributed factory from the menu service. If the factory is not
	 * contained by this service, this call does nothing.
	 *
	 * @param factory the contribution factory to remove. Must not be
	 *                <code>null</code>.
	 */
	void removeContributionFactory(AbstractContributionFactory factory);

	/**
	 * Populate a <code>ContributionManager</code> at the specified starting
	 * location with a set of <code>IContributionItems</code>s. It applies
	 * <code>AbstractContributionFactory</code>s that are stored against the
	 * provided location.
	 *
	 * @param mgr      The ContributionManager to populate
	 * @param location The starting location to begin populating this contribution
	 *                 manager. The format is the Menu API URI format.
	 * @see #releaseContributions(ContributionManager)
	 */
	void populateContributionManager(ContributionManager mgr, String location);

	/**
	 * Before calling dispose() on a ContributionManager populated by the menu
	 * service, you must inform the menu service to release its contributions. This
	 * takes care of unregistering any IContributionItems that have their
	 * visibleWhen clause managed by this menu service.
	 * <p>
	 * This will not update the ContributionManager (and any widgets). It will
	 * simply remove all menu service references to the contents of this
	 * ContributionManager.
	 * </p>
	 *
	 * @param mgr The manager that was populated by a call to
	 *            {@link #populateContributionManager(ContributionManager, String)}
	 */
	void releaseContributions(ContributionManager mgr);

	/**
	 * Get the current state of eclipse as seen by the menu service.
	 *
	 * @return an IEvaluationContext containing state variables.
	 *
	 * @see org.eclipse.ui.ISources
	 * @see org.eclipse.ui.services.IEvaluationService
	 */
	IEvaluationContext getCurrentState();
}
