content: /*******************************************************************************
   * Copyright (c) 2000, 2008 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.jsdt.internal.ui.refactoring.reorg;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import org.eclipse.core.resources.IContainer;
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.core.runtime.CoreException;
  import org.eclipse.wst.jsdt.core.IJavaScriptElement;
  import org.eclipse.wst.jsdt.core.IJavaScriptModel;
  import org.eclipse.wst.jsdt.core.IJavaScriptProject;
  import org.eclipse.wst.jsdt.core.IPackageFragmentRoot;
  import org.eclipse.wst.jsdt.core.JavaScriptCore;
  import org.eclipse.wst.jsdt.core.JavaScriptModelException;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.IReorgDestinationValidator;
  import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
  import org.eclipse.wst.jsdt.ui.StandardJavaScriptElementContentProvider;
  
  
  public final class DestinationContentProvider extends StandardJavaScriptElementContentProvider {
  	
  	private IReorgDestinationValidator fValidator;
  	
  	public DestinationContentProvider(IReorgDestinationValidator validator) {
  		super(true);
  		fValidator= validator;
  	}
  	
  	public boolean hasChildren(Object element) {
  		if (element instanceof IJavaScriptElement){
  			IJavaScriptElement javaElement= (IJavaScriptElement) element;
  			if (! fValidator.canChildrenBeDestinations(javaElement))
  				return false;
  			if (javaElement.getElementType() == IJavaScriptElement.PACKAGE_FRAGMENT_ROOT){
  				if (((IPackageFragmentRoot)javaElement).isArchive())
  					return false;
  			}
  		} else if (element instanceof IResource) {
  			IResource resource= (IResource) element;
  			if (! fValidator.canChildrenBeDestinations(resource))
  				return false;
  		}
  		return super.hasChildren(element);
  	}
  	
  	public Object[] getChildren(Object element) {
  		try {
  			if (element instanceof IJavaScriptModel) {
  				return concatenate(getJavaProjects((IJavaScriptModel)element), getOpenNonJavaProjects((IJavaScriptModel)element));
  			} else {
  				Object[] children= doGetChildren(element);
  				ArrayList result= new ArrayList(children.length);
  				for (int i= 0; i < children.length; i++) {
  					if (children[i] instanceof IJavaScriptElement) {
  						IJavaScriptElement javaElement= (IJavaScriptElement) children[i];
  						if (fValidator.canElementBeDestination(javaElement) || fValidator.canChildrenBeDestinations(javaElement))
  							result.add(javaElement);
  					} else if (children[i] instanceof IResource) {
  						IResource resource= (IResource) children[i];
  						if (fValidator.canElementBeDestination(resource) || fValidator.canChildrenBeDestinations(resource))
  							result.add(resource);
  					}
  				}
  				return result.toArray();
  			}
  		} catch (JavaScriptModelException e) {
  			JavaScriptPlugin.log(e);
  			return new Object[0];
  		}
  	}
  
  	private Object[] doGetChildren(Object parentElement) {
  		if (parentElement instanceof IContainer) {
  			final IContainer container= (IContainer) parentElement;
  			return getResources(container);
  		}
  		return super.getChildren(parentElement);
  	}
  	
  	// Copied from supertype
  	private Object[] getResources(IContainer container) {
  		try {
  			IResource[] members= container.members();
  			IJavaScriptProject javaProject= JavaScriptCore.create(container.getProject());
  			if (javaProject == null || !javaProject.exists())
  				return members;
  			boolean isFolderOnClasspath = javaProject.isOnIncludepath(container);
  			List nonJavaResources= new ArrayList();
  			// Can be on classpath but as a member of non-java resource folder
  			for (int i= 0; i < members.length; i++) {
  				IResource member= members[i];
  				// A resource can also be a java element
  				// in the case of exclusion and inclusion filters.
  				// We therefore exclude Java elements from the list
  				// of non-Java resources.
  				if (isFolderOnClasspath) {
  					if (javaProject.findPackageFragmentRoot(member.getFullPath()) == null) {
  						nonJavaResources.add(member);
  					} 
  				} else if (!javaProject.isOnIncludepath(member)) {
  					nonJavaResources.add(member);
  				}
  			}
  			return nonJavaResources.toArray();
  		} catch(CoreException e) {
  			return NO_CHILDREN;
  		}
  	}
  	
  	private static Object[] getOpenNonJavaProjects(IJavaScriptModel model) throws JavaScriptModelException {
  		Object[] nonJavaProjects= model.getNonJavaScriptResources();
  		ArrayList result= new ArrayList(nonJavaProjects.length);
  		for (int i= 0; i < nonJavaProjects.length; i++) {
  			IProject project = (IProject) nonJavaProjects[i];
  			if (project.isOpen())
  				result.add(project);
  		}
  		return result.toArray();
  	}
  
  }
  