/*******************************************************************************
 *Copyright (c) 2008 Standards for 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 244978 - initial API and implementation
 *                          bug 263843 - Fix null pointer exception on region
 *******************************************************************************/
package org.eclipse.wst.xsl.ui.internal.contentassist;

import java.util.ArrayList;
import java.util.Collections;

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.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
import org.eclipse.wst.xsl.ui.internal.contentassist.contentmodel.XSLContentModelGenerator;
import org.w3c.dom.Node;
 

/**
 * This class provides content assistance proposals outside of the XSL namespace.  Normal
 * XML editor content assistance only provides proposals for items within the same namespace
 * or if an element has children elements.   This class extends this functionality by checking
 * for the first XSL ancestor and uses that to determine what proposals should be
 * provided in the way of xsl elements.
 * 
 * @author David Carver
 * @since 1.0
 */
public class XSLElementContentAssistRequest extends
		AbstractXMLElementContentAssistRequest {

	/**
	 * @param node
	 * @param parent
	 * @param documentRegion
	 * @param completionRegion
	 * @param begin
	 * @param length
	 * @param filter
	 * @param textViewer
	 */
	public XSLElementContentAssistRequest(Node node,
			IStructuredDocumentRegion documentRegion,
			ITextRegion completionRegion, int begin, int length, String filter,
			ITextViewer textViewer) {
		super(node, documentRegion, completionRegion, begin, length,
				filter, textViewer);
		contentModel = new XSLContentModelGenerator();
	}


	/**
	 * Calculate proposals for open content regions.
	 */
	protected void computeTagOpenProposals() {

		if (replacementBeginPosition == documentRegion.getStartOffset(region)) {
			if (node.getNodeType() == Node.ELEMENT_NODE) {
				// at the start of an existing tag, right before the '<'
				computeTagNameProposals();
			}
		} else {
			// within the white space
			ITextRegion name = getNameRegion(((IDOMNode) node)
					.getStartStructuredDocumentRegion());
			if ((name != null)
					&& ((documentRegion.getStartOffset(name) <= replacementBeginPosition) && (documentRegion
							.getEndOffset(name) >= replacementBeginPosition))) {
				// replace the existing name
				replacementBeginPosition = documentRegion.getStartOffset(name);
				replacementLength = name.getTextLength();
			} else {
				// insert a valid new name, or possibly an end tag
				// addEndTagProposals(contentAssistRequest);
				setReplacementLength(0);
			}
			addTagNameProposals(getElementPosition(node));
		}
	}

	/**
	 * Provides a list of possible proposals for the XSL Elements within the current
	 * scope.
	 */
	@Override
	public ArrayList<ICompletionProposal> getCompletionProposals() {
		if (region == null) {
			return new ArrayList<ICompletionProposal>();
		}
		
		if (region.getType() == DOMRegionContext.XML_TAG_OPEN) {
			computeTagOpenProposals();
		} else if (region.getType() == DOMRegionContext.XML_TAG_NAME) {
			computeTagNameProposals();
		}
		return getAllCompletionProposals();
	}
	
	
	/**
	 * Calculates the proposals for the XML Tag Name Region.
	 */
	protected void computeTagNameProposals() {
		// completing the *first* tag in "<tagname1 |<tagname2"
		
		// Ignore attributes
		if (inAttributeRegion()) {
			return;
		}
		
		addTagNameProposals(this.getElementPosition(node));
		// addEndTagNameProposals();

	}

}
