source: trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMap.java @ 838

Last change on this file since 838 was 838, checked in by sherbold, 12 years ago
  • code documentation and clean-up
File size: 67.8 KB
Line 
1
2package de.ugoe.cs.tasktree.keyboardmaps;
3
4import java.io.BufferedReader;
5import java.io.IOException;
6import java.io.InputStream;
7import java.io.InputStreamReader;
8import java.io.UnsupportedEncodingException;
9import java.util.ArrayList;
10import java.util.HashMap;
11import java.util.List;
12import java.util.Locale;
13import java.util.Map;
14import java.util.logging.Level;
15
16import de.ugoe.cs.util.console.Console;
17
18/**
19 * <p>
20 * Helper class that maps keyboard input based on a key map.
21 * </p>
22 *
23 * @version 1.0
24 * @author Patrick Harms
25 */
26public class KeyboardMap {
27
28    /**
29     * <p>
30     * Locale used for the mapping.
31     * </p>
32     */
33    private Locale locale;
34
35    /**
36     * <p>
37     * Name of the mappings-file.
38     * </p>
39     */
40    private String fileName;
41
42    /**
43     * <p>
44     * Map that defines which key strokes define a virtual key.
45     * </p>
46     */
47    private Map<VirtualKey, List<KeyStroke>> keyStrokes =
48        new HashMap<VirtualKey, List<KeyStroke>>();
49
50    /**
51     * <p>
52     * Creates a new KeyboardMap.
53     * </p>
54     *
55     * @param locale
56     *            Locale that is used for the keyboard map
57     */
58    KeyboardMap(Locale locale) {
59        this.locale = locale;
60
61        if ((this.locale == Locale.ENGLISH) || (this.locale == Locale.US) ||
62            (this.locale == Locale.CANADA))
63        {
64            fileName = "en-us";
65        }
66        else if (locale == Locale.UK) {
67            fileName = "en-gb";
68        }
69        else {
70            fileName = locale.getLanguage();
71        }
72    }
73
74    /**
75     * <p>
76     * Returns a character that is generated, given a {@link VirtualKey} is pressed while the
77     * respective modifiers are active.
78     * </p>
79     *
80     * @param key
81     *            key that is pressed
82     * @param numlock
83     *            true, if numlock is pressed; false otherwise
84     * @param shift
85     *            true, if shift is pressed; false otherwise
86     * @param altgr
87     *            true, if altgr is pressed; false otherwise
88     * @param inhibit
89     *            true, if inhibit is pressed; false otherwise
90     * @return generated character
91     */
92    public char getCharacterFor(VirtualKey key,
93                                boolean numlock,
94                                boolean shift,
95                                boolean altgr,
96                                boolean inhibit)
97    {
98        List<KeyStroke> candidates = keyStrokes.get(key);
99
100        if (candidates == null) {
101            return Character.UNASSIGNED;
102        }
103
104        // try to find the key stroke
105        for (KeyStroke keyStroke : candidates) {
106            if ((numlock == keyStroke.getNumlock()) && (!keyStroke.getLocalstate()) &&
107                (shift == keyStroke.getShift()) && (altgr == keyStroke.getAltgr()) &&
108                (inhibit == keyStroke.getInhibit()))
109            {
110                return keyStroke.getCharacter();
111            }
112        }
113
114        // try to find the key stroke with a local state ignoring the other keys
115        for (KeyStroke keyStroke : candidates) {
116            if ((numlock == keyStroke.getNumlock()) && (keyStroke.getLocalstate()) &&
117                (inhibit == keyStroke.getInhibit()))
118            {
119                return keyStroke.getCharacter();
120            }
121        }
122
123        return Character.UNASSIGNED;
124    }
125
126    /**
127     *
128     * <p>
129     * Initializes the keyboard map.
130     * </p>
131     *
132     * @throws IllegalArgumentException thrown if there is a problem loading the keyboard map
133     */
134    void init() throws IllegalArgumentException {
135        Console.traceln(Level.FINE, "initializing keymap for locale " + locale);
136
137        List<String[]> deadKeySequences = new ArrayList<String[]>();
138        List<String[]> keyStrokes = new ArrayList<String[]>();
139        readStream(getStream(fileName), deadKeySequences, keyStrokes);
140
141        Console.traceln(Level.FINER, "read " + keyStrokes.size() + " key strokes and " +
142            deadKeySequences.size() + " dead key sequences");
143
144        VirtualKeySynonyms virtualKeySynonyms = determineVirtualKeySynonyms(keyStrokes);
145        processKeyStrokes(keyStrokes, virtualKeySynonyms);
146        // TODO still required? processDeadKeySequences(deadKeySequences);
147    }
148
149    /**
150     * <p>
151     * Returns a {@link InputStream} for a given filename.
152     * </p>
153     *
154     * @param name
155     *            the filename
156     * @return the {@link InputStream}
157     */
158    private InputStream getStream(String name) {
159        Console.traceln(Level.FINER, "reading keymap for locale " + locale +
160            " from resource keymaps/" + name);
161
162        InputStream stream =
163            this.getClass().getClassLoader().getResourceAsStream("keymaps/" + name);
164
165        if (stream == null) {
166            throw new IllegalArgumentException("no keyboard map available for locale " + locale);
167        }
168
169        return stream;
170    }
171
172    /**
173     * <p>
174     * Reads a keyboard map from a input stream.
175     * </p>
176     *
177     * @param stream
178     *            input stream with the keyboard map
179     * @param deadKeySequences
180     *            the dead key sequences
181     * @param keyStrokes
182     *            the keystrokes
183     * @throws IllegalArgumentException
184     *             thrown if there is an error reading the keyboard map
185     */
186    private void readStream(InputStream stream,
187                            List<String[]> deadKeySequences,
188                            List<String[]> keyStrokes) throws IllegalArgumentException
189    {
190        BufferedReader in = null;
191        try {
192            in = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
193        }
194        catch (UnsupportedEncodingException e) {
195            Console.traceln(Level.WARNING, "no keyboard map available for locale " + locale);
196            throw new IllegalArgumentException("provided stream can not be read due to invalid encoding",
197                                               e);
198        }
199
200        try {
201            String line;
202            while ((line = in.readLine()) != null) {
203                if (!"".equals(line)) {
204                    processLine(line, deadKeySequences, keyStrokes);
205                }
206            }
207        }
208        catch (IOException e) {
209            Console.traceln(Level.WARNING, "no keyboard map available for locale " + locale);
210            throw new IllegalArgumentException("no keyboard map available for locale " + locale, e);
211        }
212        finally {
213            try {
214                in.close();
215            }
216            catch (IOException e) {
217                Console.traceln(Level.WARNING,
218                                "could not close input stream for reading keyboard map");
219            }
220        }
221    }
222
223    /**
224     * <p>
225     * Processes a line of a keyboard map file.
226     * </p>
227     *
228     * @param line
229     *            the line in the keyboard map file
230     * @param deadKeySequences
231     *            the dead key sequences
232     * @param keyStrokes
233     *            the keystrokes
234     */
235    private void processLine(String line, List<String[]> deadKeySequences, List<String[]> keyStrokes)
236    {
237        String[] values = line.split(" ");
238
239        if (values.length <= 0) {
240            return;
241        }
242
243        // ignore comments
244        if (values[0].startsWith("#")) {
245            return;
246        }
247
248        if ("map".equals(values[0])) {
249            // this is the map id. Ignore it.
250        }
251        else if ("include".equals(values[0])) {
252            // process all includes
253            for (int i = 1; i < values.length; i++) {
254                if (!values[i].startsWith("#")) {
255                    readStream(getStream(values[i]), deadKeySequences, keyStrokes);
256                }
257                else {
258                    break;
259                }
260            }
261        }
262        else if ("sequence".equals(values[0])) {
263            deadKeySequences.add(values);
264        }
265        else {
266            boolean alreadyAdded = false;
267
268            // check, if there is a replacement
269            for (int i = 0; i < keyStrokes.size(); i++) {
270                if (keyStrokes.get(i)[0].equals(values[0])) {
271                    Console.traceln(Level.FINEST, "replacing key stroke " + values[0] +
272                                    " with former keyid " + keyStrokes.get(i)[1] +
273                                    " with new key id " + values[1]);
274                    keyStrokes.set(i, values);
275                    alreadyAdded = true;
276                    break;
277                }
278            }
279
280            if (!alreadyAdded) {
281                keyStrokes.add(values);
282            }
283        }
284    }
285
286    /**
287     * <p>
288     * Determines synonyms for virtual keys for the keyboard map.
289     * </p>
290     *
291     * @param keyStrokes
292     *            the keystrokes
293     * @return the synonyms
294     */
295    private VirtualKeySynonyms determineVirtualKeySynonyms(List<String[]> keyStrokes) {
296        Console.traceln(Level.FINER, "determining virtual keys and synonyms for the keymap");
297
298        VirtualKeySynonyms virtualKeySynonyms = new VirtualKeySynonyms();
299
300        // for debugging purposes, determine which key strokes are not matched to virtual keys.
301        List<String[]> unmatchedKeyStrokes = new ArrayList<String[]>();
302
303        for (String[] keyStroke : keyStrokes) {
304            String keyStrokeName = keyStroke[0];
305            int keyId = getKeyId(keyStroke[1]);
306            // System.err.println(keyStrokeName + "  0x" + Integer.toHexString(keyId));
307
308            VirtualKey virtualKey = determineVirtualKey(keyStrokeName);
309
310            if (virtualKey != null) {
311                virtualKeySynonyms.add(keyId, virtualKey);
312            }
313            else {
314                unmatchedKeyStrokes.add(keyStroke);
315            }
316        }
317
318        for (String[] unmatchedKeyStroke : unmatchedKeyStrokes) {
319            if (!virtualKeySynonyms.containsKey(getKeyId(unmatchedKeyStroke[1]))) {
320                Console.traceln(Level.FINEST, "no virtual key mapped to key stroke " +
321                                unmatchedKeyStroke[0] + "(" + unmatchedKeyStroke[1] +
322                                ") of keyboard map for locale " + locale);
323            }
324        }
325
326        return virtualKeySynonyms;
327    }
328
329    /**
330     * <p>
331     * Converts a hexadecimal Id that is contained in a string into the integer Id of the key.
332     * </p>
333     *
334     * @param keyIdString
335     *            the Id string
336     * @return the Id as integer
337     */
338    private int getKeyId(String keyIdString) {
339        if (keyIdString.startsWith("0x")) {
340            keyIdString = keyIdString.substring(2);
341        }
342
343        return Integer.parseInt(keyIdString, 16);
344    }
345
346    /**
347     * <p>
348     * Processes a list of key strokes.
349     * </p>
350     *
351     * @param keyStrokes
352     *            the key strokes
353     * @param virtualKeySynonyms
354     *            synonyms of the involved virtual keys
355     */
356    private void processKeyStrokes(List<String[]> keyStrokes, VirtualKeySynonyms virtualKeySynonyms)
357    {
358        for (String[] keyStroke : keyStrokes) {
359            handleKeyStroke(keyStroke, virtualKeySynonyms);
360        }
361
362        addKeyStrokesIndependentOfNumLock();
363    }
364
365    /**
366     * <p>
367     * Handles a key stroke.
368     * </p>
369     *
370     * @param values
371     *            contains the name, string Id, and modifiers of the key stroke
372     * @param virtualKeySynonyms
373     *            synonyms of the involved virtual keys
374     */
375    private void handleKeyStroke(String[] values, VirtualKeySynonyms virtualKeySynonyms) {
376        String keyStrokeName = values[0];
377        String keyIdString = values[1];
378        if (keyIdString.startsWith("0x")) {
379            keyIdString = keyIdString.substring(2);
380        }
381
382        int keyId = Integer.parseInt(keyIdString, 16);
383
384        // parse the conditions
385        boolean numlock = false;
386        boolean localstate = false;
387        boolean shift = false;
388        boolean altgr = false;
389        boolean addupper = false;
390        boolean inhibit = false;
391
392        for (int i = 2; i < values.length; i++) {
393            if (!values[i].startsWith("#")) {
394                if ("numlock".equals(values[i])) {
395                    numlock = true;
396                }
397                else if ("localstate".equals(values[i])) {
398                    localstate = true;
399                }
400                else if ("shift".equals(values[i])) {
401                    shift = true;
402                }
403                else if ("altgr".equals(values[i])) {
404                    altgr = true;
405                }
406                else if ("addupper".equals(values[i])) {
407                    addupper = true;
408                }
409                else if ("inhibit".equals(values[i])) {
410                    inhibit = true;
411                }
412                else {
413                    Console.traceln(Level.SEVERE, "unknown condition " + values[i] +
414                                    " specified for key stroke " + keyStrokeName +
415                                    " through keyboard map for locale " + locale);
416                    throw new IllegalArgumentException
417                        ("no keyboard map available for locale " + locale);
418                }
419            }
420            else {
421                break;
422            }
423        }
424
425        addAllRepresentedKeyStrokes(keyStrokeName, keyId, numlock, localstate, shift, altgr,
426                                    addupper, inhibit, virtualKeySynonyms);
427    }
428
429    /**
430     * <p>
431     * Adds a key stroke and all synonyms to the keyboard map.
432     * </p>
433     *
434     * @param keyStrokeName
435     *            name of the key stroke
436     * @param keyId
437     *            id of the key stroke
438     * @param numlock
439     *            true, if numlock is pressed; false otherwise
440     * @param localstate
441     *            true, if localstate is pressed; false otherwise
442     * @param shift
443     *            true, if shift is pressed; false otherwise
444     * @param altgr
445     *            true, if altgr is pressed; false otherwise
446     * @param addupper
447     *            true, if addupper is pressed; false otherwise
448     * @param inhibit
449     *            true, if inhibit is pressed; false otherwise
450     * @param virtualKeySynonyms
451     *            synonyms of the involved virtual keys
452     */
453    private void addAllRepresentedKeyStrokes(String keyStrokeName,
454                                             int keyId,
455                                             boolean numlock,
456                                             boolean localstate,
457                                             boolean shift,
458                                             boolean altgr,
459                                             boolean addupper,
460                                             boolean inhibit,
461                                             VirtualKeySynonyms virtualKeySynonyms)
462    {
463        VirtualKey[] virtualKeys = virtualKeySynonyms.getVirtualKeySynonyms(keyId);
464
465        if (virtualKeys == null) {
466            Console.traceln(Level.SEVERE, "no virtual key mapped to key stroke " + keyStrokeName +
467                " of keyboard map for locale " + locale);
468            return;
469        }
470
471        for (VirtualKey virtualKey : virtualKeys) {
472            if (addupper) {
473                char c = determineCharacter(keyStrokeName, true);
474                addKeyStroke(keyStrokeName, virtualKey, numlock, localstate, true, altgr, inhibit,
475                             c);
476
477                c = determineCharacter(keyStrokeName, false);
478                addKeyStroke(keyStrokeName, virtualKey, numlock, localstate, false, altgr, inhibit,
479                             c);
480            }
481            else {
482                char c = determineCharacter(keyStrokeName, false);
483                addKeyStroke(keyStrokeName, virtualKey, numlock, localstate, shift, altgr, inhibit,
484                             c);
485            }
486        }
487    }
488
489    /**
490     * <p>
491     * Adds a key stroke and to the keyboard map.
492     * </p>
493     *
494     * @param keyStrokeName
495     *            name of the key stroke
496     * @param virtualKey
497     *            the associated virtual key
498     * @param numlock
499     *            true, if numlock is pressed; false otherwise
500     * @param localstate
501     *            true, if localstate is pressed; false otherwise
502     * @param shift
503     *            true, if shift is pressed; false otherwise
504     * @param altgr
505     *            true, if altgr is pressed; false otherwise
506     * @param addupper
507     *            true, if addupper is pressed; false otherwise
508     * @param inhibit
509     *            true, if inhibit is pressed; false otherwise
510     * @param character
511     *            the resulting character
512     */
513    private void addKeyStroke(String keyStrokeName,
514                              VirtualKey virtualKey,
515                              boolean numlock,
516                              boolean localstate,
517                              boolean shift,
518                              boolean altgr,
519                              boolean inhibit,
520                              char character)
521    {
522        KeyStroke keyStroke =
523            new KeyStroke(keyStrokeName, virtualKey, numlock, localstate, shift, altgr, inhibit,
524                          character);
525
526        List<KeyStroke> keyStrokeList = keyStrokes.get(keyStroke.getVirtualKey());
527
528        if (keyStrokeList == null) {
529            keyStrokeList = new ArrayList<KeyStroke>();
530            keyStrokes.put(keyStroke.getVirtualKey(), keyStrokeList);
531        }
532
533        keyStrokeList.add(keyStroke);
534    }
535
536    /**
537     * <p>
538     * Adds key strokes independent of numlock.
539     * </p>
540     */
541    private void addKeyStrokesIndependentOfNumLock() {
542        for (Map.Entry<VirtualKey, List<KeyStroke>> entry : keyStrokes.entrySet()) {
543            List<KeyStroke> keyStrokesToAdd = new ArrayList<KeyStroke>();
544            for (KeyStroke keyStroke : entry.getValue()) {
545                if (!keyStroke.getNumlock()) {
546                    boolean foundPositiveNumlockVariant = false;
547                    for (KeyStroke candidate : entry.getValue()) {
548                        if ((candidate.getShift() == keyStroke.getShift()) &&
549                            (candidate.getAltgr() == keyStroke.getAltgr()) &&
550                            (candidate.getLocalstate() == keyStroke.getLocalstate()) &&
551                            (candidate.getInhibit() == keyStroke.getInhibit()) &&
552                            (candidate.getNumlock()))
553                        {
554                            foundPositiveNumlockVariant = true;
555                            break;
556                        }
557                    }
558
559                    if (!foundPositiveNumlockVariant) {
560                        keyStrokesToAdd.add(keyStroke);
561                    }
562                }
563            }
564
565            for (KeyStroke keyStroke : keyStrokesToAdd) {
566                addKeyStroke(keyStroke.getKeyStrokeName(), keyStroke.getVirtualKey(), true,
567                             keyStroke.getLocalstate(), keyStroke.getShift(), keyStroke.getAltgr(),
568                             keyStroke.getInhibit(), keyStroke.getCharacter());
569            }
570        }
571    }
572
573    /**
574     * <p>
575     * Determines a {@link VirtualKey} depending on a key stroke name
576     * </p>
577     *
578     * @param keyStrokeName
579     *            name of the key stroke
580     * @return related virtual key
581     */
582    private VirtualKey determineVirtualKey(String keyStrokeName) {
583        if ("Shift_R".equals(keyStrokeName)) {
584            return VirtualKey.SHIFT;
585        }
586        else if ("Shift_L".equals(keyStrokeName)) {
587            return VirtualKey.SHIFT;
588        }
589        else if ("Alt_R".equals(keyStrokeName)) {
590            return VirtualKey.ALT_GRAPH;
591        }
592        else if ("Mode_switch".equals(keyStrokeName)) {
593            return VirtualKey.MODECHANGE;
594        }
595        else if ("ISO_Level3_Shift".equals(keyStrokeName)) {
596            return VirtualKey.SHIFT;
597        }
598        else if ("Alt_L".equals(keyStrokeName)) {
599            return VirtualKey.ALT;
600        }
601        else if ("Control_R".equals(keyStrokeName)) {
602            return VirtualKey.CONTROL;
603        }
604        else if ("Control_L".equals(keyStrokeName)) {
605            return VirtualKey.CONTROL;
606        }
607        else if ("Menu".equals(keyStrokeName)) {
608            return VirtualKey.WINDOWS;
609        }
610        else if ("1".equals(keyStrokeName)) {
611            return VirtualKey.DIGIT_1;
612        }
613        else if ("2".equals(keyStrokeName)) {
614            return VirtualKey.DIGIT_2;
615        }
616        else if ("3".equals(keyStrokeName)) {
617            return VirtualKey.DIGIT_3;
618        }
619        else if ("4".equals(keyStrokeName)) {
620            return VirtualKey.DIGIT_4;
621        }
622        else if ("5".equals(keyStrokeName)) {
623            return VirtualKey.DIGIT_5;
624        }
625        else if ("6".equals(keyStrokeName)) {
626            return VirtualKey.DIGIT_6;
627        }
628        else if ("7".equals(keyStrokeName)) {
629            return VirtualKey.DIGIT_7;
630        }
631        else if ("8".equals(keyStrokeName)) {
632            return VirtualKey.DIGIT_8;
633        }
634        else if ("9".equals(keyStrokeName)) {
635            return VirtualKey.DIGIT_9;
636        }
637        else if ("0".equals(keyStrokeName)) {
638            return VirtualKey.DIGIT_0;
639        }
640        else if ("BackSpace".equals(keyStrokeName)) {
641            return VirtualKey.BACK_SPACE;
642        }
643        else if ("Tab".equals(keyStrokeName)) {
644            return VirtualKey.TAB;
645        }
646        else if ("q".equals(keyStrokeName)) {
647            return VirtualKey.LETTER_Q;
648        }
649        else if ("w".equals(keyStrokeName)) {
650            return VirtualKey.LETTER_W;
651        }
652        else if ("e".equals(keyStrokeName)) {
653            return VirtualKey.LETTER_E;
654        }
655        else if ("r".equals(keyStrokeName)) {
656            return VirtualKey.LETTER_R;
657        }
658        else if ("t".equals(keyStrokeName)) {
659            return VirtualKey.LETTER_T;
660        }
661        else if ("y".equals(keyStrokeName)) {
662            return VirtualKey.LETTER_Y;
663        }
664        else if ("u".equals(keyStrokeName)) {
665            return VirtualKey.LETTER_U;
666        }
667        else if ("i".equals(keyStrokeName)) {
668            return VirtualKey.LETTER_I;
669        }
670        else if ("o".equals(keyStrokeName)) {
671            return VirtualKey.LETTER_O;
672        }
673        else if ("p".equals(keyStrokeName)) {
674            return VirtualKey.LETTER_P;
675        }
676        else if ("a".equals(keyStrokeName)) {
677            return VirtualKey.LETTER_A;
678        }
679        else if ("s".equals(keyStrokeName)) {
680            return VirtualKey.LETTER_S;
681        }
682        else if ("d".equals(keyStrokeName)) {
683            return VirtualKey.LETTER_D;
684        }
685        else if ("f".equals(keyStrokeName)) {
686            return VirtualKey.LETTER_F;
687        }
688        else if ("g".equals(keyStrokeName)) {
689            return VirtualKey.LETTER_G;
690        }
691        else if ("h".equals(keyStrokeName)) {
692            return VirtualKey.LETTER_H;
693        }
694        else if ("j".equals(keyStrokeName)) {
695            return VirtualKey.LETTER_J;
696        }
697        else if ("k".equals(keyStrokeName)) {
698            return VirtualKey.LETTER_K;
699        }
700        else if ("l".equals(keyStrokeName)) {
701            return VirtualKey.LETTER_L;
702        }
703        else if ("Return".equals(keyStrokeName)) {
704            return VirtualKey.ENTER;
705        }
706        else if ("z".equals(keyStrokeName)) {
707            return VirtualKey.LETTER_Z;
708        }
709        else if ("x".equals(keyStrokeName)) {
710            return VirtualKey.LETTER_X;
711        }
712        else if ("c".equals(keyStrokeName)) {
713            return VirtualKey.LETTER_C;
714        }
715        else if ("v".equals(keyStrokeName)) {
716            return VirtualKey.LETTER_V;
717        }
718        else if ("b".equals(keyStrokeName)) {
719            return VirtualKey.LETTER_B;
720        }
721        else if ("n".equals(keyStrokeName)) {
722            return VirtualKey.LETTER_N;
723        }
724        else if ("m".equals(keyStrokeName)) {
725            return VirtualKey.LETTER_M;
726        }
727        else if ("space".equals(keyStrokeName)) {
728            return VirtualKey.SPACE;
729        }
730        else if ("less".equals(keyStrokeName)) {
731            return VirtualKey.LESS;
732        }
733        else if ("greater".equals(keyStrokeName)) {
734            return VirtualKey.GREATER;
735        }
736        else if ("Escape".equals(keyStrokeName)) {
737            return VirtualKey.ESCAPE;
738        }
739        else if ("F1".equals(keyStrokeName)) {
740            return VirtualKey.F1;
741        }
742        else if ("F2".equals(keyStrokeName)) {
743            return VirtualKey.F2;
744        }
745        else if ("F3".equals(keyStrokeName)) {
746            return VirtualKey.F3;
747        }
748        else if ("F4".equals(keyStrokeName)) {
749            return VirtualKey.F4;
750        }
751        else if ("F5".equals(keyStrokeName)) {
752            return VirtualKey.F5;
753        }
754        else if ("F6".equals(keyStrokeName)) {
755            return VirtualKey.F6;
756        }
757        else if ("F7".equals(keyStrokeName)) {
758            return VirtualKey.F7;
759        }
760        else if ("F8".equals(keyStrokeName)) {
761            return VirtualKey.F8;
762        }
763        else if ("F9".equals(keyStrokeName)) {
764            return VirtualKey.F9;
765        }
766        else if ("F10".equals(keyStrokeName)) {
767            return VirtualKey.F10;
768        }
769        else if ("F11".equals(keyStrokeName)) {
770            return VirtualKey.F11;
771        }
772        else if ("F12".equals(keyStrokeName)) {
773            return VirtualKey.F12;
774        }
775        else if ("F13".equals(keyStrokeName)) {
776            return VirtualKey.F13;
777        }
778        else if ("F14".equals(keyStrokeName)) {
779            return VirtualKey.F14;
780        }
781        else if ("F15".equals(keyStrokeName)) {
782            return VirtualKey.F15;
783        }
784        else if ("F16".equals(keyStrokeName)) {
785            return VirtualKey.F16;
786        }
787        else if ("F17".equals(keyStrokeName)) {
788            return VirtualKey.F17;
789        }
790        else if ("F18".equals(keyStrokeName)) {
791            return VirtualKey.F18;
792        }
793        else if ("F19".equals(keyStrokeName)) {
794            return VirtualKey.F19;
795        }
796        else if ("F20".equals(keyStrokeName)) {
797            return VirtualKey.F20;
798        }
799        else if ("F21".equals(keyStrokeName)) {
800            return VirtualKey.F21;
801        }
802        else if ("F22".equals(keyStrokeName)) {
803            return VirtualKey.F22;
804        }
805        else if ("F23".equals(keyStrokeName)) {
806            return VirtualKey.F23;
807        }
808        else if ("F24".equals(keyStrokeName)) {
809            return VirtualKey.F24;
810        }
811        else if ("Print".equals(keyStrokeName)) {
812            return VirtualKey.PRINTSCREEN;
813        }
814        else if ("Scroll_Lock".equals(keyStrokeName)) {
815            return VirtualKey.SCROLL_LOCK;
816        }
817        else if ("Insert".equals(keyStrokeName)) {
818            return VirtualKey.INSERT;
819        }
820        else if ("Delete".equals(keyStrokeName)) {
821            return VirtualKey.DELETE;
822        }
823        else if ("Home".equals(keyStrokeName)) {
824            return VirtualKey.HOME;
825        }
826        else if ("End".equals(keyStrokeName)) {
827            return VirtualKey.END;
828        }
829        else if ("Page_Up".equals(keyStrokeName)) {
830            return VirtualKey.PAGE_UP;
831        }
832        else if ("Page_Down".equals(keyStrokeName)) {
833            return VirtualKey.PAGE_DOWN;
834        }
835        else if ("Left".equals(keyStrokeName)) {
836            return VirtualKey.LEFT;
837        }
838        else if ("Up".equals(keyStrokeName)) {
839            return VirtualKey.UP;
840        }
841        else if ("Down".equals(keyStrokeName)) {
842            return VirtualKey.DOWN;
843        }
844        else if ("Right".equals(keyStrokeName)) {
845            return VirtualKey.RIGHT;
846        }
847        else if ("Num_Lock".equals(keyStrokeName)) {
848            return VirtualKey.NUM_LOCK;
849        }
850        else if ("KP_Divide".equals(keyStrokeName)) {
851            return VirtualKey.SLASH;
852        }
853        else if ("KP_Multiply".equals(keyStrokeName)) {
854            return VirtualKey.ASTERISK;
855        }
856        else if ("KP_Subtract".equals(keyStrokeName)) {
857            return VirtualKey.MINUS;
858        }
859        else if ("KP_Add".equals(keyStrokeName)) {
860            return VirtualKey.PLUS;
861        }
862        else if ("KP_Enter".equals(keyStrokeName)) {
863            return VirtualKey.ENTER;
864        }
865        else if ("KP_Decimal".equals(keyStrokeName)) {
866            return VirtualKey.DECIMAL;
867        }
868        else if ("KP_Separator".equals(keyStrokeName)) {
869            return VirtualKey.SEPARATOR;
870        }
871        else if ("KP_Delete".equals(keyStrokeName)) {
872            return VirtualKey.DELETE;
873        }
874        else if ("KP_0".equals(keyStrokeName)) {
875            return VirtualKey.NUMPAD_0;
876        }
877        else if ("KP_Insert".equals(keyStrokeName)) {
878            return VirtualKey.INSERT;
879        }
880        else if ("KP_1".equals(keyStrokeName)) {
881            return VirtualKey.NUMPAD_1;
882        }
883        else if ("KP_End".equals(keyStrokeName)) {
884            return VirtualKey.END;
885        }
886        else if ("KP_2".equals(keyStrokeName)) {
887            return VirtualKey.NUMPAD_2;
888        }
889        else if ("KP_Down".equals(keyStrokeName)) {
890            return VirtualKey.KP_DOWN;
891        }
892        else if ("KP_3".equals(keyStrokeName)) {
893            return VirtualKey.NUMPAD_3;
894        }
895        else if ("KP_Next".equals(keyStrokeName)) {
896            return VirtualKey.PAGE_DOWN;
897        }
898        else if ("KP_4".equals(keyStrokeName)) {
899            return VirtualKey.NUMPAD_4;
900        }
901        else if ("KP_Left".equals(keyStrokeName)) {
902            return VirtualKey.KP_LEFT;
903        }
904        else if ("KP_5".equals(keyStrokeName)) {
905            return VirtualKey.NUMPAD_5;
906        }
907        else if ("KP_Begin".equals(keyStrokeName)) {
908            return VirtualKey.BEGIN;
909        }
910        else if ("KP_6".equals(keyStrokeName)) {
911            return VirtualKey.NUMPAD_6;
912        }
913        else if ("KP_Right".equals(keyStrokeName)) {
914            return VirtualKey.KP_RIGHT;
915        }
916        else if ("KP_7".equals(keyStrokeName)) {
917            return VirtualKey.NUMPAD_7;
918        }
919        else if ("KP_Home".equals(keyStrokeName)) {
920            return VirtualKey.HOME;
921        }
922        else if ("KP_8".equals(keyStrokeName)) {
923            return VirtualKey.NUMPAD_8;
924        }
925        else if ("KP_Up".equals(keyStrokeName)) {
926            return VirtualKey.KP_UP;
927        }
928        else if ("KP_9".equals(keyStrokeName)) {
929            return VirtualKey.NUMPAD_9;
930        }
931        else if ("KP_Prior".equals(keyStrokeName)) {
932            return VirtualKey.PAGE_UP;
933        }
934        else if ("Caps_Lock".equals(keyStrokeName)) {
935            return VirtualKey.CAPS_LOCK;
936        }
937        else if ("exclam".equals(keyStrokeName)) {
938            return VirtualKey.EXCLAMATION_MARK;
939        }
940        else if ("exclamdown".equals(keyStrokeName)) {
941            return VirtualKey.INVERTED_EXCLAMATION_MARK;
942        }
943        else if ("quotedbl".equals(keyStrokeName)) {
944            return VirtualKey.QUOTEDBL;
945        }
946        else if ("slash".equals(keyStrokeName)) {
947            return VirtualKey.SLASH;
948        }
949        else if ("backslash".equals(keyStrokeName)) {
950            return VirtualKey.BACK_SLASH;
951        }
952        else if ("dead_acute".equals(keyStrokeName)) {
953            return VirtualKey.DEAD_ACUTE;
954        }
955        else if ("dead_diaresis".equals(keyStrokeName)) {
956            return VirtualKey.DEAD_DIAERESIS;
957        }
958        else if ("dead_abovering".equals(keyStrokeName)) {
959            return VirtualKey.DEAD_ABOVERING;
960        }
961        else if ("plus".equals(keyStrokeName)) {
962            return VirtualKey.PLUS;
963        }
964        else if ("asterisk".equals(keyStrokeName)) {
965            return VirtualKey.ASTERISK;
966        }
967        else if ("dead_tilde".equals(keyStrokeName)) {
968            return VirtualKey.DEAD_TILDE;
969        }
970        else if ("dead_doubleacute".equals(keyStrokeName)) {
971            return VirtualKey.DEAD_DOUBLEACUTE;
972        }
973        else if ("dead_caron".equals(keyStrokeName)) {
974            return VirtualKey.DEAD_CARON;
975        }
976        else if ("dead_circumflex".equals(keyStrokeName)) {
977            return VirtualKey.DEAD_CIRCUMFLEX;
978        }
979        else if ("comma".equals(keyStrokeName)) {
980            return VirtualKey.COMMA;
981        }
982        else if ("semicolon".equals(keyStrokeName)) {
983            return VirtualKey.SEMICOLON;
984        }
985        else if ("multiply".equals(keyStrokeName)) {
986            return VirtualKey.MULTIPLY;
987        }
988        else if ("period".equals(keyStrokeName)) {
989            return VirtualKey.PERIOD;
990        }
991        else if ("colon".equals(keyStrokeName)) {
992            return VirtualKey.COLON;
993        }
994        else if ("dead_breve".equals(keyStrokeName)) {
995            return VirtualKey.DEAD_BREVE;
996        }
997        else if ("division".equals(keyStrokeName)) {
998            return VirtualKey.DIVIDE;
999        }
1000        else if ("minus".equals(keyStrokeName)) {
1001            return VirtualKey.MINUS;
1002        }
1003        else if ("underscore".equals(keyStrokeName)) {
1004            return VirtualKey.UNDERSCORE;
1005        }
1006        else if ("dead_abovedot".equals(keyStrokeName)) {
1007            return VirtualKey.DEAD_ABOVEDOT;
1008        }
1009        else if ("bracketleft".equals(keyStrokeName)) {
1010            return VirtualKey.OPEN_BRACKET;
1011        }
1012        else if ("bracketright".equals(keyStrokeName)) {
1013            return VirtualKey.CLOSE_BRACKET;
1014        }
1015        else if ("grave".equals(keyStrokeName)) {
1016            return VirtualKey.DEAD_GRAVE;
1017        }
1018        else if ("equal".equals(keyStrokeName)) {
1019            return VirtualKey.EQUALS;
1020        }
1021        else if ("dead_macron".equals(keyStrokeName)) {
1022            return VirtualKey.DEAD_MACRON;
1023        }
1024        else if ("dead_ogonek".equals(keyStrokeName)) {
1025            return VirtualKey.DEAD_OGONEK;
1026        }
1027        else if ("dead_cedilla".equals(keyStrokeName)) {
1028            return VirtualKey.DEAD_CEDILLA;
1029        }
1030        else if ("ampersand".equals(keyStrokeName)) {
1031            return VirtualKey.AMPERSAND;
1032        }
1033        else if ("parenleft".equals(keyStrokeName)) {
1034            return VirtualKey.LEFT_PARENTHESIS;
1035        }
1036        else if ("parenright".equals(keyStrokeName)) {
1037            return VirtualKey.RIGHT_PARENTHESIS;
1038        }
1039        else if ("braceleft".equals(keyStrokeName)) {
1040            return VirtualKey.BRACELEFT;
1041        }
1042        else if ("braceright".equals(keyStrokeName)) {
1043            return VirtualKey.BRACERIGHT;
1044        }
1045        else if ("at".equals(keyStrokeName)) {
1046            return VirtualKey.AT;
1047        }
1048        else if ("dollar".equals(keyStrokeName)) {
1049            return VirtualKey.DOLLAR;
1050        }
1051        else if ("EuroSign".equals(keyStrokeName)) {
1052            return VirtualKey.EURO_SIGN;
1053        }
1054        else if ("Begin".equals(keyStrokeName)) {
1055            return VirtualKey.BEGIN;
1056        }
1057        else if ("numbersign".equals(keyStrokeName)) {
1058            return VirtualKey.NUMBER_SIGN;
1059        }
1060        else if ("asciicircum".equals(keyStrokeName)) {
1061            return VirtualKey.CIRCUMFLEX;
1062        }
1063        else if ("Kanji".equals(keyStrokeName)) {
1064            return VirtualKey.KANJI;
1065        }
1066        else if ("Katakana".equals(keyStrokeName)) {
1067            return VirtualKey.KATAKANA;
1068        }
1069        else if ("Hiragana_Katakana".equals(keyStrokeName)) {
1070            return VirtualKey.HIRAGANA;
1071        }
1072        else if ("Muhenkan".equals(keyStrokeName)) {
1073            // I found this in the KeyEvent description
1074            return VirtualKey.NONCONVERT;
1075        }
1076        else if ("kan".equals(keyStrokeName)) {
1077            // I found this in the KeyEvent description
1078            return VirtualKey.NONCONVERT;
1079        }
1080        else if ("Henkan_Mode".equals(keyStrokeName)) {
1081            // I found this in the key event description
1082            return VirtualKey.CONVERT;
1083        }
1084        else if ("voicedsound".equals(keyStrokeName)) {
1085            return VirtualKey.DEAD_VOICED_SOUND;
1086        }
1087        else if ("semivoicedsound".equals(keyStrokeName)) {
1088            return VirtualKey.DEAD_SEMIVOICED_SOUND;
1089        }
1090        else if ("Menu".equals(keyStrokeName)) {
1091            return VirtualKey.CONTEXT_MENU;
1092        }
1093        else {
1094            Console.traceln(Level.FINEST, "unknown virtual key for key stroke " + keyStrokeName +
1095                " specified through " + "keyboard map for locale " + locale);
1096
1097            return null;
1098        }
1099
1100        // for the following virtual keys no key stroke names are provided in the key maps
1101        /*
1102         * CANCEL(KeyEvent.VK_CANCEL), CLEAR(KeyEvent.VK_CLEAR), PAUSE(KeyEvent.VK_PAUSE),
1103         * HELP(KeyEvent.VK_HELP), META(KeyEvent.VK_META),
1104         *
1105         * BACK_QUOTE(KeyEvent.VK_BACK_QUOTE), QUOTE(KeyEvent.VK_QUOTE),
1106         *
1107         * DEAD_IOTA(KeyEvent.VK_DEAD_IOTA),
1108         *
1109         * FINAL(KeyEvent.VK_FINAL), CONVERT(KeyEvent.VK_CONVERT),
1110         * NONCONVERT(KeyEvent.VK_NONCONVERT), ACCEPT(KeyEvent.VK_ACCEPT), KANA(KeyEvent.VK_KANA),
1111         * ALPHANUMERIC(KeyEvent.VK_ALPHANUMERIC), FULL_WIDTH(KeyEvent.VK_FULL_WIDTH),
1112         * HALF_WIDTH(KeyEvent.VK_HALF_WIDTH), ROMAN_CHARACTERS(KeyEvent.VK_ROMAN_CHARACTERS),
1113         * ALL_CANDIDATES(KeyEvent.VK_ALL_CANDIDATES),
1114         * PREVIOUS_CANDIDATE(KeyEvent.VK_PREVIOUS_CANDIDATE), CODE_INPUT(KeyEvent.VK_CODE_INPUT),
1115         * JAPANESE_KATAKANA(KeyEvent.VK_JAPANESE_KATAKANA),
1116         * JAPANESE_HIRAGANA(KeyEvent.VK_JAPANESE_HIRAGANA),
1117         * JAPANESE_ROMAN(KeyEvent.VK_JAPANESE_ROMAN), KANA_LOCK(KeyEvent.VK_KANA_LOCK),
1118         * INPUT_METHOD_ON_OFF(KeyEvent.VK_INPUT_METHOD_ON_OFF),
1119         *
1120         * CUT(KeyEvent.VK_CUT), COPY(KeyEvent.VK_COPY), PASTE(KeyEvent.VK_PASTE),
1121         * UNDO(KeyEvent.VK_UNDO), AGAIN(KeyEvent.VK_AGAIN), FIND(KeyEvent.VK_FIND),
1122         * PROPS(KeyEvent.VK_PROPS), STOP(KeyEvent.VK_STOP), COMPOSE(KeyEvent.VK_COMPOSE),
1123         */
1124    }
1125
1126    /**
1127     * <p>
1128     * Determines the character that is generated by a key stroke.
1129     * </p>
1130     *
1131     * @param keyStrokeName name of the key stroke
1132     * @param getUpper defines whether the upper case version of the key stroke is returned or not
1133     * @return the character
1134     */
1135    private char determineCharacter(String keyStrokeName, boolean getUpper) {
1136        if ("Shift_R".equals(keyStrokeName)) {
1137            return Character.UNASSIGNED;
1138        }
1139        else if ("Shift_L".equals(keyStrokeName)) {
1140            return Character.UNASSIGNED;
1141        }
1142        else if ("Alt_R".equals(keyStrokeName)) {
1143            return Character.UNASSIGNED;
1144        }
1145        else if ("Mode_switch".equals(keyStrokeName)) {
1146            return Character.UNASSIGNED;
1147        }
1148        else if ("ISO_Level3_Shift".equals(keyStrokeName)) {
1149            return Character.UNASSIGNED;
1150        }
1151        else if ("Alt_L".equals(keyStrokeName)) {
1152            return Character.UNASSIGNED;
1153        }
1154        else if ("Control_R".equals(keyStrokeName)) {
1155            return Character.UNASSIGNED;
1156        }
1157        else if ("Control_L".equals(keyStrokeName)) {
1158            return Character.UNASSIGNED;
1159        }
1160        else if ("Menu".equals(keyStrokeName)) {
1161            return Character.UNASSIGNED;
1162        }
1163        else if ("1".equals(keyStrokeName)) {
1164            return '1';
1165        }
1166        else if ("2".equals(keyStrokeName)) {
1167            return '2';
1168        }
1169        else if ("3".equals(keyStrokeName)) {
1170            return '3';
1171        }
1172        else if ("4".equals(keyStrokeName)) {
1173            return '4';
1174        }
1175        else if ("5".equals(keyStrokeName)) {
1176            return '5';
1177        }
1178        else if ("6".equals(keyStrokeName)) {
1179            return '6';
1180        }
1181        else if ("7".equals(keyStrokeName)) {
1182            return '7';
1183        }
1184        else if ("8".equals(keyStrokeName)) {
1185            return '8';
1186        }
1187        else if ("9".equals(keyStrokeName)) {
1188            return '9';
1189        }
1190        else if ("0".equals(keyStrokeName)) {
1191            return '0';
1192        }
1193        else if ("BackSpace".equals(keyStrokeName)) {
1194            return '\b';
1195        }
1196        else if ("Tab".equals(keyStrokeName)) {
1197            return '\t';
1198        }
1199        else if ("ISO_Left_Tab".equals(keyStrokeName)) {
1200            return Character.UNASSIGNED;
1201        }
1202        else if ("q".equals(keyStrokeName)) {
1203            return getUpper ? 'Q' : 'q';
1204        }
1205        else if ("w".equals(keyStrokeName)) {
1206            return getUpper ? 'W' : 'w';
1207        }
1208        else if ("e".equals(keyStrokeName)) {
1209            return getUpper ? 'E' : 'e';
1210        }
1211        else if ("r".equals(keyStrokeName)) {
1212            return getUpper ? 'R' : 'r';
1213        }
1214        else if ("t".equals(keyStrokeName)) {
1215            return getUpper ? 'T' : 't';
1216        }
1217        else if ("y".equals(keyStrokeName)) {
1218            return getUpper ? 'Y' : 'y';
1219        }
1220        else if ("u".equals(keyStrokeName)) {
1221            return getUpper ? 'U' : 'u';
1222        }
1223        else if ("i".equals(keyStrokeName)) {
1224            return getUpper ? 'I' : 'i';
1225        }
1226        else if ("o".equals(keyStrokeName)) {
1227            return getUpper ? 'O' : 'o';
1228        }
1229        else if ("p".equals(keyStrokeName)) {
1230            return getUpper ? 'P' : 'p';
1231        }
1232        else if ("a".equals(keyStrokeName)) {
1233            return getUpper ? 'A' : 'a';
1234        }
1235        else if ("s".equals(keyStrokeName)) {
1236            return getUpper ? 'S' : 's';
1237        }
1238        else if ("d".equals(keyStrokeName)) {
1239            return getUpper ? 'D' : 'd';
1240        }
1241        else if ("f".equals(keyStrokeName)) {
1242            return getUpper ? 'F' : 'f';
1243        }
1244        else if ("g".equals(keyStrokeName)) {
1245            return getUpper ? 'G' : 'g';
1246        }
1247        else if ("h".equals(keyStrokeName)) {
1248            return getUpper ? 'H' : 'h';
1249        }
1250        else if ("j".equals(keyStrokeName)) {
1251            return getUpper ? 'J' : 'j';
1252        }
1253        else if ("k".equals(keyStrokeName)) {
1254            return getUpper ? 'K' : 'k';
1255        }
1256        else if ("l".equals(keyStrokeName)) {
1257            return getUpper ? 'L' : 'l';
1258        }
1259        else if ("Return".equals(keyStrokeName)) {
1260            return '\n';
1261        }
1262        else if ("z".equals(keyStrokeName)) {
1263            return getUpper ? 'Z' : 'z';
1264        }
1265        else if ("x".equals(keyStrokeName)) {
1266            return getUpper ? 'X' : 'x';
1267        }
1268        else if ("c".equals(keyStrokeName)) {
1269            return getUpper ? 'C' : 'c';
1270        }
1271        else if ("v".equals(keyStrokeName)) {
1272            return getUpper ? 'V' : 'v';
1273        }
1274        else if ("b".equals(keyStrokeName)) {
1275            return getUpper ? 'B' : 'b';
1276        }
1277        else if ("n".equals(keyStrokeName)) {
1278            return getUpper ? 'N' : 'n';
1279        }
1280        else if ("m".equals(keyStrokeName)) {
1281            return getUpper ? 'M' : 'm';
1282        }
1283        else if ("space".equals(keyStrokeName)) {
1284            return ' ';
1285        }
1286        else if ("less".equals(keyStrokeName)) {
1287            return '<';
1288        }
1289        else if ("greater".equals(keyStrokeName)) {
1290            return '>';
1291        }
1292        else if ("bar".equals(keyStrokeName)) {
1293            return '|';
1294        }
1295        else if ("brokenbar".equals(keyStrokeName)) {
1296            return '¦';
1297        }
1298        else if ("Escape".equals(keyStrokeName)) {
1299            return Character.UNASSIGNED;
1300        }
1301        else if ("F1".equals(keyStrokeName)) {
1302            return Character.UNASSIGNED;
1303        }
1304        else if ("F2".equals(keyStrokeName)) {
1305            return Character.UNASSIGNED;
1306        }
1307        else if ("F3".equals(keyStrokeName)) {
1308            return Character.UNASSIGNED;
1309        }
1310        else if ("F4".equals(keyStrokeName)) {
1311            return Character.UNASSIGNED;
1312        }
1313        else if ("F5".equals(keyStrokeName)) {
1314            return Character.UNASSIGNED;
1315        }
1316        else if ("F6".equals(keyStrokeName)) {
1317            return Character.UNASSIGNED;
1318        }
1319        else if ("F7".equals(keyStrokeName)) {
1320            return Character.UNASSIGNED;
1321        }
1322        else if ("F8".equals(keyStrokeName)) {
1323            return Character.UNASSIGNED;
1324        }
1325        else if ("F9".equals(keyStrokeName)) {
1326            return Character.UNASSIGNED;
1327        }
1328        else if ("F10".equals(keyStrokeName)) {
1329            return Character.UNASSIGNED;
1330        }
1331        else if ("F11".equals(keyStrokeName)) {
1332            return Character.UNASSIGNED;
1333        }
1334        else if ("SunF36".equals(keyStrokeName)) {
1335            return Character.UNASSIGNED;
1336        }
1337        else if ("F12".equals(keyStrokeName)) {
1338            return Character.UNASSIGNED;
1339        }
1340        else if ("SunF37".equals(keyStrokeName)) {
1341            return Character.UNASSIGNED;
1342        }
1343        else if ("Print".equals(keyStrokeName)) {
1344            return Character.UNASSIGNED;
1345        }
1346        else if ("Sys_Req".equals(keyStrokeName)) {
1347            return Character.UNASSIGNED;
1348        }
1349        else if ("Execute".equals(keyStrokeName)) {
1350            return Character.UNASSIGNED;
1351        }
1352        else if ("F22".equals(keyStrokeName)) {
1353            return Character.UNASSIGNED;
1354        }
1355        else if ("Scroll_Lock".equals(keyStrokeName)) {
1356            return Character.UNASSIGNED;
1357        }
1358        else if ("F23".equals(keyStrokeName)) {
1359            return Character.UNASSIGNED;
1360        }
1361        else if ("Insert".equals(keyStrokeName)) {
1362            return Character.UNASSIGNED;
1363        }
1364        else if ("Delete".equals(keyStrokeName)) {
1365            return Character.UNASSIGNED;
1366        }
1367        else if ("Home".equals(keyStrokeName)) {
1368            return Character.UNASSIGNED;
1369        }
1370        else if ("End".equals(keyStrokeName)) {
1371            return Character.UNASSIGNED;
1372        }
1373        else if ("Page_Up".equals(keyStrokeName)) {
1374            return Character.UNASSIGNED;
1375        }
1376        else if ("Page_Down".equals(keyStrokeName)) {
1377            return Character.UNASSIGNED;
1378        }
1379        else if ("Left".equals(keyStrokeName)) {
1380            return Character.UNASSIGNED;
1381        }
1382        else if ("Up".equals(keyStrokeName)) {
1383            return Character.UNASSIGNED;
1384        }
1385        else if ("Down".equals(keyStrokeName)) {
1386            return Character.UNASSIGNED;
1387        }
1388        else if ("Right".equals(keyStrokeName)) {
1389            return Character.UNASSIGNED;
1390        }
1391        else if ("Num_Lock".equals(keyStrokeName)) {
1392            return Character.UNASSIGNED;
1393        }
1394        else if ("KP_Divide".equals(keyStrokeName)) {
1395            return '/';
1396        }
1397        else if ("KP_Multiply".equals(keyStrokeName)) {
1398            return '*';
1399        }
1400        else if ("KP_Subtract".equals(keyStrokeName)) {
1401            return '-';
1402        }
1403        else if ("KP_Add".equals(keyStrokeName)) {
1404            return '+';
1405        }
1406        else if ("KP_Enter".equals(keyStrokeName)) {
1407            return '\n';
1408        }
1409        else if ("KP_Decimal".equals(keyStrokeName)) {
1410            return ',';
1411        }
1412        else if ("KP_Separator".equals(keyStrokeName)) {
1413            return ',';
1414        }
1415        else if ("KP_Delete".equals(keyStrokeName)) {
1416            return Character.UNASSIGNED;
1417        }
1418        else if ("KP_0".equals(keyStrokeName)) {
1419            return '0';
1420        }
1421        else if ("KP_Insert".equals(keyStrokeName)) {
1422            return Character.UNASSIGNED;
1423        }
1424        else if ("KP_1".equals(keyStrokeName)) {
1425            return '1';
1426        }
1427        else if ("KP_End".equals(keyStrokeName)) {
1428            return Character.UNASSIGNED;
1429        }
1430        else if ("KP_2".equals(keyStrokeName)) {
1431            return '2';
1432        }
1433        else if ("KP_Down".equals(keyStrokeName)) {
1434            return Character.UNASSIGNED;
1435        }
1436        else if ("KP_3".equals(keyStrokeName)) {
1437            return '3';
1438        }
1439        else if ("KP_Next".equals(keyStrokeName)) {
1440            return Character.UNASSIGNED;
1441        }
1442        else if ("KP_4".equals(keyStrokeName)) {
1443            return '4';
1444        }
1445        else if ("KP_Left".equals(keyStrokeName)) {
1446            return Character.UNASSIGNED;
1447        }
1448        else if ("KP_5".equals(keyStrokeName)) {
1449            return '5';
1450        }
1451        else if ("KP_Begin".equals(keyStrokeName)) {
1452            return Character.UNASSIGNED;
1453        }
1454        else if ("KP_6".equals(keyStrokeName)) {
1455            return '6';
1456        }
1457        else if ("KP_Right".equals(keyStrokeName)) {
1458            return Character.UNASSIGNED;
1459        }
1460        else if ("KP_7".equals(keyStrokeName)) {
1461            return '7';
1462        }
1463        else if ("KP_Home".equals(keyStrokeName)) {
1464            return Character.UNASSIGNED;
1465        }
1466        else if ("KP_8".equals(keyStrokeName)) {
1467            return '8';
1468        }
1469        else if ("KP_Up".equals(keyStrokeName)) {
1470            return Character.UNASSIGNED;
1471        }
1472        else if ("KP_9".equals(keyStrokeName)) {
1473            return '9';
1474        }
1475        else if ("KP_Prior".equals(keyStrokeName)) {
1476            return Character.UNASSIGNED;
1477        }
1478        else if ("Caps_Lock".equals(keyStrokeName)) {
1479            return Character.UNASSIGNED;
1480        }
1481        else if ("Multi_key".equals(keyStrokeName)) {
1482            return Character.UNASSIGNED;
1483        }
1484        else if ("exclam".equals(keyStrokeName)) {
1485            return '!';
1486        }
1487        else if ("onesuperior".equals(keyStrokeName)) {
1488            return '¹';
1489        }
1490        else if ("exclamdown".equals(keyStrokeName)) {
1491            return '¡';
1492        }
1493        else if ("quotedbl".equals(keyStrokeName)) {
1494            return '"';
1495        }
1496        else if ("twosuperior".equals(keyStrokeName)) {
1497            return '²';
1498        }
1499        else if ("oneeighth".equals(keyStrokeName)) {
1500            return '⅛';
1501        }
1502        else if ("section".equals(keyStrokeName)) {
1503            return '§';
1504        }
1505        else if ("threesuperior".equals(keyStrokeName)) {
1506            return '³';
1507        }
1508        else if ("sterling".equals(keyStrokeName)) {
1509            return '£';
1510        }
1511        else if ("dollar".equals(keyStrokeName)) {
1512            return '$';
1513        }
1514        else if ("onequarter".equals(keyStrokeName)) {
1515            return '¼';
1516        }
1517        else if ("currency".equals(keyStrokeName)) {
1518            return '¤';
1519        }
1520        else if ("percent".equals(keyStrokeName)) {
1521            return '%';
1522        }
1523        else if ("onehalf".equals(keyStrokeName)) {
1524            return '½';
1525        }
1526        else if ("threeeighths".equals(keyStrokeName)) {
1527            return '⅜';
1528        }
1529        else if ("ampersand".equals(keyStrokeName)) {
1530            return '&';
1531        }
1532        else if ("threequarters".equals(keyStrokeName)) {
1533            return '¾';
1534        }
1535        else if ("fiveeighths".equals(keyStrokeName)) {
1536            return '⅝';
1537        }
1538        else if ("slash".equals(keyStrokeName)) {
1539            return '/';
1540        }
1541        else if ("braceleft".equals(keyStrokeName)) {
1542            return '{';
1543        }
1544        else if ("seveneighths".equals(keyStrokeName)) {
1545            return '⅞';
1546        }
1547        else if ("parenleft".equals(keyStrokeName)) {
1548            return '(';
1549        }
1550        else if ("bracketleft".equals(keyStrokeName)) {
1551            return '[';
1552        }
1553        else if ("trademark".equals(keyStrokeName)) {
1554            return '™';
1555        }
1556        else if ("parenright".equals(keyStrokeName)) {
1557            return ')';
1558        }
1559        else if ("bracketright".equals(keyStrokeName)) {
1560            return ']';
1561        }
1562        else if ("plusminus".equals(keyStrokeName)) {
1563            return '±';
1564        }
1565        else if ("equal".equals(keyStrokeName)) {
1566            return '=';
1567        }
1568        else if ("braceright".equals(keyStrokeName)) {
1569            return '}';
1570        }
1571        else if ("ssharp".equals(keyStrokeName)) {
1572            return 'ß';
1573        }
1574        else if ("question".equals(keyStrokeName)) {
1575            return '?';
1576        }
1577        else if ("backslash".equals(keyStrokeName)) {
1578            return '\\';
1579        }
1580        else if ("questiondown".equals(keyStrokeName)) {
1581            return '¿';
1582        }
1583        else if ("acute".equals(keyStrokeName)) {
1584            return '´';
1585        }
1586        else if ("dead_acute".equals(keyStrokeName)) {
1587            return 0x0301;
1588        }
1589        else if ("grave".equals(keyStrokeName)) {
1590            return '`';
1591        }
1592        else if ("dead_grave".equals(keyStrokeName)) {
1593            return 0x0300;
1594        }
1595        else if ("dead_cedilla".equals(keyStrokeName)) {
1596            return 0x0327;
1597        }
1598        else if ("dead_ogonek".equals(keyStrokeName)) {
1599            return 0x0328;
1600        }
1601        else if ("at".equals(keyStrokeName)) {
1602            return '@';
1603        }
1604        else if ("Greek_OMEGA".equals(keyStrokeName)) {
1605            return 'Ω';
1606        }
1607        else if ("EuroSign".equals(keyStrokeName)) {
1608            return '€';
1609        }
1610        else if ("paragraph".equals(keyStrokeName)) {
1611            return 0x2029;
1612        }
1613        else if ("registered".equals(keyStrokeName)) {
1614            return '®';
1615        }
1616        else if ("tslash".equals(keyStrokeName)) {
1617            return 'ŧ';
1618        }
1619        else if ("Tslash".equals(keyStrokeName)) {
1620            return 'Ŧ';
1621        }
1622        else if ("z".equals(keyStrokeName)) {
1623            return getUpper ? 'Z' : 'z';
1624        }
1625        else if ("leftarrow".equals(keyStrokeName)) {
1626            return '←';
1627        }
1628        else if ("yen".equals(keyStrokeName)) {
1629            return '¥';
1630        }
1631        else if ("downarrow".equals(keyStrokeName)) {
1632            return '↓';
1633        }
1634        else if ("uparrow".equals(keyStrokeName)) {
1635            return '↑';
1636        }
1637        else if ("rightarrow".equals(keyStrokeName)) {
1638            return '→';
1639        }
1640        else if ("idotless".equals(keyStrokeName)) {
1641            return 'ı';
1642        }
1643        else if ("oslash".equals(keyStrokeName)) {
1644            return 'ø';
1645        }
1646        else if ("Ooblique".equals(keyStrokeName)) {
1647            return 'Ø';
1648        }
1649        else if ("thorn".equals(keyStrokeName)) {
1650            return 'þ';
1651        }
1652        else if ("THORN".equals(keyStrokeName)) {
1653            return 'Þ';
1654        }
1655        else if ("udiaeresis".equals(keyStrokeName)) {
1656            return getUpper ? 'Ü' : 'ü';
1657        }
1658        else if ("Udiaeresis".equals(keyStrokeName)) {
1659            return getUpper ? 'Ü' : 'ü';
1660        }
1661        else if ("dead_diaeresis".equals(keyStrokeName)) {
1662            return 0x0308;
1663        }
1664        else if ("dead_abovering".equals(keyStrokeName)) {
1665            return 0x030A;
1666        }
1667        else if ("plus".equals(keyStrokeName)) {
1668            return '+';
1669        }
1670        else if ("asterisk".equals(keyStrokeName)) {
1671            return '*';
1672        }
1673        else if ("asciitilde".equals(keyStrokeName)) {
1674            return '~';
1675        }
1676        else if ("dead_tilde".equals(keyStrokeName)) {
1677            return 0x0303;
1678        }
1679        else if ("dead_macron".equals(keyStrokeName)) {
1680            return 0x0304;
1681        }
1682        else if ("ae".equals(keyStrokeName)) {
1683            return 'æ';
1684        }
1685        else if ("AE".equals(keyStrokeName)) {
1686            return 'Æ';
1687        }
1688        else if ("eth".equals(keyStrokeName)) {
1689            return 'ð';
1690        }
1691        else if ("ETH".equals(keyStrokeName)) {
1692            return 'Ð';
1693        }
1694        else if ("dstroke".equals(keyStrokeName)) {
1695            return getUpper ? 'Đ' : 'đ';
1696        }
1697        else if ("ordfeminine".equals(keyStrokeName)) {
1698            return 'ª';
1699        }
1700        else if ("eng".equals(keyStrokeName)) {
1701            return 'ŋ';
1702        }
1703        else if ("ENG".equals(keyStrokeName)) {
1704            return 'Ŋ';
1705        }
1706        else if ("hstroke".equals(keyStrokeName)) {
1707            return 'ħ';
1708        }
1709        else if ("Hstroke".equals(keyStrokeName)) {
1710            return 'Ħ';
1711        }
1712        else if ("kra".equals(keyStrokeName)) {
1713            return 'ĸ';
1714        }
1715        else if ("odiaeresis".equals(keyStrokeName)) {
1716            return 'ö';
1717        }
1718        else if ("Odiaeresis".equals(keyStrokeName)) {
1719            return 'Ö';
1720        }
1721        else if ("dead_doubleacute".equals(keyStrokeName)) {
1722            return 0x030B;
1723        }
1724        else if ("adiaeresis".equals(keyStrokeName)) {
1725            return 'ä';
1726        }
1727        else if ("Adiaeresis".equals(keyStrokeName)) {
1728            return 'Ä';
1729        }
1730        else if ("dead_caron".equals(keyStrokeName)) {
1731            return 0x030C;
1732        }
1733        else if ("asciicircum".equals(keyStrokeName)) {
1734            return '^';
1735        }
1736        else if ("dead_circumflex".equals(keyStrokeName)) {
1737            return 0x0302;
1738        }
1739        else if ("degree".equals(keyStrokeName)) {
1740            return '°';
1741        }
1742        else if ("notsign".equals(keyStrokeName)) {
1743            return '¬';
1744        }
1745        else if ("numbersign".equals(keyStrokeName)) {
1746            return '#';
1747        }
1748        else if ("apostrophe".equals(keyStrokeName)) {
1749            return '\'';
1750        }
1751        else if ("dead_breve".equals(keyStrokeName)) {
1752            return 0x0306;
1753        }
1754        else if ("y".equals(keyStrokeName)) {
1755            return getUpper ? 'Y' : 'y';
1756        }
1757        else if ("guillemotleft".equals(keyStrokeName)) {
1758            return '»';
1759        }
1760        else if ("guillemotright".equals(keyStrokeName)) {
1761            return '«';
1762        }
1763        else if ("cent".equals(keyStrokeName)) {
1764            return '¢';
1765        }
1766        else if ("copyright".equals(keyStrokeName)) {
1767            return '©';
1768        }
1769        else if ("leftdoublequotemark".equals(keyStrokeName)) {
1770            return '„';
1771        }
1772        else if ("rightdoublequotemark".equals(keyStrokeName)) {
1773            return '“';
1774        }
1775        else if ("mu".equals(keyStrokeName)) {
1776            return 'µ';
1777        }
1778        else if ("masculine".equals(keyStrokeName)) {
1779            return 'º';
1780        }
1781        else if ("comma".equals(keyStrokeName)) {
1782            return ',';
1783        }
1784        else if ("semicolon".equals(keyStrokeName)) {
1785            return ';';
1786        }
1787        else if ("horizconnector".equals(keyStrokeName)) {
1788            return '·';
1789        }
1790        else if ("multiply".equals(keyStrokeName)) {
1791            return '×';
1792        }
1793        else if ("period".equals(keyStrokeName)) {
1794            return '.';
1795        }
1796        else if ("colon".equals(keyStrokeName)) {
1797            return ':';
1798        }
1799        else if ("periodcentered".equals(keyStrokeName)) {
1800            return '…';
1801        }
1802        else if ("division".equals(keyStrokeName)) {
1803            return '÷';
1804        }
1805        else if ("minus".equals(keyStrokeName)) {
1806            return '-';
1807        }
1808        else if ("underscore".equals(keyStrokeName)) {
1809            return '_';
1810        }
1811        else if ("dead_belowdot".equals(keyStrokeName)) {
1812            return 0x0323;
1813        }
1814        else if ("dead_abovedot".equals(keyStrokeName)) {
1815            return 0x0307;
1816        }
1817        else if ("eacute".equals(keyStrokeName)) {
1818            return getUpper ? 'É' : 'é';
1819        }
1820        else if ("Eacute".equals(keyStrokeName)) {
1821            return getUpper ? 'É' : 'é';
1822        }
1823        else if ("egrave".equals(keyStrokeName)) {
1824            return getUpper ? 'È' : 'è';
1825        }
1826        else if ("Egrave".equals(keyStrokeName)) {
1827            return getUpper ? 'È' : 'è';
1828        }
1829        else if ("ccedilla".equals(keyStrokeName)) {
1830            return getUpper ? 'Ç' : 'ç';
1831        }
1832        else if ("Ccedilla".equals(keyStrokeName)) {
1833            return getUpper ? 'Ç' : 'ç';
1834        }
1835        else if ("agrave".equals(keyStrokeName)) {
1836            return getUpper ? 'À' : 'à';
1837        }
1838        else if ("Agrave".equals(keyStrokeName)) {
1839            return getUpper ? 'À' : 'à';
1840        }
1841        else if ("lstroke".equals(keyStrokeName)) {
1842            return getUpper ? 'Ł' : 'ł';
1843        }
1844        else if ("Lstroke".equals(keyStrokeName)) {
1845            return getUpper ? 'Ł' : 'ł';
1846        }
1847        else if ("ugrave".equals(keyStrokeName)) {
1848            return getUpper ? 'Ù' : 'ù';
1849        }
1850        else if ("Ugrave".equals(keyStrokeName)) {
1851            return getUpper ? 'Ù' : 'ù';
1852        }
1853        else if ("igrave".equals(keyStrokeName)) {
1854            return getUpper ? 'Ì' : 'ì';
1855        }
1856        else if ("Igrave".equals(keyStrokeName)) {
1857            return getUpper ? 'Ì' : 'ì';
1858        }
1859        else if ("ograve".equals(keyStrokeName)) {
1860            return getUpper ? 'Ò' : 'ò';
1861        }
1862        else if ("ograve".equals(keyStrokeName)) {
1863            return getUpper ? 'Ò' : 'ò';
1864        }
1865        else if ("keyboard_type".equals(keyStrokeName)) {
1866            return Character.UNASSIGNED;
1867        }
1868        else if ("keyboard_subtype".equals(keyStrokeName)) {
1869            return Character.UNASSIGNED;
1870        }
1871        else if ("keyboard_functionkeys".equals(keyStrokeName)) {
1872            return Character.UNASSIGNED;
1873        }
1874        else if ("kana_NU".equals(keyStrokeName)) {
1875            return 'ヌ';
1876        }
1877        else if ("kana_FU".equals(keyStrokeName)) {
1878            return 'フ';
1879        }
1880        else if ("kana_A".equals(keyStrokeName)) {
1881            return 'ア';
1882        }
1883        else if ("kana_a".equals(keyStrokeName)) {
1884            return 'ァ';
1885        }
1886        else if ("kana_U".equals(keyStrokeName)) {
1887            return 'ウ';
1888        }
1889        else if ("kana_u".equals(keyStrokeName)) {
1890            return 'ゥ';
1891        }
1892        else if ("kana_E".equals(keyStrokeName)) {
1893            return 'エ';
1894        }
1895        else if ("kana_e".equals(keyStrokeName)) {
1896            return 'ェ';
1897        }
1898        else if ("kana_O".equals(keyStrokeName)) {
1899            return 'オ';
1900        }
1901        else if ("kana_o".equals(keyStrokeName)) {
1902            return 'ォ';
1903        }
1904        else if ("kana_YA".equals(keyStrokeName)) {
1905            return 'ヤ';
1906        }
1907        else if ("kana_ya".equals(keyStrokeName)) {
1908            return 'ャ';
1909        }
1910        else if ("kana_YU".equals(keyStrokeName)) {
1911            return 'ユ';
1912        }
1913        else if ("kana_yu".equals(keyStrokeName)) {
1914            return 'ュ';
1915        }
1916        else if ("kana_YO".equals(keyStrokeName)) {
1917            return 'ヨ';
1918        }
1919        else if ("kana_yo".equals(keyStrokeName)) {
1920            return 'ョ';
1921        }
1922        else if ("kana_WA".equals(keyStrokeName)) {
1923            return 'ワ';
1924        }
1925        else if ("kana_WO".equals(keyStrokeName)) {
1926            return 'ヲ';
1927        }
1928        else if ("kana_HO".equals(keyStrokeName)) {
1929            return 'ホ';
1930        }
1931        else if ("kana_HE".equals(keyStrokeName)) {
1932            return 'ヘ';
1933        }
1934        else if ("kana_TA".equals(keyStrokeName)) {
1935            return 'タ';
1936        }
1937        else if ("kana_TE".equals(keyStrokeName)) {
1938            return 'テ';
1939        }
1940        else if ("kana_I".equals(keyStrokeName)) {
1941            return 'イ';
1942        }
1943        else if ("kana_i".equals(keyStrokeName)) {
1944            return 'ィ';
1945        }
1946        else if ("kana_SU".equals(keyStrokeName)) {
1947            return 'ス';
1948        }
1949        else if ("kana_KA".equals(keyStrokeName)) {
1950            return 'カ';
1951        }
1952        else if ("kana_N".equals(keyStrokeName)) {
1953            return 'ン';
1954        }
1955        else if ("kana_NA".equals(keyStrokeName)) {
1956            return 'ナ';
1957        }
1958        else if ("kana_NI".equals(keyStrokeName)) {
1959            return 'ニ';
1960        }
1961        else if ("kana_RA".equals(keyStrokeName)) {
1962            return 'ラ';
1963        }
1964        else if ("kana_SE".equals(keyStrokeName)) {
1965            return 'セ';
1966        }
1967        else if ("voicedsound".equals(keyStrokeName)) {
1968            return 0x3099;
1969        }
1970        else if ("semivoicedsound".equals(keyStrokeName)) {
1971            return 0x309A;
1972        }
1973        else if ("kana_openingbracket".equals(keyStrokeName)) {
1974            return 0x04A2;
1975        }
1976        else if ("kana_closingbracket".equals(keyStrokeName)) {
1977            return 0x04A3;
1978        }
1979        else if ("kana_CHI".equals(keyStrokeName)) {
1980            return 'チ';
1981        }
1982        else if ("kana_TO".equals(keyStrokeName)) {
1983            return 'ト';
1984        }
1985        else if ("kana_SHI".equals(keyStrokeName)) {
1986            return 'シ';
1987        }
1988        else if ("kana_HA".equals(keyStrokeName)) {
1989            return 'ハ';
1990        }
1991        else if ("kana_KI".equals(keyStrokeName)) {
1992            return 'キ';
1993        }
1994        else if ("kana_KU".equals(keyStrokeName)) {
1995            return 'ク';
1996        }
1997        else if ("kana_MA".equals(keyStrokeName)) {
1998            return 'マ';
1999        }
2000        else if ("kana_NO".equals(keyStrokeName)) {
2001            return 'ノ';
2002        }
2003        else if ("kana_RI".equals(keyStrokeName)) {
2004            return 'リ';
2005        }
2006        else if ("kana_RE".equals(keyStrokeName)) {
2007            return 'レ';
2008        }
2009        else if ("kana_KE".equals(keyStrokeName)) {
2010            return 'ケ';
2011        }
2012        else if ("Zenkaku_Hankaku".equals(keyStrokeName)) {
2013            return Character.UNASSIGNED;
2014        }
2015        else if ("Kanji".equals(keyStrokeName)) {
2016            return Character.UNASSIGNED;
2017        }
2018        else if ("kana_MU".equals(keyStrokeName)) {
2019            return 'ム';
2020        }
2021        else if ("kana_TSU".equals(keyStrokeName)) {
2022            return 'ツ';
2023        }
2024        else if ("kana_tsu".equals(keyStrokeName)) {
2025            return 'ッ';
2026        }
2027        else if ("kana_SA".equals(keyStrokeName)) {
2028            return 'サ';
2029        }
2030        else if ("kana_SO".equals(keyStrokeName)) {
2031            return 'ソ';
2032        }
2033        else if ("kana_HI".equals(keyStrokeName)) {
2034            return 'ヒ';
2035        }
2036        else if ("kana_KO".equals(keyStrokeName)) {
2037            return 'コ';
2038        }
2039        else if ("kana_MI".equals(keyStrokeName)) {
2040            return 'ミ';
2041        }
2042        else if ("kana_MO".equals(keyStrokeName)) {
2043            return 'モ';
2044        }
2045        else if ("kana_NE".equals(keyStrokeName)) {
2046            return 'ネ';
2047        }
2048        else if ("kana_comma".equals(keyStrokeName)) {
2049            return '、';
2050        }
2051        else if ("kana_RU".equals(keyStrokeName)) {
2052            return 'ル';
2053        }
2054        else if ("kana_fullstop".equals(keyStrokeName)) {
2055            return '。';
2056        }
2057        else if ("kana_ME".equals(keyStrokeName)) {
2058            return 'メ';
2059        }
2060        else if ("kana_conjunctive".equals(keyStrokeName)) {
2061            return Character.UNASSIGNED;
2062        }
2063        else if ("Henkan_Mode".equals(keyStrokeName)) {
2064            return Character.UNASSIGNED;
2065        }
2066        else if ("Hiragana_Katakana".equals(keyStrokeName)) {
2067            return Character.UNASSIGNED;
2068        }
2069        else if ("Katakana".equals(keyStrokeName)) {
2070            return Character.UNASSIGNED;
2071        }
2072        else if ("Romaji".equals(keyStrokeName)) {
2073            return Character.UNASSIGNED;
2074        }
2075        else if ("Muhenkan".equals(keyStrokeName)) {
2076            return Character.UNASSIGNED;
2077        }
2078        else if ("Eisu_toggle".equals(keyStrokeName)) {
2079            return Character.UNASSIGNED;
2080        }
2081        else if ("Eisu_toggle".equals(keyStrokeName)) {
2082            return Character.UNASSIGNED;
2083        }
2084        else if ("F13".equals(keyStrokeName)) {
2085            return Character.UNASSIGNED;
2086        }
2087        else if ("Hangul".equals(keyStrokeName)) {
2088            return Character.UNASSIGNED;
2089        }
2090        else if ("Hangul_Hanja".equals(keyStrokeName)) {
2091            return Character.UNASSIGNED;
2092        }
2093        else {
2094            Console.traceln(Level.SEVERE, "unknown key stroke name " + keyStrokeName +
2095                            " specified through keyboard map " + "for locale " + locale);
2096
2097            // if (shift)
2098            // {
2099            // System.err.println("    else if (\"" + keyStrokeName + "\".equals(keyStrokeName))");
2100            // System.err.println("    {");
2101            // System.err.println("      return shift ? '" +
2102            // Character.toUpperCase(keyStrokeName.charAt(0)) +
2103            // "' : '" + Character.toLowerCase(keyStrokeName.charAt(0)) + "';");
2104            // System.err.println("    }");
2105            // }
2106            // else
2107            // {
2108            // System.err.println("    else if (\"" + keyStrokeName + "\".equals(keyStrokeName))");
2109            // System.err.println("    {");
2110            // System.err.println("      return '" + keyStrokeName + "';");
2111            // System.err.println("    }");
2112            // }
2113            //
2114            // return 0x0;
2115            throw new IllegalArgumentException("no keyboard map available for locale " + locale);
2116        }
2117    }
2118}
Note: See TracBrowser for help on using the repository browser.