View Javadoc

1   /*
2    *  XNap Commons
3    *
4    *  Copyright (C) 2005  Felix Berger
5    *
6    *  This library is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public
8    *  License as published by the Free Software Foundation; either
9    *  version 2.1 of the License, or (at your option) any later version.
10   *
11   *  This library is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   *  Lesser General Public License for more details.
15   *
16   *  You should have received a copy of the GNU Lesser General Public
17   *  License along with this library; if not, write to the Free Software
18   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19   */
20  package org.xnap.commons.gui.completion;
21  
22  import javax.swing.SwingUtilities;
23  import javax.swing.event.DocumentEvent;
24  import javax.swing.event.DocumentListener;
25  
26  /***
27   * This mode mimics KDE's short automatic completion mode. 
28   * 
29   * While typing possible unique completions are inserted into the text
30   * component after the cursor and set selected, so the user can type over
31   * them in case they are not wished for.
32   * 
33   * @author Felix Berger
34   */
35  public class ShortAutomaticCompletionMode extends AbstractCompletionMode
36  {
37  	
38  	private DocumentListener docListener = new DocumentHandler();
39  
40  	protected void complete(String prefix)
41  	{
42  		String comp = getModel().completeUniquePrefix(prefix);
43  		// only complete if it's really a completion
44  		if (comp.length() > prefix.length()) {
45  			setText(comp, comp.length(), prefix.length());
46  		}
47  	}
48  
49  	public void disable()
50  	{
51  		getTextComponent().getDocument().removeDocumentListener(docListener);
52  	}
53  
54  	protected void enable()
55  	{
56  		getTextComponent().getDocument().addDocumentListener(docListener);
57  	}
58  
59  	private class DocumentHandler implements DocumentListener
60  	{
61  
62  		public void insertUpdate(DocumentEvent e)
63  		{
64  			if (e.getLength() == 1) {
65  				final String text = getText();
66  				Runnable r = new Runnable()
67  				{
68  
69  					public void run()
70  					{
71  						complete(text);
72  					}
73  				};
74  				SwingUtilities.invokeLater(r);
75  			}
76  		}
77  
78  		/*
79  		 * @see javax.swing.event.DocumentListener#removeUpdate(javax.swing.event.DocumentEvent)
80  		 */
81  		public void removeUpdate(DocumentEvent e)
82  		{
83  		}
84  
85  		/*
86  		 * @see javax.swing.event.DocumentListener#changedUpdate(javax.swing.event.DocumentEvent)
87  		 */
88  		public void changedUpdate(DocumentEvent e)
89  		{
90  		}
91  	}
92  }