Mega Code Archive

 
Categories / Java / Swing JFC
 

Auto complete TextField

/* From http://java.sun.com/docs/books/tutorial/index.html */ /*  * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  * -Redistribution of source code must retain the above copyright notice, this  *  list of conditions and the following disclaimer.  *  * -Redistribution in binary form must reproduce the above copyright notice,  *  this list of conditions and the following disclaimer in the documentation  *  and/or other materials provided with the distribution.  *  * Neither the name of Sun Microsystems, Inc. or the names of contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission.  *  * This software is provided "AS IS," without a warranty of any kind. ALL  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING  * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE  * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")  * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE  * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS  * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST  * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,  * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY  * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  *  * You acknowledge that this software is not designed, licensed or intended  * for use in the design, construction, operation or maintenance of any  * nuclear facility.  */ import java.util.List; import javax.swing.JTextField; import javax.swing.text.*; public class rntsoftAutoTextField extends JTextField {   class AutoDocument extends PlainDocument {     public void replace(int i, int j, String s, AttributeSet attributeset)         throws BadLocationException {       super.remove(i, j);       insertString(i, s, attributeset);     }     public void insertString(int i, String s, AttributeSet attributeset)         throws BadLocationException {       if (s == null || "".equals(s))         return;       String s1 = getText(0, i);       String s2 = getMatch(s1 + s);       int j = (i + s.length()) - 1;       if (isStrict && s2 == null) {         s2 = getMatch(s1);         j--;       } else if (!isStrict && s2 == null) {         super.insertString(i, s, attributeset);         return;       }       if (autoComboBox != null && s2 != null)         autoComboBox.setSelectedValue(s2);       super.remove(0, getLength());       super.insertString(0, s2, attributeset);       setSelectionStart(j + 1);       setSelectionEnd(getLength());     }     public void remove(int i, int j) throws BadLocationException {       int k = getSelectionStart();       if (k > 0)         k--;       String s = getMatch(getText(0, k));       if (!isStrict && s == null) {         super.remove(i, j);       } else {         super.remove(0, getLength());         super.insertString(0, s, null);       }       if (autoComboBox != null && s != null)         autoComboBox.setSelectedValue(s);       try {         setSelectionStart(k);         setSelectionEnd(getLength());       } catch (Exception exception) {       }     }   }   public rntsoftAutoTextField(List list) {     isCaseSensitive = false;     isStrict = true;     autoComboBox = null;     if (list == null) {       throw new IllegalArgumentException("values can not be null");     } else {       dataList = list;       init();       return;     }   }   rntsoftAutoTextField(List list, rntsoftAutoComboBox b) {     isCaseSensitive = false;     isStrict = true;     autoComboBox = null;     if (list == null) {       throw new IllegalArgumentException("values can not be null");     } else {       dataList = list;       autoComboBox = b;       init();       return;     }   }   private void init() {     setDocument(new AutoDocument());     if (isStrict && dataList.size() > 0)       setText(dataList.get(0).toString());   }   private String getMatch(String s) {     for (int i = 0; i < dataList.size(); i++) {       String s1 = dataList.get(i).toString();       if (s1 != null) {         if (!isCaseSensitive             && s1.toLowerCase().startsWith(s.toLowerCase()))           return s1;         if (isCaseSensitive && s1.startsWith(s))           return s1;       }     }     return null;   }   public void replaceSelection(String s) {     AutoDocument _lb = (AutoDocument) getDocument();     if (_lb != null)       try {         int i = Math.min(getCaret().getDot(), getCaret().getMark());         int j = Math.max(getCaret().getDot(), getCaret().getMark());         _lb.replace(i, j - i, s, null);       } catch (Exception exception) {       }   }   public boolean isCaseSensitive() {     return isCaseSensitive;   }   public void setCaseSensitive(boolean flag) {     isCaseSensitive = flag;   }   public boolean isStrict() {     return isStrict;   }   public void setStrict(boolean flag) {     isStrict = flag;   }   public List getDataList() {     return dataList;   }   public void setDataList(List list) {     if (list == null) {       throw new IllegalArgumentException("values can not be null");     } else {       dataList = list;       return;     }   }   private List dataList;   private boolean isCaseSensitive;   private boolean isStrict;   private rntsoftAutoComboBox autoComboBox; } import java.awt.event.ItemEvent; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.plaf.basic.BasicComboBoxEditor; public class rntsoftAutoComboBox extends JComboBox {   private class AutoTextFieldEditor extends BasicComboBoxEditor {     private rntsoftAutoTextField getAutoTextFieldEditor() {       return (rntsoftAutoTextField) editor;     }     AutoTextFieldEditor(java.util.List list) {       editor = new rntsoftAutoTextField(list, rntsoftAutoComboBox.this);     }   }   public rntsoftAutoComboBox(java.util.List list) {     isFired = false;     autoTextFieldEditor = new AutoTextFieldEditor(list);     setEditable(true);     setModel(new DefaultComboBoxModel(list.toArray()) {       protected void fireContentsChanged(Object obj, int i, int j) {         if (!isFired)           super.fireContentsChanged(obj, i, j);       }     });     setEditor(autoTextFieldEditor);   }   public boolean isCaseSensitive() {     return autoTextFieldEditor.getAutoTextFieldEditor().isCaseSensitive();   }   public void setCaseSensitive(boolean flag) {     autoTextFieldEditor.getAutoTextFieldEditor().setCaseSensitive(flag);   }   public boolean isStrict() {     return autoTextFieldEditor.getAutoTextFieldEditor().isStrict();   }   public void setStrict(boolean flag) {     autoTextFieldEditor.getAutoTextFieldEditor().setStrict(flag);   }   public java.util.List getDataList() {     return autoTextFieldEditor.getAutoTextFieldEditor().getDataList();   }   public void setDataList(java.util.List list) {     autoTextFieldEditor.getAutoTextFieldEditor().setDataList(list);     setModel(new DefaultComboBoxModel(list.toArray()));   }   void setSelectedValue(Object obj) {     if (isFired) {       return;     } else {       isFired = true;       setSelectedItem(obj);       fireItemStateChanged(new ItemEvent(this, 701, selectedItemReminder,           1));       isFired = false;       return;     }   }   protected void fireActionEvent() {     if (!isFired)       super.fireActionEvent();   }   private AutoTextFieldEditor autoTextFieldEditor;   private boolean isFired; }