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

import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.services.IServiceLocator;

/**
 * The primary interface between a workbench part and the workbench.
 * <p>
 * This interface is not intended to be implemented or extended by clients.
 * </p>
 *
 * @noimplement This interface is not intended to be implemented by clients.
 */
public interface IWorkbenchPartSite extends IWorkbenchSite {

	/**
	 * Returns the part registry extension id for this workbench site's part.
	 * <p>
	 * The name comes from the <code>id</code> attribute in the configuration
	 * element.
	 * </p>
	 *
	 * @return the registry extension id
	 */
	String getId();

	/**
	 * Returns the unique identifier of the plug-in that defines this workbench
	 * site's part.
	 *
	 * @return the unique identifier of the declaring plug-in
	 */
	String getPluginId();

	/**
	 * Returns the registered name for this workbench site's part.
	 * <p>
	 * The name comes from the <code>name</code> attribute in the configuration
	 * element.
	 * </p>
	 *
	 * @return the part name
	 */
	String getRegisteredName();

	/**
	 * Registers a pop-up menu with a particular id for extension. This method
	 * should only be called if the target part has more than one context menu to
	 * register.
	 * <p>
	 * For a detailed description of context menu registration see
	 * <code>registerContextMenu(MenuManager, ISelectionProvider);</code>
	 * </p>
	 *
	 * @param menuId            the menu id
	 * @param menuManager       the menu manager
	 * @param selectionProvider the selection provider
	 */
	void registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider);

	/**
	 * Registers a pop-up menu with the default id for extension. The default id is
	 * defined as the part id.
	 * <p>
	 * Within the workbench one plug-in may extend the pop-up menus for a view or
	 * editor within another plug-in. In order to be eligible for extension, the
	 * target part must publish each menu by calling
	 * <code>registerContextMenu</code>. Once this has been done the workbench will
	 * automatically insert any action extensions which exist.
	 * </p>
	 * <p>
	 * A menu id must be provided for each registered menu. For consistency across
	 * parts the following strategy should be adopted by all part implementors.
	 * </p>
	 * <ol>
	 * <li>If the target part has only one context menu it should be registered with
	 * <code>id == part id</code>. This can be done easily by calling
	 * <code>registerContextMenu(MenuManager, ISelectionProvider)</code>.
	 * <li>If the target part has more than one context menu a unique id should be
	 * defined for each. Prefix each menu id with the part id and publish these ids
	 * within the javadoc for the target part. Register each menu at runtime by
	 * calling <code>registerContextMenu(String, MenuManager,
	 *			ISelectionProvider)</code>.</li>
	 * </ol>
	 * <p>
	 * Any pop-up menu which is registered with the workbench should also define a
	 * <code>GroupMarker</code> in the registered menu with id
	 * <code>IWorkbenchActionConstants.MB_ADDITIONS</code>. Other plug-ins will use
	 * this group as a reference point for insertion. The marker should be defined
	 * at an appropriate location within the menu for insertion.
	 * </p>
	 *
	 * @param menuManager       the menu manager
	 * @param selectionProvider the selection provider
	 */
	void registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider);

	/**
	 * Returns the key binding service in use.
	 * <p>
	 * The part will access this service to register all of its actions, to set the
	 * active scope.
	 * </p>
	 *
	 * @return the key binding service in use
	 * @since 2.1
	 * @deprecated Use {@link IServiceLocator#getService(Class)} instead.
	 * @see IContextService
	 * @see IHandlerService
	 */
	@Deprecated
	IKeyBindingService getKeyBindingService();

	/**
	 * Returns the part associated with this site
	 *
	 * @since 3.1
	 *
	 * @return the part associated with this site
	 */
	IWorkbenchPart getPart();
}
