@@ -10,11 +10,11 @@ import { basename } from 'vs/base/common/resources';
10
10
import { URI } from 'vs/base/common/uri' ;
11
11
import { Emitter , Event } from 'vs/base/common/event' ;
12
12
import { Disposable , DisposableStore , IDisposable } from 'vs/base/common/lifecycle' ;
13
- import { DataTransferDTO , ExtHostTreeViewsShape , MainThreadTreeViewsShape } from './extHost.protocol' ;
13
+ import { CheckboxUpdate , DataTransferDTO , ExtHostTreeViewsShape , MainThreadTreeViewsShape } from './extHost.protocol' ;
14
14
import { ITreeItem , TreeViewItemHandleArg , ITreeItemLabel , IRevealOptions , TreeCommand , TreeViewPaneHandleArg } from 'vs/workbench/common/views' ;
15
15
import { ExtHostCommands , CommandsConverter } from 'vs/workbench/api/common/extHostCommands' ;
16
16
import { asPromise } from 'vs/base/common/async' ;
17
- import { TreeItemCollapsibleState , ThemeIcon , MarkdownString as MarkdownStringType , TreeItem } from 'vs/workbench/api/common/extHostTypes' ;
17
+ import { TreeItemCollapsibleState , TreeItemCheckboxState , ThemeIcon , MarkdownString as MarkdownStringType , TreeItem } from 'vs/workbench/api/common/extHostTypes' ;
18
18
import { isUndefinedOrNull , isString } from 'vs/base/common/types' ;
19
19
import { equals , coalesce } from 'vs/base/common/arrays' ;
20
20
import { ILogService } from 'vs/platform/log/common/log' ;
@@ -23,6 +23,7 @@ import { MarkdownString, ViewBadge, DataTransfer } from 'vs/workbench/api/common
23
23
import { IMarkdownString } from 'vs/base/common/htmlContent' ;
24
24
import { CancellationToken , CancellationTokenSource } from 'vs/base/common/cancellation' ;
25
25
import { ITreeViewsService , TreeviewsService } from 'vs/workbench/services/views/common/treeViewsService' ;
26
+ import { checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions' ;
26
27
27
28
type TreeItemHandle = string ;
28
29
@@ -99,6 +100,7 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape {
99
100
get onDidChangeSelection ( ) { return treeView . onDidChangeSelection ; } ,
100
101
get visible ( ) { return treeView . visible ; } ,
101
102
get onDidChangeVisibility ( ) { return treeView . onDidChangeVisibility ; } ,
103
+ get onDidChangeTreeCheckbox ( ) { checkProposedApiEnabled ( extension , 'treeItemCheckbox' ) ; return treeView . onDidChangeTreeCheckbox ; } ,
102
104
get message ( ) { return treeView . message ; } ,
103
105
set message ( message : string ) {
104
106
treeView . message = message ;
@@ -234,6 +236,14 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape {
234
236
treeView . setVisible ( isVisible ) ;
235
237
}
236
238
239
+ $changeCheckboxState ( treeViewId : string , checkboxUpdate : CheckboxUpdate [ ] ) : void {
240
+ const treeView = this . treeViews . get ( treeViewId ) ;
241
+ if ( ! treeView ) {
242
+ throw new Error ( localize ( 'treeView.notRegistered' , 'No tree view with id \'{0}\' registered.' , treeViewId ) ) ;
243
+ }
244
+ treeView . setCheckboxState ( checkboxUpdate ) ;
245
+ }
246
+
237
247
private createExtHostTreeView < T > ( id : string , options : vscode . TreeViewOptions < T > , extension : IExtensionDescription ) : ExtHostTreeView < T > {
238
248
const treeView = new ExtHostTreeView < T > ( id , options , this . _proxy , this . commands . converter , this . logService , extension ) ;
239
249
this . treeViews . set ( id , treeView ) ;
@@ -296,6 +306,9 @@ class ExtHostTreeView<T> extends Disposable {
296
306
private _onDidChangeVisibility : Emitter < vscode . TreeViewVisibilityChangeEvent > = this . _register ( new Emitter < vscode . TreeViewVisibilityChangeEvent > ( ) ) ;
297
307
readonly onDidChangeVisibility : Event < vscode . TreeViewVisibilityChangeEvent > = this . _onDidChangeVisibility . event ;
298
308
309
+ private _onDidChangeTreeCheckbox = this . _register ( new Emitter < vscode . TreeCheckboxChangeEvent < T > > ( ) ) ;
310
+ readonly onDidChangeTreeCheckbox : Event < vscode . TreeCheckboxChangeEvent < T > > = this . _onDidChangeTreeCheckbox . event ;
311
+
299
312
private _onDidChangeData : Emitter < TreeData < T > > = this . _register ( new Emitter < TreeData < T > > ( ) ) ;
300
313
301
314
private refreshPromise : Promise < void > = Promise . resolve ( ) ;
@@ -474,6 +487,26 @@ class ExtHostTreeView<T> extends Disposable {
474
487
}
475
488
}
476
489
490
+ async setCheckboxState ( checkboxUpdates : CheckboxUpdate [ ] ) {
491
+ const items = ( await Promise . all ( checkboxUpdates . map ( async checkboxUpdate => {
492
+ const extensionItem = this . getExtensionElement ( checkboxUpdate . treeItemHandle ) ;
493
+ if ( extensionItem ) {
494
+ return {
495
+ extensionItem : extensionItem ,
496
+ treeItem : await this . dataProvider . getTreeItem ( extensionItem ) ,
497
+ newState : checkboxUpdate . newState ? TreeItemCheckboxState . Checked : TreeItemCheckboxState . Unchecked
498
+ } ;
499
+ }
500
+ return Promise . resolve ( undefined ) ;
501
+ } ) ) ) . filter ( ( item ) => item !== undefined ) as { extensionItem : T ; treeItem : vscode . TreeItem2 ; newState : TreeItemCheckboxState } [ ] ;
502
+
503
+ items . forEach ( item => {
504
+ item . treeItem . checkboxState = item . newState ? TreeItemCheckboxState . Checked : TreeItemCheckboxState . Unchecked ;
505
+ } ) ;
506
+
507
+ this . _onDidChangeTreeCheckbox . fire ( { items : items . map ( item => [ item . extensionItem , item . newState ] ) } ) ;
508
+ }
509
+
477
510
async handleDrag ( sourceTreeItemHandles : TreeItemHandle [ ] , treeDataTransfer : vscode . DataTransfer , token : CancellationToken ) : Promise < vscode . DataTransfer | undefined > {
478
511
const extensionTreeItems : T [ ] = [ ] ;
479
512
for ( const sourceHandle of sourceTreeItemHandles ) {
@@ -717,8 +750,13 @@ class ExtHostTreeView<T> extends Disposable {
717
750
return command ? { ...this . commands . toInternal ( command , disposable ) , originalId : command . command } : undefined ;
718
751
}
719
752
753
+ private getCheckbox ( extensionTreeItem : vscode . TreeItem2 ) : boolean | undefined {
754
+ return ( extensionTreeItem . checkboxState !== undefined ) ?
755
+ extensionTreeItem . checkboxState === TreeItemCheckboxState . Checked : undefined ;
756
+ }
757
+
720
758
private validateTreeItem ( extensionTreeItem : vscode . TreeItem ) {
721
- if ( ! TreeItem . isTreeItem ( extensionTreeItem ) ) {
759
+ if ( ! TreeItem . isTreeItem ( extensionTreeItem , this . extension ) ) {
722
760
throw new Error ( `Extension ${ this . extension . identifier . value } has provided an invalid tree item.` ) ;
723
761
}
724
762
}
@@ -741,7 +779,8 @@ class ExtHostTreeView<T> extends Disposable {
741
779
iconDark : this . getDarkIconPath ( extensionTreeItem ) || icon ,
742
780
themeIcon : this . getThemeIcon ( extensionTreeItem ) ,
743
781
collapsibleState : isUndefinedOrNull ( extensionTreeItem . collapsibleState ) ? TreeItemCollapsibleState . None : extensionTreeItem . collapsibleState ,
744
- accessibilityInformation : extensionTreeItem . accessibilityInformation
782
+ accessibilityInformation : extensionTreeItem . accessibilityInformation ,
783
+ checkboxChecked : this . getCheckbox ( extensionTreeItem )
745
784
} ;
746
785
747
786
return {
0 commit comments