/*******************************************************************************
 * 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;

/**
 * The workbench's global registry of perspectives.
 * <p>
 * This registry contains a descriptor for each perspectives in the workbench.
 * It is initially populated with stock perspectives from the workbench's
 * perspective extension point (<code>"org.eclipse.ui.perspectives"</code>) and
 * with custom perspectives defined by the user.
 * </p>
 * <p>
 * This interface is not intended to be implemented by clients.
 * </p>
 *
 * @see IWorkbench#getPerspectiveRegistry
 * @noimplement This interface is not intended to be implemented by clients.
 */
public interface IPerspectiveRegistry {
	/**
	 * Clones an existing perspective.
	 *
	 * @param id    the id for the cloned perspective, which must not already be
	 *              used by any registered perspective
	 * @param label the label assigned to the cloned perspective
	 * @param desc  the perspective to clone
	 * @return the cloned perspective descriptor
	 * @throws IllegalArgumentException if there is already a perspective with the
	 *                                  given id
	 *
	 * @since 3.0
	 */
	IPerspectiveDescriptor clonePerspective(String id, String label, IPerspectiveDescriptor desc)
			throws IllegalArgumentException;

	/**
	 * Deletes a perspective. Has no effect if the perspective is defined in an
	 * extension.
	 *
	 * @param persp the perspective to delete
	 * @since 3.2
	 */
	void deletePerspective(IPerspectiveDescriptor persp);

	/**
	 * Finds and returns the registered perspective with the given perspective id.
	 *
	 * @param perspectiveId the perspective id
	 * @return the perspective, or <code>null</code> if none
	 * @see IPerspectiveDescriptor#getId
	 */
	IPerspectiveDescriptor findPerspectiveWithId(String perspectiveId);

	/**
	 * Finds and returns the registered perspective with the given label.
	 *
	 * @param label the label
	 * @return the perspective, or <code>null</code> if none
	 * @see IPerspectiveDescriptor#getLabel
	 */
	IPerspectiveDescriptor findPerspectiveWithLabel(String label);

	/**
	 * Returns the id of the default perspective for the workbench. This identifies
	 * one perspective extension within the workbench's perspective registry.
	 * <p>
	 * Returns <code>null</code> if there is no default perspective.
	 * </p>
	 *
	 * @return the default perspective id, or <code>null</code>
	 */
	String getDefaultPerspective();

	/**
	 * Returns a list of the perspectives known to the workbench.
	 *
	 * @return a list of perspectives
	 */
	IPerspectiveDescriptor[] getPerspectives();

	/**
	 * Sets the default perspective for the workbench to the given perspective id.
	 * If non-<code>null</code>, the id must correspond to a perspective extension
	 * within the workbench's perspective registry.
	 * <p>
	 * A <code>null</code> id indicates no default perspective.
	 * </p>
	 *
	 * @param id a perspective id, or <code>null</code>
	 */
	void setDefaultPerspective(String id);

	/**
	 * Reverts a perspective back to its original definition as specified in the
	 * plug-in manifest.
	 *
	 * @param perspToRevert the perspective to revert
	 *
	 * @since 3.0
	 */
	void revertPerspective(IPerspectiveDescriptor perspToRevert);
}
