/* * 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.GXT; import com.extjs.gxt.ui.client.core.El; import com.extjs.gxt.ui.client.event.BaseObservable; import com.extjs.gxt.ui.client.widget.Component; import com.google.gwt.user.client.DOM; public class FocusFrame extends BaseObservable { private FocusFrame() { } private static FocusFrame instance = new FocusFrame(); private boolean initialized; private Component curComponent; private El focusFrameContainer; private List<El> sides = new ArrayList<El>(); protected void init() { if (!initialized) { focusFrameContainer = new El(DOM.createDiv()); focusFrameContainer.setStyleName("x-aria-focusframe"); focusFrameContainer.makePositionable(); focusFrameContainer.hide(); for (int i = 0; i < 4; i++) { El side = new El(DOM.createDiv()); side.setStyleName("x-aria-focusframe-side"); focusFrameContainer.dom.appendChild(side.dom); side.makePositionable(true); sides.add(side); } initialized = true; } } public static FocusFrame get() { return instance; } public void frame(Component newComponent) { if (!GXT.isAriaEnabled()) { return; } if (!initialized) { init(); } if (curComponent != newComponent) { if (newComponent.isRendered()) { curComponent = newComponent; curComponent.el().getParent().makePositionable(); curComponent.el().getParent().dom.appendChild(focusFrameContainer.dom); focusFrameContainer.show(); sync(curComponent); } } } public void unframe() { if (initialized) { focusFrameContainer.hide(); curComponent = null; } } public void unframe(Component c) { if (c == curComponent) { unframe(); } } public void hide(Component c) { if (initialized && c == curComponent) { focusFrameContainer.setVisible(false); } } public void show(Component c) { if (initialized && c == curComponent) { focusFrameContainer.setVisible(true); sync(c); } } public void sync(Component c) { if (initialized && curComponent == c && c.isRendered()) { El el = curComponent.el(); int width = el.getWidth(); int height = el.getHeight(); sides.get(0).setSize(width, 2).alignTo(el.dom, "tl", null); sides.get(1).setSize(width, 2).alignTo(el.dom, "bl", new int[] {0, -2}); sides.get(2).setSize(2, height).alignTo(el.dom, "tr", new int[] {-2, 0}); sides.get(3).setSize(2, height).alignTo(el.dom, "tl", null); for (El side : sides) { side.setZIndex(curComponent.el().getZIndex() + 1); } } } }