Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrant Gayed2010-02-16 20:52:30 +0000
committerGrant Gayed2010-02-16 20:52:30 +0000
commit1990d21b38ad9eb025b792e0e6abf2d70c98eec0 (patch)
tree20831dec617eb9626612161b2776aaadf45f71ed /bundles/org.eclipse.swt/Eclipse SWT Browser
parent953ca18350a344dd04af4811bafee035eeede5d1 (diff)
downloadeclipse.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.java116
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);

Back to the top