/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
package org.eclipse.search.internal.ui.text;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.Assert;

import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ui.actions.WorkspaceModifyOperation;

import org.eclipse.search.internal.core.ISearchScope;
import org.eclipse.search.internal.core.text.TextSearchEngine;
import org.eclipse.search.internal.ui.SearchMessages;
import org.eclipse.search.internal.ui.SearchPlugin;
import org.eclipse.search.internal.ui.SearchPluginImages;

/**
 * An operation to perform a regular text search.
 */
public class TextSearchOperation extends WorkspaceModifyOperation {

	public static final int NO_PRIORITY_CHANGE= -1;
	
	private IWorkspace fWorkspace;
	private String fPattern;
	private String fOptions;
	private ISearchScope fScope;
	private TextSearchResultCollector fCollector;
	
	/**
	 * Creates a new text search operation.
	 */
	public TextSearchOperation(IWorkspace workspace,  String pattern, String options, 
			ISearchScope scope, TextSearchResultCollector collector)  {
		Assert.isNotNull(collector);
		fWorkspace= workspace;
		fPattern= pattern;
		fOptions= options;
		fScope= scope;
		fCollector= collector;
		fCollector.setOperation(this);
	}
	
	/**
	 * The actual algorithm.
	 */
	protected void execute(IProgressMonitor monitor) throws CoreException {
		fCollector.setProgressMonitor(monitor);		
		TextSearchEngine engine= new TextSearchEngine();
		engine.search(fWorkspace, fPattern, fOptions, fScope, fCollector);
	}	

	String getSingularLabel() {
		return SearchMessages.getFormattedString("TextSearchOperation.singularLabelPostfix", new String[] {fPattern, fScope.getDescription()}); //$NON-NLS-2$ //$NON-NLS-1$
	}

	String getPluralLabelPattern() {
		return SearchMessages.getFormattedString("TextSearchOperation.pluralLabelPatternPostfix", new String[] {fPattern, "{0}", fScope.getDescription()}); //$NON-NLS-2$ //$NON-NLS-1$
	}
	
	ImageDescriptor getImageDescriptor() {
		return SearchPluginImages.DESC_OBJ_TSEARCH_DPDN;
	}
}