diff options
author | Grant Gayed | 2010-02-16 20:52:30 +0000 |
---|---|---|
committer | Grant Gayed | 2010-02-16 20:52:30 +0000 |
commit | 1990d21b38ad9eb025b792e0e6abf2d70c98eec0 (patch) | |
tree | 20831dec617eb9626612161b2776aaadf45f71ed /bundles/org.eclipse.swt/Eclipse SWT Browser | |
parent | 953ca18350a344dd04af4811bafee035eeede5d1 (diff) | |
download | eclipse.platform.swt-1990d21b38ad9eb025b792e0e6abf2d70c98eec0.tar.gz eclipse.platform.swt-1990d21b38ad9eb025b792e0e6abf2d70c98eec0.tar.xz eclipse.platform.swt-1990d21b38ad9eb025b792e0e6abf2d70c98eec0.zip |
231311 - Browser widget does not implement Traverse events
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT Browser')
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java | 116 |
1 files changed, 106 insertions, 10 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java index 10b84ac73b..2fc0db9d16 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java @@ -30,6 +30,7 @@ class IE extends WebBrowser { boolean back, forward, navigate, delaySetText, ignoreDispose; boolean installFunctionsOnDocumentComplete, untrustedText; + boolean nextTraverseDoit, ignoreTraverse; Point location; Point size; boolean addressBar = true, menuBar = true, statusBar = true, toolBar = true; @@ -325,20 +326,40 @@ public void create(Composite parent, int style) { e.doit = false; break; } - /* - * FocusIn and Traverse are hooked to handle traversal into - * and out of the Browser when it has key listeners. - */ case SWT.FocusIn: { site.setFocus(); break; } + /* + * Tabbing out of the browser can fail as a result of the WebSite + * embedded within the Browser (eg.- if the WebSite has focus then + * a typical backwards-traversal re-assigns focus within the parent + * Browser). The workaround is to listen for traversals and re- + * perform the traversal on the appropriate control. + */ case SWT.Traverse: { - if (browser.isListening(SWT.KeyDown) || browser.isListening(SWT.KeyUp)) { - if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { + if (e.widget instanceof WebSite) { + if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS && e.doit) { browser.traverse(SWT.TRAVERSE_TAB_PREVIOUS); e.doit = false; } + } else { /* instanceof Browser */ + if (e.detail == SWT.TRAVERSE_TAB_NEXT) { + if (ignoreTraverse) { + ignoreTraverse = false; + break; + } + ignoreTraverse = true; + e.doit = nextTraverseDoit; + browser.notifyListeners(e.type, e); + e.type = SWT.NONE; + if (e.doit) { + site.traverse(SWT.TRAVERSE_TAB_NEXT); + e.doit = false; + } + } else { + e.doit = nextTraverseDoit; + } } break; } @@ -348,6 +369,7 @@ public void create(Composite parent, int style) { browser.addListener(SWT.Dispose, listener); browser.addListener(SWT.FocusIn, listener); browser.addListener(SWT.Resize, listener); + browser.addListener(SWT.Traverse, listener); site.addListener(SWT.MouseWheel, listener); site.addListener(SWT.Traverse, listener); @@ -1168,6 +1190,82 @@ public void refresh() { auto.invoke(rgdispid[0]); } +boolean sendKeyEvent(Event event) { + int traversal = SWT.TRAVERSE_NONE; + boolean all = false; + switch (event.keyCode) { + case SWT.ESC: { + traversal = SWT.TRAVERSE_ESCAPE; + all = true; + nextTraverseDoit = true; + break; + } + case SWT.CR: { + traversal = SWT.TRAVERSE_RETURN; + all = true; + nextTraverseDoit = false; + break; + } + case SWT.ARROW_DOWN: + case SWT.ARROW_RIGHT: + traversal = SWT.TRAVERSE_ARROW_NEXT; + nextTraverseDoit = false; + break; + case SWT.ARROW_UP: + case SWT.ARROW_LEFT: + traversal = SWT.TRAVERSE_ARROW_PREVIOUS; + nextTraverseDoit = false; + break; + case SWT.TAB: + traversal = (event.stateMask & SWT.SHIFT) != 0 ? SWT.TRAVERSE_TAB_PREVIOUS : SWT.TRAVERSE_TAB_NEXT; + nextTraverseDoit = (event.stateMask & SWT.CTRL) != 0; + break; + case SWT.PAGE_DOWN: + if ((event.stateMask & SWT.CTRL) != 0) { + traversal = SWT.TRAVERSE_PAGE_NEXT; + all = true; + nextTraverseDoit = true; + } + break; + case SWT.PAGE_UP: + if ((event.stateMask & SWT.CTRL) != 0) { + traversal = SWT.TRAVERSE_PAGE_PREVIOUS; + all = true; + nextTraverseDoit = true; + } + break; + } + boolean doit = true; + if (traversal != SWT.TRAVERSE_NONE) { + Control control = browser; + Shell shell = control.getShell(); + final Event[] traverseEvent = new Event[1]; + Listener listener = new Listener() { + public void handleEvent(Event event) { + traverseEvent[0] = event; + } + }; + Display display = browser.getDisplay(); + display.addFilter(SWT.Traverse, listener); + do { + if (control.traverse(traversal)) { + doit = false; + break; + } + if (!traverseEvent[0].doit && control.isListening(SWT.Traverse)) break; + if (control == shell) break; + control = control.getParent(); + } while (all && control != null); + display.removeFilter(SWT.Traverse, listener); + nextTraverseDoit = true; + } + if (doit) { + browser.notifyListeners(event.type, event); + doit = event.doit; + } + return doit; +} + void setHTML (String string) { int charCount = string.length(); char[] chars = new char[charCount]; @@ -1475,8 +1573,7 @@ void handleDOMEvent (OleEvent e) { case SWT.DEL: lastCharCode = keyEvent.character = SWT.DEL; break; case SWT.TAB: lastCharCode = keyEvent.character = SWT.TAB; break; } - browser.notifyListeners (keyEvent.type, keyEvent); - if (!keyEvent.doit) { + if (!sendKeyEvent(keyEvent)) { rgdispid = event.getIDsOfNames(new String[] { PROPERTY_RETURNVALUE }); dispIdMember = rgdispid[0]; Variant pVarFalse = new Variant(false); @@ -1534,8 +1631,7 @@ void handleDOMEvent (OleEvent e) { keyEvent.keyCode = lastKeyCode; keyEvent.character = (char)lastCharCode; keyEvent.stateMask = mask; - browser.notifyListeners (keyEvent.type, keyEvent); - if (!keyEvent.doit) { + if (!sendKeyEvent(keyEvent)) { rgdispid = event.getIDsOfNames(new String[] { PROPERTY_RETURNVALUE }); dispIdMember = rgdispid[0]; Variant pVarFalse = new Variant(false); |