88
99/**
1010 * Handle the conversion between JavaScript and Java key events.
11+ *
12+ * used by plaf/JSListUI and plaf/JSTextUI; should be implemented for all
13+ * components?
1114 *
1215 * @author Bob Hanson
16+ * @author Trai Nguyen
1317 *
1418 */
1519@ SuppressWarnings ({"serial" , "unused" })
1620public class JSKeyEvent extends KeyEvent {
1721
18- // used currently only by plaf/JSListUI
19-
20-
21- //Alphanumeric keys
22- // VK_0, VK_1, ..., VK_9, VK_A, VK_B, ..., VK_Z
23- //Java: pressed/typed/released (typed has charCode 0; pressed has UCASE keyCode but true-case keyChar
24- //JavaScript: down/pressed/up
22+ public static JSKeyEvent newJSKeyEvent (JComponent source , Object jQueryEvent ) {
2523
26- //Control keys
27- // VK_ENTER, VK_BACKSPACE, VK_TAB, VK_ESCAPE
28- //Java: pressed/typed/released (typed has charCode 0; pressed has UCASE keyCode but true-case keyChar
29- //JavaScript: down/pressed/up
30-
31- //Function keys
32- // VK_F1, VK_F2, VK_F3, VK_F4 VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10, VK_F11, VK_F12,
33- // VK_SCROLL_LOCK, VK_PRINTSCREEN, VK_PAUSE,
34- // VK_DELETE, VK_INSERT,
35- // VK_PAGE_UP, VK_PAGE_DOWN, VK_HOME, VK_END
36- //Java: pressed/released only, with keyChar 0xFFFF
37- // DEL: adds 0 127 typed
38- // INS: code is 155
39- //JavaScript: down/pressed/up; only up for printScreen
40- // DEL: code is 46
41- // INS: code is 45
24+ // JavaScript: keydown keypress keyup
25+ // Java: KEY_PRESSED KEY_TYPED* KEY_RELEASED
26+ // Java code/char 0/char code/char
27+ //
28+ // *KEY_TYPED only when keyChar not CHAR_UNDEFINED (0xFFFF)
4229
43- //Arrow keys
44- // VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN
45- //Java: pressed/released 38/0xFFFF
46- //JavaScript: down/pressed/up 38/"ArrowUp"
30+ String evType = null , jskey = null ;
31+ int jskeyCode = 0 , jskeyLocation = 0 ;
32+ Object ev = jQueryEvent ;
4733
48- Object jqEvent ;
49- private boolean ignore ;
34+ /**
35+ * @j2sNative
36+ *
37+ * evType = ev.type; jskey = ev.key;
38+ * jskeyCode = ev.keyCode || ev.which;
39+ * jskeyLocation = ev.originalEvent.location || 0;
40+ * if (evType == "keypress")
41+ * ev.originalEvent.preventDefault();
42+ */
5043
51- public JSKeyEvent (JComponent source , Object jQueryEvent ) {
52- super ();
53- this .source = source ;
54- when = System .currentTimeMillis ();
55- keyLocation = KeyEvent .KEY_LOCATION_UNKNOWN ;
56- Object ev = this .jqEvent = jQueryEvent ;
57- // JavaScript information:
58- String evType = null ;
59- String jskey = "" ;
60- int jskeyCode = 0 ;
44+ int id = (evType == "keydown" ? KEY_PRESSED
45+ : evType == "keypress" ? KEY_TYPED
46+ : evType == "keyup" ? KEY_RELEASED
47+ : 0 );
48+ int keyCode = getJavaKeyCode (jskeyCode , jskey );
49+ char keyChar = getJavaKeyChar (keyCode , jskey );
50+ return (id == 0 || keyChar == CHAR_UNDEFINED && id == KEY_TYPED ? null
51+ : new JSKeyEvent (source , jQueryEvent , id ,
52+ (id == KEY_TYPED ? JSKeyEvent .VK_UNDEFINED : keyCode ),
53+ keyChar ,
54+ (id == KEY_TYPED ? KEY_LOCATION_UNKNOWN : jskeyLocation + 1 ))
55+ );
56+ }
57+
58+ private JSKeyEvent (JComponent source , Object ev , int id , int keyCode , char keyChar , int location ) {
59+ super (source , id , System .currentTimeMillis (), 0 , keyCode , keyChar , location );
6160 boolean shift = false , ctrl = false , meta = false , alt = false , altGraph = false ;
6261 /**
6362 * @j2sNative
6463 *
65- * evType = ev.type;
66- * jskey = ev.key;
67- * jskeyCode = ev.keyCode || ev.which;
68- * if (evType == "keypress")
69- * ev.originalEvent.preventDefault();
7064 * shift = ev.shiftKey;
7165 * ctrl = ev.ctrlKey;
7266 * alt = ev.altKey;
7367 * meta = ev.metaKey;
7468 * altGraph = ev.altGraphKey;
7569 */
76-
7770 modifiers = JSKeyEvent .getModifiers (shift , ctrl , alt , meta , altGraph );
78-
79- // JavaScript: keydown keypress keyup
80- // Java: KEY_PRESSED KEY_TYPED KEY_RELEASED
81-
82- id = (evType == "keydown" ? KEY_PRESSED : evType == "keypress" ? KEY_TYPED : evType == "keyup" ? KEY_RELEASED : 0 );
83- keyCode = getJavaKeyCode (jskeyCode , jskey );
84- keyChar = getJavaKeyChar (keyCode , jskey );
85- ignore = (keyChar == CHAR_UNDEFINED && id == KEY_TYPED );
86- if (id == KEY_TYPED )
87- keyCode = 0 ;
8871 }
8972
9073 private static int getJavaKeyCode (int jskeyCode , String jskey ) {
91-
9274 // see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
93-
94- // enter is special
95- if (jskeyCode == 13 )
96- return VK_ENTER ;
9775 if (jskeyCode <= 40 ) {
98- // 0-40 is same
76+ // enter is special
77+ if (jskeyCode == 13 )
78+ return VK_ENTER ;
79+ // other 0-40 is same
9980 return jskeyCode ;
10081 }
10182 if (jskey .length () == 1 ) {
@@ -113,7 +94,6 @@ private static int getJavaKeyCode(int jskeyCode, String jskey) {
11394 case 244 : // Kanji
11495 return VK_KANJI ;
11596 }
116-
11797 String keyName = "VK_" + jskey .toUpperCase ();
11898 try {
11999 // get the Java code from AWTKeyStroke by name, if possible
@@ -178,72 +158,4 @@ private static int getModifiers(boolean shift, boolean ctrl, boolean alt, boolea
178158 return 0 ;
179159 }
180160
181- public JSKeyEvent (JComponent jc , int eventType , long currentTimeMillis , int modifiers , int keyCode , char keyChar ,
182- Object jQueryEvent ) {
183-
184- // switch (eventType) {
185- // case KeyEvent.KEY_PRESSED:
186- // // note that events are bundled here into one eventType
187- // int keyCode = 0;
188- // int modifiers = JSUtil.J2S._getKeyModifiers(jQueryEvent);
189- // char keyChar = '\0';
190- // String type = null;
191- // /**
192- // * @j2sNative
193- // *
194- // * keyCode = jQueryEvent.keyCode;
195- // * keyChar = jQueryEvent.key;
196- // * type = jQueryEvent.type;
197- // *
198- // */
199- // switch (type) {
200- // case "keydown":
201- // eventType = KeyEvent.KEY_PRESSED;
202- // break;
203- // case "keypress":
204- // // igonred by Java for
205- //
206- //
207- //// Control keys
208- //// VK_ENTER, VK_BACKSPACE, VK_TAB, VK_ESCAPE
209- //// Function keys
210- //// VK_F1, VK_F2, VK_F3, VK_F4 VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10, VK_F11, VK_F12,
211- //// VK_SCROLL_LOCK, VK_PRINTSCREEN, VK_PAUSE,
212- //// VK_DELETE, VK_INSERT,
213- //// VK_PAGE_UP, VK_PAGE_DOWN, VK_HOME, VK_END
214- //// Java: pressed/released only, with keyChar 0xFFFF
215- //// DEL: adds 0 127 typed
216- //// INS: code is 155
217- //// JavaScript: down/pressed/up; but only up for printScreen
218- //// PRINTSCREEN code is 44
219- //// INS: code is 45
220- //// DEL: code is 46
221- ////
222- //// Arrow keys
223- //// VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN
224- //// Java: pressed/released 38/0xFFFF
225- ////
226- ////
227- //
228- // // TODO: generate this for BACKSPACE and what other keys?
229- // eventType = KeyEvent.KEY_TYPED;
230- // keyChar = (char) keyCode;
231- // keyCode = KeyEvent.VK_UNDEFINED;
232- // break;
233- // case "keyup":
234- // eventType = KeyEvent.KEY_RELEASED;
235- // break;
236- // }
237-
238-
239- super (jc , eventType , currentTimeMillis , modifiers , keyCode , keyChar );
240- jqEvent = jQueryEvent ;
241- // TODO Auto-generated constructor stub
242- }
243-
244- public boolean doIgnore () {
245- // some TYPE events are ignored
246- return ignore ;
247- }
248-
249161}
0 commit comments