1 /*****************************************************/
\r
2 /* This java file is a part of the */
\r
4 /* - Plouf's Java IRC Client - */
\r
6 /* Copyright (C) 2002 - 2005 Philippe Detournay */
\r
8 /* All contacts : theplouf@yahoo.com */
\r
10 /* PJIRC is free software; you can redistribute */
\r
11 /* it and/or modify it under the terms of the GNU */
\r
12 /* General Public License as published by the */
\r
13 /* Free Software Foundation; version 2 or later of */
\r
16 /* PJIRC is distributed in the hope that it will */
\r
17 /* be useful, but WITHOUT ANY WARRANTY; without */
\r
18 /* even the implied warranty of MERCHANTABILITY or */
\r
19 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU */
\r
20 /* General Public License for more details. */
\r
22 /* You should have received a copy of the GNU */
\r
23 /* General Public License along with PJIRC; if */
\r
24 /* not, write to the Free Software Foundation, */
\r
25 /* Inc., 59 Temple Place, Suite 330, Boston, */
\r
26 /* MA 02111-1307 USA */
\r
28 /*****************************************************/
\r
30 package irc.gui.common;
\r
32 import irc.EventDispatcher;
\r
33 import irc.ListenerGroup;
\r
35 import java.awt.Color;
\r
36 import java.awt.Container;
\r
37 import java.awt.Font;
\r
38 import java.awt.GridLayout;
\r
39 import java.awt.TextField;
\r
40 import java.awt.event.ActionEvent;
\r
41 import java.awt.event.ActionListener;
\r
42 import java.awt.event.FocusEvent;
\r
43 import java.awt.event.FocusListener;
\r
44 import java.awt.event.KeyEvent;
\r
45 import java.awt.event.KeyListener;
\r
46 import java.util.Vector;
\r
49 * The special input text field used in AWTSource.
\r
51 public class AWTIrcTextField extends Container implements ActionListener, KeyListener, FocusListener {
\r
53 private int _tabCount;
\r
54 private String _completing;
\r
55 private String[] _completeList;
\r
56 private Vector _historic;
\r
57 private ListenerGroup _listeners;
\r
58 private TextField _field;
\r
59 private boolean _useEnterTextHere;
\r
60 private String _enterTextHere;
\r
63 * Create a new AWTIrcTextField.
\r
65 public AWTIrcTextField() {
\r
67 _useEnterTextHere = false;
\r
68 setLayout(new GridLayout(1, 1));
\r
69 _field = new TextField();
\r
71 _completeList = new String[0];
\r
72 _field.setFont(new Font("Monospaced", Font.PLAIN, 12));
\r
76 _listeners = new ListenerGroup();
\r
77 _historic = new Vector();
\r
78 _field.addActionListener(this);
\r
79 _field.addKeyListener(this);
\r
82 Class c = _field.getClass();
\r
83 java.lang.reflect.Method m = c.getMethod("setFocusTraversalKeysEnabled", new Class[] { boolean.class });
\r
84 m.invoke(_field, new Object[] { new Boolean(false) });
\r
85 } catch (Exception ex) {
\r
89 addFocusListener(this);
\r
94 * Release this object.
\r
96 public void release() {
\r
97 removeFocusListener(this);
\r
98 _field.removeActionListener(this);
\r
99 _field.removeKeyListener(this);
\r
100 _historic = new Vector();
\r
106 * Configure the "enter text here" feature.
\r
109 * true if feature enabled, false otherwise.
\r
111 * text to be displayed.
\r
113 public void setEnterTextHere(boolean b, String text) {
\r
114 _useEnterTextHere = b;
\r
115 _enterTextHere = text;
\r
117 if (_useEnterTextHere) {
\r
118 _field.setText(_enterTextHere);
\r
119 _field.setSelectionStart(0);
\r
120 _field.setSelectionEnd(_field.getText().length() + 1);
\r
125 public void setBackground(Color c) {
\r
126 super.setBackground(c);
\r
127 _field.setBackground(c);
\r
131 public void setForeground(Color c) {
\r
132 super.setForeground(c);
\r
133 _field.setForeground(c);
\r
137 public void focusGained(FocusEvent e) {
\r
138 _field.requestFocus();
\r
142 public void focusLost(FocusEvent e) {
\r
147 * Add an action listener on the field.
\r
150 * the action listener to add.
\r
152 public void addActionListener(ActionListener lis) {
\r
153 _listeners.addListener(lis);
\r
157 * Remove an action lsitener from the field.
\r
160 * action listener to remove.
\r
162 public void removeActionListener(ActionListener lis) {
\r
163 _listeners.removeListener(lis);
\r
167 * Set the list of known words to be auto completed if the type key is
\r
171 * array of known words.
\r
173 public void setCompleteList(String[] list) {
\r
174 _completeList = new String[list.length];
\r
175 for (int i = 0; i < list.length; i++)
\r
176 _completeList[i] = list[i];
\r
180 * Set this field content.
\r
183 * new text content.
\r
185 public void setText(String txt) {
\r
186 _field.setText(txt);
\r
190 * Return text content.
\r
192 * @return text content.
\r
194 public String getText() {
\r
195 return _field.getText();
\r
199 * Get the current caret position.
\r
201 * @return caret position.
\r
203 public int getCaretPosition() {
\r
204 return _field.getCaretPosition();
\r
208 * Set the caret position.
\r
211 * new caret position.
\r
213 public void setCaretPosition(int pos) {
\r
214 _field.setCaretPosition(pos);
\r
217 private void type(int c) {
\r
218 int selA = _field.getSelectionStart();
\r
219 int selB = _field.getSelectionEnd();
\r
220 String t = _field.getText();
\r
221 if (selA != selB) {
\r
222 t = t.substring(0, selA) + t.substring(selB);
\r
223 _field.setCaretPosition(selA);
\r
225 int p = _field.getCaretPosition();
\r
226 String before = t.substring(0, p);
\r
227 String after = t.substring(p);
\r
228 _field.setText(before + ((char) c) + after);
\r
229 _field.setCaretPosition(p + 1);
\r
232 private void getCompleting() {
\r
234 String t = _field.getText();
\r
236 if ((_field.getCaretPosition() == t.length()) || (t.charAt(_field.getCaretPosition()) == ' ')) {
\r
237 for (int i = _field.getCaretPosition() - 1; i >= 0; i--) {
\r
238 if (t.charAt(i) == ' ')
\r
240 _completing = t.charAt(i) + _completing;
\r
245 private void complete() {
\r
246 if (_completing.length() == 0)
\r
248 String begin = _completing.toLowerCase(java.util.Locale.ENGLISH);
\r
249 Vector match = new Vector();
\r
250 for (int i = 0; i < _completeList.length; i++) {
\r
251 if (_completeList[i].toLowerCase(java.util.Locale.ENGLISH).startsWith(begin)) {
\r
252 match.insertElementAt(_completeList[i], match.size());
\r
255 if (match.size() > 0) {
\r
256 String completeItem = (String) match.elementAt(_tabCount % match.size());
\r
257 int p = _field.getCaretPosition();
\r
258 String t = _field.getText();
\r
259 String before = t.substring(0, p);
\r
260 String after = t.substring(p);
\r
261 // supprimer le dernier mot de before (garder l'espace)
\r
262 int space = before.lastIndexOf(' ');
\r
266 before = before.substring(0, space + 1);
\r
267 before += completeItem;
\r
268 _field.setText(before + after);
\r
269 _field.setCaretPosition(before.length());
\r
274 public void keyPressed(KeyEvent e) {
\r
275 if ((e.getKeyCode() == KeyEvent.VK_TAB) || (e.getKeyCode() == KeyEvent.VK_PAGE_DOWN)) {
\r
276 if (_tabCount == 0)
\r
284 if (e.getKeyCode() == KeyEvent.VK_UP) {
\r
285 if (_historic.size() > 0) {
\r
289 _field.setText((String) _historic.elementAt(_index));
\r
290 setCaretPosition(getText().length());
\r
293 } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
\r
294 if (_historic.size() > 0) {
\r
296 if (_index > _historic.size())
\r
297 _index = _historic.size();
\r
298 if (_index < _historic.size()) {
\r
299 _field.setText((String) _historic.elementAt(_index));
\r
301 _field.setText("");
\r
303 setCaretPosition(getText().length());
\r
306 } else if ((e.getKeyCode() == KeyEvent.VK_K) && e.isControlDown()) {
\r
309 } else if ((e.getKeyCode() == KeyEvent.VK_B) && e.isControlDown()) {
\r
312 } else if ((e.getKeyCode() == KeyEvent.VK_U) && e.isControlDown()) {
\r
315 } else if ((e.getKeyCode() == KeyEvent.VK_R) && e.isControlDown()) {
\r
318 } else if ((e.getKeyCode() == KeyEvent.VK_O) && e.isControlDown()) {
\r
321 } else if ((e.getKeyCode() == KeyEvent.VK_W) && e.isControlDown()) {
\r
328 public void keyReleased(KeyEvent e) {
\r
333 public void keyTyped(KeyEvent e) {
\r
338 * Validate the curren text, as if user pressed enter key.
\r
340 public void validateText() {
\r
341 if (getText().length() > 0) {
\r
342 _historic.insertElementAt(getText(), _historic.size());
\r
343 _index = _historic.size();
\r
345 _listeners.sendEvent("actionPerformed", new Object[] { new ActionEvent(this, 0, "validate") });
\r
349 public void actionPerformed(ActionEvent e) {
\r
350 EventDispatcher.dispatchEventAsync(this, "validateText", new Object[0]);
\r