blob: d63ec974ad8ffb1cde6c575253a8152e184e93b2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 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 213849 - initial API and implementation
* David Carver - STAR - bug 230958 - refactored to fix bug with getting
* the DOM Document for the current editor
* David Carver - STAR - bug 240170 - refactored code to help with narrowing of
* results and easier maintenance.
* David Carver (Intalio) - bug 289498 - Added additional context types.
*******************************************************************************/
package org.eclipse.wst.xsl.ui.internal.contentassist;
import java.util.ArrayList;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.contentassist.IContextInformationValidator;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.wst.xsl.core.XSLCore;
import org.eclipse.wst.xsl.ui.internal.Messages;
import org.eclipse.wst.xsl.ui.provisional.contentassist.AbstractXSLContentAssistProcessor;
import org.eclipse.wst.xsl.ui.provisional.contentassist.IContentAssistProposalRequest;
import org.w3c.dom.NamedNodeMap;
/**
* The XSL Content Assist Processor provides content assistance for various
* attributes values within the XSL Editor. This includes support for xpaths on
* select statements as well as on test and match attributes.
*
* @author David Carver
* @since 1.0
*/
public class XSLContentAssistProcessor extends AbstractXSLContentAssistProcessor implements IContentAssistProcessor {
private static final String attributeXpath = "{"; //$NON-NLS-1$
private ArrayList<ICompletionProposal> xslProposals;
private ArrayList<ICompletionProposal> additionalProposals;
private ArrayList<ICompletionProposal> attributeProposals;
private ArrayList<String> namespaces;
/**
* Provides an XSL Content Assist Processor class that is XSL aware and XML
* aware.
*/
public XSLContentAssistProcessor() {
super();
xslProposals = new ArrayList<ICompletionProposal>();
additionalProposals = new ArrayList<ICompletionProposal>();
namespaces = new ArrayList<String>();
namespaces.add(XSLCore.XSL_NAMESPACE_URI);
}
/**
* CONTENT ASSIST STARTS HERE
*
* Return a list of proposed code completions based on the specified
* location within the document that corresponds to the current cursor
* position within the text-editor control.
*
* @param textViewer
* @param documentPosition
* - the cursor location within the document
*
* @return an array of ICompletionProposal
*/
public ICompletionProposal[] computeCompletionProposals(
ITextViewer textViewer, int documentPosition) {
initializeProposalVariables(textViewer, documentPosition);
additionalProposals = getAdditionalXSLElementProposals();
xslProposals = getXSLNamespaceProposals();
attributeProposals = getAttributeProposals();
ArrayList<ICompletionProposal> proposalList = new ArrayList<ICompletionProposal>();
proposalList.addAll(additionalProposals);
proposalList.addAll(xslProposals);
proposalList.addAll(attributeProposals);
ICompletionProposal[] combinedProposals = combineProposals(proposalList);
if (combinedProposals == null || combinedProposals.length == 0) {
setErrorMessage(Messages.NoContentAssistance);
}
return combinedProposals;
}
private ArrayList<ICompletionProposal> getXSLNamespaceProposals() {
if (XSLCore.isXSLNamespace(xmlNode)) {
XSLContentAssistRequestFactory requestFactory = new XSLContentAssistRequestFactory(
textViewer, cursorPosition, xmlNode, sdRegion,
completionRegion, matchString);
IContentAssistProposalRequest contentAssistRequest = requestFactory
.getContentAssistRequest();
xslProposals = contentAssistRequest.getCompletionProposals();
}
return xslProposals;
}
private ArrayList<ICompletionProposal> getAdditionalXSLElementProposals() {
if (!XSLCore.isXSLNamespace(xmlNode)) {
additionalProposals = new XSLElementContentAssistRequest(xmlNode,
sdRegion, completionRegion, cursorPosition, 0, matchString,
textViewer).getCompletionProposals();
}
return additionalProposals;
}
private ArrayList<ICompletionProposal> getAttributeProposals() {
attributeProposals = new AttributeContentAssist(xmlNode,
sdRegion, completionRegion, cursorPosition, 0, matchString, textViewer).getCompletionProposals();
return attributeProposals;
}
private ICompletionProposal[] combineProposals(
ArrayList<ICompletionProposal> proposalList) {
ICompletionProposal[] combinedProposals = new ICompletionProposal[proposalList
.size()];
proposalList.toArray(combinedProposals);
return combinedProposals;
}
/**
* (non-Javadoc)
*
* @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeContextInformation(org.eclipse.jface.text.ITextViewer,
* int)
*/
public IContextInformation[] computeContextInformation(ITextViewer viewer,
int offset) {
return null;
}
/**
* (non-Javadoc)
*
* @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationAutoActivationCharacters()
*/
public char[] getContextInformationAutoActivationCharacters() {
return null;
}
/**
* (non-Javadoc)
*
* @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationValidator()
*/
public IContextInformationValidator getContextInformationValidator() {
return null;
}
public String getMaximumVersion() {
return "2.0"; //$NON-NLS-1$
}
public String getMinimumVersion() {
return "1.0"; //$NON-NLS-1$
}
public ArrayList<String> getNamespaces() {
return null;
}
protected boolean assistanceOnAttribute(IDOMNode node, ITextRegion aRegion) {
NamedNodeMap nodeMap = node.getAttributes();
for (int i = 0; i < nodeMap.getLength(); i++) {
IDOMAttr attrNode = (IDOMAttr) nodeMap.item(i);
if (attrNode.getValueRegion() != null &&
attrNode.getValueRegion().getStart() == aRegion.getStart()) {
if (attrNode.getValue().contains(attributeXpath)) {
return true;
}
}
}
return false;
}
}