|
|
import _FocusMixin = require("./_FocusMixin");
|
|
|
import _WidgetBase = require("./_WidgetBase");
|
|
|
import { DeclareConstructor } from "dojo/_base/declare";
|
|
|
|
|
|
/**
|
|
|
* A mixin to allow arrow key and letter key navigation of child or descendant widgets.
|
|
|
* It can be used by dijit/_Container based widgets with a flat list of children, or more complex widgets like dijit/Tree.
|
|
|
*
|
|
|
* To use this mixin, the subclass must:
|
|
|
*
|
|
|
* - Implement _getNext(), _getFirst(), _getLast(), _onLeftArrow(), _onRightArrow() _onDownArrow(), _onUpArrow() methods to handle home/end/left/right/up/down keystrokes. Next and previous in this context refer to a linear ordering of the descendants used by letter key search.
|
|
|
* - Set all descendants' initial tabIndex to "-1"; both initial descendants and any descendants added later, by for example addChild()
|
|
|
* - Define childSelector to a function or string that identifies focusable descendant widgets
|
|
|
*
|
|
|
* Also, child widgets must implement a focus() method.
|
|
|
*/
|
|
|
interface _KeyNavMixin extends _FocusMixin {
|
|
|
/**
|
|
|
* Tab index of the container; same as HTML tabIndex attribute.
|
|
|
* Note then when user tabs into the container, focus is immediately moved to the first item in the container.
|
|
|
*/
|
|
|
tabIndex: string;
|
|
|
|
|
|
/**
|
|
|
* Selector (passed to on.selector()) used to identify what to treat as a child widget. Used to monitor focus events and set this.focusedChild. Must be set by implementing class. If this is a string (ex: "> *") then the implementing class must require dojo/query.
|
|
|
*/
|
|
|
childSelector: string | Function | null;
|
|
|
|
|
|
/**
|
|
|
* Called on left arrow key, or right arrow key if widget is in RTL mode.
|
|
|
* Should go back to the previous child in horizontal container widgets like Toolbar.
|
|
|
*/
|
|
|
_onLeftArrow(evt?: KeyboardEvent): void;
|
|
|
|
|
|
/**
|
|
|
* Called on right arrow key, or left arrow key if widget is in RTL mode.
|
|
|
* Should go to the next child in horizontal container widgets like Toolbar.
|
|
|
*/
|
|
|
_onRightArrow(evt?: KeyboardEvent): void;
|
|
|
|
|
|
/**
|
|
|
* Called on up arrow key. Should go to the previous child in vertical container widgets like Menu.
|
|
|
*/
|
|
|
_onUpArrow(evt?: KeyboardEvent): void;
|
|
|
|
|
|
/**
|
|
|
* Called on down arrow key. Should go to the next child in vertical container widgets like Menu.
|
|
|
*/
|
|
|
_onDownArrow(evt?: KeyboardEvent): void;
|
|
|
|
|
|
/**
|
|
|
* Default focus() implementation: focus the first child.
|
|
|
*/
|
|
|
focus(): void;
|
|
|
|
|
|
/**
|
|
|
* Returns first child that can be focused.
|
|
|
*/
|
|
|
_getFirstFocusableChild(): _WidgetBase;
|
|
|
|
|
|
/**
|
|
|
* Returns last child that can be focused.
|
|
|
*/
|
|
|
_getLastFocusableChild(): _WidgetBase;
|
|
|
|
|
|
/**
|
|
|
* Focus the first focusable child in the container.
|
|
|
*/
|
|
|
focusFirstChild(): void;
|
|
|
|
|
|
/**
|
|
|
* Focus the last focusable child in the container.
|
|
|
*/
|
|
|
focusLastChild(): void;
|
|
|
|
|
|
/**
|
|
|
* Focus specified child widget.
|
|
|
*
|
|
|
* @param widget Reference to container's child widget
|
|
|
* @param last If true and if widget has multiple focusable nodes, focus the last one instead of the first one
|
|
|
*/
|
|
|
focusChild(widget: _WidgetBase, last?: boolean): void;
|
|
|
|
|
|
/**
|
|
|
* Handler for when the container itself gets focus.
|
|
|
*
|
|
|
* Initially the container itself has a tabIndex, but when it gets focus, switch focus to first child.
|
|
|
*/
|
|
|
_onContainerFocus(evt: Event): void;
|
|
|
|
|
|
/**
|
|
|
* Called when a child widget gets focus, either by user clicking it, or programatically by arrow key handling code.
|
|
|
*
|
|
|
* It marks that the current node is the selected one, and the previously selected node no longer is.
|
|
|
*/
|
|
|
_onChildFocus(child?: _WidgetBase): void;
|
|
|
|
|
|
_searchString: string;
|
|
|
|
|
|
multiCharSearchDuration: number;
|
|
|
|
|
|
/**
|
|
|
* When a key is pressed that matches a child item, this method is called so that a widget can take appropriate action is necessary.
|
|
|
*/
|
|
|
onKeyboardSearch(tem: _WidgetBase, evt: Event, searchString: string, numMatches: number): void;
|
|
|
|
|
|
/**
|
|
|
* Compares the searchString to the widget's text label, returning:
|
|
|
*
|
|
|
* * -1: a high priority match and stop searching
|
|
|
* * 0: not a match
|
|
|
* * 1: a match but keep looking for a higher priority match
|
|
|
*/
|
|
|
_keyboardSearchCompare(item: _WidgetBase, searchString: string): -1 | 0 | 1;
|
|
|
|
|
|
/**
|
|
|
* When a key is pressed, if it's an arrow key etc. then it's handled here.
|
|
|
*/
|
|
|
_onContainerKeydown(evt: Event): void;
|
|
|
|
|
|
/**
|
|
|
* When a printable key is pressed, it's handled here, searching by letter.
|
|
|
*/
|
|
|
_onContainerKeypress(evt: Event): void;
|
|
|
|
|
|
/**
|
|
|
* Perform a search of the widget's options based on the user's keyboard activity
|
|
|
*
|
|
|
* Called on keypress (and sometimes keydown), searches through this widget's children looking for items that match the user's typed search string. Multiple characters typed within 1 sec of each other are combined for multicharacter searching.
|
|
|
*/
|
|
|
_keyboardSearch(evt: Event, keyChar: string): void;
|
|
|
|
|
|
/**
|
|
|
* Called when focus leaves a child widget to go to a sibling widget.
|
|
|
*/
|
|
|
_onChildBlur(widget: _WidgetBase): void;
|
|
|
|
|
|
/**
|
|
|
* Returns the next or previous focusable descendant, compared to "child".
|
|
|
* Implements and extends _KeyNavMixin._getNextFocusableChild() for a _Container.
|
|
|
*/
|
|
|
_getNextFocusableChild(child: _WidgetBase, dir: 1 | -1): _WidgetBase | null;
|
|
|
|
|
|
/**
|
|
|
* Returns the first child.
|
|
|
*/
|
|
|
_getFirst(): _WidgetBase | null;
|
|
|
|
|
|
/**
|
|
|
* Returns the last descendant.
|
|
|
*/
|
|
|
_getLast(): _WidgetBase | null;
|
|
|
|
|
|
/**
|
|
|
* Returns the next descendant, compared to "child".
|
|
|
*/
|
|
|
_getNext(child: _WidgetBase, dir: 1 | -1): _WidgetBase | null;
|
|
|
}
|
|
|
|
|
|
declare module "dojo/_base/kernel" {
|
|
|
interface Dijit {
|
|
|
_KeyNavMixin: _KeyNavMixinConstructor;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
type _KeyNavMixinConstructor = DeclareConstructor<_KeyNavMixin>;
|
|
|
declare const _KeyNavMixin: _KeyNavMixinConstructor;
|
|
|
export = _KeyNavMixin;
|