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

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.ui.internal.ICompatibleWorkbenchPage;
import org.eclipse.ui.presentations.IStackPresentationSite;

/**
 * A workbench page consists of an arrangement of views and editors intended to
 * be presented together to the user in a single workbench window.
 * <p>
 * A page can contain 0 or more views and 0 or more editors. These views and
 * editors are contained wholly within the page and are not shared with other
 * pages. The layout and visible action set for the page is defined by a
 * perspective.
 * <p>
 * The number of views and editors within a page is restricted to simplify part
 * management for the user. In particular:
 * <ul>
 * <li>Unless a view explicitly allows for multiple instances in its plugin
 * declaration there will be only one instance in a given workbench page.</li>
 * <li>Only one editor can exist for each editor input within a page.
 * <li>
 * </ul>
 * </p>
 * <p>
 * This interface is not intended to be implemented by clients.
 * </p>
 * 
 * @since 1.0
 * @see IPerspectiveDescriptor
 * @see IEditorPart
 * @see IViewPart
 * @noimplement This interface is not intended to be implemented by clients.
 */
public interface IWorkbenchPage extends IPartService, ISelectionService,
		ICompatibleWorkbenchPage {
	/**
	 * An optional attribute within a workspace marker (<code>IMarker</code>)
	 * which identifies the preferred editor type to be opened when
	 * <code>openEditor</code> is called.
	 * 
	 * @see #openEditor(IEditorInput, String)
	 * @see #openEditor(IEditorInput, String, boolean)
	 * @deprecated in 3.0 since the notion of markers this is not generally
	 *             applicable. Use the IDE-specific constant
	 *             <code>IDE.EDITOR_ID_ATTR</code>.
	 */
	public static final String EDITOR_ID_ATTR = "org.eclipse.ui.editorID"; //$NON-NLS-1$

	/**
	 * Change event id when the perspective is reset to its original state.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_RESET = "reset"; //$NON-NLS-1$

	/**
	 * Change event id when the perspective has completed a reset to its
	 * original state.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_RESET_COMPLETE = "resetComplete"; //$NON-NLS-1$

	/**
	 * Change event id when one or more views are shown in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_VIEW_SHOW = "viewShow"; //$NON-NLS-1$

	/**
	 * Change event id when one or more views are hidden in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_VIEW_HIDE = "viewHide"; //$NON-NLS-1$

	/**
	 * Change event id when one or more editors are opened in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_EDITOR_OPEN = "editorOpen"; //$NON-NLS-1$

	/**
	 * Change event id when one or more editors are closed in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_EDITOR_CLOSE = "editorClose"; //$NON-NLS-1$

	/**
	 * Change event id when the editor area is shown in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_EDITOR_AREA_SHOW = "editorAreaShow"; //$NON-NLS-1$

	/**
	 * Change event id when the editor area is hidden in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_EDITOR_AREA_HIDE = "editorAreaHide"; //$NON-NLS-1$

	/**
	 * Change event id when an action set is shown in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_ACTION_SET_SHOW = "actionSetShow"; //$NON-NLS-1$

	/**
	 * Change event id when an action set is hidden in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_ACTION_SET_HIDE = "actionSetHide"; //$NON-NLS-1$

	/**
	 * Change event id when a fast view is added in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_FAST_VIEW_ADD = "fastViewAdd"; //$NON-NLS-1$

	/**
	 * Change event id when a fast view is removed in a perspective.
	 * 
	 * @see IPerspectiveListener
	 */
	public static final String CHANGE_FAST_VIEW_REMOVE = "fastViewRemove"; //$NON-NLS-1$

	/**
	 * Change event id when the page working set was replaced
	 * 
	 * @see IPropertyChangeListener
	 */
	public static final String CHANGE_WORKING_SET_REPLACE = "workingSetReplace"; //$NON-NLS-1$	 

	/**
	 * Change event id when the page working set list was replaced
	 * 
	 * @see IPropertyChangeListener
	 */
	public static final String CHANGE_WORKING_SETS_REPLACE = "workingSetsReplace"; //$NON-NLS-1$	 

	/**
	 * Show view mode that indicates the view should be made visible and
	 * activated. Use of this mode has the same effect as calling
	 * {@link #showView(String)}.
	 * 
	 */
	public static final int VIEW_ACTIVATE = 1;

	/**
	 * Show view mode that indicates the view should be made visible. If the
	 * view is opened in the container that contains the active view then this
	 * has the same effect as <code>VIEW_CREATE</code>.
	 * 
	 */
	public static final int VIEW_VISIBLE = 2;

	/**
	 * Show view mode that indicates the view should be made created but not
	 * necessarily be made visible. It will only be made visible in the event
	 * that it is opened in its own container. In other words, only if it is not
	 * stacked with another view.
	 * 
	 */
	public static final int VIEW_CREATE = 3;

	/**
	 * Editor opening match mode specifying that no matching against existing
	 * editors should be done.
	 * 
	 */
	public static final int MATCH_NONE = 0;

	/**
	 * Editor opening match mode specifying that the editor input should be
	 * considered when matching against existing editors.
	 * 
	 */
	public static final int MATCH_INPUT = 1;

	/**
	 * Editor opening match mode specifying that the editor id should be
	 * considered when matching against existing editors.
	 * 
	 */
	public static final int MATCH_ID = 2;

	/**
	 * State of a view in a given page when the view stack is minimized.
	 * 
	 */
	public static final int STATE_MINIMIZED = IStackPresentationSite.STATE_MINIMIZED;

	/**
	 * State of a view in a given page when the page is zoomed in on the view
	 * stack.
	 * 
	 */
	public static final int STATE_MAXIMIZED = IStackPresentationSite.STATE_MAXIMIZED;

	/**
	 * State of a view in a given page when the view stack is in it's normal
	 * state.
	 * 
	 */
	public static final int STATE_RESTORED = IStackPresentationSite.STATE_RESTORED;

	/**
	 * Activates the given part. The part will be brought to the front and given
	 * focus. The part must belong to this page.
	 * 
	 * @param part
	 *            the part to activate
	 */
	public void activate(IWorkbenchPart part);

	/**
	 * Adds a property change listener.
	 * 
	 * @param listener
	 *            the property change listener to add
	 * @deprecated client should register listeners on the instance of
	 *             {@link org.eclipse.ui.IWorkingSetManager} returned by
	 *             {@link org.eclipse.ui.IWorkbench#getWorkingSetManager()}
	 *             instead.
	 */
	public void addPropertyChangeListener(IPropertyChangeListener listener);

	/**
	 * Moves the given part forward in the Z order of this page so as to make it
	 * visible, without changing which part has focus. The part must belong to
	 * this page.
	 * 
	 * @param part
	 *            the part to bring forward
	 */
	public void bringToTop(IWorkbenchPart part);

	/**
	 * Closes this workbench page. If this page is the active one, this honor is
	 * passed along to one of the window's other pages if possible.
	 * <p>
	 * If the page has an open editor with unsaved content, the user will be
	 * given the opportunity to save it.
	 * </p>
	 * 
	 * @return <code>true</code> if the page was successfully closed, and
	 *         <code>false</code> if it is still open
	 */
	public boolean close();

	/**
	 * Closes all of the editors belonging to this workbench page.
	 * <p>
	 * If the page has open editors with unsaved content and <code>save</code>
	 * is <code>true</code>, the user will be given the opportunity to save
	 * them.
	 * </p>
	 * 
	 * @param save
	 * 
	 * @return <code>true</code> if all editors were successfully closed, and
	 *         <code>false</code> if at least one is still open
	 */
	public boolean closeAllEditors(boolean save);

	/**
	 * Closes the given <code>Array</code> of editor references. The editors
	 * must belong to this workbench page.
	 * <p>
	 * If any of the editors have unsaved content and <code>save</code> is
	 * <code>true</code>, the user will be given the opportunity to save
	 * them.
	 * </p>
	 * 
	 * @param editorRefs
	 *            the editors to close
	 * @param save
	 *            <code>true</code> to save the editor contents if required
	 *            (recommended), and <code>false</code> to discard any unsaved
	 *            changes
	 * @return <code>true</code> if the editors were successfully closed, and
	 *         <code>false</code> if the editors are still open
	 */
	public boolean closeEditors(IEditorReference[] editorRefs, boolean save);

	/**
	 * Closes the given editor. The editor must belong to this workbench page.
	 * <p>
	 * If the editor has unsaved content and <code>save</code> is
	 * <code>true</code>, the user will be given the opportunity to save it.
	 * </p>
	 * 
	 * @param editor
	 *            the editor to close
	 * @param save
	 *            <code>true</code> to save the editor contents if required
	 *            (recommended), and <code>false</code> to discard any unsaved
	 *            changes
	 * @return <code>true</code> if the editor was successfully closed, and
	 *         <code>false</code> if the editor is still open
	 */
	public boolean closeEditor(IEditorPart editor, boolean save);

	/**
	 * Returns the view in this page with the specified id. There is at most one
	 * view in the page with the specified id.
	 * 
	 * @param viewId
	 *            the id of the view extension to use
	 * @return the view, or <code>null</code> if none is found
	 */
	public IViewPart findView(String viewId);

	/**
	 * Returns the view reference with the specified id.
	 * 
	 * @param viewId
	 *            the id of the view extension to use
	 * @return the view reference, or <code>null</code> if none is found
	 */
	public IViewReference findViewReference(String viewId);

	/**
	 * Returns the view reference with the specified id and secondary id.
	 * 
	 * @param viewId
	 *            the id of the view extension to use
	 * @param secondaryId
	 *            the secondary id to use, or <code>null</code> for no
	 *            secondary id
	 * @return the view reference, or <code>null</code> if none is found
	 */
	public IViewReference findViewReference(String viewId, String secondaryId);

	/**
	 * Returns the active editor open in this page.
	 * <p>
	 * This is the visible editor on the page, or, if there is more than one
	 * visible editor, this is the one most recently brought to top.
	 * </p>
	 * 
	 * @return the active editor, or <code>null</code> if no editor is active
	 */
	public IEditorPart getActiveEditor();

	/**
	 * Returns the editor with the specified input. Returns null if there is no
	 * opened editor with that input.
	 * 
	 * @param input
	 *            the editor input
	 * @return an editor with input equals to <code>input</code>
	 */
	public IEditorPart findEditor(IEditorInput input);

	/**
	 * Returns an array of editor references that match the given input and/or
	 * editor id, as specified by the given match flags. Returns an empty array
	 * if there are no matching editors, or if matchFlags is MATCH_NONE.
	 * 
	 * @param input
	 *            the editor input, or <code>null</code> if MATCH_INPUT is not
	 *            specified in matchFlags
	 * @param editorId
	 *            the editor id, or <code>null</code> if MATCH_ID is not
	 *            specified in matchFlags
	 * @param matchFlags
	 *            a bit mask consisting of zero or more of the MATCH_* constants
	 *            OR-ed together
	 * @return the references for the matching editors
	 * 
	 * @see #MATCH_NONE
	 * @see #MATCH_INPUT
	 * @see #MATCH_ID
	 */
	public IEditorReference[] findEditors(IEditorInput input, String editorId,
			int matchFlags);

	/**
	 * Returns a list of the editors open in this page.
	 * <p>
	 * Note that each page has its own editors; editors are never shared between
	 * pages.
	 * </p>
	 * 
	 * @return a list of open editors
	 * 
	 * @deprecated Clients are encouraged to use {@link #getEditorReferences()}
	 *             instead. Calling this method has the side effect of restoring
	 *             all the editors in the page which can cause plug-in
	 *             activation.
	 */
	public IEditorPart[] getEditors();

	/**
	 * Returns an array of references to open editors in this page.
	 * <p>
	 * Note that each page has its own editors; editors are never shared between
	 * pages.
	 * </p>
	 * 
	 * @return a list of open editors
	 */
	public IEditorReference[] getEditorReferences();

	/**
	 * Returns a list of dirty editors in this page.
	 * 
	 * @return a list of dirty editors
	 */
	public IEditorPart[] getDirtyEditors();

	/**
	 * Returns the input for this page.
	 * 
	 * @return the input for this page, or <code>null</code> if none
	 */
	public IAdaptable getInput();

	/**
	 * Returns the page label. This will be a unique identifier within the
	 * containing workbench window.
	 * 
	 * @return the page label
	 */
	public String getLabel();

	/**
	 * Returns the current perspective descriptor for this page, or
	 * <code>null</code> if there is no current perspective.
	 * 
	 * @return the current perspective descriptor or <code>null</code>
	 * @see #setPerspective
	 * @see #savePerspective
	 */
	public IPerspectiveDescriptor getPerspective();

	/**
	 * Returns a list of the reference to views visible on this page.
	 * <p>
	 * Note that each page has its own views; views are never shared between
	 * pages.
	 * </p>
	 * 
	 * @return a list of references to visible views
	 */
	public IViewReference[] getViewReferences();

	/**
	 * Returns a list of the views visible on this page.
	 * <p>
	 * Note that each page has its own views; views are never shared between
	 * pages.
	 * </p>
	 * 
	 * @return a list of visible views
	 * 
	 * @deprecated Clients are encouraged to use {@link #getViewReferences()}
	 *             instead. Calling this method has the side effect of restoring
	 *             all the views in the page which can cause plug-in activation.
	 */
	public IViewPart[] getViews();

	/**
	 * Returns the workbench window of this page.
	 * 
	 * @return the workbench window
	 */
	public IWorkbenchWindow getWorkbenchWindow();

	/**
	 * Returns the working set of this page.
	 * 
	 * @return the working set of this page.
	 * @deprecated individual views should store a working set if needed
	 * @since 1.1
	 */
	public IWorkingSet getWorkingSet();

	/**
	 * Hides an action set in this page.
	 * <p>
	 * In most cases where this method is used the caller is tightly coupled to
	 * a particular action set. They define it in the registry and may make it
	 * visible in certain scenarios by calling <code>showActionSet</code>. A
	 * static variable is often used to identify the action set id in caller
	 * code.
	 * </p>
	 * 
	 * @param actionSetID
	 *            the action set to hide
	 */
	public void hideActionSet(String actionSetID);

	/**
	 * Hides the given view. The view must belong to this page.
	 * 
	 * @param view
	 *            the view to hide
	 */
	public void hideView(IViewPart view);

	/**
	 * Hides the given view that belongs to the reference, if any.
	 * 
	 * @param view
	 *            the references whos view is to be hidden
	 */
	public void hideView(IViewReference view);

	/**
	 * Returns whether the specified part is visible.
	 * 
	 * @param part
	 *            the part to test
	 * @return boolean <code>true</code> if part is visible
	 */
	public boolean isPartVisible(IWorkbenchPart part);

	/**
	 * Returns whether the page's current perspective is showing the editor
	 * area.
	 * 
	 * @return <code>true</code> when editor area visible, <code>false</code>
	 *         otherwise
	 */
	public boolean isEditorAreaVisible();

	/**
	 * Reuses the specified editor by setting its new input.
	 * 
	 * @param editor
	 *            the editor to be reused
	 * @param input
	 *            the new input for the reusable editor
	 */
	public void reuseEditor(IReusableEditor editor, IEditorInput input);

	/**
	 * Opens an editor on the given input.
	 * <p>
	 * If this page already has an editor open on the target input that editor
	 * is activated; otherwise, a new editor is opened. Two editor inputs,
	 * input1 and input2, are considered the same if
	 * 
	 * <pre>
	 * input1.equals(input2) == true
	 * </pre>.
	 * </p>
	 * <p>
	 * The editor type is determined by mapping <code>editorId</code> to an
	 * editor extension registered with the workbench. An editor id is passed
	 * rather than an editor object to prevent the accidental creation of more
	 * than one editor for the same input. It also guarantees a consistent
	 * lifecycle for editors, regardless of whether they are created by the user
	 * or restored from saved data.
	 * </p>
	 * 
	 * @param input
	 *            the editor input
	 * @param editorId
	 *            the id of the editor extension to use
	 * @return an open and active editor, or <code>null</code> if an external
	 *         editor was opened
	 * @exception PartInitException
	 *                if the editor could not be created or initialized
	 */
	public IEditorPart openEditor(IEditorInput input, String editorId)
			throws PartInitException;

	/**
	 * Opens an editor on the given input.
	 * <p>
	 * If this page already has an editor open on the target input that editor
	 * is brought to the front; otherwise, a new editor is opened. Two editor
	 * inputs are considered the same if they equal. See
	 * <code>Object.equals(Object)<code>
	 * and <code>IEditorInput</code>. If <code>activate == true</code> the editor
	 * will be activated.  
	 * </p><p>
	 * The editor type is determined by mapping <code>editorId</code> to an editor
	 * extension registered with the workbench.  An editor id is passed rather than
	 * an editor object to prevent the accidental creation of more than one editor
	 * for the same input. It also guarantees a consistent lifecycle for editors,
	 * regardless of whether they are created by the user or restored from saved 
	 * data.
	 * </p>
	 * 
	 * @param input the editor input
	 * @param editorId the id of the editor extension to use
	 * @param activate if <code>true</code> the editor will be activated
	 * @return an open editor, or <code>null</code> if an external editor was opened
	 * @exception PartInitException if the editor could not be created or initialized
	 */
	public IEditorPart openEditor(IEditorInput input, String editorId,
			boolean activate) throws PartInitException;

	/**
	 * Opens an editor on the given input.
	 * <p>
	 * If this page already has an editor open that matches the given input
	 * and/or editor id (as specified by the matchFlags argument), that editor
	 * is brought to the front; otherwise, a new editor is opened. Two editor
	 * inputs are considered the same if they equal. See
	 * <code>Object.equals(Object)<code>
	 * and <code>IEditorInput</code>. If <code>activate == true</code> the editor
	 * will be activated.  
	 * </p><p>
	 * The editor type is determined by mapping <code>editorId</code> to an editor
	 * extension registered with the workbench.  An editor id is passed rather than
	 * an editor object to prevent the accidental creation of more than one editor
	 * for the same input. It also guarantees a consistent lifecycle for editors,
	 * regardless of whether they are created by the user or restored from saved 
	 * data.
	 * </p>
	 * 
	 * @param input the editor input
	 * @param editorId the id of the editor extension to use
	 * @param activate if <code>true</code> the editor will be activated
	 * @param matchFlags a bit mask consisting of zero or more of the MATCH_* constants OR-ed together
	 * @return an open editor, or <code>null</code> if an external editor was opened
	 * @exception PartInitException if the editor could not be created or initialized
	 * 
	 * @see #MATCH_NONE
	 * @see #MATCH_INPUT
	 * @see #MATCH_ID
	 */
	public IEditorPart openEditor(final IEditorInput input,
			final String editorId, final boolean activate, final int matchFlags)
			throws PartInitException;

	/**
	 * Removes the property change listener.
	 * 
	 * @param listener
	 *            the property change listener to remove
	 */
	public void removePropertyChangeListener(IPropertyChangeListener listener);

	/**
	 * Changes the visible views, their layout, and the visible action sets
	 * within the page to match the current perspective descriptor. This is a
	 * rearrangement of components and not a replacement. The contents of the
	 * current perspective descriptor are unaffected.
	 * <p>
	 * For more information on perspective change see
	 * <code>setPerspective()</code>.
	 * </p>
	 */
	public void resetPerspective();

	/**
	 * Saves the contents of all dirty editors belonging to this workbench page.
	 * If there are no dirty editors this method returns without effect.
	 * <p>
	 * If <code>confirm</code> is <code>true</code> the user is prompted to
	 * confirm the command.
	 * </p>
	 * <p>
	 * Note that as of 3.2, this method also saves views that implement
	 * ISaveablePart and are dirty.
	 * </p>
	 * 
	 * @param confirm <code>true</code> to ask the user before saving unsaved
	 *            changes (recommended), and <code>false</code> to save
	 *            unsaved changes without asking
	 * @return <code>true</code> if the command succeeded, and
	 *         <code>false</code> if the operation was canceled by the user or
	 *         an error occurred while saving
	 */
	public boolean saveAllEditors(boolean confirm);

	/**
	 * Saves the contents of the given editor if dirty. If not, this method
	 * returns without effect.
	 * <p>
	 * If <code>confirm</code> is <code>true</code> the user is prompted to
	 * confirm the command. Otherwise, the save happens without prompt.
	 * </p>
	 * <p>
	 * The editor must belong to this workbench page.
	 * </p>
	 * 
	 * @param editor
	 *            the editor to close
	 * @param confirm
	 *            <code>true</code> to ask the user before saving unsaved
	 *            changes (recommended), and <code>false</code> to save
	 *            unsaved changes without asking
	 * @return <code>true</code> if the command succeeded, and
	 *         <code>false</code> if the editor was not saved
	 */
	public boolean saveEditor(IEditorPart editor, boolean confirm);

	/**
	 * Saves the visible views, their layout, and the visible action sets for
	 * this page to the current perspective descriptor. The contents of the
	 * current perspective descriptor are overwritten.
	 * @since 1.1
	 */
	public void savePerspective();

	/**
	 * Saves the visible views, their layout, and the visible action sets for
	 * this page to the given perspective descriptor. The contents of the given
	 * perspective descriptor are overwritten and it is made the current one for
	 * this page.
	 * 
	 * @param perspective
	 *            the perspective descriptor to save to
	 * @since 1.1
	 */
	public void savePerspectiveAs(IPerspectiveDescriptor perspective);

	/**
	 * Show or hide the editor area for the page's active perspective.
	 * 
	 * @param showEditorArea
	 *            <code>true</code> to show the editor area,
	 *            <code>false</code> to hide the editor area
	 */
	public void setEditorAreaVisible(boolean showEditorArea);

	/**
	 * Changes the visible views, their layout, and the visible action sets
	 * within the page to match the given perspective descriptor. This is a
	 * rearrangement of components and not a replacement. The contents of the
	 * old perspective descriptor are unaffected.
	 * <p>
	 * When a perspective change occurs the old perspective is deactivated
	 * (hidden) and cached for future reference. Then the new perspective is
	 * activated (shown). The views within the page are shared by all existing
	 * perspectives to make it easy for the user to switch between one
	 * perspective and another quickly without loss of context.
	 * </p>
	 * <p>
	 * During activation the action sets are modified. If an action set is
	 * specified in the new perspective which is not visible in the old one it
	 * will be created. If an old action set is not specified in the new
	 * perspective it will be disposed.
	 * </p>
	 * <p>
	 * The visible views and their layout within the page also change. If a view
	 * is specified in the new perspective which is not visible in the old one a
	 * new instance of the view will be created. If an old view is not specified
	 * in the new perspective it will be hidden. This view may reappear if the
	 * user selects it from the View menu or if they switch to a perspective
	 * (which may be the old one) where the view is visible.
	 * </p>
	 * <p>
	 * The open editors are not modified by this method.
	 * </p>
	 * 
	 * @param perspective
	 *            the perspective descriptor
	 */
	public void setPerspective(IPerspectiveDescriptor perspective);

	/**
	 * Shows an action set in this page.
	 * <p>
	 * In most cases where this method is used the caller is tightly coupled to
	 * a particular action set. They define it in the registry and may make it
	 * visible in certain scenarios by calling <code>showActionSet</code>. A
	 * static variable is often used to identify the action set id in caller
	 * code.
	 * </p>
	 * 
	 * @param actionSetID
	 *            the action set to show
	 */
	public void showActionSet(String actionSetID);

	/**
	 * Shows the view identified by the given view id in this page and gives it
	 * focus. If there is a view identified by the given view id (and with no
	 * secondary id) already open in this page, it is given focus.
	 * 
	 * @param viewId
	 *            the id of the view extension to use
	 * @return the shown view
	 * @exception PartInitException
	 *                if the view could not be initialized
	 */
	public IViewPart showView(String viewId) throws PartInitException;

	/**
	 * Shows a view in this page with the given id and secondary id. The
	 * behaviour of this method varies based on the supplied mode. If
	 * <code>VIEW_ACTIVATE</code> is supplied, the view is given focus. If
	 * <code>VIEW_VISIBLE</code> is supplied, then it is made visible but not
	 * given focus. Finally, if <code>VIEW_CREATE</code> is supplied the view is
	 * created and will only be made visible if it is not created in a folder
	 * that already contains visible views.
	 * <p>
	 * This allows multiple instances of a particular view to be created. They
	 * are disambiguated using the secondary id. If a secondary id is given, the
	 * view must allow multiple instances by having specified
	 * allowMultiple="true" in its extension.
	 * </p>
	 * 
	 * @param viewId
	 *            the id of the view extension to use
	 * @param secondaryId
	 *            the secondary id to use, or <code>null</code> for no secondary
	 *            id
	 * @param mode
	 *            the activation mode. Must be {@link #VIEW_ACTIVATE},
	 *            {@link #VIEW_VISIBLE} or {@link #VIEW_CREATE}
	 * @return a view
	 * @exception PartInitException
	 *                if the view could not be initialized
	 * @exception IllegalArgumentException
	 *                if the supplied mode is not valid
	 */
	public IViewPart showView(String viewId, String secondaryId, int mode)
			throws PartInitException;

	/**
	 * Returns <code>true</code> if the editor is pinned and should not be
	 * reused.
	 * 
	 * @param editor
	 *            the editor to test
	 * @return boolean whether the editor is pinned
	 * @since 1.1
	 */
	public boolean isEditorPinned(IEditorPart editor);

	/**
	 * Returns the number of open editors before reusing editors.
	 * 
	 * @return a int
	 * 
	 * @deprecated
	 * @since 1.1
	 */
	public int getEditorReuseThreshold();

	/**
	 * Set the number of open editors before reusing editors. If < 0 the user
	 * preference settings will be used.
	 * 
	 * @param openEditors
	 *            the threshold
	 * @deprecated use IPageLayout.setEditorReuseThreshold(int openEditors)
	 *             instead.
	 * @since 1.1
	 */
	public void setEditorReuseThreshold(int openEditors);

	/**
	 * Returns the navigation history which manages a list of entries keeping
	 * the history of places (positions, selection and editors) the user visited
	 * making it easier to the user to move back and forward without losing
	 * context.
	 * 
	 * @return the navigation history
	 * @since 1.1
	 */
	public INavigationHistory getNavigationHistory();

	/**
	 * Returns an array of IViewParts that are stacked with the given part.
	 * 
	 * @param part
	 *            the part to test
	 * @return the parts that are stacked with this part, including the part in
	 *         question. <code>null</code> is returned if the part does not
	 *         belong to this page.
	 */
	IViewPart[] getViewStack(IViewPart part);

	/**
	 * Returns the new wizard shortcuts associated with the current perspective.
	 * Returns an empty array if there is no current perspective.
	 * 
	 * @see IPageLayout#addNewWizardShortcut(String)
	 * @return an array of wizard identifiers
	 * @since 1.1
	 */
	public String[] getNewWizardShortcuts();

	/**
	 * Returns the perspective shortcuts associated with the current
	 * perspective. Returns an empty array if there is no current perspective.
	 * 
	 * @see IPageLayout#addPerspectiveShortcut(String)
	 * @return an array of perspective identifiers
	 */
	public String[] getPerspectiveShortcuts();

	/**
	 * Returns the show view shortcuts associated with the current perspective.
	 * Returns an empty array if there is no current perspective.
	 * 
	 * @see IPageLayout#addShowViewShortcut(String)
	 * @return an array of view identifiers
	 */
	public String[] getShowViewShortcuts();

	/**
	 * Returns the descriptors for the perspectives that are open in this page,
	 * in the order in which they were opened.
	 * 
	 * @return the open perspective descriptors, in order of opening
	 */
	public IPerspectiveDescriptor[] getOpenPerspectives();

	/**
	 * Returns the descriptors for the perspectives that are open in this page,
	 * in the order in which they were activated (oldest first).
	 * 
	 * @return the open perspective descriptors, in order of activation
	 */
	public IPerspectiveDescriptor[] getSortedPerspectives();

	/**
	 * Closes the specified perspective in this page. If the last perspective in
	 * this page is closed, then all editors are closed. Views that are not
	 * shown in other perspectives are closed as well. If <code>saveParts</code>
	 * is <code>true</code>, the user will be prompted to save any unsaved
	 * changes for parts that are being closed. The page itself is closed if
	 * <code>closePage</code> is <code>true</code>.
	 * 
	 * @param desc
	 *            the descriptor of the perspective to be closed
	 * @param saveParts
	 *            whether the page's parts should be saved if closed
	 * @param closePage
	 *            whether the page itself should be closed if last perspective
	 */
	public void closePerspective(IPerspectiveDescriptor desc,
			boolean saveParts, boolean closePage);

	/**
	 * Closes all perspectives in this page. All editors are closed, prompting
	 * to save any unsaved changes if <code>saveEditors</code> is
	 * <code>true</code>. The page itself is closed if <code>closePage</code>
	 * is <code>true</code>.
	 * 
	 * @param saveEditors
	 *            whether the page's editors should be saved
	 * @param closePage
	 *            whether the page itself should be closed
	 */
	public void closeAllPerspectives(boolean saveEditors, boolean closePage);

	/**
	 * <p>
	 * Return the extension tracker for the workbench. This tracker may be used
	 * by plug-ins to ensure responsiveness to changes to the plug-in registry.
	 * </p>
	 * <p>
	 * The tracker at this level of the workbench is typically used to track
	 * elements that only exist over the lifespan of a page. For example,
	 * <code>ViewPart</code> objects fall into this category.
	 * </p>
	 * 
	 * @return the extension tracker
	 * @see IWorkbench#getExtensionTracker()
	 * @see IWorkbenchWindow#getExtensionTracker()
	 */
	public IExtensionTracker getExtensionTracker();

	/**
	 * Return the visible working sets for this page. Please note that this
	 * array is not filtered by activities. Clients should attempt to ensure
	 * that any use of this method is consistant with the currently enabled
	 * activity set.
	 * 
	 * @return the visible working sets for this page
	 * @see IWorkbench#getActivitySupport()
	 * @since 1.1
	 */
	public IWorkingSet[] getWorkingSets();

	/**
	 * Set the working sets for this page. Any duplicate entries will be removed
	 * from the array by this method.
	 * 
	 * @param sets
	 *            the new working sets for this page. The array may be empty,
	 *            but no element in the array may be <code>null</code>.
	 * @since 1.1
	 */
	public void setWorkingSets(IWorkingSet[] sets);

	/**
	 * Return a working set that contains all of the elements contained in the
	 * array of working sets provided by {@link #getWorkingSets()}. Should this
	 * array or the underlying elements in any of the working sets change this
	 * set will be updated.
	 * 
	 * <p>
	 * This working set is never <code>null</code>, even if there are no
	 * working sets assigned to this page via
	 * {@link #setWorkingSets(IWorkingSet[])}. It is recommended that any
	 * client that uses this API be aware of this and act accordingly.
	 * Specifically, it is recommended that any client utilizing this or any
	 * other IWorkingSet whose {@link IWorkingSet#isAggregateWorkingSet()}
	 * returns <code>true</code> act as if they are not using any working set
	 * if the set is empty. These clients should also maintain an awareness of
	 * the contents of aggregate working sets and toggle this behavior should
	 * the contents of the aggregate either become empty or non-empty.
	 * </p>
	 * <p>
	 * Example: <br/> Here we have pseudocode showing how some workingset
	 * utilizing component could react to changes in aggregate working sets.
	 * <br/> <code>
	 * private IWorkingSet myWorkingSet;
	 * 
	 * IPropertyChangeListener workingSetListener = new IPropertyChangeListener() {
	 *	public void propertyChange(PropertyChangeEvent event) {
	 * 		if (isMyCurrentWorkingSet(event)) {
	 * 			if (isEmptyAggregate(myWorkingSet)) {
	 * 				showNoSet();
	 * 			}
	 * 			else {
	 * 				showSet();
	 * 			}
	 *		}
	 *	}
	 * };
	 * 
	 * public void setWorkingSet(IWorkingSet newSet) {
	 * 		myWorkingSet = newSet;
	 * 		if (myWorkingSet == null || isEmptyAggregate(myWorkingSet)){
	 * 			showNoSet();
	 * 		}
	 * 		else {
	 * 			showSet();
	 * 		}
	 * }
	 * </code>
	 * </p>
	 * 
	 * @return the aggregate working set for this page, this implements 
	 *   {@link IAggregateWorkingSet}
	 * @see IAggregateWorkingSet
	 * @since 1.1
	 */
	public IWorkingSet getAggregateWorkingSet();

	/**
	 * Returns the page "zoomed" state.
	 * 
	 * @return <code>true</code> if the page is zoomed in the workbench
	 *         window, <code>false</code> otherwise.
	 */
	public boolean isPageZoomed();

	/**
	 * Zooms out the zoomed-in part. If the page does not have a zoomed part, it
	 * does nothing.
	 * 
	 */
	public void zoomOut();

	/**
	 * Zoom the page in on a part. If the part is already in zoom then zoom out.
	 * 
	 * @param ref
	 *            the workbench part to zoom in on. Must not be
	 *            <code>null</code>.
	 */
	public void toggleZoom(IWorkbenchPartReference ref);

	/**
	 * Returns the maximized/minimized/restored state of the given part
	 * reference.
	 * 
	 * @param ref
	 *            the workbench part to query. Must not be <code>null</code>.
	 * @return one of the STATE_* contants.
	 */
	public int getPartState(IWorkbenchPartReference ref);

	/**
	 * Set the state of the given part reference. Setting the state of one part
	 * can effect the state of other parts.
	 * 
	 * @param ref
	 *            the workbench part reference. Must not be <code>null</code>.
	 * @param state
	 *            one of the STATE_* constants.
	 */
	public void setPartState(IWorkbenchPartReference ref, int state);

	/**
	 * Find the part reference for the given part. A convenience method to
	 * quickly go from part to part reference.
	 * 
	 * @param part
	 *            The part to search for. It can be <code>null</code>.
	 * @return The reference for the given part, or <code>null</code> if no
	 *         reference can be found.
	 */
	public IWorkbenchPartReference getReference(IWorkbenchPart part);

	/**
	 * Add back an open but non-participating editor
	 * 
	 * @param ref
	 *            the editor to re-add. Must be an editor removed using
	 *            #hideEditor(IEditorReference), must not have been closed,
	 *            and must not be <code>null</code>.
	 * @since 1.4
	 * @see #hideEditor(IEditorReference)
	 */
	public void showEditor(IEditorReference ref);

	/**
	 * Remove an open editor, turn it into a non-participating editor.
	 * <p>
	 * A non-participating editor will not be returned in the list of open
	 * editors ({@link #getEditorReferences()}) and will not be visible in the
	 * editor area. However, it will continue to participate in the save
	 * lifecycle and may still be closed by some workbench close events.
	 * </p>
	 * <p>
	 * Behaviour for hiding and showing editors from multiple stacks is not
	 * defined (and unsupported) at this time.
	 * </p>
	 * 
	 * @param ref
	 *            the editor reference to remove. It must be a current open
	 *            editor belonging to this page, and must not be
	 *            <code>null</code>.
	 * @since 3.5
	 * @see #showEditor(IEditorReference)
	 */
	public void hideEditor(IEditorReference ref);

	/**
	 * Opens editors for the given inputs. Only the editor constructed for the first input 
	 * gets activated. 
	 * <p>
	 * The editor type is determined by mapping <code>editorIDs</code> to an editor
	 * extension registered with the workbench.  An editor id is passed rather than
	 * an editor object to prevent the accidental creation of more than one editor
	 * for the same input. It also guarantees a consistent lifecycle for editors,
	 * regardless of whether they are created by the user or restored from saved 
	 * data.
	 * </p><p>
	 * The length of the input array and editor ID arrays must be the same. The editors
	 * are opened using pairs of { input[i], editorIDs[i] }.
	 * </p>
	 * @param inputs the editor inputs
	 * @param editorIDs the IDs of the editor extensions to use, in the order of inputs
	 * @param matchFlags a bit mask consisting of zero or more of the MATCH_* constants OR-ed together
	 * @return references to the editors constructed for the inputs. The editors 
	 * corresponding to those reference might not be materialized.
	 * @exception MultiPartInitException if at least one editor could not be created or initialized
	 * @see #MATCH_NONE
	 * @see #MATCH_INPUT
	 * @see #MATCH_ID
	 * @since 1.4
	 */
	public IEditorReference[] openEditors(final IEditorInput[] inputs, final String[] editorIDs, 
			final int matchFlags) throws MultiPartInitException;
}
