/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.spark.component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import javax.swing.text.PlainDocument;
public class AutoCompleteDocument extends PlainDocument {
private static final long serialVersionUID = -6198560336890706214L;
private List<String> dictionary = new ArrayList<String>();
private JTextComponent comp;
public AutoCompleteDocument(JTextComponent field, String[] aDictionary) {
comp = field;
dictionary.addAll(Arrays.asList(aDictionary));
}
public void addDictionaryEntry(String item) {
dictionary.add(item);
}
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
super.insertString(offs, str, a);
String word = autoComplete(getText(0, getLength()));
if (word != null) {
super.insertString(offs + str.length(), word, a);
comp.setCaretPosition(offs + str.length());
comp.moveCaretPosition(getLength());
}
}
public String autoComplete(String text) {
for (Object aDictionary : dictionary) {
String word = (String) aDictionary;
if (word.startsWith(text)) {
return word.substring(text.length());
}
}
return null;
}
/**
* Creates a auto completing JTextField.
*
* @param dictionary an array of words to use when trying auto completion.
* @return a JTextField that is initialized as using an auto
* completing textfield.
*/
public static JTextField createAutoCompleteTextField(String[] dictionary) {
JTextField field = new JTextField();
AutoCompleteDocument doc = new AutoCompleteDocument(field,
dictionary);
field.setDocument(doc);
return field;
}
public static void main(String args[]) {
javax.swing.JFrame frame = new javax.swing.JFrame("foo");
frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
String[] dict = {"auto", "automobile", "autocrat", "graduation"};
JTextField field =
AutoCompleteDocument.createAutoCompleteTextField(dict);
BoxLayout layout = new BoxLayout(frame.getContentPane(),
BoxLayout.X_AXIS);
frame.getContentPane().setLayout(layout);
frame.getContentPane().add(new javax.swing.JLabel("Text Field: "));
frame.getContentPane().add(field);
frame.setVisible(true);
}
}