package com.yoursway.completion.demo; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import org.eclipse.swt.widgets.Display; import com.yoursway.completion.Activator; import com.yoursway.completion.CompletionProposalUpdatesListener; import com.yoursway.completion.CompletionProposalsProvider; public class DictionaryCompletion implements CompletionProposalsProvider { private static final int DEFAULT_PRIORITY = Integer.MAX_VALUE / 2; private static final int SUBSTR_DIFF = -1; private ArrayList<String> words; public DictionaryCompletion() { URL dictionary = Activator.getInstance().getBundle().getEntry("resources/dictionary.txt"); InputStreamReader inputStreamReader; try { inputStreamReader = new InputStreamReader(dictionary.openStream()); LineNumberReader lnr = new LineNumberReader(inputStreamReader); words = new ArrayList<String>(); for (String line = lnr.readLine(); line != null; line = lnr.readLine()) { words.add(line); } lnr.close(); Collections.sort(words); } catch (IOException e) { e.printStackTrace(); words.add("silly"); } } private List<CompletionProposalImpl> proposalsList(String substring) { List<CompletionProposalImpl> proposals = new LinkedList<CompletionProposalImpl>(); System.out.println("filtering string is: " + substring); for (String str : words) { CompletionProposalImpl newProposal = null; if (str.startsWith(substring)) newProposal = new CompletionProposalImpl(str, DEFAULT_PRIORITY); else if (str.indexOf(substring) != -1) newProposal = new CompletionProposalImpl(str, DEFAULT_PRIORITY + SUBSTR_DIFF); //TODO continue if (newProposal != null) proposals.add(newProposal); } System.out.println("Proposals are: " + proposals); return proposals; } public boolean isCompletable(char c){ return Character.isLetterOrDigit(c) || c == '_'; } public void startCompletionFor(final CompletionProposalUpdatesListener listener, CharSequence text, int caretOffset) { int beginIndex = findStartOfWord(text, caretOffset); String substring = text.subSequence(beginIndex, caretOffset).toString(); final List<CompletionProposalImpl> proposals = proposalsList(substring); Collections.sort(proposals, new Comparator<CompletionProposalImpl>() { public int compare(CompletionProposalImpl o1, CompletionProposalImpl o2) { return o1.relevance() - o2.relevance(); } }); Display.getDefault().timerExec(500, new Runnable(){ public void run() { listener.setProposals(proposals); } }); } public void stopCompletion() { } public int findStartOfWord(CharSequence text, int caretOffset) { int beginIndex = caretOffset - 1; while(beginIndex>=0 && isCompletable(text.charAt(beginIndex))){ beginIndex --; } return beginIndex + 1; } }