/** * Code taken freely from * http://www.java-engineer.com/java/auto-complete.html */ //------------------------------------------------------------------------------ // Copyright (c) 1999-2001 Matt Welsh. All Rights Reserved. //------------------------------------------------------------------------------ package com.limegroup.gnutella.gui; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.text.Document; import com.limegroup.gnutella.settings.UISettings; import com.limegroup.gnutella.util.AutoCompleteDictionary; import com.limegroup.gnutella.util.TrieSet; /** * * @author Matt Welsh (matt@matt-welsh.com) * * @modified Sam Berlin * .. to not implement AutoComplete, not take * the dictionary in the constructor, allow the Dictionary * and listeners to be lazily created, and update the dictionary at will. * */ public class AutoCompleteTextField extends KeyProcessingTextField { public AutoCompleteTextField() { super(); } public AutoCompleteTextField(Document a, String b, int c) {super(a, b, c);} public AutoCompleteTextField(int a) { super(a); } public AutoCompleteTextField(String a) { super(a); } public AutoCompleteTextField(String a, int b) { super(a, b); } //---------------------------------------------------------------------------- // Public methods //---------------------------------------------------------------------------- /** * Set the dictionary that autocomplete lookup should be performed by. * * @param dict The dictionary that will be used for the autocomplete lookups. */ public void setDictionary(AutoCompleteDictionary dict) { // lazily create the listeners if ( this.dict == null ) setUp(); this.dict = dict; } /** * Gets the dictionary currently used for lookups. * * @return dict The dictionary that will be used for the autocomplete lookups. */ public AutoCompleteDictionary getDictionary() { return dict; } /** * Creates the default dictionary object */ public AutoCompleteDictionary createDefaultDictionary() { return new TrieSet(true); } /** * Sets whether the component is currently performing autocomplete lookups as * keystrokes are performed. * * @param val True or false. */ public void setAutoComplete(boolean val) { UISettings.AUTOCOMPLETE_ENABLED.setValue(val); } /** * Gets whether the component is currently performing autocomplete lookups as * keystrokes are performed. Looks up the value in UISettings. * * @return True or false. */ public boolean getAutoComplete() { return UISettings.AUTOCOMPLETE_ENABLED.getValue(); } /** * Adds the current value of the field underlying dictionary */ public void addToDictionary() { if( !getAutoComplete() ) return; if ( dict == null ) { setUp(); this.dict = createDefaultDictionary(); } dict.addEntry(getText().trim()); } /** * Adds the specified string to the underlying dictionary */ public void addToDictionary(String s) { if( !getAutoComplete() ) return; if ( dict == null ) { setUp(); this.dict = createDefaultDictionary(); } dict.addEntry(s.trim()); } //---------------------------------------------------------------------------- // Protected methods //---------------------------------------------------------------------------- protected void setUp() { addKeyListener( new KeyAdapter() { public void keyReleased(KeyEvent e) { char charPressed = e.getKeyChar(); int charCodePressed = e.getKeyCode(); if (charCodePressed == KeyEvent.VK_DELETE || charPressed == KeyEvent.CHAR_UNDEFINED || charCodePressed == KeyEvent.VK_BACK_SPACE ) { return; } autoCompleteInput(); } }); } public void autoCompleteInput() { // this part theoretically should be handled by the // JTextField itself, but for some reason it gets // confused during fast typing. if (getSelectionStart() != getSelectionEnd()) { setText(getText().substring(0, getSelectionStart())); } final String input = getText(); final String newText = lookup(input); int length = input.length(); if(newText != null && length < newText.length()) { setText( input + newText.substring(length) ); setSelectionStart(input.length()); setSelectionEnd(getText().length()); } } protected String lookup(String s) { if(dict != null && getAutoComplete() && !s.equals("")) return dict.lookup(s); return null; } //---------------------------------------------------------------------------- // Fields //---------------------------------------------------------------------------- protected AutoCompleteDictionary dict; }