@@ -7,10 +7,11 @@ import 'vs/css!./list';
77import { IDisposable , Disposable } from 'vs/base/common/lifecycle' ;
88import { range } from 'vs/base/common/arrays' ;
99import { IListVirtualDelegate , IListRenderer , IListEvent , IListContextMenuEvent } from './list' ;
10- import { List , IListStyles , IListOptions } from './listWidget' ;
10+ import { List , IListStyles , IListOptions , IAccessibilityProvider } from './listWidget' ;
1111import { IPagedModel } from 'vs/base/common/paging' ;
1212import { Event } from 'vs/base/common/event' ;
1313import { CancellationTokenSource } from 'vs/base/common/cancellation' ;
14+ import { ScrollbarVisibility } from 'vs/base/common/scrollable' ;
1415
1516export interface IPagedRenderer < TElement , TTemplateData > extends IListRenderer < TElement , TTemplateData > {
1617 renderPlaceholder ( index : number , templateData : TTemplateData ) : void ;
@@ -70,6 +71,50 @@ class PagedRenderer<TElement, TTemplateData> implements IListRenderer<number, IT
7071 }
7172}
7273
74+ class PagedAccessibilityProvider < T > implements IAccessibilityProvider < number > {
75+
76+ constructor (
77+ private modelProvider : ( ) => IPagedModel < T > ,
78+ private accessibilityProvider : IAccessibilityProvider < T >
79+ ) { }
80+
81+ getAriaLabel ( index : number ) : string | null {
82+ const model = this . modelProvider ( ) ;
83+
84+ if ( ! model . isResolved ( index ) ) {
85+ return null ;
86+ }
87+
88+ return this . accessibilityProvider . getAriaLabel ( model . get ( index ) ) ;
89+ }
90+ }
91+
92+ export interface IPagedListOptions < T > {
93+ readonly enableKeyboardNavigation ?: boolean ;
94+ readonly automaticKeyboardNavigation ?: boolean ;
95+ readonly ariaLabel ?: string ;
96+ readonly keyboardSupport ?: boolean ;
97+ readonly multipleSelectionSupport ?: boolean ;
98+ readonly accessibilityProvider ?: IAccessibilityProvider < T > ;
99+
100+ // list view options
101+ readonly useShadows ?: boolean ;
102+ readonly verticalScrollMode ?: ScrollbarVisibility ;
103+ readonly setRowLineHeight ?: boolean ;
104+ readonly setRowHeight ?: boolean ;
105+ readonly supportDynamicHeights ?: boolean ;
106+ readonly mouseSupport ?: boolean ;
107+ readonly horizontalScrolling ?: boolean ;
108+ readonly additionalScrollHeight ?: number ;
109+ }
110+
111+ function fromPagedListOptions < T > ( modelProvider : ( ) => IPagedModel < T > , options : IPagedListOptions < T > ) : IListOptions < number > {
112+ return {
113+ ...options ,
114+ accessibilityProvider : options . accessibilityProvider && new PagedAccessibilityProvider ( modelProvider , options . accessibilityProvider )
115+ } ;
116+ }
117+
73118export class PagedList < T > implements IDisposable {
74119
75120 private list : List < number > ;
@@ -80,10 +125,11 @@ export class PagedList<T> implements IDisposable {
80125 container : HTMLElement ,
81126 virtualDelegate : IListVirtualDelegate < number > ,
82127 renderers : IPagedRenderer < T , any > [ ] ,
83- options : IListOptions < any > = { }
128+ options : IPagedListOptions < T > = { }
84129 ) {
85- const pagedRenderers = renderers . map ( r => new PagedRenderer < T , ITemplateData < T > > ( r , ( ) => this . model ) ) ;
86- this . list = new List ( user , container , virtualDelegate , pagedRenderers , options ) ;
130+ const modelProvider = ( ) => this . model ;
131+ const pagedRenderers = renderers . map ( r => new PagedRenderer < T , ITemplateData < T > > ( r , modelProvider ) ) ;
132+ this . list = new List ( user , container , virtualDelegate , pagedRenderers , fromPagedListOptions ( modelProvider , options ) ) ;
87133 }
88134
89135 getHTMLElement ( ) : HTMLElement {
0 commit comments