|
@@ -23,8 +23,11 @@
|
23
|
23
|
package com.dmdirc.ui.input;
|
24
|
24
|
|
25
|
25
|
import com.dmdirc.Config;
|
|
26
|
+import com.dmdirc.commandparser.Command;
|
|
27
|
+import com.dmdirc.commandparser.CommandManager;
|
26
|
28
|
import com.dmdirc.commandparser.CommandParser;
|
27
|
29
|
import com.dmdirc.commandparser.CommandWindow;
|
|
30
|
+import com.dmdirc.commandparser.IntelligentCommand;
|
28
|
31
|
import com.dmdirc.ui.components.ColourPickerDialog;
|
29
|
32
|
import com.dmdirc.ui.messages.Styliser;
|
30
|
33
|
|
|
@@ -32,6 +35,8 @@ import java.awt.event.ActionEvent;
|
32
|
35
|
import java.awt.event.ActionListener;
|
33
|
36
|
import java.awt.event.KeyEvent;
|
34
|
37
|
import java.awt.event.KeyListener;
|
|
38
|
+import java.util.ArrayList;
|
|
39
|
+import java.util.List;
|
35
|
40
|
|
36
|
41
|
import javax.swing.JTextField;
|
37
|
42
|
|
|
@@ -177,46 +182,46 @@ public final class InputHandler implements KeyListener, ActionListener {
|
177
|
182
|
*/
|
178
|
183
|
private void handleControlKey(final KeyEvent keyEvent) {
|
179
|
184
|
switch (keyEvent.getKeyCode()) {
|
180
|
|
- case KeyEvent.VK_B:
|
181
|
|
- addControlCode(Styliser.CODE_BOLD, POSITION_END);
|
182
|
|
- break;
|
183
|
|
-
|
184
|
|
- case KeyEvent.VK_U:
|
185
|
|
- addControlCode(Styliser.CODE_UNDERLINE, POSITION_END);
|
186
|
|
- break;
|
187
|
|
-
|
188
|
|
- case KeyEvent.VK_O:
|
189
|
|
- addControlCode(Styliser.CODE_STOP, POSITION_END);
|
190
|
|
- break;
|
191
|
|
-
|
192
|
|
- case KeyEvent.VK_I:
|
193
|
|
- addControlCode(Styliser.CODE_ITALIC, POSITION_END);
|
194
|
|
- break;
|
195
|
|
-
|
196
|
|
- case KeyEvent.VK_F:
|
197
|
|
- if ((keyEvent.getModifiers() & KeyEvent.SHIFT_MASK) != 0) {
|
198
|
|
- addControlCode(Styliser.CODE_FIXED, POSITION_END);
|
199
|
|
- }
|
200
|
|
- break;
|
201
|
|
-
|
202
|
|
- case KeyEvent.VK_K:
|
203
|
|
- if ((keyEvent.getModifiers() & KeyEvent.SHIFT_MASK) == 0) {
|
204
|
|
- addControlCode(Styliser.CODE_COLOUR, POSITION_START);
|
205
|
|
- showColourPicker(true, false);
|
206
|
|
- } else {
|
207
|
|
- addControlCode(Styliser.CODE_HEXCOLOUR, POSITION_START);
|
208
|
|
- showColourPicker(false, true);
|
209
|
|
- }
|
210
|
|
- break;
|
211
|
|
-
|
212
|
|
- case KeyEvent.VK_ENTER:
|
213
|
|
- commandParser.parseCommandCtrl(parentWindow, target.getText());
|
214
|
|
- addToBuffer(target.getText());
|
215
|
|
- break;
|
216
|
|
-
|
217
|
|
- default:
|
218
|
|
- /* Do nothing. */
|
219
|
|
- break;
|
|
185
|
+ case KeyEvent.VK_B:
|
|
186
|
+ addControlCode(Styliser.CODE_BOLD, POSITION_END);
|
|
187
|
+ break;
|
|
188
|
+
|
|
189
|
+ case KeyEvent.VK_U:
|
|
190
|
+ addControlCode(Styliser.CODE_UNDERLINE, POSITION_END);
|
|
191
|
+ break;
|
|
192
|
+
|
|
193
|
+ case KeyEvent.VK_O:
|
|
194
|
+ addControlCode(Styliser.CODE_STOP, POSITION_END);
|
|
195
|
+ break;
|
|
196
|
+
|
|
197
|
+ case KeyEvent.VK_I:
|
|
198
|
+ addControlCode(Styliser.CODE_ITALIC, POSITION_END);
|
|
199
|
+ break;
|
|
200
|
+
|
|
201
|
+ case KeyEvent.VK_F:
|
|
202
|
+ if ((keyEvent.getModifiers() & KeyEvent.SHIFT_MASK) != 0) {
|
|
203
|
+ addControlCode(Styliser.CODE_FIXED, POSITION_END);
|
|
204
|
+ }
|
|
205
|
+ break;
|
|
206
|
+
|
|
207
|
+ case KeyEvent.VK_K:
|
|
208
|
+ if ((keyEvent.getModifiers() & KeyEvent.SHIFT_MASK) == 0) {
|
|
209
|
+ addControlCode(Styliser.CODE_COLOUR, POSITION_START);
|
|
210
|
+ showColourPicker(true, false);
|
|
211
|
+ } else {
|
|
212
|
+ addControlCode(Styliser.CODE_HEXCOLOUR, POSITION_START);
|
|
213
|
+ showColourPicker(false, true);
|
|
214
|
+ }
|
|
215
|
+ break;
|
|
216
|
+
|
|
217
|
+ case KeyEvent.VK_ENTER:
|
|
218
|
+ commandParser.parseCommandCtrl(parentWindow, target.getText());
|
|
219
|
+ addToBuffer(target.getText());
|
|
220
|
+ break;
|
|
221
|
+
|
|
222
|
+ default:
|
|
223
|
+ /* Do nothing. */
|
|
224
|
+ break;
|
220
|
225
|
}
|
221
|
226
|
}
|
222
|
227
|
|
|
@@ -277,17 +282,68 @@ public final class InputHandler implements KeyListener, ActionListener {
|
277
|
282
|
return;
|
278
|
283
|
}
|
279
|
284
|
|
|
285
|
+ if (start > 0 && text.charAt(0) == Config.getCommandChar().charAt(0)) {
|
|
286
|
+ doCommandTabCompletion(text, start, end);
|
|
287
|
+ } else {
|
|
288
|
+ doNormalTabCompletion(text, start, end, null);
|
|
289
|
+ }
|
|
290
|
+ }
|
|
291
|
+
|
|
292
|
+ /**
|
|
293
|
+ * Handles potentially intelligent tab completion.
|
|
294
|
+ *
|
|
295
|
+ * @param text The text that is being completed
|
|
296
|
+ * @param start The start index of the word we're completing
|
|
297
|
+ * @param end The end index of the word we're completing
|
|
298
|
+ */
|
|
299
|
+ private void doCommandTabCompletion(final String text, final int start,
|
|
300
|
+ final int end) {
|
|
301
|
+ final String signature = text.substring(1, text.indexOf(' '));
|
|
302
|
+ final Command command = CommandManager.getCommand(signature);
|
|
303
|
+
|
|
304
|
+ if (command instanceof IntelligentCommand) {
|
|
305
|
+ int args = 0;
|
|
306
|
+ int lastArg = signature.length() + 2;
|
|
307
|
+ final List<String> previousArgs = new ArrayList<String>();
|
|
308
|
+
|
|
309
|
+ final String word = text.substring(start, end);
|
|
310
|
+
|
|
311
|
+ for (int i = lastArg; i < start; i++) {
|
|
312
|
+ if (text.charAt(i) == ' ') {
|
|
313
|
+ args++;
|
|
314
|
+ previousArgs.add(text.substring(lastArg, i));
|
|
315
|
+ lastArg = i + 1;
|
|
316
|
+ }
|
|
317
|
+ }
|
|
318
|
+
|
|
319
|
+ final List<String> results = ((IntelligentCommand) command).getSuggestions(args, previousArgs);
|
|
320
|
+
|
|
321
|
+ doNormalTabCompletion(text, start, end, results);
|
|
322
|
+ } else {
|
|
323
|
+ doNormalTabCompletion(text, start, end, null);
|
|
324
|
+ }
|
|
325
|
+ }
|
|
326
|
+
|
|
327
|
+ /**
|
|
328
|
+ * Handles normal (non-intelligent-command) tab completion.
|
|
329
|
+ *
|
|
330
|
+ * @param text The text that is being completed
|
|
331
|
+ * @param start The start index of the word we're completing
|
|
332
|
+ * @param end The end index of the word we're completing
|
|
333
|
+ * @param additional A list of additional strings to use
|
|
334
|
+ */
|
|
335
|
+ private void doNormalTabCompletion(final String text, final int start,
|
|
336
|
+ final int end, final List<String> additional) {
|
280
|
337
|
final String word = text.substring(start, end);
|
281
|
338
|
|
282
|
|
- final TabCompleterResult res = tabCompleter.complete(word);
|
|
339
|
+ final TabCompleterResult res = tabCompleter.complete(word, additional);
|
283
|
340
|
|
284
|
341
|
if (res.getResultCount() == 0) {
|
285
|
342
|
// TODO: Beep, or something
|
286
|
343
|
} else if (res.getResultCount() == 1) {
|
287
|
344
|
// One result, just replace it
|
288
|
345
|
final String result = res.getResults().get(0);
|
289
|
|
- text = text.substring(0, start) + result + text.substring(end);
|
290
|
|
- target.setText(text);
|
|
346
|
+ target.setText(text.substring(0, start) + result + text.substring(end));
|
291
|
347
|
target.setCaretPosition(start + result.length());
|
292
|
348
|
} else {
|
293
|
349
|
// Multiple results
|
|
@@ -295,8 +351,7 @@ public final class InputHandler implements KeyListener, ActionListener {
|
295
|
351
|
if (sub.equalsIgnoreCase(word)) {
|
296
|
352
|
// TODO: Beep, display possible answers, etc
|
297
|
353
|
} else {
|
298
|
|
- text = text.substring(0, start) + sub + text.substring(end);
|
299
|
|
- target.setText(text);
|
|
354
|
+ target.setText(text.substring(0, start) + sub + text.substring(end));
|
300
|
355
|
target.setCaretPosition(start + sub.length());
|
301
|
356
|
}
|
302
|
357
|
}
|