package tool.editors.contentassist;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.text.contentassist.CompletionProposal;
import org.eclipse.jface.text.contentassist.ContextInformation;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import tool.editors.text.IToolWords;
public class ProposalCache {
private static Map<String, ContextInformation> languageContextInformation;
private static Map<String, String> replacements;
static {
languageContextInformation = new HashMap<String, ContextInformation>();
for (String reservedWord : IToolWords.ToolReservedWords) {
ContextInformation ci = new ContextInformation(reservedWord,
MessageFormat.format("{0} valid 5 characters around insertion point",
new Object[] { reservedWord }));
languageContextInformation.put(reservedWord, ci);
}
/*
* Special case replacements.
*
*/
replacements = new HashMap<String, String>();
replacements.put("when", "when do");
replacements.put("case", "case is\nend case;\n");
replacements.put("if", "if end\nend if;\n");
}
private ProposalCache(){
super();
}
public static ICompletionProposal[] languageProposals(String lastWord, int offset, String indent){
int replacementOffset = offset - lastWord.length();
int replacementLength = lastWord.length();
List<ICompletionProposal> reservedWords = new ArrayList<ICompletionProposal>();
// Reserved words
for (String reservedWord : IToolWords.ToolReservedWords) {
if (!lastWord.isEmpty() && !reservedWord.startsWith(lastWord)){
continue;
}
if (reservedWord.equalsIgnoreCase("for")){
reservedWords.add(forProposal(lastWord, offset, indent));
} else {
String replacement = replacements.get(reservedWord);
if (replacement == null)
replacement = reservedWord;
reservedWords.add(
new CompletionProposal(replacement, // replacement string
replacementOffset, //replacement offset
replacementLength, // replacement length
replacement.length(), // cursor position
null, // image
reservedWord, // display string
languageContextInformation.get(reservedWord), // context information
MessageFormat.format("Tool reserved: {0}", //additional proposal information
new Object[] { reservedWord})));
}
}
// Constants
for (String constant : IToolWords.ToolConstants) {
if (!lastWord.isEmpty() && !constant.startsWith(lastWord)){
continue;
}
reservedWords.add(
new CompletionProposal(constant,
replacementOffset,
replacementLength,
constant.length()));
}
// Scalars
for (String scalar : IToolWords.ToolScalarTypes) {
if (!lastWord.isEmpty() && !scalar.startsWith(lastWord)){
continue;
}
reservedWords.add(
new CompletionProposal(scalar, // replacement string
replacementOffset, //replacement offset
replacementLength, // replacement length
scalar.length()));//, // cursor position
}
//Sort the result
Collections.sort(reservedWords, new Comparator<ICompletionProposal>() {
@Override
public int compare(ICompletionProposal o1, ICompletionProposal o2) {
if (o1 == null || o2 == null)
return 0;
return o1.getDisplayString().compareToIgnoreCase(o2.getDisplayString());
}
});
ICompletionProposal[] reservedArray = new ICompletionProposal[reservedWords.size()];
int index = 0;
for (ICompletionProposal prop : reservedWords){
reservedArray[index] = prop;
index++;
}
return reservedArray; }
public static ICompletionProposal[] classProposals(String identifyer, int offset) {
// TODO Auto-generated method stub
return null;
}
private static ICompletionProposal forProposal(String lastWord, int offset, String indent){
int replacementOffset = offset - lastWord.length();
int replacementLength = lastWord.length();
String replacement = "for x in y do\n" + indent + "end for;\n";
CompletionProposal cp = new CompletionProposal(replacement, // replacement string
replacementOffset, //replacement offset
replacementLength, // replacement length
4, // cursor position
null, // image
"for", // display string
languageContextInformation.get("for"), // context information
replacement); //additional proposal information
return cp;
}
}