/*******************************************************************************
 * Copyright (c) 2004 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.jst.jsp.ui.internal.java.search;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.search.SearchDocument;
import org.eclipse.jst.jsp.core.internal.java.search.JSPSearchScope;
import org.eclipse.jst.jsp.core.internal.java.search.JSPSearchSupport;
import org.eclipse.jst.jsp.ui.internal.Logger;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
import org.eclipse.wst.sse.ui.internal.search.BasicSearchQuery;

/**
 * Implementation of <code>ISearchQuery</code> for <code>IJavaElement</code>s in JSP files.
 * 
 * @author pavery
 */
public class JSPSearchQuery extends BasicSearchQuery {
	
	private class SingleFileSearch implements IWorkspaceRunnable {

		public void run(IProgressMonitor monitor) throws CoreException {

			try {
				if (getFile() != null && getJavaElement() != null) {
					
					JSPSearchSupport support = JSPSearchSupport.getInstance();
					// index the file
					SearchDocument delegate =  support.addJspFile(getFile());
					String scopePath = delegate.getPath();
					JSPSearchScope singleFileScope = new JSPSearchScope(new String[]{getFile().getFullPath().toString(), scopePath});
					
					// perform a search
					// by passing in this jsp search query, requstor can add matches
					support.searchRunnable(getJavaElement(), singleFileScope, new JSPSingleFileSearchRequestor(getInstance()));
				}
			}
			catch(CoreException e) {
				Logger.logException(e);
			}
		}
	}
	
	/** the IJavaElement we are searching for in the file **/
	private IJavaElement fElement = null;
	
	public JSPSearchQuery(IFile file, IJavaElement element) {
		super(file);
		this.fElement = element;
	}
	
	public IJavaElement getJavaElement() {
		return this.fElement;
	}
	
	// for access by inner class
	public JSPSearchQuery getInstance() {
		return this;
	}

	/**
	 * @see com.ibm.sse.editor.internal.search.BasicSearchQuery#getRunnable()
	 */
	protected IWorkspaceRunnable getRunnable() {
		return new SingleFileSearch();
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.sse.editor.internal.search.BasicSearchQuery#doQuery()
	 */
	protected IStatus doQuery() {
		
		clearMatches();
		
		IStatus status = Status.OK_STATUS;
		try {
			JSPSearchSupport support = JSPSearchSupport.getInstance();
			// index the file
			SearchDocument delegate =  support.addJspFile(getFile());
			String scopePath = delegate.getPath();
			JSPSearchScope singleFileScope = new JSPSearchScope(new String[]{getFile().getFullPath().toString(), scopePath});
			
			// perform a searchs
			// by passing in this jsp search query, requstor can add matches
			support.searchRunnable(getJavaElement(), singleFileScope, new JSPSingleFileSearchRequestor(getInstance()));
		}
		catch (Exception e){
			status = new Status(IStatus.ERROR, "org.eclipse.wst.sse.ui", IStatus.OK, "", null); //$NON-NLS-1$	//$NON-NLS-2$
		}
		return status;
	}
	
	/**
	 * @see org.eclipse.search.ui.ISearchQuery#getLabel()
	 */
	public String getLabel() {
		String[] args = {getSearchText(), getOccurrencesCountText(), getFilename()};
		return SSEUIPlugin.getResourceString("%OccurrencesSearchQuery.0", args);
	}

	private String getFilename() {
		String filename = SSEUIPlugin.getResourceString("%OccurrencesSearchQuery.2"); //$NON-NLS-1$
		if(getFile() != null)
			filename = getFile().getName();
		return filename;
	}
	
	private String getOccurrencesCountText() {
		String count = ""; //$NON-NLS-1$
		// pa_TODO make dynamic
		return count;
	}

	/**
	 * @see com.ibm.sse.editor.internal.search.BasicSearchQuery#getSearchText()
	 */
	protected String getSearchText() {
		return this.fElement.getElementName();
	}
	
	/**
	 * @see org.eclipse.search.ui.ISearchQuery#canRerun()
	 */
	public boolean canRerun() {
		
		return false;
	}

	/**
	 * @see org.eclipse.search.ui.ISearchQuery#canRunInBackground()
	 */
	public boolean canRunInBackground() {
		return true;
	}

	/**
	 * @see org.eclipse.search.ui.ISearchQuery#getSearchResult()
	 */
	public ISearchResult getSearchResult() {
		
		return new JSPOccurrencesSearchResult(this);
	}

}
