/*******************************************************************************
 *Copyright (c) 2008 Standards in Technology in Automotive Retail 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:
 *    David Carver (STAR) - bug 243575 - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.ui.internal.contentassist;

import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
import org.eclipse.wst.xsl.core.XSLCore;
import org.eclipse.wst.xsl.core.model.StylesheetModel;
import org.eclipse.wst.xsl.core.model.Template;
import org.eclipse.wst.xsl.core.model.XSLAttribute;
import org.eclipse.wst.xsl.ui.internal.util.XSLPluginImageHelper;
import org.eclipse.wst.xsl.ui.internal.util.XSLPluginImages;
import org.w3c.dom.Node;

/**
 * CallTemplateContentAssistance provides content assist proposals for
 * <xsl:call-with> templates.   It will provide a list of all available
 * named templates.
 * 
 * @author David Carver
 *
 */
public class CallTemplateContentAssistRequest extends
		AbstractXSLContentAssistRequest {
	
	private static final String ATTR_MODE = "mode";
	private static final String ATTR_NAME = "name";

	/**
	 * @param node
	 * @param parent
	 * @param documentRegion
	 * @param completionRegion
	 * @param begin
	 * @param length
	 * @param filter
	 * @param textViewer
	 */
	public CallTemplateContentAssistRequest(Node node, Node parent,
			IStructuredDocumentRegion documentRegion,
			ITextRegion completionRegion, int begin, int length, String filter,
			ITextViewer textViewer) {
		super(node, parent, documentRegion, completionRegion, begin, length,
				filter, textViewer);
		// TODO Auto-generated constructor stub
	}
	
	/** 
	 * (non-Javadoc)
	 * @see org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest#getCompletionProposals()
	 */
	@Override
	public ICompletionProposal[] getCompletionProposals() {
		proposals.clear();
		
		IFile editorFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(getLocation()));
		
		StylesheetModel model = XSLCore.getInstance().getStylesheet(editorFile);

		List<Template> templates = model.getTemplates();
		
		for (Template template : templates) {
			XSLAttribute attribute = template.getAttribute(ATTR_NAME);
			if (attribute != null) {
				String proposalInfo = getAdditionalInfo(template);
				CustomCompletionProposal proposal = new CustomCompletionProposal(
						attribute.getValue(), getStartOffset() + 1, 0,
						attribute.getValue().length(), XSLPluginImageHelper
								.getInstance().getImage(
										XSLPluginImages.IMG_TEMPLATE), attribute
								.getValue(), null, proposalInfo, 0);
				addProposal(proposal);
			}
		}
		return super.getCompletionProposals();
	}
	
	protected String getAdditionalInfo(Template template) {
		XSLAttribute nameAttribute = template.getAttribute(ATTR_NAME);
		
		String proposalInfo = "Template Name: " + nameAttribute.getValue() +
		                      "\r\n" + "File:" + template.getStylesheet().getFile().getName();
		
		return proposalInfo;
	}

}
