blob: 8157e2a8a8525712b966710319c96532817e2381 [file] [log] [blame]
/*******************************************************************************
*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();
}
}