/**
* Copyright (c) 2005-2013 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 Jul 15, 2006
* @author Fabio
*/
package org.python.pydev.editor.codecompletion;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.BoldStylerProvider;
import org.eclipse.jface.text.contentassist.ICompletionProposalExtension7;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.python.pydev.core.docutils.PySelection;
import org.python.pydev.shared_core.string.StringUtils;
import org.python.pydev.shared_ui.proposals.AbstractCompletionProposalExtension;
public abstract class AbstractPyCompletionProposalExtension2 extends AbstractCompletionProposalExtension
implements ICompletionProposalExtension7 {
public AbstractPyCompletionProposalExtension2(String replacementString, int replacementOffset,
int replacementLength, int cursorPosition, int priority, ICompareContext compareContext) {
super(replacementString, replacementOffset, replacementLength, cursorPosition, priority, compareContext);
}
public AbstractPyCompletionProposalExtension2(String replacementString, int replacementOffset,
int replacementLength, int cursorPosition, Image image, String displayString,
IContextInformation contextInformation, String additionalProposalInfo, int priority, int onApplyAction,
String args, ICompareContext compareContext) {
super(replacementString, replacementOffset, replacementLength, cursorPosition, image, displayString,
contextInformation, additionalProposalInfo, priority, onApplyAction, args, compareContext);
}
@Override
protected boolean getApplyCompletionOnDot() {
return PyCodeCompletionPreferencesPage.applyCompletionOnDot();
}
@Override
public StyledString getStyledDisplayString(IDocument document, int offset, BoldStylerProvider boldStylerProvider) {
//Extension enabled with enableColoredLabels(true); on PyContentAssistant.
String[] strs = PySelection.getActivationTokenAndQual(document, offset, false);
if (strs[1].length() == 0 && (strs[0].length() == 0 || strs[0].endsWith("."))) {
StyledString styledString = new StyledString(getDisplayString());
return styledString;
}
String qualifier = strs[1];
final boolean useSubstringMatchInCodeCompletion = PyCodeCompletionPreferencesPage
.getUseSubstringMatchInCodeCompletion();
String original = getDisplayString();
// Qualifier is everything after " - ".
int index = original.indexOf(" - ");
String strBeforeQualifier;
if (index != -1) {
strBeforeQualifier = original.substring(0, index);
} else {
strBeforeQualifier = original;
}
StyledString styledString = new StyledString();
if (useSubstringMatchInCodeCompletion) {
int i = strBeforeQualifier.toLowerCase().indexOf(qualifier.toLowerCase());
if (i < 0) {
styledString.append(strBeforeQualifier);
} else {
styledString.append(strBeforeQualifier.substring(0, i));
styledString.append(strBeforeQualifier.substring(i, i + qualifier.length()),
boldStylerProvider.getBoldStyler());
styledString.append(
strBeforeQualifier.substring(i + qualifier.length(), strBeforeQualifier.length()));
}
} else {
styledString.append(strBeforeQualifier);
}
if (styledString.length() < original.length()) {
styledString.append(original.substring(styledString.length()), StyledString.QUALIFIER_STYLER);
}
return styledString;
}
@Override
public boolean validate(IDocument document, int offset, DocumentEvent event) {
String[] strs = PySelection.getActivationTokenAndQual(document, offset, false);
//System.out.println("validating:"+strs[0]+" - "+strs[1]);
//when we end with a '.', we should start a new completion (and not stay in the old one).
if (strs[1].length() == 0 && (strs[0].length() == 0 || strs[0].endsWith("."))) {
//System.out.println(false);
return false;
}
String qualifier = strs[1];
final boolean useSubstringMatchInCodeCompletion = PyCodeCompletionPreferencesPage
.getUseSubstringMatchInCodeCompletion();
String displayString = getDisplayString();
boolean ret = PyCodeCompletionUtils.acceptName(useSubstringMatchInCodeCompletion, displayString, qualifier);
return ret;
}
//-------------------- ICompletionProposalExtension
//Note that '.' is always there!!
protected final static char[] VAR_TRIGGER = new char[] { '.' };
/**
* We want to apply it on \n or on '.'
*
* When . is entered, the user will finish (and apply) the current completion
* and request a new one with '.'
*
* If not added, it won't request the new one (and will just stop the current)
*/
@Override
public char[] getTriggerCharacters() {
char[] chars = VAR_TRIGGER;
if (PyCodeCompletionPreferencesPage.applyCompletionOnLParen()) {
chars = StringUtils.addChar(chars, '(');
}
if (PyCodeCompletionPreferencesPage.applyCompletionOnRParen()) {
chars = StringUtils.addChar(chars, ')');
}
return chars;
}
}