Bug 566293 - Unit tests for keyboard layout fail in newer Eclipse

Change-Id: I60e38967445781392582c8a15d80e6e279a563f9
Signed-off-by: José Manuel Arnesto <kevloral@gmail.com>
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AbstractKeyboardTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AbstractKeyboardTest.java
index 5b399fa..402d05f 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AbstractKeyboardTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AbstractKeyboardTest.java
@@ -35,259 +35,259 @@
 	public void canTypeSingleQuote() throws Exception {
 		styledText.setFocus();
 		styledText.typeText("'");
-		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=2009363 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=0 end=0 text='}");
+		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=2009363 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true start=0 end=0 text='}");
 		assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=2009363 data=null}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1951427 data=null character=''' keyCode=" + toKeyCode(39, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1951515 data=null character=''' keyCode=" + toKeyCode(39, styledText.widget) + " stateMask=0 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1951427 data=null character=" + toCharacter('\'', styledText.widget) + " keyCode=" + toKeyCode(39, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1951515 data=null character=" + toCharacter('\'', styledText.widget) + " keyCode=" + toKeyCode(39, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canTypeAltUpKey() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.MOD3, Keystrokes.UP);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=-2118818527 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=-2118818111 data=null character='\\0' keyCode=" + toKeyCode(16777217, styledText.widget) + " stateMask=65536 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=-2118818055 data=null character='\\0' keyCode=" + toKeyCode(16777217, styledText.widget) + " stateMask=65536 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=-2118817351 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=-2118818527 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=-2118818111 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777217, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=-2118818055 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777217, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=-2118817351 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canTypeBackquoteKey() throws Exception {
 		styledText.setFocus();
 		styledText.typeText("`");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=332938450 data=null character='`' keyCode=" + toKeyCode(96, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=332938540 data=null character='`' keyCode=" + toKeyCode(96, styledText.widget) + " stateMask=0 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=332938450 data=null character=" + toCharacter('`', styledText.widget) + " keyCode=" + toKeyCode(96, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=332938540 data=null character=" + toCharacter('`', styledText.widget) + " keyCode=" + toKeyCode(96, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canTypeShiftKey() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.SHIFT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=332938450 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=332938540 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=332938450 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=332938540 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canTypeEndKey() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.END);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1686687 data=null character='\\0' keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1686718 data=null character='\\0' keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=0 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1686687 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1686718 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
     }
 
 	@Test
 	public void canTypeCTRLKey() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.CTRL);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334095974 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334096084 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334095974 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334096084 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canTypeAltKey() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.ALT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337927063 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337927163 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337927063 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337927163 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_CTRL_SHIFT_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.SHIFT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334163451 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334163611 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=262144 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334163782 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=393216 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334163832 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334163451 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334163611 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334163782 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(393216, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334163832 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_SHIFT_CTRL_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.CTRL);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334173686 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334173996 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=131072 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334174277 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=393216 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334174347 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334173686 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334173996 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334174277 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(393216, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334174347 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_CTRL_ALT_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.ALT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334364901 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334365191 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=262144 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334365331 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=327680 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334365492 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334364901 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334365191 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334365331 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(327680, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334365492 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_ALT_CTRL_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.ALT, Keystrokes.CTRL);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334374164 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334374324 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=65536 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334374475 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=327680 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334374495 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334374164 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334374324 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334374475 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(327680, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334374495 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_SHIFT_ALT_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.ALT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334403126 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334403236 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=131072 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334403366 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334403426 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334403126 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334403236 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334403366 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334403426 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_ALT_SHIFT_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.ALT, Keystrokes.SHIFT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334417126 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334417456 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=65536 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334417526 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334417577 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334417126 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334417456 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334417526 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334417577 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_SHIFT_CTRL_ALT_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.CTRL, Keystrokes.ALT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=336998217 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=336998548 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=131072 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=336998858 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=393216 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=336998938 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=458752 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337000000 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=393216 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337000330 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=336998217 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=336998548 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=336998858 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(393216, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=336998938 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(458752, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337000000 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(393216, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337000330 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_SHIFT_ALT_CTRL_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.ALT, Keystrokes.CTRL);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337024085 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337024595 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=131072 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337025316 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337026738 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=458752 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337027700 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337028090 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337024085 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337024595 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337025316 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337026738 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(458752, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337027700 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337028090 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_CTRL_SHIFT_ALT_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.SHIFT, Keystrokes.ALT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337073666 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337074086 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=262144 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337074527 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=393216 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337074928 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=458752 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337075999 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=393216 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337076370 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337073666 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337074086 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337074527 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(393216, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337074928 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(458752, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337075999 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(393216, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337076370 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_CTRL_ALT_SHIFT_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.ALT, Keystrokes.SHIFT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337084111 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337084592 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=262144 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337085162 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=327680 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337085753 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=458752 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337086184 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=327680 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337086584 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337084111 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337084592 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337085162 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(327680, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337085753 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(458752, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337086184 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(327680, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337086584 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_ALT_CTRL_SHIFT_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.ALT, Keystrokes.CTRL, Keystrokes.SHIFT);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337516292 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337516753 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=65536 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337517113 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=327680 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337517985 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=458752 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337518335 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=327680 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337518686 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337516292 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337516753 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337517113 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(327680, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337517985 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(458752, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337518335 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(327680, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337518686 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canType_ALT_SHIFT_CTRL_Keys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.ALT, Keystrokes.SHIFT, Keystrokes.CTRL);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337527028 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337527649 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=65536 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337528209 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337531534 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=458752 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337532275 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337532666 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337527028 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337527649 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337528209 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337531534 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(458752, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337532275 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337532666 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
 	}
 	
 	@Test
 	public void canTypeCTRL_SHIFT_T() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.toKeys(SWT.CTRL | SWT.SHIFT, 't'));
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=356391804 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=356392194 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=262144 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=356393156 data=null character='' keyCode=" + toKeyCode(116, styledText.widget) + " stateMask=393216 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=356392495 data=null character='' keyCode=" + toKeyCode(116, styledText.widget) + " stateMask=393216 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=356393987 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=393216 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=356394307 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=356391804 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=356392194 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=356393156 data=null character=" + toCharacter('', styledText.widget) + " keyCode=" + toKeyCode(116, styledText.widget) + " stateMask=" + toStateMask(393216, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=356392495 data=null character=" + toCharacter('', styledText.widget) + " keyCode=" + toKeyCode(116, styledText.widget) + " stateMask=" + toStateMask(393216, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=356393987 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(393216, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=356394307 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
 	}
 	
 	@Test
 	public void canTypeSmallCharacters() throws Exception {
 		styledText.setFocus();
 		keyboard.typeText("ab");
-		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=358259489 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=0 end=0 text=a}");
+		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=358259489 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true start=0 end=0 text=a}");
 		assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=358259489 data=null}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=358259489 data=null character='a' keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=358259560 data=null character='a' keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=358264617 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=1 end=1 text=b}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=358259489 data=null character=" + toCharacter('a', styledText.widget) + " keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=358259560 data=null character=" + toCharacter('a', styledText.widget) + " keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=358264617 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true start=1 end=1 text=b}");
 		assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=358264617 data=null}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=358264617 data=null character='b' keyCode=" + toKeyCode(98, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=358259810 data=null character='b' keyCode=" + toKeyCode(98, styledText.widget) + " stateMask=0 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=358264617 data=null character=" + toCharacter('b', styledText.widget) + " keyCode=" + toKeyCode(98, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=358259810 data=null character=" + toCharacter('b', styledText.widget) + " keyCode=" + toKeyCode(98, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
 	}
 	
 	@Test
 	public void canTypeCapitalCharacters() throws Exception {
 		styledText.setFocus();
 		keyboard.typeText("A");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=359800165 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=359800285 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=0 end=0 text=A}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=359800165 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=359800285 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true start=0 end=0 text=A}");
 		assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=359800285 data=null}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=359800285 data=null character='A' keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=131072 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=359800405 data=null character='A' keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=131072 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=359800485 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=359800285 data=null character=" + toCharacter('A', styledText.widget) + " keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=359800405 data=null character=" + toCharacter('A', styledText.widget) + " keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=359800485 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
 	}
 	
 	@Test
 	public void canTypeCTRL_SPACE() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.create(' ')[0]);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=41517702 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=41517702 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
 		if (!isWin32() && !isGtk()) // FIXME: bug 278162: Sending CTRL+SPACE does not work consistently across platforms
 			assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=41517983 data=null}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=41517983 data=null character=' ' keyCode=" + toKeyCode(32, styledText.widget) + " stateMask=262144 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=41518070 data=null character=' ' keyCode=" + toKeyCode(32, styledText.widget) + " stateMask=262144 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=41518278 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=41517983 data=null character=" + toCharacter(' ', styledText.widget) + " keyCode=" + toKeyCode(32, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=41518070 data=null character=" + toCharacter(' ', styledText.widget) + " keyCode=" + toKeyCode(32, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=41518278 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=" + toStateMask(262144, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canTypeFunctionKeys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(SWT.NONE, SWT.F2, '\0');
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=71024493 data=null character='\\0' keyCode=" + toKeyCode(16777227, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=71024597 data=null character='\\0' keyCode=" + toKeyCode(16777227, styledText.widget) + " stateMask=0 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=71024493 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777227, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=71024597 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777227, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canTypeArrowKeys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.DOWN);
-		assertEventMatches(listeners, "Traverse [31]: TraverseEvent{StyledText {} time=72468446 data=null character='\\0' keyCode=" + toKeyCode(16777218, styledText.widget) + " stateMask=0 doit=false detail=64}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=72468446 data=null character='\\0' keyCode=" + toKeyCode(16777218, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=72468502 data=null character='\\0' keyCode=" + toKeyCode(16777218, styledText.widget) + " stateMask=0 doit=true}");
+		assertEventMatches(listeners, "Traverse [31]: TraverseEvent{StyledText {} time=72468446 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777218, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=false detail=64}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=72468446 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777218, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=72468502 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777218, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
 	}
 
 	@Test
@@ -296,22 +296,22 @@
 			return;
 		styledText.setFocus();
 		styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.END);
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=74720408 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=74720744 data=null character='\\0' keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=131072 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=74720800 data=null character='\\0' keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=131072 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=74720904 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=74720408 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=74720744 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=74720800 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=74720904 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(131072, styledText.widget) + " doit=true}");
 	}
 
 	@Test
 	public void canTypeModifierAndSpecialKeys() throws Exception {
 		styledText.setFocus();
 		styledText.pressShortcut(SWT.ALT | SWT.SHIFT, SWT.F1, '\0');
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1734039746 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1734040242 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=65536 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1734040650 data=null character='\\0' keyCode=" + toKeyCode(16777226, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1734040730 data=null character='\\0' keyCode=" + toKeyCode(16777226, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1734041073 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1734041394 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1734039746 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1734040242 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1734040650 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777226, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1734040730 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(16777226, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1734041073 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1734041394 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
 	}
 
 	@Test
@@ -321,14 +321,14 @@
 			return;
 		styledText.setFocus();
 		styledText.pressShortcut(SWT.ALT | SWT.SHIFT, 'c');
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=17898887 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=17899215 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=65536 doit=true}");
-		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=17899783 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=0 end=0 text=Ç}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=17898887 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=17899215 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=17899783 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=" + toStateMask(0, styledText.widget) + " doit=true start=0 end=0 text=Ç}");
 		assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=17899783 data=null}");
-		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=17899783 data=null character='Ç' keyCode=" + toKeyCode(99, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17899887 data=null character='Ç' keyCode=" + toKeyCode(99, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17900711 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=196608 doit=true}");
-		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17901071 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}");
+		assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=17899783 data=null character='Ç' keyCode=" + toKeyCode(99, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17899887 data=null character='Ç' keyCode=" + toKeyCode(99, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17900711 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=" + toStateMask(196608, styledText.widget) + " doit=true}");
+		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17901071 data=null character=" + toCharacter('\0', styledText.widget) + " keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=" + toStateMask(65536, styledText.widget) + " doit=true}");
 	}
 
 	@Before