/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* Created on Aug 11, 2004
*
* @author Fabio Zadrozny
*/
package org.python.pydev.editor.codecompletion.templates;
import java.util.List;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.TemplateCompletionProcessor;
import org.eclipse.jface.text.templates.TemplateContext;
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.swt.graphics.Image;
import org.python.pydev.core.docutils.PySelection;
import org.python.pydev.editor.templates.PyContextType;
import org.python.pydev.editor.templates.TemplateHelper;
import org.python.pydev.plugin.PydevPlugin;
import org.python.pydev.ui.UIConstants;
/**
* @author Fabio Zadrozny
*/
public class PyTemplateCompletionProcessor extends TemplateCompletionProcessor {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.templates.TemplateCompletionProcessor#getTemplates(java.lang.String)
*/
protected Template[] getTemplates(String contextTypeId) {
return TemplateHelper.getTemplateStore().getTemplates();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.templates.TemplateCompletionProcessor#getContextType(org.eclipse.jface.text.ITextViewer,
* org.eclipse.jface.text.IRegion)
*/
protected TemplateContextType getContextType(ITextViewer viewer, IRegion region) {
return TemplateHelper.getContextTypeRegistry().getContextType(PyContextType.PY_COMPLETIONS_CONTEXT_TYPE);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.templates.TemplateCompletionProcessor#getImage(org.eclipse.jface.text.templates.Template)
*/
protected Image getImage(Template template) {
return PydevPlugin.getImageCache().get(UIConstants.COMPLETION_TEMPLATE);
}
/**
* @param viewer
* @param documentOffset
* @param propList
*
*/
public void addTemplateProposals(ITextViewer viewer, int documentOffset, List<ICompletionProposal> propList) {
String str = extractPrefix(viewer, documentOffset);
ICompletionProposal[] templateProposals = computeCompletionProposals(viewer, documentOffset);
for (int j = 0; j < templateProposals.length; j++) {
if (templateProposals[j].getDisplayString().startsWith(str)) {
propList.add(templateProposals[j]);
}
}
}
/**
* Overridden so that we can do the indentation in this case.
*/
@Override
protected TemplateContext createContext(final ITextViewer viewer, final IRegion region) {
TemplateContextType contextType = getContextType(viewer, region);
return createContext(contextType, viewer, region);
}
public static PyDocumentTemplateContext createContext(final TemplateContextType contextType,
final ITextViewer viewer, final IRegion region) {
if (contextType != null) {
IDocument document = viewer.getDocument();
PySelection selection = new PySelection(document, viewer.getTextWidget().getSelection().x);
String indent = selection.getIndentationFromLine();
return createContext(contextType, viewer, region, indent);
}
return null;
}
/**
* Creates a concrete template context for the given region in the document. This involves finding out which
* context type is valid at the given location, and then creating a context of this type. The default implementation
* returns a <code>DocumentTemplateContext</code> for the context type at the given location.
*
* @param contextType the context type for the template.
* @param viewer the viewer for which the context is created
* @param region the region into <code>document</code> for which the context is created
* @return a template context that can handle template insertion at the given location, or <code>null</code>
*/
public static PyDocumentTemplateContext createContext(final TemplateContextType contextType,
final ITextViewer viewer, final IRegion region, String indent) {
if (contextType != null) {
IDocument document = viewer.getDocument();
final String indentTo = indent;
return new PyDocumentTemplateContext(contextType, document, region.getOffset(), region.getLength(),
indentTo, viewer);
}
return null;
}
}