/*******************************************************************************
 * 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.xml.ui.contentassist;

import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.templates.ContextTypeRegistry;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.TemplateCompletionProcessor;
import org.eclipse.jface.text.templates.TemplateContext;
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.jface.text.templates.persistence.TemplateStore;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;


/**
 * A completion processor that computes template proposals and works with
 * AbstractContentAssistProcessor
 */
abstract public class AbstractTemplateCompletionProcessor extends TemplateCompletionProcessor {
	private String fContextTypeId = null;
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.text.templates.TemplateCompletionProcessor#createProposal(org.eclipse.jface.text.templates.Template, org.eclipse.jface.text.templates.TemplateContext, org.eclipse.jface.text.IRegion, int)
	 */
	protected ICompletionProposal createProposal(Template template, TemplateContext context, IRegion region, int relevance) {
		// CustomTemplateProposal turns the additional information to content
		// fit for HTML
		return new CustomTemplateProposal(template, context, region, getImage(template), relevance);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.templates.TemplateCompletionProcessor#getContextType(org.eclipse.jface.text.ITextViewer,
	 *      org.eclipse.jface.text.IRegion)
	 */
	protected TemplateContextType getContextType(ITextViewer viewer, IRegion region) {
		// another completion processor should have already set the current
		// context type id, so just use that value instead of trying to
		// determine
		// the context type again
		if (getTemplateContextRegistry() != null) {
			return getTemplateContextRegistry().getContextType(getContextTypeId());
		}
		return null;
	}

	protected String getContextTypeId() {
		return fContextTypeId;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.templates.TemplateCompletionProcessor#getImage(org.eclipse.jface.text.templates.Template)
	 */
	protected Image getImage(Template template) {
		// just return the same image for now
		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_MACRO);
	}

	/**
	 * Return the template context registry to use with this completion
	 * processor
	 * 
	 * @return ContextTypeRegistry
	 */
	abstract protected ContextTypeRegistry getTemplateContextRegistry();

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.templates.TemplateCompletionProcessor#getTemplates(java.lang.String)
	 */
	protected Template[] getTemplates(String contextTypeId) {
		if (getTemplateStore() != null) {
			return getTemplateStore().getTemplates(contextTypeId);
		}
		return null;
	}

	/**
	 * Return the template store to use with this template completion
	 * processor
	 * 
	 * @return TemplateStore
	 */
	abstract protected TemplateStore getTemplateStore();

	/**
	 * Set the current context type to use when determining completion
	 * proposals.
	 * 
	 * @param contextTypeId
	 */
	public void setContextType(String contextTypeId) {
		fContextTypeId = contextTypeId;
	}
}
