@@ -34,12 +34,19 @@ function joinThemableIconPath(base: string, iconPath: ThemableIconPath): Themabl
3434 return path . join ( base , iconPath ) ;
3535}
3636
37+ enum SortOrder {
38+ NameAsc = 'NameAsc' ,
39+ NameDesc = 'NameDesc'
40+ }
41+
3742/**
3843 * Tree data provider for the databases view.
3944 */
4045class DatabaseTreeDataProvider extends DisposableObject
4146 implements TreeDataProvider < DatabaseItem > {
4247
48+ private _sortOrder = SortOrder . NameAsc ;
49+
4350 private readonly _onDidChangeTreeData = new EventEmitter < DatabaseItem | undefined > ( ) ;
4451 private currentDatabaseItem : DatabaseItem | undefined ;
4552
@@ -84,7 +91,14 @@ class DatabaseTreeDataProvider extends DisposableObject
8491
8592 public getChildren ( element ?: DatabaseItem ) : ProviderResult < DatabaseItem [ ] > {
8693 if ( element === undefined ) {
87- return this . databaseManager . databaseItems . slice ( 0 ) ;
94+ return this . databaseManager . databaseItems . slice ( 0 ) . sort ( ( db1 , db2 ) => {
95+ switch ( this . sortOrder ) {
96+ case SortOrder . NameAsc :
97+ return db1 . name . localeCompare ( db2 . name ) ;
98+ case SortOrder . NameDesc :
99+ return db2 . name . localeCompare ( db1 . name ) ;
100+ }
101+ } ) ;
88102 }
89103 else {
90104 return [ ] ;
@@ -98,6 +112,15 @@ class DatabaseTreeDataProvider extends DisposableObject
98112 public getCurrent ( ) : DatabaseItem | undefined {
99113 return this . currentDatabaseItem ;
100114 }
115+
116+ public get sortOrder ( ) {
117+ return this . _sortOrder ;
118+ }
119+
120+ public set sortOrder ( newSortOrder : SortOrder ) {
121+ this . _sortOrder = newSortOrder ;
122+ this . _onDidChangeTreeData . fire ( ) ;
123+ }
101124}
102125
103126/** Gets the first element in the given list, if any, or undefined if the list is empty or undefined. */
@@ -129,19 +152,25 @@ async function chooseDatabaseDir(): Promise<Uri | undefined> {
129152}
130153
131154export class DatabaseUI extends DisposableObject {
132- public constructor ( ctx : ExtensionContext , private cliserver : cli . CodeQLCliServer , private databaseManager : DatabaseManager ,
133- private readonly queryServer : qsClient . QueryServerClient | undefined ) {
134-
155+ private treeDataProvider : DatabaseTreeDataProvider ;
156+
157+ public constructor (
158+ ctx : ExtensionContext ,
159+ private cliserver : cli . CodeQLCliServer ,
160+ private databaseManager : DatabaseManager ,
161+ private readonly queryServer : qsClient . QueryServerClient | undefined
162+ ) {
135163 super ( ) ;
136164
137- const treeDataProvider = this . push ( new DatabaseTreeDataProvider ( ctx , databaseManager ) ) ;
138- this . push ( window . createTreeView ( 'codeQLDatabases' , { treeDataProvider } ) ) ;
165+ this . treeDataProvider = this . push ( new DatabaseTreeDataProvider ( ctx , databaseManager ) ) ;
166+ this . push ( window . createTreeView ( 'codeQLDatabases' , { treeDataProvider : this . treeDataProvider } ) ) ;
139167
140168 ctx . subscriptions . push ( commands . registerCommand ( 'codeQL.chooseDatabase' , this . handleChooseDatabase ) ) ;
141169 ctx . subscriptions . push ( commands . registerCommand ( 'codeQL.setCurrentDatabase' , this . handleSetCurrentDatabase ) ) ;
142170 ctx . subscriptions . push ( commands . registerCommand ( 'codeQL.upgradeCurrentDatabase' , this . handleUpgradeCurrentDatabase ) ) ;
143171 ctx . subscriptions . push ( commands . registerCommand ( 'codeQL.clearCache' , this . handleClearCache ) ) ;
144172 ctx . subscriptions . push ( commands . registerCommand ( 'codeQLDatabases.setCurrentDatabase' , this . handleMakeCurrentDatabase ) ) ;
173+ ctx . subscriptions . push ( commands . registerCommand ( 'codeQLDatabases.sortByName' , this . handleSortByName ) ) ;
145174 ctx . subscriptions . push ( commands . registerCommand ( 'codeQLDatabases.removeDatabase' , this . handleRemoveDatabase ) ) ;
146175 ctx . subscriptions . push ( commands . registerCommand ( 'codeQLDatabases.upgradeDatabase' , this . handleUpgradeDatabase ) ) ;
147176 }
@@ -154,6 +183,14 @@ export class DatabaseUI extends DisposableObject {
154183 return await this . chooseAndSetDatabase ( ) ;
155184 }
156185
186+ private handleSortByName = async ( ) => {
187+ if ( this . treeDataProvider . sortOrder === SortOrder . NameAsc ) {
188+ this . treeDataProvider . sortOrder = SortOrder . NameDesc ;
189+ } else {
190+ this . treeDataProvider . sortOrder = SortOrder . NameAsc ;
191+ }
192+ }
193+
157194 private handleUpgradeCurrentDatabase = async ( ) : Promise < void > => {
158195 await this . handleUpgradeDatabase ( this . databaseManager . currentDatabaseItem ) ;
159196 }
0 commit comments