package bndtools.editor.completion;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jface.text.*;
import org.eclipse.jface.text.contentassist.*;
import aQute.bnd.help.Syntax;
public class BndCompletionProcessor implements IContentAssistProcessor {
private static final Pattern PREFIX_PATTERN = Pattern.compile("^(?:.*\\s)*(.*)$");
@Override
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
try {
String pre = viewer.getDocument().get(0, offset);
Matcher matcher = PREFIX_PATTERN.matcher(pre);
if (matcher.matches()) {
String prefix = matcher.group(1);
ICompletionProposal[] found = proposals(prefix, offset);
if (found.length == 1) {
found[0].apply(viewer.getDocument());
viewer.setSelectedRange(offset + (found[0].getDisplayString().length() - prefix.length() + 2), 0);
return new ICompletionProposal[0];
}
return found;
}
return proposals(null, offset);
} catch (BadLocationException e) {
return proposals(null, offset);
}
}
private static ICompletionProposal[] proposals(String prefix, int offset) {
ArrayList<ICompletionProposal> results = new ArrayList<ICompletionProposal>(Syntax.HELP.size());
for (Syntax s : Syntax.HELP.values()) {
if (prefix == null || s.getHeader().startsWith(prefix)) {
IContextInformation info = new ContextInformation(s.getHeader(), s.getHeader());
String text = prefix == null ? s.getHeader() : s.getHeader().substring(prefix.length());
results.add(new CompletionProposal(text + ": ", offset, 0, text.length() + 2, null, s.getHeader(), info, s.getLead())); //$NON-NLS-1$
}
}
Collections.sort(results, new Comparator<ICompletionProposal>() {
@Override
public int compare(ICompletionProposal p1, ICompletionProposal p2) {
return p1.getDisplayString().compareTo(p2.getDisplayString());
}
});
return results.toArray(new ICompletionProposal[0]);
}
@Override
public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
// TODO Auto-generated method stub
return null;
}
@Override
public char[] getCompletionProposalAutoActivationCharacters() {
return new char[] {
'-'
};
}
@Override
public char[] getContextInformationAutoActivationCharacters() {
return new char[] {
'-'
};
}
@Override
public IContextInformationValidator getContextInformationValidator() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getErrorMessage() {
// TODO Auto-generated method stub
return null;
}
}