/*******************************************************************************
 * Copyright (c) 2005 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.wst.sse.ui.internal.search;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.search.ui.ISearchQuery;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;

/**
 * <p>
 * Finds occurrences of a specified region type w/ region text in an
 * IStructuredDocument. Clients must implement getPartitionTypes() and
 * getRegionTypes() to indicate which partition types and region types it can
 * operate on.
 * </p>
 * 
 * <p>
 * Clients should override <code>getSearchQuery()</code> in order to provide
 * their own type of "search" (eg. searching for XML start tags, searching for
 * Java elements, etc...)
 * </p>
 * 
 */
abstract public class FindOccurrencesProcessor {
	public boolean findOccurrences(IDocument document, ITextSelection textSelection, IFile file) {
		boolean findOccurrences = false;

		// determine if action should be enabled or not
		if (document instanceof IStructuredDocument) {
			IStructuredDocument structuredDocument = (IStructuredDocument) document;
			IStructuredDocumentRegion sdRegion = structuredDocument.getRegionAtCharacterOffset(textSelection.getOffset());
			if (sdRegion != null) {
				ITextRegion r = sdRegion.getRegionAtCharacterOffset(textSelection.getOffset());
				if (r != null) {
					String type = r.getType();
					if (enabledForRegionType(type)) {
						String matchText = sdRegion.getText(r);

						// first of all activate the view
						NewSearchUI.activateSearchResultView();

						if (matchText != null && type != null) {
							ISearchQuery searchQuery = getSearchQuery(file, structuredDocument, matchText, type, textSelection);
							if (searchQuery != null) {
								if (searchQuery.canRunInBackground())
									NewSearchUI.runQueryInBackground(searchQuery);
								else
									NewSearchUI.runQueryInForeground(null, searchQuery);
							}
							findOccurrences = true;
						}
					}
				}
			}
		}
		return findOccurrences;
	}

	/**
	 * @param regionType
	 * @return <code>true</code> if this action can operate on this region
	 *         type (ITextRegion), otherwise false.
	 */
	private boolean enabledForRegionType(String regionType) {

		String[] accept = getRegionTypes();
		for (int i = 0; i < accept.length; i++) {
			if (regionType.equals(accept[i]))
				return true;
		}
		return false;
	}

	/**
	 * Clients should override this to enable find occurrences on certain
	 * partition(s).
	 */
	abstract protected String[] getPartitionTypes();

	/**
	 * Clients should override this to enable find occurrences on different
	 * region type(s).
	 */
	abstract protected String[] getRegionTypes();

	/**
	 * Clients should override to provide their own search for the file.
	 */
	protected ISearchQuery getSearchQuery(IFile file, IStructuredDocument document, String regionText, String regionType, ITextSelection textSelection) {
		return new OccurrencesSearchQuery(file, document, regionText, regionType);
	}

	/**
	 * @param partitionType
	 * @return <code>true</code> if this action can operate on this type of
	 *         partition, otherwise <code>false</code>.
	 */
	public boolean enabledForParitition(String partitionType) {
		String[] accept = getPartitionTypes();
		for (int i = 0; i < accept.length; i++) {
			if (partitionType.equals(accept[i]))
				return true;
		}
		return false;
	}
}
