package net.sourceforge.phpeclipse.builder;

import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil;
import net.sourceforge.phpeclipse.phpeditor.PHPParserAction;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;

/**
 *
 * @see org.eclipse.core.resources.IResourceDelta
 * @see org.eclipse.core.resources.IResourceDeltaVisitor
 */
public class ParserVisitor implements IResourceDeltaVisitor {
  final IProgressMonitor fMonitor;
  public ParserVisitor(IProgressMonitor monitor) {
    fMonitor = monitor;
  }
  
	protected void checkCancel() {
				if (fMonitor.isCanceled()) {
					 throw new OperationCanceledException();
				}
		 }
  /** 
   * Visits the given resource delta.
   * 
   * @return <code>true</code> if the resource delta's children should
   *		be visited; <code>false</code> if they should be skipped.
   * @exception CoreException if the visit fails for some reason.
   */
  public boolean visit(IResourceDelta delta) throws CoreException {

    IResource resource = delta.getResource();
    int resourceType = resource.getType();
		checkCancel();
		
    switch (delta.getKind()) {
      case IResourceDelta.ADDED :
        if (resourceType == IResource.FILE) {
          if ((resource.getFileExtension() != null)
            && PHPFileUtil.isPHPFile((IFile) resource)) {
						fMonitor.worked(1);
            fMonitor.subTask("Parsing: " + resource.getFullPath());
            PHPParserAction.parseFile((IFile) resource);
          }
        }
        break;

      case IResourceDelta.CHANGED :
        if (resourceType == IResource.FILE) {
          if ((resource.getFileExtension() != null)
            && PHPFileUtil.isPHPFile((IFile) resource)) {
			  		fMonitor.worked(1);
            fMonitor.subTask("Parsing: " + resource.getFullPath());
            PHPParserAction.parseFile((IFile) resource);
          }
        }
        break;

      case IResourceDelta.REMOVED :
        }
    return true; // carry on
  }

}