1+ /*---------------------------------------------------------
2+ * Copyright (C) Microsoft Corporation. All rights reserved.
3+ *--------------------------------------------------------*/
4+
5+ import vscode = require( "vscode" ) ;
6+ import QuickPickItem = vscode . QuickPickItem ;
7+
8+ export class CheckboxQuickPickItem {
9+ name : string ;
10+ isSelected : boolean ;
11+ }
12+
13+ export class CheckboxQuickPick {
14+ private static readonly confirm : string = "$(check)" ;
15+ private static readonly checkboxOn : string = "[ x ]" ;
16+ private static readonly checkboxOff : string = "[ ]" ;
17+ private static readonly confirmPlaceHolder : string = "Select 'Confirm' to confirm change; Press 'esc' key to cancel changes" ;
18+
19+ public static show (
20+ checkboxQuickPickItems : CheckboxQuickPickItem [ ] ,
21+ callback : ( items : CheckboxQuickPickItem [ ] ) => void ) : void {
22+ CheckboxQuickPick . showInner ( checkboxQuickPickItems . slice ( ) , callback ) ;
23+ }
24+
25+ private static showInner (
26+ items : CheckboxQuickPickItem [ ] ,
27+ callback : ( items : CheckboxQuickPickItem [ ] ) => void ) : void {
28+ vscode . window . showQuickPick (
29+ CheckboxQuickPick . getQuickPickItems ( items ) ,
30+ {
31+ ignoreFocusOut : true ,
32+ matchOnDescription : true ,
33+ placeHolder : CheckboxQuickPick . confirmPlaceHolder
34+ } ) . then ( ( selection ) => {
35+ if ( ! selection ) {
36+ return ;
37+ }
38+
39+ if ( selection . label === CheckboxQuickPick . confirm ) {
40+ callback ( items ) ;
41+ return ;
42+ }
43+
44+ let index : number = CheckboxQuickPick . getRuleIndex ( items , selection . description ) ;
45+ CheckboxQuickPick . toggleSelection ( items [ index ] ) ;
46+ CheckboxQuickPick . showInner ( items , callback ) ;
47+ } ) ;
48+ }
49+
50+ private static getRuleIndex ( items : CheckboxQuickPickItem [ ] , itemLabel : string ) : number {
51+ return items . findIndex ( item => item . name === itemLabel ) ;
52+ }
53+
54+ private static getQuickPickItems ( items : CheckboxQuickPickItem [ ] ) : QuickPickItem [ ] {
55+ let quickPickItems : QuickPickItem [ ] = [ ] ;
56+ quickPickItems . push ( { label : CheckboxQuickPick . confirm , description : "Confirm" } ) ;
57+ items . forEach ( item =>
58+ quickPickItems . push ( {
59+ label : CheckboxQuickPick . convertToCheckBox ( item . isSelected ) , description : item . name
60+ } ) ) ;
61+ return quickPickItems ;
62+ }
63+
64+ private static toggleSelection ( item : CheckboxQuickPickItem ) : void {
65+ item . isSelected = ! item . isSelected ;
66+ }
67+
68+ private static convertToCheckBox ( state : boolean ) : string {
69+ if ( state ) {
70+ return CheckboxQuickPick . checkboxOn ;
71+ }
72+ else {
73+ return CheckboxQuickPick . checkboxOff ;
74+ }
75+ }
76+ }
0 commit comments