From 8a72707c6054c30b13f7ca44fa413a5652ff068e Mon Sep 17 00:00:00 2001 From: Cory Rivera Date: Tue, 12 Sep 2023 15:52:13 -0700 Subject: [PATCH] Add ability to only show folders in File Browser dialogs (#2238) --- .../Contracts/FileBrowserOpenRequest.cs | 7 ++++++- .../FileBrowser/FileBrowserOperation.cs | 17 +++++++++++------ .../FileBrowser/FileBrowserService.cs | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenRequest.cs index b0a21c25..726929e1 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/Contracts/FileBrowserOpenRequest.cs @@ -25,7 +25,7 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts public string ExpandPath; /// - /// File extension filter (e.g. *.bak) + /// File extension filter (e.g. *.bak). Ignored if is set to true. /// public string[] FileFilters; @@ -33,6 +33,11 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser.Contracts /// True if this is a request to change file filter /// public bool ChangeFilter; + + /// + /// Whether to only show folders in the file browser. + /// + public bool? ShowFoldersOnly; } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserOperation.cs b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserOperation.cs index 73b37073..1c594ac7 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserOperation.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserOperation.cs @@ -26,19 +26,23 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser private bool fileTreeCreated; private CancellationTokenSource cancelSource; private CancellationToken cancelToken; + private bool showFoldersOnly; #region Constructors /// /// Initializes a new instance of the class. /// - /// The connection object - /// The file extension filters - public FileBrowserOperation(ServerConnection connection, string expandPath, string[] fileFilters = null) + /// The connection object. + /// The initial folder to open in the file dialog. + /// The file extension filters. Ignored if is set to true. + /// Whether to only show folders in the file browser. + public FileBrowserOperation(ServerConnection connection, string expandPath, string[] fileFilters = null, bool? showFoldersOnly = null) { this.cancelSource = new CancellationTokenSource(); this.cancelToken = cancelSource.Token; this.connection = connection; + this.showFoldersOnly = showFoldersOnly ?? false; this.Initialize(expandPath, fileFilters); } @@ -236,9 +240,10 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser } treeNode.IsFile = isFile; - // if the node is a directory, or if we are browsing for files and the file name is allowed, - // add the node to the tree - if (!isFile || (this.FilterFile(treeNode.Name, this.fileFilters))) + // If the node is a directory, or if we are browsing for files and the file name is allowed, + // add the node to the tree. Files will be skipped instead if the dialog is only showing folders, + // regardless of any provided file filters. + if (!isFile || (this.FilterFile(treeNode.Name, this.fileFilters) && !this.showFoldersOnly)) { children.Add(treeNode); } diff --git a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs index 97b576a8..8bea61b1 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs @@ -232,7 +232,7 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser { if (!fileBrowserParams.ChangeFilter) { - browser = new FileBrowserOperation(bindingContext.ServerConnection, fileBrowserParams.ExpandPath, fileBrowserParams.FileFilters); + browser = new FileBrowserOperation(bindingContext.ServerConnection, fileBrowserParams.ExpandPath, fileBrowserParams.FileFilters, fileBrowserParams.ShowFoldersOnly); } else {