/*******************************************************************************
 * Copyright (c) 2000, 2008 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.core.resources.IMarker;
import org.eclipse.core.resources.IResource;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;

import org.eclipse.ui.IViewPart;

/**
 * Provides client access to the search result view.
 * Each element in the view is a <code>ISearchResultViewEntry</code>,
 * which groups markers based on the <code>groupByKey</code> provided
 * by the client each time when adding a match. If every match should
 * show up in the search result view then the match itself can be used
 * as key.
 * <p>
 * The search result view has id <code>"org.eclipse.search.SearchResultView"</code>.
 * </p>
 * <p>
 * This interface is not intended to be implemented by clients.
 * </p>
 * @deprecated Part of the old ('classic') search result view. Since 3.0 clients can create their own search result view pages.
 * To access the parent view, {@link org.eclipse.search.ui.ISearchResultViewPart} is used instead.
 *
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */
@Deprecated
public interface ISearchResultView extends IViewPart {

	/**
	 * Informs the view that a search has started.
	 * Provides all necessary information to create an entry in the search result
	 * view.
	 * If every match should show up in the search result view then the match
	 * itself can be used as key.
	 *
	 * @param	groupFactory			the action group factory
	 *								  		or <code>null</code> if no factory is provided.
	 * @param	singularLabel			the label to be used for this search occurrence
	 * 									  if there is one match
	 *									  or <code>null</code> if the pluralLabelPattern should be used
	 * @param	pluralLabelPattern		the label pattern to be used for this search occurrence
	 * 									  if there are more than one matches or none.
	 * 									  This string may contain {0} which will be replace by the match count
	 * @param	imageDescriptor			the image descriptor to be used for this search occurrence,
	 *									  or <code>null</code> if this search should not have an image
	 * @param	pageId					the id of the search page which started the search
	 * @param	labelProvider			the label provider used by this search result view
	 *									  or <code>null</code> if the default provider should be used.
	 *									  The default label provider shows the resource name and the corresponding image.
	 * @param	gotoAction				the action used by the view to go to a marker
	 * @param	groupByKeyComputer		the computer used by the view to compute the key for a marker
	 * @param	operation				the runnable used by the view to repeat the search
	 *
	 * @see IActionGroupFactory
	 * @since 2.0
	 */
	public void searchStarted(
				IActionGroupFactory		groupFactory,
				String					singularLabel,
				String					pluralLabelPattern,
				ImageDescriptor			imageDescriptor,
				String					pageId,
				ILabelProvider			labelProvider,
				IAction					gotoAction,
				IGroupByKeyComputer		groupByKeyComputer,
				IRunnableWithProgress	operation);

	/**
	 * Returns the current selection of the search result view
	 *
	 * @return	the current selection of the search result view
	 * @see	org.eclipse.jface.viewers.ISelectionProvider#getSelection
	 */
	public ISelection getSelection();

	/**
	 * Informs the view that a search has started. Provides all necessary
	 * information to create an entry in the search result view. If every match
	 * should show up in the search result view then the match itself can be
	 * used as key.
	 *
	 * @param pageId
	 *            the id of the search page which started the search
	 * @param label
	 *            the label to be used for this search occurrence
	 * @param imageDescriptor
	 *            the image descriptor to be used for this search occurrence, or
	 *            <code>null</code> if this search should not have an image
	 * @param contributor
	 *            the context menu contributor or <code>null</code> if no
	 *            context menu is contributed
	 * @param labelProvider
	 *            the label provider used by this search result view or
	 *            <code>null</code> if the default provider should be used. The
	 *            default label provider shows the resource name and the
	 *            corresponding image.
	 * @param gotoAction
	 *            the action used by the view to go to a marker
	 * @param groupByKeyComputer
	 *            the computer used by the view to compute the key for a marker
	 * @param operation
	 *            the runnable used by the view to repeat the search
	 * @deprecated As of build &gt; 20011107, replaced by the new version with
	 *             additional parameter
	 */
	@Deprecated
	public void searchStarted(
				String					pageId,
				String					label,
				ImageDescriptor			imageDescriptor,
				IContextMenuContributor contributor,
				ILabelProvider			labelProvider,
				IAction					gotoAction,
				IGroupByKeyComputer		groupByKeyComputer,
				IRunnableWithProgress	operation);

	/**
	 * Informs the view that a search has started. Provides all necessary
	 * information to create an entry in the search result view. If every match
	 * should show up in the search result view then the match itself can be
	 * used as key.
	 *
	 * @param pageId
	 *            the id of the search page which started the search
	 * @param singularLabel
	 *            the label to be used for this search occurrence if there is
	 *            one match or <code>null</code> if the pluralLabelPattern
	 *            should be used
	 * @param pluralLabelPattern
	 *            the label pattern to be used for this search occurrence if
	 *            there are more than one matches or none. This string may
	 *            contain {0} which will be replace by the match count
	 * @param imageDescriptor
	 *            the image descriptor to be used for this search occurrence, or
	 *            <code>null</code> if this search should not have an image
	 * @param contributor
	 *            the context menu contributor or <code>null</code> if no
	 *            context menu is contributed
	 * @param labelProvider
	 *            the label provider used by this search result view or
	 *            <code>null</code> if the default provider should be used. The
	 *            default label provider shows the resource name and the
	 *            corresponding image.
	 * @param gotoAction
	 *            the action used by the view to go to a marker
	 * @param groupByKeyComputer
	 *            the computer used by the view to compute the key for a marker
	 * @param operation
	 *            the runnable used by the view to repeat the search
	 * @since 2.0
	 * @deprecated As of build &gt; 20020514, replaced by the new version which
	 *             provides an action group factory
	 */
	@Deprecated
	public void searchStarted(
				String					pageId,
				String					singularLabel,
				String					pluralLabelPattern,
				ImageDescriptor			imageDescriptor,
				IContextMenuContributor contributor,
				ILabelProvider			labelProvider,
				IAction					gotoAction,
				IGroupByKeyComputer		groupByKeyComputer,
				IRunnableWithProgress	operation);

	/**
	 * Informs the view that the search has finished.
	 * This method must also be called in case of the search
	 * fails or has been canceled.
	 */
	public void searchFinished();

	/**
	 * Informs the view that a match has been found.
	 * Provides all necessary information to create a search result entry in this
	 * view.
	 * <p>
	 * Note: It is the clients responsibility to create the marker for this match.
	 * </p>
	 *
	 * @param	description		the text description of the match
	 * @param	groupByKey		the <code>Object</code> by which this match is grouped
	 * @param	marker			the marker for this match
	 * @param	resource		the marker's resource passed for optimization
	 */
	public void addMatch(String description, Object groupByKey, IResource resource, IMarker marker);

	/**
	 * Returns the label provider of a search result view.
	 *
	 * @return	the label provider of a search result view or <code>null</code>
	 * @since 2.0
	 */
	public ILabelProvider getLabelProvider();
}
