/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.common.ui.internal.dialogfield;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.search.IJavaSearchScope;

/**
 * @author mengbo
 * @version 1.5
 */
/*package*/ class JavaSearchScopeDecorator implements IJavaSearchScope {
	JavaSearchScope[] _scopes = new JavaSearchScope[0];

	/**
	 * @param project
	 * @param superTypes
	 */
	public JavaSearchScopeDecorator(IProject project, List superTypes) {
		List scopeList = new ArrayList();
		if (superTypes != null) {
			for (int i = 0; i < superTypes.size(); i++) {
				scopeList.add(new JavaSearchScope(project, superTypes.get(i)
						.toString()));
			}
		}
		_scopes = (JavaSearchScope[]) scopeList
				.toArray(new JavaSearchScope[scopeList.size()]);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(java.lang.String)
	 */
	public boolean encloses(String resourcePath) {
		for (int i = 0; i < _scopes.length; i++) {
			if (_scopes[i].encloses(resourcePath) == true) {
				return true;
			}
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(org.eclipse.jdt.core.IJavaElement)
	 */
	public boolean encloses(IJavaElement element) {
		for (int i = 0; i < _scopes.length; i++) {
			if (_scopes[i].encloses(element) == true) {
				return true;
			}
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#enclosingProjectsAndJars()
	 */
	public IPath[] enclosingProjectsAndJars() {
		Set set = new HashSet();
		for (int i = 0; i < _scopes.length; i++) {
			set.addAll(Arrays.asList(_scopes[i].enclosingProjectsAndJars()));
		}
		return (IPath[]) set.toArray(new IPath[set.size()]);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesBinaries()
	 */
	public boolean includesBinaries() {
		for (int i = 0; i < _scopes.length; i++) {
			if (_scopes[i].includesBinaries() == true) {
				return true;
			}
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesClasspaths()
	 */
	public boolean includesClasspaths() {
		for (int i = 0; i < _scopes.length; i++) {
			if (_scopes[i].includesClasspaths() == true) {
				return true;
			}
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesBinaries(boolean)
	 */
	public void setIncludesBinaries(boolean includesBinaries) {
		for (int i = 0; i < _scopes.length; i++) {
			_scopes[i].setIncludesBinaries(includesBinaries);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesClasspaths(boolean)
	 */
	public void setIncludesClasspaths(boolean includesClasspaths) {
		for (int i = 0; i < _scopes.length; i++) {
			_scopes[i].setIncludesClasspaths(includesClasspaths);
		}
	}

}
