summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT Mozilla
diff options
context:
space:
mode:
authorGrant Gayed <ggayed>2010-02-16 21:36:05 +0000
committerGrant Gayed <ggayed>2010-02-16 21:36:05 +0000
commit4d6f560f0a06efaf67a7e46b7c04fa4921ffc103 (patch)
treef11c016269e467c69dfe702f8a3ff5f7f3c19d16 /bundles/org.eclipse.swt/Eclipse SWT Mozilla
parentcaee548380386542be30d62a7779aaed8593ad67 (diff)
downloadeclipse.platform.swt-4d6f560f0a06efaf67a7e46b7c04fa4921ffc103.tar.gz
eclipse.platform.swt-4d6f560f0a06efaf67a7e46b7c04fa4921ffc103.tar.xz
eclipse.platform.swt-4d6f560f0a06efaf67a7e46b7c04fa4921ffc103.zip
231311 - Browser widget does not implement Traverse events
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT Mozilla')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java88
1 files changed, 84 insertions, 4 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java
index b07b345935..c08537ba20 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java
@@ -48,7 +48,7 @@ class Mozilla extends WebBrowser {
int /*long*/ request;
Point location, size;
boolean visible, isChild, ignoreDispose, isRetrievingBadCert, isViewingErrorPage, ignoreAllMessages, untrustedText;
- boolean updateLastNavigateUrl;
+ boolean updateLastNavigateUrl, nextTraverseDoit = true;
Shell tip = null;
Listener listener;
Vector unhookedDOMWindows = new Vector ();
@@ -1471,6 +1471,10 @@ public void create (Composite parent, int style) {
});
break;
}
+ case SWT.Traverse: {
+ event.doit = nextTraverseDoit;
+ break;
+ }
}
}
};
@@ -1481,7 +1485,8 @@ public void create (Composite parent, int style) {
SWT.Activate,
SWT.Deactivate,
SWT.Show,
- SWT.KeyDown // needed to make browser traversable
+ SWT.KeyDown, // needed to make browser traversable
+ SWT.Traverse
};
for (int i = 0; i < folderEvents.length; i++) {
browser.addListener (folderEvents[i], listener);
@@ -3885,8 +3890,7 @@ int HandleEvent (int /*long*/ event) {
keyEvent.keyCode = lastKeyCode;
keyEvent.character = (char)lastCharCode;
keyEvent.stateMask = (aAltKey[0] != 0 ? SWT.ALT : 0) | (aCtrlKey[0] != 0 ? SWT.CTRL : 0) | (aShiftKey[0] != 0 ? SWT.SHIFT : 0) | (aMetaKey[0] != 0 ? SWT.COMMAND : 0);
- browser.notifyListeners (keyEvent.type, keyEvent);
- if (!keyEvent.doit || browser.isDisposed ()) {
+ if (!sendKeyEvent (keyEvent) || browser.isDisposed ()) {
domEvent.PreventDefault ();
}
return XPCOM.NS_OK;
@@ -4054,6 +4058,82 @@ int HandleEvent (int /*long*/ event) {
return XPCOM.NS_OK;
}
+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;
+}
+
/* nsIBadCertListener2 */
int NotifyCertProblem (int /*long*/ socketInfo, int /*long*/ status, int /*long*/ targetSite, int /*long*/ _suppressError) {