/* * Ext GWT - Ext for GWT * Copyright(c) 2007-2009, Ext JS, LLC. * licensing@extjs.com * * http://extjs.com/license */ package com.extjs.gxt.ui.client.aria; import java.util.ArrayList; import java.util.List; import com.extjs.gxt.ui.client.event.PreviewEvent; import com.extjs.gxt.ui.client.util.BaseEventPreview; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.ComponentManager; import com.google.gwt.event.dom.client.KeyCodes; public class FocusManager { public static FocusManager get() { if (instance == null) { instance = new FocusManager(); } return instance; } private List<FocusHandler> handlers = new ArrayList<FocusHandler>(); private List<NavigationHandler> navigationHandlers = new ArrayList<NavigationHandler>(); private BaseEventPreview preview; private static FocusManager instance; private boolean managed = true; private FocusManager() { preview = new BaseEventPreview() { @Override protected void onPreviewKeyPress(PreviewEvent pe) { super.onPreviewKeyPress(pe); Component c = ComponentManager.get().find(pe.getTarget()); if (c != null) { int key = pe.getKeyCode(); for (int i = 0; i < handlers.size(); i++) { FocusHandler handler = handlers.get(i); if (handler.canHandleKeyPress(c, pe)) { switch (key) { case KeyCodes.KEY_TAB: handler.onTab(c, pe); break; case KeyCodes.KEY_LEFT: handler.onLeft(c, pe); break; case KeyCodes.KEY_RIGHT: handler.onRight(c, pe); break; case KeyCodes.KEY_ESCAPE: handler.onEscape(c, pe); break; case KeyCodes.KEY_ENTER: handler.onEnter(c, pe); break; } return; } } } } }; preview.setAutoHide(false); initHandlers(); } public void disable() { preview.remove(); } public void enable() { preview.add(); } public NavigationHandler findNavigationHandler(Component comp) { for (int i = 0, len = navigationHandlers.size(); i < len; i++) { NavigationHandler h = navigationHandlers.get(i); if (h.canHandleTabKey(comp)) { return h; } } return null; } public boolean isManaged() { return managed; } public void register(NavigationHandler handler) { navigationHandlers.add(handler); } public void register(FocusHandler handler) { if (!handlers.contains(handler)) { handlers.add(handler); } } public void setManaged(boolean managed) { this.managed = managed; } public void unregister(NavigationHandler handler) { navigationHandlers.remove(handler); } public void unregister(FocusHandler handler) { handlers.remove(handler); } protected void initHandlers() { register(new ButtonBarHandler()); register(new MenuHandler()); register(new TabPanelHandler()); register(new InputSliderHandler()); register(new FieldHandler()); register(new HeaderHandler()); register(new ContentPanelHandler()); // always last register(new DefaultHandler()); register(new ContentPanelNavigationHandler()); } }