/**
* 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 Apr 12, 2005
*
* @author Fabio Zadrozny
*/
package org.python.pydev.editor.correctionassist.docstrings;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.swt.graphics.Image;
import org.python.pydev.core.IPythonNature;
import org.python.pydev.core.bundle.ImageCache;
import org.python.pydev.core.docutils.PySelection;
import org.python.pydev.editor.PyEdit;
import org.python.pydev.editor.actions.PyAction;
import org.python.pydev.editor.autoedit.DefaultIndentPrefs;
import org.python.pydev.editor.codecompletion.IPyCompletionProposal;
import org.python.pydev.editor.codecompletion.PyCompletionProposal;
import org.python.pydev.editor.correctionassist.heuristics.IAssistProps;
import org.python.pydev.ui.UIConstants;
import com.aptana.shared_core.string.FastStringBuffer;
import com.aptana.shared_core.structure.Tuple;
public class AssistDocString implements IAssistProps {
private final String docStringStyle;
public AssistDocString() {
this(null);
}
/**
* @param docStringStyle the doc string prefix to be used (i.e.: '@' or ':'). If null, it's gotten from the preferences.
*/
public AssistDocString(String docStringStyle) {
this.docStringStyle = docStringStyle;
}
/**
* @see org.python.pydev.editor.correctionassist.heuristics.IAssistProps#getProps(org.python.pydev.core.docutils.PySelection,
* org.python.pydev.core.bundle.ImageCache)
*/
public List<ICompletionProposal> getProps(PySelection ps, ImageCache imageCache, File f, IPythonNature nature,
PyEdit edit, int offset) throws BadLocationException {
ArrayList<ICompletionProposal> l = new ArrayList<ICompletionProposal>();
Tuple<List<String>, Integer> tuple = ps.getInsideParentesisToks(false);
if (tuple == null) {
if (ps.isInClassLine()) {
tuple = new Tuple<List<String>, Integer>(new ArrayList<String>(), offset);
} else {
return l;
}
}
List<String> params = tuple.o1;
int lineOfOffset = ps.getLineOfOffset(tuple.o2);
String initial = PySelection.getIndentationFromLine(ps.getCursorLineContents());
String delimiter = PyAction.getDelimiter(ps.getDoc());
String indentation = edit != null ? edit.getIndentPrefs().getIndentationString() : DefaultIndentPrefs.get()
.getIndentationString();
String inAndIndent = delimiter + initial + indentation;
FastStringBuffer buf = new FastStringBuffer();
String docStringMarker = DocstringsPrefPage.getDocstringMarker();
buf.append(inAndIndent + docStringMarker);
buf.append(inAndIndent);
int newOffset = buf.length();
if (ps.isInFunctionLine(true)) {
String preferredDocstringStyle = this.docStringStyle;
if (preferredDocstringStyle == null) {
preferredDocstringStyle = DocstringsPrefPage.getPreferredDocstringStyle();
}
for (String paramName : params) {
if (!PySelection.isIdentifier(paramName)) {
continue;
}
buf.append(inAndIndent).append(preferredDocstringStyle).append("param ").append(paramName).append(":");
if (DocstringsPrefPage.getTypeTagShouldBeGenerated(paramName)) {
buf.append(inAndIndent).append(preferredDocstringStyle).append("type ").append(paramName)
.append(":");
}
}
} else {
// It's a class declaration - do nothing.
}
buf.append(inAndIndent).append(docStringMarker);
String comp = buf.toString();
int offsetPosToAdd = ps.getEndLineOffset(lineOfOffset);
Image image = null; //may be null (testing)
if (imageCache != null) {
image = imageCache.get(UIConstants.ASSIST_DOCSTRING);
}
l.add(new PyCompletionProposal(comp, offsetPosToAdd, 0, newOffset, image, "Make docstring", null, null,
IPyCompletionProposal.PRIORITY_DEFAULT) {
public void apply(IDocument document) {
//remove the next line if it is a pass...
PySelection ps = new PySelection(document, fReplacementOffset);
int iNextLine = ps.getCursorLine() + 1;
String nextLine = ps.getLine(iNextLine);
if (nextLine.trim().equals("pass")) {
ps.deleteLine(iNextLine);
}
super.apply(document);
}
});
return l;
}
/**
* @see org.python.pydev.editor.correctionassist.heuristics.IAssistProps#isValid(org.python.pydev.core.docutils.PySelection,
* java.lang.String)
*/
public boolean isValid(PySelection ps, String sel, PyEdit edit, int offset) {
return ps.isInFunctionLine(true) || ps.isInClassLine();
}
}