All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.extjs.gxt.ui.client.aria.FocusFrame Maven / Gradle / Ivy

The newest version!
/*
 * Sencha GXT 2.3.1 - Sencha for GWT
 * Copyright(c) 2007-2013, Sencha, Inc.
 * [email protected]
 * 
 * http://www.sencha.com/products/gxt/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;
import com.google.gwt.user.client.Element;

/**
 * Adds a frame around a given component to indicate a component has focus.
 */
public class FocusFrame extends BaseObservable {
  private static FocusFrame instance;

  public static FocusFrame get() {
    if (instance == null) {
      instance = new FocusFrame();
    }
    return instance;
  }

  private boolean initialized;
  private Component curComponent;
  private Element curElement;
  private El focusFrameContainer;
  private List sides = new ArrayList();

  private FocusFrame() {

  }

  /**
   * Frames the given component.
   * 
   * @param newComponent the component to be framed
   */
  public void frame(Component newComponent) {
    frame(newComponent, null);
  }

  /**
   * Frames the given component.
   * 
   * @param newComponent the component to be framed
   * @param newElement a child element of the component where the frame should
   *          be applied
   */
  public void frame(Component newComponent, Element newElement) {
    if (!GXT.isFocusManagerEnabled()) {
      return;
    }

    if (!initialized) {
      init();
    }

    if (curComponent != newComponent) {
      if (newComponent.isRendered()) {
        curComponent = newComponent;
        curElement = newElement != null ? newElement : curComponent.getElement();
        El e = El.fly(curElement);
        e.getParent().makePositionable();
        e.getParent().dom.appendChild(focusFrameContainer.dom);
        focusFrameContainer.show();
        sync(curComponent, newElement);
      }
    }

  }

  /**
   * Hides the frame.
   * 
   * @param c the framed component
   */
  public void hide(Component c) {
    if (initialized && c == curComponent) {
      focusFrameContainer.setVisible(false);
    }
  }

  /**
   * Shows the frame on a component that has been previously framed.
   * 
   * @param c the component
   */
  public void show(Component c) {
    if (initialized && c == curComponent) {
      focusFrameContainer.setVisible(true);
      sync(c);
    }
  }

  /**
   * Updates the frame's size and position to match the component.
   * 
   * @param c the component
   */
  public void sync(Component c) {
    sync(c, null);
  }

  /**
   * Updates the frame's size and position to match the component's child
   * element.
   * 
   * @param c the component
   * @param elem the child element
   */
  public void sync(Component c, Element elem) {
    if (initialized && curComponent == c && c.isRendered()) {
      El el = elem != null ? new El(elem) : 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);
      }
    }
  }

  /**
   * Removes and visible frames.
   */
  public void unframe() {
    if (initialized) {
      focusFrameContainer.hide();
      curComponent = null;
      curElement = null;
    }
  }

  /**
   * Remove the comonent's frame.
   * 
   * @param c the component
   */
  public void unframe(Component c) {
    if (c == curComponent) {
      unframe();
    }
  }

  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;
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy