package org.erlide.ui.templates;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.templates.DocumentTemplateContext;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.TemplateBuffer;
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.jface.text.templates.TemplateException;
import org.eclipse.jface.text.templates.TemplateTranslator;
import org.erlide.runtime.rpc.RpcException;
import org.erlide.ui.actions.IndentHandler;
import org.erlide.util.ErlLogger;
public class ErlangTemplateContext extends DocumentTemplateContext {
public ErlangTemplateContext(final TemplateContextType contextType,
final IDocument document, final int offset, final int length) {
super(contextType, document, offset, length);
}
@Override
public TemplateBuffer evaluate(final Template template) throws BadLocationException,
TemplateException {
return evaluate(template, false);
}
public TemplateBuffer evaluate(final Template template0, final boolean indentFrom0)
throws BadLocationException, TemplateException {
Template template = template0;
if (!canEvaluate(template)) {
return null;
}
if (ErlTemplateCompletionPreferences.getIndentCode()) {
template = indentTemplatePattern(template, indentFrom0);
}
final TemplateTranslator translator = new TemplateTranslator();
final TemplateBuffer buffer = translator.translate(template);
getContextType().resolve(buffer, this);
return buffer;
}
@Override
public boolean canEvaluate(final Template template) {
final String key = getKey();
return key.length() != 0 && template.getName().startsWith(key);
}
private Template indentTemplatePattern(final Template template,
final boolean indentFrom0) {
String pattern = template.getPattern();
final String whiteSpacePrefix = indentFrom0 ? "" : getWhiteSpacePrefix();
try {
pattern = IndentHandler.indentLines(0, 0, pattern, true, whiteSpacePrefix);
} catch (final RpcException e) {
ErlLogger.error(e);
}
return new Template(template.getName(), template.getDescription(),
template.getContextTypeId(), pattern, template.isAutoInsertable());
}
private String getWhiteSpacePrefix() {
final int start = getStart();
final IDocument document = getDocument();
int line;
try {
line = document.getLineOfOffset(start);
final int lineStart = document.getLineOffset(line);
for (int i = 0; lineStart + i <= start; ++i) {
final char c = document.getChar(lineStart + i);
if (c != ' ' && c != '\t') {
return document.get(lineStart, i);
}
}
} catch (final BadLocationException e) {
ErlLogger.error(e);
}
return "";
}
}