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

import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.viewers.ISelection;

import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkingSet;

/**
 * Offers client access to the search dialog.
 * A search page can enable or disable the dialog's action
 * button and get an operation context to perform the action.
 * The dialog itself cannot be accessed directly.
 * <p>
 * This interface is not intended to be implemented by clients.
 * </p>
 *
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */
public interface ISearchPageContainer {

	/**
	 * Workspace scope (value <code>0</code>).
	 *
	 * @since 2.0
	 */
	public static final int WORKSPACE_SCOPE= 0;

	/**
	 * Selection scope (value <code>1</code>).
	 *
	 * @since 2.0
	 */
	public static final int SELECTION_SCOPE= 1;

	/**
	 * Working set scope (value <code>2</code>).
	 *
	 * @since 2.0
	 */
	public static final int WORKING_SET_SCOPE= 2;

	/**
	 * Current Project scope (value <code>3</code>).
	 *
	 * @since 3.0
	 */
	public static final int SELECTED_PROJECTS_SCOPE= 3;

	/**
	 * Returns the selection with which this container was opened.
	 *
	 * @return the selection passed to this container when it was opened
	 */
	public ISelection getSelection();

	/**
	 * Returns the context for the search operation.
	 * This context allows progress to be shown inside the search dialog.
	 *
	 * @return	the <code>IRunnableContext</code> for the search operation
	 */
	public IRunnableContext getRunnableContext();

	/**
	 * Sets the enable state of the perform action button
	 * of this container.
	 *
	 * @param	state	<code>true</code> to enable the button which performs the action
	 */
	 public void setPerformActionEnabled(boolean state);

	/**
	 * Returns search container's selected scope.
	 * The scope is WORKSPACE_SCOPE, SELECTED_PROJECTS_SCOPE, SELECTION_SCOPE or WORKING_SET_SCOPE.
	 *
	 * @return the selected scope
	 * @since 2.0
	 */
	public int getSelectedScope();

	/**
	 * Sets the selected scope of this search page container.
	 * The scope is WORKSPACE_SCOPE, SELECTED_PROJECTS_SCOPE, SELECTION_SCOPE or WORKING_SET_SCOPE.
	 * @param scope the newly selected scope
	 *
	 * @since 2.0
	 */
	public void setSelectedScope(int scope);

	/**
	 * Tells whether a valid scope is selected.
	 *
	 * @return a <code>true</code> if a valid scope is selected in this search page container
	 * @since 2.0
	 */
	public boolean hasValidScope();

	/**
	 * Tells this container whether the active editor can provide the selection for the scope and
	 * hence the {@link #SELECTION_SCOPE} can be enabled if the active part is an editor.
	 *
	 * @param state <code>true</code> if the active editor can provide the selection,
	 *            <code>false</code> otherwise
	 * @since 3.7
	 */
	public void setActiveEditorCanProvideScopeSelection(boolean state);

	/**
	 * Returns the editor input of the active editor.
	 *
	 * @return the editor input or <code>null</code> if the active part is not an editor
	 * @since 3.7
	 */
	public IEditorInput getActiveEditorInput();

	/**
	 * Returns the selected working sets of this container.
	 *
	 * @return an array with the selected working sets or <code>null</code> if the scope is not {@link #WORKING_SET_SCOPE}
	 * @since 2.0
	 */
	public IWorkingSet[] getSelectedWorkingSets();

	/**
	 * Sets the selected working sets of this container.
	 *
	 * @param workingSets an array of IWorkingSet
	 * @since 2.0
	 */
	public void setSelectedWorkingSets(IWorkingSet[] workingSets);

	/**
	 * Returns the names of the enclosing projects if selected by the container or <code>null</code>
	 * if the scope is not {@link #SELECTED_PROJECTS_SCOPE}
	 *
	 * @return the names of the enclosing project or <code>null</code> if the scope is not {@link #SELECTED_PROJECTS_SCOPE}.
	 * @since 3.2
	 */
	public String[] getSelectedProjectNames();

}
