Skip to content

Commit e5b9347

Browse files
committed
add multi-root file viewer
1 parent 4f12bc1 commit e5b9347

File tree

3 files changed

+79
-1
lines changed

3 files changed

+79
-1
lines changed

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,11 @@
232232
{
233233
"id": "bazelTaskOutline",
234234
"name": "Bazel Run Targets"
235+
},
236+
{
237+
"id": "rootFileViewer",
238+
"name": "Root File Viewer",
239+
"when": "isMultiRoot"
235240
}
236241
]
237242
},

src/extension.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { registerLSClient } from './loggingTCPServer';
2121
import { ProjectViewManager } from './projectViewManager';
2222
import { BazelRunTargetProvider } from './provider/bazelRunTargetProvider';
2323
import { BazelTaskProvider } from './provider/bazelTaskProvider';
24+
import { RootFileViewProvider } from './provider/rootFileViewProvider';
2425
import {
2526
getWorkspaceRoot,
2627
initBazelProjectFile,
@@ -45,6 +46,10 @@ export async function activate(context: ExtensionContext) {
4546
BazelRunTargetProvider.instance
4647
);
4748
tasks.registerTaskProvider('bazel', new BazelTaskProvider());
49+
window.registerTreeDataProvider(
50+
'rootFileViewer',
51+
RootFileViewProvider.instance
52+
);
4853

4954
BazelLanguageServerTerminal.trace('extension activated');
5055

@@ -66,6 +71,11 @@ export async function activate(context: ExtensionContext) {
6671
'isBazelWorkspaceRoot',
6772
isBazelWorkspaceRoot()
6873
);
74+
commands.executeCommand(
75+
'setContext',
76+
'isMultiRoot',
77+
workspace.workspaceFile?.fsPath.includes('code-workspace')
78+
);
6979
// create .eclipse/.bazelproject file if DNE
7080
if (isBazelWorkspaceRoot()) {
7181
initBazelProjectFile();
@@ -134,7 +144,7 @@ export async function activate(context: ExtensionContext) {
134144
registerLSClient();
135145
}
136146

137-
export function deactivate() {}
147+
export function deactivate() { }
138148

139149
function syncProjectView(): void {
140150
if (!isRedhatJavaReady()) {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import path from 'path';
2+
import {
3+
Event,
4+
ProviderResult,
5+
ThemeIcon,
6+
TreeDataProvider,
7+
TreeItem,
8+
TreeItemCollapsibleState,
9+
Uri,
10+
workspace
11+
} from 'vscode';
12+
import { getWorkspaceRoot } from '../util';
13+
14+
const WORKSPACE_ROOT = getWorkspaceRoot();
15+
16+
export class RootFileViewProvider implements TreeDataProvider<string> {
17+
private static _instance: RootFileViewProvider;
18+
19+
private constructor() { }
20+
21+
public static get instance(): RootFileViewProvider {
22+
if (!this._instance) {
23+
this._instance = new RootFileViewProvider();
24+
}
25+
return this._instance;
26+
}
27+
28+
onDidChangeTreeData?:
29+
| Event<string | void | string[] | null | undefined>
30+
| undefined;
31+
getTreeItem(element: string): TreeItem | Thenable<TreeItem> {
32+
return new FileItem(element);
33+
}
34+
getChildren(element?: string | undefined): ProviderResult<string[]> {
35+
if (!element) {
36+
return workspace.fs
37+
.readDirectory(Uri.file(WORKSPACE_ROOT))
38+
.then((val) => {
39+
return val.filter((v) => v[1] === 1).map((v) => v[0]);
40+
});
41+
}
42+
return [];
43+
}
44+
}
45+
46+
class FileItem extends TreeItem {
47+
constructor(fileName: string, collapsibleState?: TreeItemCollapsibleState) {
48+
super(fileName, collapsibleState);
49+
this.command = {
50+
title: fileName,
51+
command: 'vscode.open',
52+
arguments: [`${WORKSPACE_ROOT}${path.sep}${fileName}`],
53+
};
54+
switch (fileName.split('.').reverse()[0]) {
55+
case 'json':
56+
this.iconPath = new ThemeIcon('json');
57+
break;
58+
default:
59+
this.iconPath = new ThemeIcon('file');
60+
break;
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)