@@ -8,78 +8,143 @@ interface StudioAction extends vscode.QuickPickItem {
8
8
id : string ;
9
9
}
10
10
11
- function doMenuAction ( uri : vscode . Uri , menuType : string ) : Promise < any > {
12
- uri = uri || vscode . window . activeTextEditor . document . uri ;
13
- if ( uri . scheme !== FILESYSTEM_SCHEMA ) {
14
- return ;
11
+ class StudioActions {
12
+ private uri : vscode . Uri ;
13
+ private api : AtelierAPI ;
14
+ private name : string ;
15
+
16
+ public constructor ( uri : vscode . Uri ) {
17
+ this . uri = uri ;
18
+ this . name = this . uri . path . slice ( 1 ) . replace ( / \/ / g, "." ) ;
19
+ this . api = new AtelierAPI ( uri . authority ) ;
20
+ }
21
+
22
+ public processUserAction ( userAction ) : Thenable < any > {
23
+ const serverAction = parseInt ( userAction . action || 0 , 10 ) ;
24
+ const { target, errorText } = userAction ;
25
+ if ( errorText !== "" ) {
26
+ outputChannel . appendLine ( errorText ) ;
27
+ outputChannel . show ( ) ;
28
+ }
29
+ outputChannel . appendLine ( JSON . stringify ( userAction ) ) ;
30
+ switch ( serverAction ) {
31
+ case 0 :
32
+ /// do nothing
33
+ break ;
34
+ case 1 : // Display the default Studio dialog with a yes/no/cancel button.
35
+ return vscode . window
36
+ . showWarningMessage ( target , { modal : true } , "Yes" , "No" )
37
+ . then ( answer => ( answer === "Yes" ? "1" : answer === "No" ? "0" : "2" ) ) ;
38
+ case 2 : // Run a CSP page/Template. The Target is the full url to the CSP page/Template
39
+ throw new Error ( "Not suppoorted" ) ;
40
+ case 3 : // Run an EXE on the client.
41
+ throw new Error ( "Not suppoorted" ) ;
42
+ case 4 : // Insert the text in Target in the current document at the current selection point
43
+ throw new Error ( "Not suppoorted" ) ;
44
+ case 5 : // Studio will open the documents listed in Target
45
+ throw new Error ( "Not suppoorted" ) ;
46
+ case 6 : // Display an alert dialog in Studio with the text from the Target variable.
47
+ return vscode . window . showWarningMessage ( target , { modal : true } ) ;
48
+ case 7 : // Display a dialog with a textbox and Yes/No/Cancel buttons.
49
+ return vscode . window . showInputBox ( {
50
+ prompt : target ,
51
+ } ) ;
52
+ default :
53
+ throw new Error ( "Not suppoorted" ) ;
54
+ }
15
55
}
16
- const query = "select * from %Atelier_v1_Utils.Extension_GetMenus(?,?,?)" ;
17
- const name = uri . path . slice ( 1 ) . replace ( / \/ / g, "." ) ;
18
- const api = new AtelierAPI ( uri . authority ) ;
19
- const parameters = [ menuType , name , "" ] ;
20
- return api
21
- . actionQuery ( query , parameters )
22
- . then ( data => data . result . content )
23
- . then ( menu =>
24
- menu . reduce (
56
+
57
+ private userAction ( action , afterUserAction = false , answer : string = "" , msg : string = "" ) : Thenable < void > {
58
+ if ( ! action ) {
59
+ return ;
60
+ }
61
+ const func = afterUserAction ? "AfterUserAction" : "UserAction" ;
62
+ const query = `select * from %Atelier_v1_Utils.Extension_${ func } (?, ?, ?, ?)` ;
63
+ let selectedText = "" ;
64
+ const editor = vscode . window . activeTextEditor ;
65
+ if ( ! editor ) {
66
+ selectedText = "" ;
67
+ }
68
+ const selection = editor . selection ;
69
+ selectedText = editor . document . getText ( selection ) ;
70
+
71
+ const parameters = afterUserAction
72
+ ? [ "0" , action . id , this . name , answer ]
73
+ : [ "0" , action . id , this . name , selectedText ] ;
74
+ return vscode . window . withProgress (
75
+ {
76
+ cancellable : false ,
77
+ location : vscode . ProgressLocation . Notification ,
78
+ title : `Executing user action: ${ action . label } ` ,
79
+ } ,
80
+ ( ) =>
81
+ this . api
82
+ . actionQuery ( query , parameters )
83
+ . then ( data => data . result . content . pop ( ) )
84
+ . then ( this . processUserAction )
85
+ . then ( answer => {
86
+ if ( answer ) {
87
+ return this . userAction ( action , true , answer ) ;
88
+ }
89
+ } )
90
+ . catch ( err => {
91
+ outputChannel . appendLine ( `Studio Action "${ action . label } " not supported` ) ;
92
+ outputChannel . show ( ) ;
93
+ } )
94
+ ) ;
95
+ }
96
+
97
+ private constructMenu ( menu ) : any [ ] {
98
+ return menu
99
+ . reduce (
25
100
( list , sub ) =>
26
101
list . concat (
27
102
sub . items
28
- . filter ( el => el . id !== "" && el . separator == 0 && el . enabled == 1 )
29
- . map ( el => ( { ...el , id : `${ sub . id } ,${ el . id } ` , label : el . name , itemId : el . id , type : sub . type } ) )
103
+ . filter ( el => el . id !== "" && el . separator == 0 )
104
+ // .filter(el => el.enabled == 1)
105
+ . map ( el => ( {
106
+ ...el ,
107
+ id : `${ sub . id } ,${ el . id } ` ,
108
+ label : el . name . replace ( "&" , "" ) ,
109
+ itemId : el . id ,
110
+ type : sub . type ,
111
+ } ) )
30
112
) ,
31
113
[ ]
32
114
)
33
- )
34
- . then ( menuItems =>
35
- menuItems . filter ( ( item : any , index : number , self : any ) => {
115
+ . sort ( ( el1 , el2 ) => ( el1 . type === "main" && el2 . type !== el1 . type ? - 1 : 1 ) )
116
+ . filter ( ( item : any , index : number , self : any ) => {
36
117
if ( item && item . type === "main" ) {
37
118
return true ;
38
119
}
39
120
return self . findIndex ( ( el ) : boolean => el . itemId === item . itemId ) === index ;
40
- } )
41
- )
42
- . then ( menuItems => {
43
- return vscode . window . showQuickPick < StudioAction > ( menuItems , { canPickMany : false } ) ;
44
- } )
45
- . then ( action => {
46
- if ( ! action ) {
47
- return ;
48
- }
49
- const query = "select * from %Atelier_v1_Utils.Extension_UserAction(?, ?, ?, ?)" ;
50
- let selectedText = "" ;
51
- const editor = vscode . window . activeTextEditor ;
52
- if ( ! editor ) {
53
- selectedText = "" ;
54
- }
55
- const selection = editor . selection ;
56
- selectedText = editor . document . getText ( selection ) ;
121
+ } ) ;
122
+ }
57
123
58
- const parameters = [ "0" , action . id , name , selectedText ] ;
59
- return vscode . window . withProgress (
60
- {
61
- cancellable : false ,
62
- location : vscode . ProgressLocation . Notification ,
63
- title : `Executing user action: ${ action . label } ` ,
64
- } ,
65
- ( ) =>
66
- api
67
- . actionQuery ( query , parameters )
68
- . then ( data => data . result . content . pop ( ) )
69
- . then ( userAction => {
70
- if ( userAction && userAction . action != "0" ) {
71
- outputChannel . appendLine ( `Studio Action "${ action . label } " not supported` ) ;
72
- outputChannel . show ( ) ;
73
- }
74
- } )
75
- ) ;
76
- } ) ;
124
+ public getMenu ( menuType : string ) : Thenable < any > {
125
+ const query = "select * from %Atelier_v1_Utils.Extension_GetMenus(?,?,?)" ;
126
+ const parameters = [ menuType , this . name , "" ] ;
127
+
128
+ return this . api
129
+ . actionQuery ( query , parameters )
130
+ . then ( data => data . result . content )
131
+ . then ( this . constructMenu )
132
+ . then ( menuItems => {
133
+ return vscode . window . showQuickPick < StudioAction > ( menuItems , { canPickMany : false } ) ;
134
+ } )
135
+ . then ( action => this . userAction ( action ) ) ;
136
+ }
77
137
}
78
138
79
139
// export function contextMenu(uri: vscode.Uri): Promise<void> {
80
140
// return doMenuAction(uri, "context");
81
141
// }
82
142
83
- export function mainMenu ( uri : vscode . Uri ) {
84
- return doMenuAction ( uri , "" ) ;
143
+ export async function mainMenu ( uri : vscode . Uri ) {
144
+ uri = uri || vscode . window . activeTextEditor . document . uri ;
145
+ if ( ! uri || uri . scheme !== FILESYSTEM_SCHEMA ) {
146
+ return ;
147
+ }
148
+ const studioActions = new StudioActions ( uri ) ;
149
+ return studioActions && studioActions . getMenu ( "" ) ;
85
150
}
0 commit comments