001: package com.tagtraum.perf.gcviewer.util;
002:
003: import com.tagtraum.perf.gcviewer.RecentURLsModel;
004:
005: import javax.swing.*;
006: import javax.swing.event.ListDataListener;
007: import javax.swing.event.ListDataEvent;
008: import javax.swing.text.AttributeSet;
009: import javax.swing.text.BadLocationException;
010: import javax.swing.text.Document;
011: import javax.swing.text.PlainDocument;
012: import java.util.List;
013: import java.util.ArrayList;
014: import java.awt.*;
015:
016: /**
017: * AutoCompletionTextField.
018: * <p/>
019: * Date: Oct 6, 2005
020: * Time: 9:49:21 AM
021: *
022: * @author <a href="mailto:hs@tagtraum.com">Hendrik Schreiber</a>
023: */
024: public class AutoCompletionTextField extends JTextField implements
025: ComboBoxEditor {
026:
027: private RecentURLsModel recentURLsModel;
028: private AutoCompletionComboBoxModel comboBoxModel;
029: private List suggestions;
030:
031: public AutoCompletionTextField() {
032: super ();
033: this .suggestions = new ArrayList();
034: this .comboBoxModel = new AutoCompletionComboBoxModel();
035: setDocument(createDefaultModel());
036: this .recentURLsModel = new RecentURLsModel();
037: }
038:
039: public ComboBoxModel getComboBoxModel() {
040: return comboBoxModel;
041: }
042:
043: public Component getEditorComponent() {
044: return this ;
045: }
046:
047: public void setItem(Object anObject) {
048: }
049:
050: public Object getItem() {
051: return getText();
052: }
053:
054: public void setRecentURLsModel(RecentURLsModel recentURLsModel) {
055: this .recentURLsModel = recentURLsModel;
056: }
057:
058: protected Document createDefaultModel() {
059: return new PlainDocument() {
060: public void insertString(int offs, String str,
061: AttributeSet a) throws BadLocationException {
062: final String text = this .getText(0, offs) + str;
063: List oldSuggestions = suggestions;
064: suggestions = recentURLsModel.getURLsStartingWith(text);
065: String appendString = "";
066: if (!suggestions.isEmpty()) {
067: final String suggestion = (String) suggestions
068: .get(0);
069: appendString = suggestion.substring(text.length());
070: }
071: super .insertString(offs, str + appendString, a);
072: setCaretPosition(offs);
073: setSelectionStart(text.length());
074: setSelectionEnd(getLength());
075: if (!oldSuggestions.equals(suggestions)) {
076: comboBoxModel.fireContentsChanged();
077: }
078: }
079:
080: public void remove(int offs, int len)
081: throws BadLocationException {
082: super .remove(offs, len);
083: final List oldSuggestions = suggestions;
084: suggestions = recentURLsModel
085: .getURLsStartingWith(AutoCompletionTextField.this
086: .getText());
087: if (!oldSuggestions.equals(suggestions)) {
088: comboBoxModel.fireContentsChanged();
089: }
090: }
091:
092: };
093: }
094:
095: private class AutoCompletionComboBoxModel implements ComboBoxModel {
096:
097: private List listDataListeners;
098: private Object selected;
099:
100: public AutoCompletionComboBoxModel() {
101: this .listDataListeners = new ArrayList();
102: }
103:
104: public void setSelectedItem(Object anItem) {
105: this .selected = anItem;
106: }
107:
108: public Object getSelectedItem() {
109: return this .selected;
110: }
111:
112: public int getSize() {
113: return suggestions.size();
114: }
115:
116: public Object getElementAt(int index) {
117: return suggestions.get(index);
118: }
119:
120: public void addListDataListener(ListDataListener l) {
121: listDataListeners.add(l);
122: }
123:
124: public void removeListDataListener(ListDataListener l) {
125: listDataListeners.remove(l);
126: }
127:
128: private void fireContentsChanged() {
129: for (int i = 0; i < listDataListeners.size(); i++) {
130: ((ListDataListener) listDataListeners.get(i))
131: .contentsChanged(new ListDataEvent(this ,
132: ListDataEvent.CONTENTS_CHANGED, 0,
133: getSize() - 1));
134: }
135: }
136:
137: }
138:
139: }
|