source: trunk/autoquest-misc/src/main/java/de/ugoe/cs/autoquest/keyboardmaps/KeyboardMap.java @ 927

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