blob: d4e499593bc9200b09a5ee483d8bec0a8f3b01af [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2017 xored software, Inc. 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:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.ui.text.templates;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
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.jface.text.templates.TemplateContextType;
import org.eclipse.jface.text.templates.TemplateVariableResolver;
public class TemplateVariableProcessor implements IContentAssistProcessor {
private static Comparator<TemplateVariableProposal> fgTemplateVariableProposalComparator = (
proposal0, proposal1) -> proposal0.getDisplayString()
.compareTo(proposal1.getDisplayString());
/** the context type */
private TemplateContextType fContextType;
/**
* Sets the context type.
*
* @param contextType
* the context type
*/
public void setContextType(TemplateContextType contextType) {
fContextType = contextType;
}
/**
* Gets the context type.
*
* @return the context type
*/
public TemplateContextType getContextType() {
return fContextType;
}
@Override
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
int documentOffset) {
if (fContextType == null)
return null;
List<TemplateVariableProposal> proposals = new ArrayList<>();
String text = viewer.getDocument().get();
int start = getStart(text, documentOffset);
int end = documentOffset;
String string = text.substring(start, end);
int colon = string.indexOf(':');
boolean includeBrace = true;
int offset = start;
String prefix = string;
if (colon != -1) {
includeBrace = false;
offset = start + colon + 1;
prefix = string.substring(colon + 1);
} else {
int escape = string.indexOf("${"); //$NON-NLS-1$
if (escape != -1) {
offset = start + escape + 2;
includeBrace = false;
prefix = string.substring(escape + 2);
}
}
if (prefix.equals("$")) //$NON-NLS-1$
prefix = ""; //$NON-NLS-1$
int length = end - offset;
for (Iterator<TemplateVariableResolver> iterator = fContextType
.resolvers(); iterator.hasNext();) {
TemplateVariableResolver variable = iterator.next();
if (variable.getType().startsWith(prefix))
proposals.add(new TemplateVariableProposal(variable, offset,
length, viewer, includeBrace));
}
Collections.sort(proposals, fgTemplateVariableProposalComparator);
return proposals.toArray(new ICompletionProposal[proposals.size()]);
}
/* Guesses the start position of the completion */
private int getStart(String string, int end) {
int start = end;
if (start >= 1 && string.charAt(start - 1) == '$')
return start - 1;
while ((start != 0)
&& Character.isUnicodeIdentifierPart(string.charAt(start - 1)))
start--;
if (start >= 1 && string.charAt(start - 1) == ':') {
start--;
while ((start != 0) && Character
.isUnicodeIdentifierPart(string.charAt(start - 1)))
start--;
}
if (start >= 2 && string.charAt(start - 1) == '{'
&& string.charAt(start - 2) == '$')
return start - 2;
return end;
}
@Override
public IContextInformation[] computeContextInformation(ITextViewer viewer,
int documentOffset) {
return null;
}
@Override
public char[] getCompletionProposalAutoActivationCharacters() {
return new char[] { '$' };
}
@Override
public char[] getContextInformationAutoActivationCharacters() {
return null;
}
@Override
public String getErrorMessage() {
return null;
}
@Override
public IContextInformationValidator getContextInformationValidator() {
return null;
}
}