55
66import 'vs/css!./media/tree' ;
77import { IDisposable , dispose , Disposable , toDisposable , DisposableStore } from 'vs/base/common/lifecycle' ;
8- import { IListOptions , List , IListStyles , mightProducePrintableCharacter , MouseController } from 'vs/base/browser/ui/list/listWidget' ;
9- import { IListVirtualDelegate , IListRenderer , IListMouseEvent , IListEvent , IListContextMenuEvent , IListDragAndDrop , IListDragOverReaction , IKeyboardNavigationLabelProvider , IIdentityProvider } from 'vs/base/browser/ui/list/list' ;
8+ import { IListOptions , List , IListStyles , MouseController , DefaultKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/listWidget' ;
9+ import { IListVirtualDelegate , IListRenderer , IListMouseEvent , IListEvent , IListContextMenuEvent , IListDragAndDrop , IListDragOverReaction , IKeyboardNavigationLabelProvider , IIdentityProvider , IKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/list' ;
1010import { append , $ , toggleClass , getDomNodePagePosition , removeClass , addClass , hasClass , hasParentWithClass , createStyleSheet , clearNode } from 'vs/base/browser/dom' ;
1111import { Event , Relay , Emitter , EventBufferer } from 'vs/base/common/event' ;
12- import { StandardKeyboardEvent , IKeyboardEvent } from 'vs/base/browser/keyboardEvent' ;
12+ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent' ;
1313import { KeyCode } from 'vs/base/common/keyCodes' ;
1414import { ITreeModel , ITreeNode , ITreeRenderer , ITreeEvent , ITreeMouseEvent , ITreeContextMenuEvent , ITreeFilter , ITreeNavigator , ICollapseStateChangeEvent , ITreeDragAndDrop , TreeDragOverBubble , TreeVisibility , TreeFilterResult , ITreeModelSpliceEvent , TreeMouseEventTarget } from 'vs/base/browser/ui/tree/tree' ;
1515import { ISpliceable } from 'vs/base/common/sequence' ;
@@ -592,7 +592,7 @@ class TypeFilterController<T, TFilterData> implements IDisposable {
592592 model : ITreeModel < T , TFilterData , any > ,
593593 private view : List < ITreeNode < T , TFilterData > > ,
594594 private filter : TypeFilter < T > ,
595- private keyboardNavigationLabelProvider : IKeyboardNavigationLabelProvider < T >
595+ private keyboardNavigationDelegate : IKeyboardNavigationDelegate
596596 ) {
597597 this . domNode = $ ( `.monaco-list-type-filter.${ this . positionClassName } ` ) ;
598598 this . domNode . draggable = true ;
@@ -658,13 +658,12 @@ class TypeFilterController<T, TFilterData> implements IDisposable {
658658 return ;
659659 }
660660
661- const isPrintableCharEvent = this . keyboardNavigationLabelProvider . mightProducePrintableCharacter ? ( e : IKeyboardEvent ) => this . keyboardNavigationLabelProvider . mightProducePrintableCharacter ! ( e ) : ( e : IKeyboardEvent ) => mightProducePrintableCharacter ( e ) ;
662661 const onKeyDown = Event . chain ( domEvent ( this . view . getHTMLElement ( ) , 'keydown' ) )
663662 . filter ( e => ! isInputElement ( e . target as HTMLElement ) || e . target === this . filterOnTypeDomNode )
664663 . map ( e => new StandardKeyboardEvent ( e ) )
665664 . filter ( this . keyboardNavigationEventFilter || ( ( ) => true ) )
666665 . filter ( ( ) => this . automaticKeyboardNavigation || this . triggered )
667- . filter ( e => isPrintableCharEvent ( e ) || ( ( this . pattern . length > 0 || this . triggered ) && ( ( e . keyCode === KeyCode . Escape || e . keyCode === KeyCode . Backspace ) && ! e . altKey && ! e . ctrlKey && ! e . metaKey ) || ( e . keyCode === KeyCode . Backspace && ( isMacintosh ? ( e . altKey && ! e . metaKey ) : e . ctrlKey ) && ! e . shiftKey ) ) )
666+ . filter ( e => this . keyboardNavigationDelegate . mightProducePrintableCharacter ( e ) || ( ( this . pattern . length > 0 || this . triggered ) && ( ( e . keyCode === KeyCode . Escape || e . keyCode === KeyCode . Backspace ) && ! e . altKey && ! e . ctrlKey && ! e . metaKey ) || ( e . keyCode === KeyCode . Backspace && ( isMacintosh ? ( e . altKey && ! e . metaKey ) : e . ctrlKey ) && ! e . shiftKey ) ) )
668667 . forEach ( e => { e . stopPropagation ( ) ; e . preventDefault ( ) ; } )
669668 . event ;
670669
@@ -1189,6 +1188,7 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
11891188 get onDidChangeFocus ( ) : Event < ITreeEvent < T > > { return this . eventBufferer . wrapEvent ( this . focus . onDidChange ) ; }
11901189 get onDidChangeSelection ( ) : Event < ITreeEvent < T > > { return this . eventBufferer . wrapEvent ( this . selection . onDidChange ) ; }
11911190 get onDidOpen ( ) : Event < ITreeEvent < T > > { return Event . map ( this . view . onDidOpen , asTreeEvent ) ; }
1191+ get onDidPin ( ) : Event < ITreeEvent < T > > { return Event . map ( this . view . onDidPin , asTreeEvent ) ; }
11921192
11931193 get onMouseClick ( ) : Event < ITreeMouseEvent < T > > { return Event . map ( this . view . onMouseClick , asTreeMouseEvent ) ; }
11941194 get onMouseDblClick ( ) : Event < ITreeMouseEvent < T > > { return Event . map ( this . view . onMouseDblClick , asTreeMouseEvent ) ; }
@@ -1228,7 +1228,7 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
12281228 const treeDelegate = new ComposedTreeDelegate < T , ITreeNode < T , TFilterData > > ( delegate ) ;
12291229
12301230 const onDidChangeCollapseStateRelay = new Relay < ICollapseStateChangeEvent < T , TFilterData > > ( ) ;
1231- const onDidChangeActiveNodes = new Relay < ITreeNode < T , TFilterData > [ ] > ( ) ;
1231+ const onDidChangeActiveNodes = new Emitter < ITreeNode < T , TFilterData > [ ] > ( ) ;
12321232 const activeNodes = new EventCollection ( onDidChangeActiveNodes . event ) ;
12331233 this . disposables . push ( activeNodes ) ;
12341234
@@ -1251,11 +1251,23 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
12511251 onDidChangeCollapseStateRelay . input = this . model . onDidChangeCollapseState ;
12521252
12531253 this . model . onDidSplice ( e => {
1254- this . focus . onDidModelSplice ( e ) ;
1255- this . selection . onDidModelSplice ( e ) ;
1256- } , null , this . disposables ) ;
1254+ this . eventBufferer . bufferEvents ( ( ) => {
1255+ this . focus . onDidModelSplice ( e ) ;
1256+ this . selection . onDidModelSplice ( e ) ;
1257+ } ) ;
1258+
1259+ const set = new Set < ITreeNode < T , TFilterData > > ( ) ;
1260+
1261+ for ( const node of this . focus . getNodes ( ) ) {
1262+ set . add ( node ) ;
1263+ }
12571264
1258- onDidChangeActiveNodes . input = Event . map ( Event . any < any > ( this . focus . onDidChange , this . selection . onDidChange , this . model . onDidSplice ) , ( ) => [ ...this . focus . getNodes ( ) , ...this . selection . getNodes ( ) ] ) ;
1265+ for ( const node of this . selection . getNodes ( ) ) {
1266+ set . add ( node ) ;
1267+ }
1268+
1269+ onDidChangeActiveNodes . fire ( Array . from ( set . values ( ) ) ) ;
1270+ } , null , this . disposables ) ;
12591271
12601272 if ( _options . keyboardSupport !== false ) {
12611273 const onKeyDown = Event . chain ( this . view . onKeyDown )
@@ -1268,7 +1280,8 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
12681280 }
12691281
12701282 if ( _options . keyboardNavigationLabelProvider ) {
1271- this . typeFilterController = new TypeFilterController ( this , this . model , this . view , filter ! , _options . keyboardNavigationLabelProvider ) ;
1283+ const delegate = _options . keyboardNavigationDelegate || DefaultKeyboardNavigationDelegate ;
1284+ this . typeFilterController = new TypeFilterController ( this , this . model , this . view , filter ! , delegate ) ;
12721285 this . focusNavigationFilter = node => this . typeFilterController ! . shouldAllowFocus ( node ) ;
12731286 this . disposables . push ( this . typeFilterController ! ) ;
12741287 }
0 commit comments