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