Skip to content

Commit

Permalink
add multi-root file viewer
Browse files Browse the repository at this point in the history
  • Loading branch information
lonhutt committed Sep 25, 2024
1 parent 4f12bc1 commit bbd13b8
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 1 deletion.
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,11 @@
{
"id": "bazelTaskOutline",
"name": "Bazel Run Targets"
},
{
"id": "rootFileViewer",
"name": "Project Root (Files)",
"when": "isMultiRoot"
}
]
},
Expand Down
12 changes: 11 additions & 1 deletion src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { registerLSClient } from './loggingTCPServer';
import { ProjectViewManager } from './projectViewManager';
import { BazelRunTargetProvider } from './provider/bazelRunTargetProvider';
import { BazelTaskProvider } from './provider/bazelTaskProvider';
import { RootFileViewProvider } from './provider/rootFileViewProvider';
import {
getWorkspaceRoot,
initBazelProjectFile,
Expand All @@ -45,6 +46,10 @@ export async function activate(context: ExtensionContext) {
BazelRunTargetProvider.instance
);
tasks.registerTaskProvider('bazel', new BazelTaskProvider());
window.registerTreeDataProvider(
'rootFileViewer',
RootFileViewProvider.instance
);

BazelLanguageServerTerminal.trace('extension activated');

Expand All @@ -66,6 +71,11 @@ export async function activate(context: ExtensionContext) {
'isBazelWorkspaceRoot',
isBazelWorkspaceRoot()
);
commands.executeCommand(
'setContext',
'isMultiRoot',
workspace.workspaceFile?.fsPath.includes('code-workspace')
);
// create .eclipse/.bazelproject file if DNE
if (isBazelWorkspaceRoot()) {
initBazelProjectFile();
Expand Down Expand Up @@ -134,7 +144,7 @@ export async function activate(context: ExtensionContext) {
registerLSClient();
}

export function deactivate() {}
export function deactivate() { }

Check warning on line 147 in src/extension.ts

View workflow job for this annotation

GitHub Actions / Build and Test (OS ubuntu-latest)

Delete `·`

Check warning on line 147 in src/extension.ts

View workflow job for this annotation

GitHub Actions / Build and Test (OS macos-latest)

Delete `·`

function syncProjectView(): void {
if (!isRedhatJavaReady()) {
Expand Down
76 changes: 76 additions & 0 deletions src/provider/rootFileViewProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import path from 'path';
import {
Event,
EventEmitter,
FileSystemWatcher,
ProviderResult,
RelativePattern,
ThemeIcon,
TreeDataProvider,
TreeItem,
TreeItemCollapsibleState,
Uri,
workspace,
} from 'vscode';
import { getWorkspaceRoot } from '../util';

const WORKSPACE_ROOT = getWorkspaceRoot();

export class RootFileViewProvider implements TreeDataProvider<string> {
private static _instance: RootFileViewProvider;

private _filesWatcher: FileSystemWatcher;
private _onDidChangeTreeData: EventEmitter<string | undefined | void> =
new EventEmitter<string | undefined | void>();
readonly onDidChangeTreeData: Event<string | undefined | void> =
this._onDidChangeTreeData.event;

private constructor() {
this._filesWatcher = workspace.createFileSystemWatcher(
new RelativePattern(WORKSPACE_ROOT, '*')
);
this._filesWatcher.onDidChange((f) => this._onDidChangeTreeData.fire());
this._filesWatcher.onDidCreate((f) => this._onDidChangeTreeData.fire());
this._filesWatcher.onDidDelete((f) => this._onDidChangeTreeData.fire());
}

public static get instance(): RootFileViewProvider {
if (!this._instance) {
this._instance = new RootFileViewProvider();
}
return this._instance;
}

getTreeItem(element: string): TreeItem | Thenable<TreeItem> {
return new FileItem(element);
}
getChildren(element?: string | undefined): ProviderResult<string[]> {
if (!element) {
return workspace.fs
.readDirectory(Uri.file(WORKSPACE_ROOT))
.then((val) => {
return val.filter((v) => v[1] === 1).map((v) => v[0]);
});
}
return [];
}
}

class FileItem extends TreeItem {
constructor(fileName: string, collapsibleState?: TreeItemCollapsibleState) {
super(fileName, collapsibleState);
this.command = {
title: fileName,
command: 'vscode.open',
arguments: [Uri.file(`${WORKSPACE_ROOT}${path.sep}${fileName}`)],
};
switch (fileName.split('.').reverse()[0]) {
case 'json':
this.iconPath = new ThemeIcon('json');
break;
default:
this.iconPath = new ThemeIcon('file');
break;
}
}
}

0 comments on commit bbd13b8

Please sign in to comment.