package org.limewire.ui.swing.browser; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import org.limewire.util.OSUtils; import org.mozilla.browser.MozillaExecutor; import org.mozilla.browser.MozillaKeyEvent; import org.mozilla.browser.XPCOMUtils; import org.mozilla.interfaces.nsIWebBrowserChrome; import org.mozilla.interfaces.nsIWebNavigation; /** * Provides key binding for forward and back navigation for * nsIWebBrowserChrome-based browsers. */ class MozillaKeyListener extends KeyAdapter { /** * nsIWebNavigation, like most Mozilla classes, is not thread-safe and must * only be set and used from the Mozilla Thread */ private nsIWebNavigation nav; /** * * @param chrome the browser targeted by the forward/back key bindings */ public MozillaKeyListener(final nsIWebBrowserChrome chrome) { MozillaExecutor.mozAsyncExec(new Runnable() { public void run() { nav = XPCOMUtils.qi(chrome.getWebBrowser(), nsIWebNavigation.class); } }); } @Override public void keyPressed(KeyEvent e) { if (e instanceof MozillaKeyEvent) { MozillaKeyEvent mozKeyEvent = (MozillaKeyEvent) e; boolean altDown = OSUtils.isMacOSX() ? mozKeyEvent.isMetaDown() : mozKeyEvent.isAltDown(); boolean rightPressed = altDown && mozKeyEvent.getKeyCode() == KeyEvent.VK_RIGHT; boolean leftPressed = altDown && mozKeyEvent.getKeyCode() == KeyEvent.VK_LEFT; //back buton is pressed and focus is not inside a text control boolean backPressed = mozKeyEvent.getKeyCode() == KeyEvent.VK_BACK_SPACE && !BrowserUtils.isTextControl(mozKeyEvent.getSourceNode()); if ((leftPressed || backPressed)) { MozillaExecutor.mozAsyncExec(new Runnable() { public void run() { if (nav.getCanGoBack()) nav.goBack(); } }); } else if (rightPressed) { MozillaExecutor.mozAsyncExec(new Runnable() { public void run() { if (nav.getCanGoForward()) nav.goForward(); } }); } } } }