/*******************************************************************************
 * Copyright (c) 2002-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 - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsi.ui.internal;

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;

import java.util.Collection;

public class ResourceFilter extends ViewerFilter 
{
  protected String[] fExtensions;
  protected IFile[] fExcludedFiles;
  protected Collection fExcludes;
	
  public ResourceFilter(String[] extensions, Collection exclude) 
  {
    fExtensions= extensions;
    fExcludes= exclude;
    fExcludedFiles = null;
  }

  public ResourceFilter(String[] extensions, IFile[] excludedFiles, Collection exclude) 
  {
    fExtensions= extensions;
    fExcludes= exclude;
    fExcludedFiles = excludedFiles;
  }
	
  public boolean isFilterProperty(Object element, Object property) 
  {
    return false;
  }
	
  public boolean select(Viewer viewer, Object parent, Object element) 
  {
    if (element instanceof IFile) 
    {
      if (fExcludes != null && fExcludes.contains(element)) 
      {
	return false;
      }
      String name= ((IFile)element).getName();
      if (fExcludedFiles != null) 
      {
        for (int j= 0; j < fExcludedFiles.length; j++) 
        {
          if ( ((IFile)element).getLocation().
               toString().compareTo(((IFile)fExcludedFiles[j]).getLocation().toString()) == 0 )
           return false;             
        }            
      }
      if (fExtensions.length == 0) 
      {
        // assume that we don't want to filter any files based on 
        // extension
        return true;
      }
      for (int i= 0; i < fExtensions.length; i++) 
      {
        if (name.endsWith(fExtensions[i]))
        {
          return true;
        }
      } 
      return false;
    } 
    else if (element instanceof IContainer) 
    { // IProject, IFolder
      try 
      {
      	IResource[] resources= ((IContainer)element).members();
	for (int i= 0; i < resources.length; i++) 
        {
	  // recursive!
	  if (select(viewer, parent, resources[i])) 
          {
	    return true;
	  }
	}
      } 
      catch (CoreException e) 
      {
      }				
    }
    return false;
  }
}
