/*
 * Copyright 2012 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.gwt.aria.client;
/////////////////////////////////////////////////////////
// This is auto-generated code.  Do not manually edit! //
/////////////////////////////////////////////////////////

import com.google.gwt.dom.client.Element;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>A factory providing each concrete role in the ARIA specification. Each role implements
 * methods that a GWT application can use to modify the appropriate DOM attributes for that
 * role.</p>
 *
 * <p>For example, suppose our GWT app has a image button and we want to make it visible in screen
 * readers as a button with some help text. To do this, we add a <i>button</i> role to the image and
 * set the ARIA <i>label</i> property to the help text that the screen reader can use:</p>
 *
 * <pre>
 *    Roles.getButtonRole().set(img.getElement());
 *    Roles.getButtonRole().setAriaLabelProperty(img.getElement(), "some help text");
 * </pre>
 *
 * <p>Most ARIA properties have a prefix of "aria-" and only affect screen readers, but there is
 * one exception: the "tabindex" property is the same one used for tab order in regular widgets.
 * For example, to set tabindex to 0 for the button:
 * </p>
 *
 * <pre>
 *   Roles.getButtonRole().setTabindexExtraAttribute(img.getElement(), 0);
 * </pre>
 *
 * <p>When the button changes state (it's enabled or disabled), we can change the ARIA enabled
 * state to match, like this:</p>
 *
 * <pre>
 *   Roles.getButtonRole().setAriaEnabledState(img.getElement(), isEnabled);
 * </pre>
 *
 * <p>ARIA distinguishes between properties (which change rarely and could be set in static HTML)
 * and states (which need to be updated in response to user input). This distinction can get a bit
 * blurry when a GWT app updates the DOM dynamically. Generally you should update ARIA
 * attributes at the same time that you change the CSS styles on a DOM node, so that a screen
 * reader will see the same state as someone viewing the page visually.</p>
 *
 * <p>The role interfaces form a hierarchy whose root is the {@link Role} interface, which contains
 * generic methods that aren't specific to a role. Some abstract roles include:</p>
 * <ol>
 * <li>{@link WidgetRole}, for DOM elements that represent either standalone or composite widgets.
 * <li>{@link CompositeRole}, for widgets that contain other widgets.</li>
 * <li>{@link StructureRole}, for DOM elements that are part of the page layout.</li>
 * <li>{@link LandmarkRole}, for DOM elements defining common regions of a page.</li>
 * <li>{@link WindowRole}, for DOM elements that define windows and dialogs.</li>
 * </ol>
 * </p>
 *
 * @see <a href="http://www.w3.org/TR/wai-aria/roles">the W3C specification</a>
 */
public final class Roles {
  private static final AlertdialogRole ALERTDIALOG = new AlertdialogRoleImpl("alertdialog");
  private static final AlertRole ALERT = new AlertRoleImpl("alert");
  private static final ApplicationRole APPLICATION = new ApplicationRoleImpl("application");
  private static final ArticleRole ARTICLE = new ArticleRoleImpl("article");
  private static final BannerRole BANNER = new BannerRoleImpl("banner");
  private static final ButtonRole BUTTON = new ButtonRoleImpl("button");
  private static final CheckboxRole CHECKBOX = new CheckboxRoleImpl("checkbox");
  private static final ColumnheaderRole COLUMNHEADER = new ColumnheaderRoleImpl("columnheader");
  private static final ComboboxRole COMBOBOX = new ComboboxRoleImpl("combobox");
  private static final ComplementaryRole COMPLEMENTARY = new ComplementaryRoleImpl("complementary");
  private static final ContentinfoRole CONTENTINFO = new ContentinfoRoleImpl("contentinfo");
  private static final DefinitionRole DEFINITION = new DefinitionRoleImpl("definition");
  private static final DialogRole DIALOG = new DialogRoleImpl("dialog");
  private static final DirectoryRole DIRECTORY = new DirectoryRoleImpl("directory");
  private static final DocumentRole DOCUMENT = new DocumentRoleImpl("document");
  private static final FormRole FORM = new FormRoleImpl("form");
  private static final GridcellRole GRIDCELL = new GridcellRoleImpl("gridcell");
  private static final GridRole GRID = new GridRoleImpl("grid");
  private static final GroupRole GROUP = new GroupRoleImpl("group");
  private static final HeadingRole HEADING = new HeadingRoleImpl("heading");
  private static final ImgRole IMG = new ImgRoleImpl("img");
  private static final LinkRole LINK = new LinkRoleImpl("link");
  private static final ListboxRole LISTBOX = new ListboxRoleImpl("listbox");
  private static final ListitemRole LISTITEM = new ListitemRoleImpl("listitem");
  private static final ListRole LIST = new ListRoleImpl("list");
  private static final LogRole LOG = new LogRoleImpl("log");
  private static final MainRole MAIN = new MainRoleImpl("main");
  private static final MarqueeRole MARQUEE = new MarqueeRoleImpl("marquee");
  private static final MathRole MATH = new MathRoleImpl("math");
  private static final MenubarRole MENUBAR = new MenubarRoleImpl("menubar");
  private static final MenuitemcheckboxRole MENUITEMCHECKBOX = new MenuitemcheckboxRoleImpl("menuitemcheckbox");
  private static final MenuitemradioRole MENUITEMRADIO = new MenuitemradioRoleImpl("menuitemradio");
  private static final MenuitemRole MENUITEM = new MenuitemRoleImpl("menuitem");
  private static final MenuRole MENU = new MenuRoleImpl("menu");
  private static final NavigationRole NAVIGATION = new NavigationRoleImpl("navigation");
  private static final NoteRole NOTE = new NoteRoleImpl("note");
  private static final OptionRole OPTION = new OptionRoleImpl("option");
  private static final PresentationRole PRESENTATION = new PresentationRoleImpl("presentation");
  private static final ProgressbarRole PROGRESSBAR = new ProgressbarRoleImpl("progressbar");
  private static final RadiogroupRole RADIOGROUP = new RadiogroupRoleImpl("radiogroup");
  private static final RadioRole RADIO = new RadioRoleImpl("radio");
  private static final RegionRole REGION = new RegionRoleImpl("region");
  private static final RowgroupRole ROWGROUP = new RowgroupRoleImpl("rowgroup");
  private static final RowheaderRole ROWHEADER = new RowheaderRoleImpl("rowheader");
  private static final RowRole ROW = new RowRoleImpl("row");
  private static final ScrollbarRole SCROLLBAR = new ScrollbarRoleImpl("scrollbar");
  private static final SearchRole SEARCH = new SearchRoleImpl("search");
  private static final SeparatorRole SEPARATOR = new SeparatorRoleImpl("separator");
  private static final SliderRole SLIDER = new SliderRoleImpl("slider");
  private static final SpinbuttonRole SPINBUTTON = new SpinbuttonRoleImpl("spinbutton");
  private static final StatusRole STATUS = new StatusRoleImpl("status");
  private static final TablistRole TABLIST = new TablistRoleImpl("tablist");
  private static final TabpanelRole TABPANEL = new TabpanelRoleImpl("tabpanel");
  private static final TabRole TAB = new TabRoleImpl("tab");
  private static final TextboxRole TEXTBOX = new TextboxRoleImpl("textbox");
  private static final TimerRole TIMER = new TimerRoleImpl("timer");
  private static final ToolbarRole TOOLBAR = new ToolbarRoleImpl("toolbar");
  private static final TooltipRole TOOLTIP = new TooltipRoleImpl("tooltip");
  private static final TreegridRole TREEGRID = new TreegridRoleImpl("treegrid");
  private static final TreeitemRole TREEITEM = new TreeitemRoleImpl("treeitem");
  private static final TreeRole TREE = new TreeRoleImpl("tree");

  private static final Map<String, Role> ROLES_MAP = new HashMap<String, Role>();

  static {
    ROLES_MAP.put("region", REGION);
    ROLES_MAP.put("alert", ALERT);
    ROLES_MAP.put("dialog", DIALOG);
    ROLES_MAP.put("alertdialog", ALERTDIALOG);
    ROLES_MAP.put("application", APPLICATION);
    ROLES_MAP.put("document", DOCUMENT);
    ROLES_MAP.put("article", ARTICLE);
    ROLES_MAP.put("banner", BANNER);
    ROLES_MAP.put("button", BUTTON);
    ROLES_MAP.put("checkbox", CHECKBOX);
    ROLES_MAP.put("gridcell", GRIDCELL);
    ROLES_MAP.put("columnheader", COLUMNHEADER);
    ROLES_MAP.put("group", GROUP);
    ROLES_MAP.put("combobox", COMBOBOX);
    ROLES_MAP.put("complementary", COMPLEMENTARY);
    ROLES_MAP.put("contentinfo", CONTENTINFO);
    ROLES_MAP.put("definition", DEFINITION);
    ROLES_MAP.put("list", LIST);
    ROLES_MAP.put("directory", DIRECTORY);
    ROLES_MAP.put("form", FORM);
    ROLES_MAP.put("grid", GRID);
    ROLES_MAP.put("heading", HEADING);
    ROLES_MAP.put("img", IMG);
    ROLES_MAP.put("link", LINK);
    ROLES_MAP.put("listbox", LISTBOX);
    ROLES_MAP.put("listitem", LISTITEM);
    ROLES_MAP.put("log", LOG);
    ROLES_MAP.put("main", MAIN);
    ROLES_MAP.put("marquee", MARQUEE);
    ROLES_MAP.put("math", MATH);
    ROLES_MAP.put("menu", MENU);
    ROLES_MAP.put("menubar", MENUBAR);
    ROLES_MAP.put("menuitem", MENUITEM);
    ROLES_MAP.put("menuitemcheckbox", MENUITEMCHECKBOX);
    ROLES_MAP.put("option", OPTION);
    ROLES_MAP.put("radio", RADIO);
    ROLES_MAP.put("menuitemradio", MENUITEMRADIO);
    ROLES_MAP.put("navigation", NAVIGATION);
    ROLES_MAP.put("note", NOTE);
    ROLES_MAP.put("presentation", PRESENTATION);
    ROLES_MAP.put("progressbar", PROGRESSBAR);
    ROLES_MAP.put("radiogroup", RADIOGROUP);
    ROLES_MAP.put("row", ROW);
    ROLES_MAP.put("rowgroup", ROWGROUP);
    ROLES_MAP.put("rowheader", ROWHEADER);
    ROLES_MAP.put("search", SEARCH);
    ROLES_MAP.put("separator", SEPARATOR);
    ROLES_MAP.put("scrollbar", SCROLLBAR);
    ROLES_MAP.put("slider", SLIDER);
    ROLES_MAP.put("spinbutton", SPINBUTTON);
    ROLES_MAP.put("status", STATUS);
    ROLES_MAP.put("tab", TAB);
    ROLES_MAP.put("tablist", TABLIST);
    ROLES_MAP.put("tabpanel", TABPANEL);
    ROLES_MAP.put("textbox", TEXTBOX);
    ROLES_MAP.put("timer", TIMER);
    ROLES_MAP.put("toolbar", TOOLBAR);
    ROLES_MAP.put("tooltip", TOOLTIP);
    ROLES_MAP.put("tree", TREE);
    ROLES_MAP.put("treegrid", TREEGRID);
    ROLES_MAP.put("treeitem", TREEITEM);
  }

  public static AlertdialogRole getAlertdialogRole() {
    return ALERTDIALOG;
  }

  public static AlertRole getAlertRole() {
    return ALERT;
  }

  public static ApplicationRole getApplicationRole() {
    return APPLICATION;
  }

  public static ArticleRole getArticleRole() {
    return ARTICLE;
  }

  public static BannerRole getBannerRole() {
    return BANNER;
  }

  public static ButtonRole getButtonRole() {
    return BUTTON;
  }

  public static CheckboxRole getCheckboxRole() {
    return CHECKBOX;
  }

  public static ColumnheaderRole getColumnheaderRole() {
    return COLUMNHEADER;
  }

  public static ComboboxRole getComboboxRole() {
    return COMBOBOX;
  }

  public static ComplementaryRole getComplementaryRole() {
    return COMPLEMENTARY;
  }

  public static ContentinfoRole getContentinfoRole() {
    return CONTENTINFO;
  }

  public static DefinitionRole getDefinitionRole() {
    return DEFINITION;
  }

  public static DialogRole getDialogRole() {
    return DIALOG;
  }

  public static DirectoryRole getDirectoryRole() {
    return DIRECTORY;
  }

  public static DocumentRole getDocumentRole() {
    return DOCUMENT;
  }

  public static FormRole getFormRole() {
    return FORM;
  }

  public static GridcellRole getGridcellRole() {
    return GRIDCELL;
  }

  public static GridRole getGridRole() {
    return GRID;
  }

  public static GroupRole getGroupRole() {
    return GROUP;
  }

  public static HeadingRole getHeadingRole() {
    return HEADING;
  }

  public static ImgRole getImgRole() {
    return IMG;
  }

  public static LinkRole getLinkRole() {
    return LINK;
  }

  public static ListboxRole getListboxRole() {
    return LISTBOX;
  }

  public static ListitemRole getListitemRole() {
    return LISTITEM;
  }

  public static ListRole getListRole() {
    return LIST;
  }

  public static LogRole getLogRole() {
    return LOG;
  }

  public static MainRole getMainRole() {
    return MAIN;
  }

  public static MarqueeRole getMarqueeRole() {
    return MARQUEE;
  }

  public static MathRole getMathRole() {
    return MATH;
  }

  public static MenubarRole getMenubarRole() {
    return MENUBAR;
  }

  public static MenuitemcheckboxRole getMenuitemcheckboxRole() {
    return MENUITEMCHECKBOX;
  }

  public static MenuitemradioRole getMenuitemradioRole() {
    return MENUITEMRADIO;
  }

  public static MenuitemRole getMenuitemRole() {
    return MENUITEM;
  }

  public static MenuRole getMenuRole() {
    return MENU;
  }

  public static NavigationRole getNavigationRole() {
    return NAVIGATION;
  }

  public static NoteRole getNoteRole() {
    return NOTE;
  }

  public static OptionRole getOptionRole() {
    return OPTION;
  }

  public static PresentationRole getPresentationRole() {
    return PRESENTATION;
  }

  public static ProgressbarRole getProgressbarRole() {
    return PROGRESSBAR;
  }

  public static RadiogroupRole getRadiogroupRole() {
    return RADIOGROUP;
  }

  public static RadioRole getRadioRole() {
    return RADIO;
  }

  public static RegionRole getRegionRole() {
    return REGION;
  }

  public static RowgroupRole getRowgroupRole() {
    return ROWGROUP;
  }

  public static RowheaderRole getRowheaderRole() {
    return ROWHEADER;
  }

  public static RowRole getRowRole() {
    return ROW;
  }

  public static ScrollbarRole getScrollbarRole() {
    return SCROLLBAR;
  }

  public static SearchRole getSearchRole() {
    return SEARCH;
  }

  public static SeparatorRole getSeparatorRole() {
    return SEPARATOR;
  }

  public static SliderRole getSliderRole() {
    return SLIDER;
  }

  public static SpinbuttonRole getSpinbuttonRole() {
    return SPINBUTTON;
  }

  public static StatusRole getStatusRole() {
    return STATUS;
  }

  public static TablistRole getTablistRole() {
    return TABLIST;
  }

  public static TabpanelRole getTabpanelRole() {
    return TABPANEL;
  }

  public static TabRole getTabRole() {
    return TAB;
  }

  public static TextboxRole getTextboxRole() {
    return TEXTBOX;
  }

  public static TimerRole getTimerRole() {
    return TIMER;
  }

  public static ToolbarRole getToolbarRole() {
    return TOOLBAR;
  }

  public static TooltipRole getTooltipRole() {
    return TOOLTIP;
  }

  public static TreegridRole getTreegridRole() {
    return TREEGRID;
  }

  public static TreeitemRole getTreeitemRole() {
    return TREEITEM;
  }

  public static TreeRole getTreeRole() {
    return TREE;
  }

  /**
   * Returns the WAI-ARIA role for the {@code element}. If no 'role' attribute is set to the
   * {@code element} or if the set role tokens do not include a WAI-ARIA role,
   * null is returned. Otherwise, if a WAI_ARIA role is among the role tokens in the 'role'
   * attribute token list, a {@link Role} corresponding the WAI-ARIA role is returned.
   */
  public static Role roleOf(Element element) {
    assert element != null : "Element cannot be null.";
    String roleAttributeValue = element.getAttribute("role");
    for (String testRoleName : roleAttributeValue.split("\\s+")) {
      Role role = ROLES_MAP.get(testRoleName);
      if (role != null) {
        return role;
      }
    }
    return null;
  }
}
