/** * 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. */ package org.python.pydev.editor.codecompletion.templates; import java.io.File; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.templates.TemplateContextType; import org.python.pydev.core.IGrammarVersionProvider; import org.python.pydev.core.IIndentPrefs; import org.python.pydev.core.IInterpreterInfo; import org.python.pydev.core.IPythonNature; import org.python.pydev.core.MisconfigurationException; import org.python.pydev.editor.PyEdit; import org.python.pydev.editor.autoedit.DefaultIndentPrefs; import org.python.pydev.editor.codefolding.PySourceViewer; import com.aptana.interactive_console.console.ui.IScriptConsoleViewer; /** * Makes a custom evaluation of the template buffer to be created (to put it in the correct indentation and * change tabs to spaces -- if needed). * * @author Fabio */ public final class PyDocumentTemplateContext extends DocumentTemplateContextWithIndent { public ITextViewer viewer; //May be null /** * Note that it's in the default context because it should be used on subclasses. */ /*default*/PyDocumentTemplateContext(TemplateContextType type, IDocument document, int offset, int length, String indentTo, IIndentPrefs indentPrefs) { super(type, document, offset, length, indentTo, indentPrefs); } public PyDocumentTemplateContext(TemplateContextType type, IDocument document, int offset, int length, String indentTo, ITextViewer viewer) { this(type, document, offset, length, indentTo, getIndentPrefs(viewer)); this.viewer = viewer; } public boolean isCythonFile() { if (this.viewer instanceof PySourceViewer) { return ((PySourceViewer) this.viewer).getEdit().isCythonFile(); } return false; } public File getEditorFile() { if (this.viewer instanceof PySourceViewer) { return ((PySourceViewer) this.viewer).getEdit().getEditorFile(); } return new File(""); } public int getGrammarVersion() { //Other possibilities //org.eclipse.jface.text.source.SourceViewer (in compare) if (this.viewer instanceof PySourceViewer) { try { IPythonNature nature = ((PySourceViewer) this.viewer).getEdit().getPythonNature(); if (nature != null) { return nature.getGrammarVersion(); } } catch (MisconfigurationException e) { } } if (this.viewer instanceof IScriptConsoleViewer) { //interactive console IScriptConsoleViewer v = (IScriptConsoleViewer) this.viewer; IInterpreterInfo interpreterInfo = (IInterpreterInfo) v.getInterpreterInfo(); if (interpreterInfo != null) { return interpreterInfo.getGrammarVersion(); } } return IGrammarVersionProvider.LATEST_GRAMMAR_VERSION; } public String getModuleName() { if (this.viewer instanceof PySourceViewer) { try { PySourceViewer pyViewer = (PySourceViewer) this.viewer; PyEdit edit = pyViewer.getEdit(); IPythonNature nature = edit.getPythonNature(); if (nature != null) { return nature.resolveModule(edit.getEditorFile()); } } catch (MisconfigurationException e) { } } return ""; } /** * @return the indent preferences to be used. */ private static IIndentPrefs getIndentPrefs(ITextViewer viewer) { if (viewer instanceof PySourceViewer) { PySourceViewer pyViewer = (PySourceViewer) viewer; return pyViewer.getEdit().getIndentPrefs(); } else { return DefaultIndentPrefs.get(); } } }