11import * as vscode from "vscode" ;
22import * as url from "url" ;
3- import { DocSearchResult } from "../../api/atelier" ;
43import { AtelierAPI } from "../../api" ;
4+ import { StudioOpenDialog } from "../../queries" ;
5+ import { studioOpenDialogFromURI } from "../../utils/FileProviderUtil" ;
56
67export class FileSearchProvider implements vscode . FileSearchProvider {
78 /**
@@ -15,58 +16,56 @@ export class FileSearchProvider implements vscode.FileSearchProvider {
1516 options : vscode . FileSearchOptions ,
1617 token : vscode . CancellationToken
1718 ) : vscode . ProviderResult < vscode . Uri [ ] > {
18- const folderQuery = url . parse ( options . folder . toString ( true ) , true ) . query ;
19- const type = folderQuery . type || "all" ;
20- const category =
21- folderQuery . csp === "" || folderQuery . csp === "1" ? "CSP" : type === "cls" ? "CLS" : type === "rtn" ? "RTN" : "*" ;
22- const generated = folderQuery . generated === "1" ;
23- const api = new AtelierAPI ( options . folder ) ;
19+ const uri = url . parse ( options . folder . toString ( true ) , true ) ;
20+ const csp = uri . query . csp === "" || uri . query . csp === "1" ;
2421 let filter = query . pattern ;
25- if ( category !== "CSP" ) {
22+ if ( ! csp ) {
2623 if ( options . folder . path !== "/" ) {
2724 filter = options . folder . path . slice ( 1 ) + "/%" + filter ;
2825 }
2926 filter = filter . replace ( / \/ / g, "." ) ;
3027 }
31- let counter = 0 ;
32- if ( ! api . enabled ) {
33- return null ;
28+ if ( filter . length ) {
29+ filter = "Name Like '%" + filter + "%'" ;
30+ } else {
31+ // When this is called without a query.pattern, every file is supposed to be returned, so do not provide a filter
32+ filter = "" ;
3433 }
35- return api
36- . getDocNames ( {
37- filter,
38- category,
39- generated,
34+ let counter = 0 ;
35+ return studioOpenDialogFromURI ( options . folder , { flat : true , filter : filter } )
36+ . then ( ( data ) => {
37+ return data . result . content ;
4038 } )
41- . then ( ( data ) => data . result . content )
42- . then ( ( files : DocSearchResult [ ] ) =>
43- files
44- . map ( ( file ) => {
45- if ( category !== "CSP" && file . cat === "CSP" ) {
39+ . then ( ( data : StudioOpenDialog [ ] ) => {
40+ const api = new AtelierAPI ( options . folder ) ;
41+ return data
42+ . map ( ( item : StudioOpenDialog ) => {
43+ // item.Type only matters here if it is 5 (CSP)
44+ if ( item . Type == "5" && ! csp ) {
4645 return null ;
4746 }
48- if ( file . cat !== "CSP " ) {
49- if ( file . name . startsWith ( "%" ) && api . ns !== "%SYS" ) {
47+ if ( item . Type !== "5 " ) {
48+ if ( item . Name . startsWith ( "%" ) && api . ns !== "%SYS" ) {
5049 return null ;
5150 }
5251 // Convert dotted name to slashed one, treating the likes of ABC.1.int or DEF.T1.int in the same way
5352 // as the Studio dialog does.
54- const nameParts = file . name . split ( "." ) ;
53+ const nameParts = item . Name . split ( "." ) ;
5554 const dotParts = nameParts
5655 . slice ( - 2 )
5756 . join ( "." )
5857 . match ( / ^ [ A - Z ] ? \d * [ . ] ( m a c | i n t | i n c ) $ / )
5958 ? 3
6059 : 2 ;
61- file . name = nameParts . slice ( 0 , - dotParts ) . join ( "/" ) + "/" + nameParts . slice ( - dotParts ) . join ( "." ) ;
60+ item . Name = nameParts . slice ( 0 , - dotParts ) . join ( "/" ) + "/" + nameParts . slice ( - dotParts ) . join ( "." ) ;
6261 }
6362 if ( ! options . maxResults || ++ counter <= options . maxResults ) {
64- return options . folder . with ( { path : `/ ${ file . name } ` } ) ;
63+ return vscode . Uri . parse ( ` ${ options . folder . scheme } :// ${ options . folder . authority } / ${ item . Name } ` , true ) ;
6564 } else {
6665 return null ;
6766 }
6867 } )
69- . filter ( ( el ) => el !== null )
70- ) ;
68+ . filter ( ( el ) => el !== null ) ;
69+ } ) ;
7170 }
7271}
0 commit comments