import { NgZone, QueryList, ElementRef, EventEmitter } from '@angular/core'; import { Dir, LayoutDirection } from '../core'; import { MdTabLabelWrapper } from './tab-label-wrapper'; import { MdInkBar } from './ink-bar'; import 'rxjs/add/operator/map'; /** * The directions that scrolling can go in when the header's tabs exceed the header width. 'After' * will scroll the header towards the end of the tabs list and 'before' will scroll towards the * beginning of the list. */ export declare type ScrollDirection = 'after' | 'before'; /** * The header of the tab group which displays a list of all the tabs in the tab group. Includes * an ink bar that follows the currently selected tab. When the tabs list's width exceeds the * width of the header container, then arrows will be displayed to allow the user to scroll * left and right across the header. */ export declare class MdTabHeader { private _zone; private _elementRef; private _dir; _labelWrappers: QueryList; _inkBar: MdInkBar; _tabListContainer: ElementRef; _tabList: ElementRef; /** The tab index that is focused. */ private _focusIndex; /** The distance in pixels that the tab labels should be translated to the left. */ private _scrollDistance; /** Whether the header should scroll to the selected index after the view has been checked. */ private _selectedIndexChanged; /** Whether the controls for pagination should be displayed */ _showPaginationControls: boolean; /** Whether the tab list can be scrolled more towards the end of the tab label list. */ _disableScrollAfter: boolean; /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */ _disableScrollBefore: boolean; /** * The number of tab labels that are displayed on the header. When this changes, the header * should re-evaluate the scroll position. */ private _tabLabelCount; /** Whether the scroll distance has changed and should be applied after the view is checked. */ private _scrollDistanceChanged; private _selectedIndex; /** The index of the active tab. */ selectedIndex: number; /** Event emitted when the option is selected. */ selectFocusedIndex: EventEmitter<{}>; /** Event emitted when a label is focused. */ indexFocused: EventEmitter<{}>; constructor(_zone: NgZone, _elementRef: ElementRef, _dir: Dir); ngAfterContentChecked(): void; /** * Waits one frame for the view to update, then updates the ink bar and scroll. * Note: This must be run outside of the zone or it will create an infinite change detection loop. */ ngAfterViewChecked(): void; _handleKeydown(event: KeyboardEvent): void; /** * Updating the view whether pagination should be enabled or not */ _updatePagination(): void; /** Tracks which element has focus; used for keyboard navigation */ /** When the focus index is set, we must manually send focus to the correct label */ focusIndex: number; /** * Determines if an index is valid. If the tabs are not ready yet, we assume that the user is * providing a valid index and return true. */ _isValidIndex(index: number): boolean; /** * Sets focus on the HTML element for the label wrapper and scrolls it into the view if * scrolling is enabled. */ _setTabFocus(tabIndex: number): void; /** * Moves the focus towards the beginning or the end of the list depending on the offset provided. * Valid offsets are 1 and -1. */ _moveFocus(offset: number): void; /** Increment the focus index by 1 until a valid tab is found. */ _focusNextTab(): void; /** Decrement the focus index by 1 until a valid tab is found. */ _focusPreviousTab(): void; /** The layout direction of the containing app. */ _getLayoutDirection(): LayoutDirection; /** Performs the CSS transformation on the tab list that will cause the list to scroll. */ _updateTabScrollPosition(): void; /** Sets the distance in pixels that the tab header should be transformed in the X-axis. */ scrollDistance: number; /** * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or * the end of the list, respectively). The distance to scroll is computed to be a third of the * length of the tab list view window. * * This is an expensive call that forces a layout reflow to compute box and scroll metrics and * should be called sparingly. */ _scrollHeader(scrollDir: ScrollDirection): void; /** * Moves the tab list such that the desired tab label (marked by index) is moved into view. * * This is an expensive call that forces a layout reflow to compute box and scroll metrics and * should be called sparingly. */ _scrollToLabel(labelIndex: number): void; /** * Evaluate whether the pagination controls should be displayed. If the scroll width of the * tab list is wider than the size of the header container, then the pagination controls should * be shown. * * This is an expensive call that forces a layout reflow to compute box and scroll metrics and * should be called sparingly. */ _checkPaginationEnabled(): void; /** * Evaluate whether the before and after controls should be enabled or disabled. * If the header is at the beginning of the list (scroll distance is equal to 0) then disable the * before button. If the header is at the end of the list (scroll distance is equal to the * maximum distance we can scroll), then disable the after button. * * This is an expensive call that forces a layout reflow to compute box and scroll metrics and * should be called sparingly. */ _checkScrollingControls(): void; /** * Determines what is the maximum length in pixels that can be set for the scroll distance. This * is equal to the difference in width between the tab list container and tab header container. * * This is an expensive call that forces a layout reflow to compute box and scroll metrics and * should be called sparingly. */ _getMaxScrollDistance(): number; /** Tells the ink-bar to align itself to the current label wrapper */ private _alignInkBarToSelectedTab(); }