Skip to content

Commit 4125be0

Browse files
committed
KeyEvent fixed
1 parent 1e2b664 commit 4125be0

File tree

4 files changed

+209
-124
lines changed

4 files changed

+209
-124
lines changed

sources/net.sf.j2s.java.core/src/java/awt/AWTKeyStroke.java

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,9 @@ private static VKCollection getVKCollection() {
590590
return (vks == null ? (vks = new VKCollection()) : vks);
591591
}
592592

593-
593+
public static void addKeyCode(String key, int keyCode) {
594+
getVKCollection().put(key, Integer.valueOf(keyCode));
595+
}
594596

595597

596598
/**
@@ -600,29 +602,10 @@ private static VKCollection getVKCollection() {
600602
*/
601603
public static int getVKValue(String key) {
602604
VKCollection vkCollect = getVKCollection();
603-
604605
Integer value = vkCollect.findCode(key);
605-
606606
if (value == null) {
607-
int keyCode = 0;
608-
final String errmsg = "String formatted incorrectly";
609-
610-
try {
611-
/**
612-
* @j2sNative
613-
*
614-
* keyCode = Clazz.load("java.awt.event.KeyEvent")[key];
615-
*/
616-
{
617-
keyCode = KeyEvent.class.getField(key).getInt(KeyEvent.class);
618-
}
619-
} catch (NoSuchFieldException nsfe) {
620-
throw new IllegalArgumentException(errmsg);
621-
} catch (IllegalAccessException iae) {
622-
throw new IllegalArgumentException(errmsg);
623-
}
624-
value = Integer.valueOf(keyCode);
625-
vkCollect.put(key, value);
607+
vkCollect.put(key, Integer.valueOf(-1));
608+
throw new IllegalArgumentException("String formatted incorrectly");
626609
}
627610
return value.intValue();
628611
}
Lines changed: 195 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
1-
package swingjs.plaf;
1+
package swingjs;
22

33
import java.awt.AWTKeyStroke;
4+
import java.awt.event.InputEvent;
45
import java.awt.event.KeyEvent;
56

67
import javax.swing.JComponent;
78

9+
/**
10+
* Handle the conversion between JavaScript and Java key events.
11+
*
12+
* @author Bob Hanson
13+
*
14+
*/
815
@SuppressWarnings({"serial", "unused"})
916
public class JSKeyEvent extends KeyEvent {
1017

18+
// used currently only by plaf/JSListUI
19+
1120

1221
//Alphanumeric keys
1322
// VK_0, VK_1, ..., VK_9, VK_A, VK_B, ..., VK_Z
@@ -37,69 +46,207 @@ public class JSKeyEvent extends KeyEvent {
3746
//JavaScript: down/pressed/up 38/"ArrowUp"
3847

3948
Object jqEvent;
49+
private boolean ignore;
4050

4151
public JSKeyEvent(JComponent source, Object jQueryEvent) {
4252
super();
53+
this.source = source;
54+
when = System.currentTimeMillis();
55+
keyLocation = KeyEvent.KEY_LOCATION_UNKNOWN;
56+
Object ev = this.jqEvent = jQueryEvent;
57+
// JavaScript information:
4358
String evType = null;
44-
int keyCode = 0;
45-
int which = 0;
46-
int modifiers = 0;
47-
int id = 0;
48-
long when = System.currentTimeMillis();
49-
char keyChar = 0;
50-
int keyLocation = KeyEvent.KEY_LOCATION_UNKNOWN;
51-
String key = "";
52-
Object ev = jQueryEvent;
59+
String jskey = "";
60+
int jskeyCode = 0;
61+
boolean shift = false, ctrl = false, meta = false, alt = false, altGraph = false;
5362
/**
5463
* @j2sNative
5564
*
56-
* key = ev.key;
5765
* evType = ev.type;
58-
* keyCode = ev.keyCode || ev.which;
59-
* if (keyCode == 13) keyCode = 10;
66+
* jskey = ev.key;
67+
* jskeyCode = ev.keyCode || ev.which;
6068
* if (evType == "keypress")
61-
* ev.originalEvent.preventDefault();
62-
*
63-
*
64-
* if (ev.shiftKey)
65-
modifiers |= (1<<0)|(1<<6); //InputEvent.SHIFT_MASK + InputEvent.SHIFT_DOWN_MASK;
66-
if (ev.ctrlKey)
67-
modifiers |= (1<<1)|(1<<7); //InputEvent.CTRL_MASK + InputEvent.CTRL_DOWN_MASK;
68-
if (ev.metaKey)
69-
modifiers |= (1<<2)|(1<<8); //InputEvent.META_MASK + InputEvent.META_DOWN_MASK;
70-
if (ev.altKey)
71-
modifiers |= (1<<3)|(1<<9); //InputEvent.ALT_MASK + InputEvent.ALT_DOWN_MASK;
72-
if (ev.altGraphKey)
73-
modifiers |= (1<<5)|(1<<13); //InputEvent.ALT_GRAPH_MASK + InputEvent.ALT_GRAPH_DOWN_MASK;
74-
*
75-
* if (keyCode == 8 && evType == "keypress") ev.originalEvent.preventDefault();
69+
* ev.originalEvent.preventDefault();
70+
* shift = ev.shiftKey;
71+
* ctrl = ev.ctrlKey;
72+
* alt = ev.altKey;
73+
* meta = ev.metaKey;
74+
* altGraph = ev.altGraphKey;
7675
*/
77-
{}
76+
77+
modifiers = JSKeyEvent.getModifiers(shift, ctrl, alt, meta, altGraph);
7878

7979
// JavaScript: keydown keypress keyup
8080
// Java: KEY_PRESSED KEY_TYPED KEY_RELEASED
8181

82-
id = (evType == "keydown" ? KeyEvent.KEY_PRESSED : evType == "keypress" ? KeyEvent.KEY_TYPED : evType == "keyup" ? KeyEvent.KEY_RELEASED : 0);
83-
this.source = source;
84-
this.id = id;
85-
this.when = when;
86-
this.modifiers = modifiers;
87-
this.keyCode = keyCode;
88-
int ch;
89-
int test;
82+
id = (evType == "keydown" ? KEY_PRESSED : evType == "keypress" ? KEY_TYPED : evType == "keyup" ? KEY_RELEASED : 0);
83+
keyCode = getJavaKeyCode(jskeyCode, jskey);
84+
boolean noKey = checkNoKey(keyCode, jskey);
85+
if (noKey) {
86+
ignore = (id == KEY_TYPED);
87+
keyChar = (ignore ? (char) keyCode : CHAR_UNDEFINED);
88+
} else {
89+
keyChar = getKeyChar(keyCode, jskey);
90+
}
91+
if (id == KEY_TYPED)
92+
keyCode = 0;
93+
}
94+
95+
private static int getJavaKeyCode(int jskeyCode, String jskey) {
96+
97+
// see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
98+
99+
if (jskeyCode <= 40) {
100+
// 0-40 is same
101+
return jskeyCode;
102+
}
103+
if (jskey.length() == 1) {
104+
// same if 1-character, except numeric keypad 0-9
105+
return (jskeyCode >= 96 && jskeyCode <= 105 ? jskeyCode : 0 + jskey.toUpperCase().charAt(0));
106+
}
107+
switch (jskeyCode) {
108+
109+
case 91: // META
110+
return 157;
111+
case 93: // CONTEXT_MENU
112+
return 525;
113+
case 144: // NUM_LOCK
114+
case 145: // SCROLL_LOCK
115+
return jskeyCode;
116+
case 244: // Kanji
117+
return 25;
118+
}
119+
120+
String keyName = "VK_" + jskey.toUpperCase();
90121
try {
91-
// only safe thing to do is get Java's keyCode from itself
92-
// for example, "Delete" is 46 instead of 127
93-
this.keyCode = (key.length() == 1 ? 0
94-
+ (id == 400 ? '\0' : key.toUpperCase().charAt(0))
95-
: keyCode == 10 || keyCode == 8 || keyCode == 9 ? 0 :
96-
(ch = AWTKeyStroke.getVKValue ("VK_" + key.toUpperCase())) == 0 ? keyCode : ch);
122+
// get the Java code from AWTKeyStroke by name, if possible
123+
return AWTKeyStroke.getVKValue(keyName);
97124
} catch (Exception e) {
98-
// ignore
99-
}
100-
this.keyChar = (key.length() == 1 ? key.charAt(0) : keyCode == 10 ? '\n' : keyCode == 8 ? '\b' : keyCode == 9 ? '\t' : '\0');
101-
this.keyLocation = keyLocation;
102-
this.jqEvent = ev;
125+
// or add this jskeycode to the Java list and note that on System.out
126+
System.out.println("JSKeyEvent adding key/keyCode " + keyName + " " + jskeyCode);
127+
AWTKeyStroke.addKeyCode(keyName, jskeyCode);
128+
}
129+
return jskeyCode;
130+
}
131+
132+
private static char getKeyChar(int jskeyCode, String jskey) {
133+
if (jskey.length() == 1)
134+
return jskey.charAt(0);
135+
switch (jskeyCode) {
136+
case VK_ENTER:
137+
return '\n';
138+
case VK_BACK_SPACE:
139+
return '\b';
140+
case VK_TAB:
141+
return '\t';
142+
case VK_DELETE:
143+
return (char) 127;
144+
case VK_ESCAPE:
145+
return (char) 27;
146+
default:
147+
return '\uFFFF';
148+
}
149+
}
150+
151+
private static boolean checkNoKey(int keyCode, String jskey) {
152+
switch (keyCode) {
153+
case VK_ENTER:
154+
case VK_TAB:
155+
case VK_BACK_SPACE:
156+
case VK_DELETE:
157+
case VK_ESCAPE:
158+
case VK_CANCEL: // untested
159+
case VK_CLEAR: // untested
160+
return false;
161+
}
162+
// otherwise only single-char jskeys have characters in Java
163+
return (jskey.length() > 1);
164+
}
165+
166+
private static int getModifiers(boolean shift, boolean ctrl, boolean alt, boolean meta, boolean altGraph) {
167+
int modifiers = 0;
168+
if (shift)
169+
modifiers |= InputEvent.SHIFT_MASK + InputEvent.SHIFT_DOWN_MASK;
170+
if (ctrl)
171+
modifiers |= InputEvent.CTRL_MASK + InputEvent.CTRL_DOWN_MASK;
172+
if (alt)
173+
modifiers |= InputEvent.ALT_MASK + InputEvent.ALT_DOWN_MASK;
174+
if (meta)
175+
modifiers |= InputEvent.META_MASK + InputEvent.META_DOWN_MASK;
176+
if (altGraph)
177+
modifiers |= InputEvent.ALT_GRAPH_MASK + InputEvent.ALT_GRAPH_DOWN_MASK;
178+
179+
180+
// TODO Auto-generated method stub
181+
return 0;
182+
}
183+
184+
public JSKeyEvent(JComponent jc, int eventType, long currentTimeMillis, int modifiers, int keyCode, char keyChar,
185+
Object jQueryEvent) {
186+
187+
// switch (eventType) {
188+
// case KeyEvent.KEY_PRESSED:
189+
// // note that events are bundled here into one eventType
190+
// int keyCode = 0;
191+
// int modifiers = JSUtil.J2S._getKeyModifiers(jQueryEvent);
192+
// char keyChar = '\0';
193+
// String type = null;
194+
// /**
195+
// * @j2sNative
196+
// *
197+
// * keyCode = jQueryEvent.keyCode;
198+
// * keyChar = jQueryEvent.key;
199+
// * type = jQueryEvent.type;
200+
// *
201+
// */
202+
// switch (type) {
203+
// case "keydown":
204+
// eventType = KeyEvent.KEY_PRESSED;
205+
// break;
206+
// case "keypress":
207+
// // igonred by Java for
208+
//
209+
//
210+
//// Control keys
211+
//// VK_ENTER, VK_BACKSPACE, VK_TAB, VK_ESCAPE
212+
//// Function keys
213+
//// VK_F1, VK_F2, VK_F3, VK_F4 VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10, VK_F11, VK_F12,
214+
//// VK_SCROLL_LOCK, VK_PRINTSCREEN, VK_PAUSE,
215+
//// VK_DELETE, VK_INSERT,
216+
//// VK_PAGE_UP, VK_PAGE_DOWN, VK_HOME, VK_END
217+
//// Java: pressed/released only, with keyChar 0xFFFF
218+
//// DEL: adds 0 127 typed
219+
//// INS: code is 155
220+
//// JavaScript: down/pressed/up; but only up for printScreen
221+
//// PRINTSCREEN code is 44
222+
//// INS: code is 45
223+
//// DEL: code is 46
224+
////
225+
//// Arrow keys
226+
//// VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN
227+
//// Java: pressed/released 38/0xFFFF
228+
////
229+
////
230+
//
231+
// // TODO: generate this for BACKSPACE and what other keys?
232+
// eventType = KeyEvent.KEY_TYPED;
233+
// keyChar = (char) keyCode;
234+
// keyCode = KeyEvent.VK_UNDEFINED;
235+
// break;
236+
// case "keyup":
237+
// eventType = KeyEvent.KEY_RELEASED;
238+
// break;
239+
// }
240+
241+
242+
super(jc, eventType, currentTimeMillis, modifiers, keyCode, keyChar);
243+
jqEvent = jQueryEvent;
244+
// TODO Auto-generated constructor stub
245+
}
246+
247+
public boolean doIgnore() {
248+
// some TYPE events are ignored
249+
return ignore;
103250
}
104251

105252
}

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSListUI.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import sun.swing.DefaultLookup;
7171
import sun.swing.SwingUtilities2;
7272
import sun.swing.UIAction;
73+
import swingjs.JSKeyEvent;
7374
import swingjs.JSUtil;
7475
//import java.awt.datatransfer.Transferable;
7576
//import javax.swing.BorderFactory;
@@ -137,7 +138,9 @@ protected DOMNode updateDOMNode() {
137138
public boolean handleJSEvent(Object target, int eventType, Object jQueryEvent) {
138139
switch (eventType) {
139140
case KeyEvent.KEY_PRESSED:
140-
jc.dispatchEvent(new JSKeyEvent(jc, jQueryEvent));
141+
JSKeyEvent keyEvent = new JSKeyEvent(jc, jQueryEvent);
142+
if (!keyEvent.doIgnore())
143+
jc.dispatchEvent(keyEvent);
141144
break;
142145
}
143146
return true;

0 commit comments

Comments
 (0)