]> git.somenet.org - irc/pjirc-ng.git/blob - src/main/java/irc/gui/common/AWTIrcTextField.java
Pjirc 2.2.1 as available on the net, reformatted and made it compile.
[irc/pjirc-ng.git] / src / main / java / irc / gui / common / AWTIrcTextField.java
1 /*****************************************************/\r
2 /*          This java file is a part of the          */\r
3 /*                                                   */\r
4 /*           -  Plouf's Java IRC Client  -           */\r
5 /*                                                   */\r
6 /*   Copyright (C)  2002 - 2005 Philippe Detournay   */\r
7 /*                                                   */\r
8 /*         All contacts : theplouf@yahoo.com         */\r
9 /*                                                   */\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
14 /*  the License.                                     */\r
15 /*                                                   */\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
21 /*                                                   */\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
27 /*                                                   */\r
28 /*****************************************************/\r
29 \r
30 package irc.gui.common;\r
31 \r
32 import irc.EventDispatcher;\r
33 import irc.ListenerGroup;\r
34 \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
47 \r
48 /**\r
49  * The special input text field used in AWTSource.\r
50  */\r
51 public class AWTIrcTextField extends Container implements ActionListener, KeyListener, FocusListener {\r
52         private int _index;\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
61 \r
62         /**\r
63          * Create a new AWTIrcTextField.\r
64          */\r
65         public AWTIrcTextField() {\r
66                 super();\r
67                 _useEnterTextHere = false;\r
68                 setLayout(new GridLayout(1, 1));\r
69                 _field = new TextField();\r
70                 add(_field);\r
71                 _completeList = new String[0];\r
72                 _field.setFont(new Font("Monospaced", Font.PLAIN, 12));\r
73                 _tabCount = 0;\r
74                 _completing = "";\r
75                 _index = 0;\r
76                 _listeners = new ListenerGroup();\r
77                 _historic = new Vector();\r
78                 _field.addActionListener(this);\r
79                 _field.addKeyListener(this);\r
80 \r
81                 try {\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
86                         // ignore it...\r
87                 }\r
88 \r
89                 addFocusListener(this);\r
90 \r
91         }\r
92 \r
93         /**\r
94          * Release this object.\r
95          */\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
101                 _field = null;\r
102                 removeAll();\r
103         }\r
104 \r
105         /**\r
106          * Configure the "enter text here" feature.\r
107          * \r
108          * @param b\r
109          *          true if feature enabled, false otherwise.\r
110          * @param text\r
111          *          text to be displayed.\r
112          */\r
113         public void setEnterTextHere(boolean b, String text) {\r
114                 _useEnterTextHere = b;\r
115                 _enterTextHere = text;\r
116 \r
117                 if (_useEnterTextHere) {\r
118                         _field.setText(_enterTextHere);\r
119                         _field.setSelectionStart(0);\r
120                         _field.setSelectionEnd(_field.getText().length() + 1);\r
121                 }\r
122         }\r
123 \r
124         @Override\r
125         public void setBackground(Color c) {\r
126                 super.setBackground(c);\r
127                 _field.setBackground(c);\r
128         }\r
129 \r
130         @Override\r
131         public void setForeground(Color c) {\r
132                 super.setForeground(c);\r
133                 _field.setForeground(c);\r
134         }\r
135 \r
136         @Override\r
137         public void focusGained(FocusEvent e) {\r
138                 _field.requestFocus();\r
139         }\r
140 \r
141         @Override\r
142         public void focusLost(FocusEvent e) {\r
143                 // nothing here\r
144         }\r
145 \r
146         /**\r
147          * Add an action listener on the field.\r
148          * \r
149          * @param lis\r
150          *          the action listener to add.\r
151          */\r
152         public void addActionListener(ActionListener lis) {\r
153                 _listeners.addListener(lis);\r
154         }\r
155 \r
156         /**\r
157          * Remove an action lsitener from the field.\r
158          * \r
159          * @param lis\r
160          *          action listener to remove.\r
161          */\r
162         public void removeActionListener(ActionListener lis) {\r
163                 _listeners.removeListener(lis);\r
164         }\r
165 \r
166         /**\r
167          * Set the list of known words to be auto completed if the type key is\r
168          * pressed.\r
169          * \r
170          * @param list\r
171          *          array of known words.\r
172          */\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
177         }\r
178 \r
179         /**\r
180          * Set this field content.\r
181          * \r
182          * @param txt\r
183          *          new text content.\r
184          */\r
185         public void setText(String txt) {\r
186                 _field.setText(txt);\r
187         }\r
188 \r
189         /**\r
190          * Return text content.\r
191          * \r
192          * @return text content.\r
193          */\r
194         public String getText() {\r
195                 return _field.getText();\r
196         }\r
197 \r
198         /**\r
199          * Get the current caret position.\r
200          * \r
201          * @return caret position.\r
202          */\r
203         public int getCaretPosition() {\r
204                 return _field.getCaretPosition();\r
205         }\r
206 \r
207         /**\r
208          * Set the caret position.\r
209          * \r
210          * @param pos\r
211          *          new caret position.\r
212          */\r
213         public void setCaretPosition(int pos) {\r
214                 _field.setCaretPosition(pos);\r
215         }\r
216 \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
224                 }\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
230         }\r
231 \r
232         private void getCompleting() {\r
233                 _completing = "";\r
234                 String t = _field.getText();\r
235 \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
239                                         break;\r
240                                 _completing = t.charAt(i) + _completing;\r
241                         }\r
242                 }\r
243         }\r
244 \r
245         private void complete() {\r
246                 if (_completing.length() == 0)\r
247                         return;\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
253                         }\r
254                 }\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
263                         if (space == -1)\r
264                                 before = "";\r
265                         else\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
270                 }\r
271         }\r
272 \r
273         @Override\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
277                                 getCompleting();\r
278                         complete();\r
279                         _tabCount++;\r
280                         e.consume();\r
281                 } else {\r
282                         _tabCount = 0;\r
283                 }\r
284                 if (e.getKeyCode() == KeyEvent.VK_UP) {\r
285                         if (_historic.size() > 0) {\r
286                                 _index--;\r
287                                 if (_index == -1)\r
288                                         _index = 0;\r
289                                 _field.setText((String) _historic.elementAt(_index));\r
290                                 setCaretPosition(getText().length());\r
291                         }\r
292                         e.consume();\r
293                 } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {\r
294                         if (_historic.size() > 0) {\r
295                                 _index++;\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
300                                 } else {\r
301                                         _field.setText("");\r
302                                 }\r
303                                 setCaretPosition(getText().length());\r
304                         }\r
305                         e.consume();\r
306                 } else if ((e.getKeyCode() == KeyEvent.VK_K) && e.isControlDown()) {\r
307                         type(3);\r
308                         e.consume();\r
309                 } else if ((e.getKeyCode() == KeyEvent.VK_B) && e.isControlDown()) {\r
310                         type(2);\r
311                         e.consume();\r
312                 } else if ((e.getKeyCode() == KeyEvent.VK_U) && e.isControlDown()) {\r
313                         type(31);\r
314                         e.consume();\r
315                 } else if ((e.getKeyCode() == KeyEvent.VK_R) && e.isControlDown()) {\r
316                         type(22);\r
317                         e.consume();\r
318                 } else if ((e.getKeyCode() == KeyEvent.VK_O) && e.isControlDown()) {\r
319                         type(15);\r
320                         e.consume();\r
321                 } else if ((e.getKeyCode() == KeyEvent.VK_W) && e.isControlDown()) {\r
322                         type(30);\r
323                         e.consume();\r
324                 }\r
325         }\r
326 \r
327         @Override\r
328         public void keyReleased(KeyEvent e) {\r
329                 // nothing here...\r
330         }\r
331 \r
332         @Override\r
333         public void keyTyped(KeyEvent e) {\r
334                 // nothing here...\r
335         }\r
336 \r
337         /**\r
338          * Validate the curren text, as if user pressed enter key.\r
339          */\r
340         public void validateText() {\r
341                 if (getText().length() > 0) {\r
342                         _historic.insertElementAt(getText(), _historic.size());\r
343                         _index = _historic.size();\r
344                 }\r
345                 _listeners.sendEvent("actionPerformed", new Object[] { new ActionEvent(this, 0, "validate") });\r
346         }\r
347 \r
348         @Override\r
349         public void actionPerformed(ActionEvent e) {\r
350                 EventDispatcher.dispatchEventAsync(this, "validateText", new Object[0]);\r
351         }\r
352 }\r