/*******************************************************************************
 * Copyright (c) 2001, 2004 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.core.participants;

import java.util.Map;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.wst.sse.core.builder.IBuilderModelProvider;
import org.eclipse.wst.sse.core.builder.IBuilderParticipant;
import org.eclipse.wst.sse.core.text.IStructuredDocument;
import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.text.ITextRegion;
import org.eclipse.wst.sse.core.text.ITextRegionList;


/**
 * Publically usable implementor of IBuilderParticipant. Includes pre- and
 * post-build hooks and iteration through the Structured Document
 */

public class AbstractBuilderParticipant implements IBuilderParticipant {

	private IFile fCurrentFile;
	private IBuilderModelProvider fModelProvider;

	public AbstractBuilderParticipant() {
		super();
	}

	protected boolean build(IFile file, IProject project, IBuilderModelProvider provider, IProgressMonitor monitor) {
		preBuild(file, provider, monitor);
		if (getCurrentFile().isAccessible() && !monitor.isCanceled()) {
			IStructuredDocument document = provider.getDocument(getCurrentFile());
			if (document != null) {
				IStructuredDocumentRegion region = document.getFirstStructuredDocumentRegion();
				while (region != null && !monitor.isCanceled()) {
					build(region);
					region = region.getNext();
				}
			}
		}
		postBuild(file, provider, monitor);
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.sse.core.builder.IBuilderParticipant#build(org.eclipse.core.resources.IResource[],
	 *      org.eclipse.core.resources.IProject,
	 *      org.eclipse.wst.sse.core.builder.IBuilderModelProvider,
	 *      org.eclipse.core.runtime.IProgressMonitor)
	 */
	public boolean build(IResource[] resources, IProject project, IBuilderModelProvider provider, IProgressMonitor monitor) {
		for (int i = 0; i < resources.length; i++) {
			if (!monitor.isCanceled()) {
				build((IFile) resources[i], project, provider, monitor);
			}
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.sse.core.builder.IBuilderParticipant#build(org.eclipse.core.resources.IResourceDelta,
	 *      org.eclipse.core.resources.IProject,
	 *      org.eclipse.wst.sse.core.builder.IBuilderModelProvider,
	 *      org.eclipse.core.runtime.IProgressMonitor)
	 */
	public boolean build(IResourceDelta delta, IProject project, IBuilderModelProvider provider, IProgressMonitor monitor) {
		return build((IFile) delta.getResource(), project, provider, monitor);
	}

	protected void build(IStructuredDocumentRegion region) {
		doBuildFor(region);
		ITextRegionList list = region.getRegions();
		for (int i = 0; i < list.size(); i++) {
			doBuildFor(region, list.get(i));
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.sse.core.builder.IBuilderParticipant#cleanup(org.eclipse.core.resources.IResource[],
	 *      org.eclipse.core.resources.IProject,
	 *      org.eclipse.wst.sse.core.builder.IBuilderModelProvider,
	 *      org.eclipse.core.runtime.IProgressMonitor)
	 */
	public boolean cleanup(IResource[] resources, IProject project, IBuilderModelProvider provider, IProgressMonitor monitor) {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.sse.core.builder.IBuilderParticipant#cleanup(org.eclipse.core.resources.IResourceDelta,
	 *      org.eclipse.core.resources.IProject,
	 *      org.eclipse.wst.sse.core.builder.IBuilderModelProvider,
	 *      org.eclipse.core.runtime.IProgressMonitor)
	 */
	public boolean cleanup(IResourceDelta delta, IProject project, IBuilderModelProvider provider, IProgressMonitor monitor) {
		return false;
	}

	protected void doBuildFor(IStructuredDocumentRegion region) {
	}

	protected void doBuildFor(IStructuredDocumentRegion region, ITextRegion textRegion) {
	}

	/**
	 * @return Returns the currentFile.
	 */
	public IFile getCurrentFile() {
		return fCurrentFile;
	}

	/**
	 * @return Returns the modelProvider.
	 */
	public IBuilderModelProvider getModelProvider() {
		return fModelProvider;
	}

	protected void postBuild(IFile file, IBuilderModelProvider provider, IProgressMonitor monitor) {
		setCurrentFile(null);
		setModelProvider(null);
	}

	protected void preBuild(IFile file, IBuilderModelProvider provider, IProgressMonitor monitor) {
		setCurrentFile(file);
		setModelProvider(provider);
	}

	/**
	 * @param currentFile
	 *            The currentFile to set.
	 */
	protected void setCurrentFile(IFile currentFile) {
		fCurrentFile = currentFile;
	}

	/**
	 * @param modelProvider
	 *            The modelProvider to set.
	 */
	protected void setModelProvider(IBuilderModelProvider modelProvider) {
		fModelProvider = modelProvider;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.sse.core.builder.IBuilderParticipant#shutdown(org.eclipse.core.resources.IProject)
	 */
	public void shutdown(IProject project) {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.sse.core.builder.IBuilderParticipant#startup(org.eclipse.core.resources.IProject,
	 *      int, java.util.Map)
	 */
	public void startup(IProject project, int kind, Map args) {
	}
}
