modular code
This commit is contained in:
171
src/providers/prompterTreeProvider.ts
Normal file
171
src/providers/prompterTreeProvider.ts
Normal file
@@ -0,0 +1,171 @@
|
||||
import * as vscode from 'vscode';
|
||||
import * as path from 'path';
|
||||
import { FileTreeItem, SettingTreeItem } from '../models/treeItems';
|
||||
import { PrompterSettings, DEFAULT_SETTINGS } from '../models/settings';
|
||||
|
||||
/**
|
||||
* Tree provider for the Prompter extension
|
||||
* Handles both file browsing and settings views
|
||||
*/
|
||||
export class PrompterTreeProvider implements vscode.TreeDataProvider<FileTreeItem | SettingTreeItem> {
|
||||
private _onDidChangeTreeData: vscode.EventEmitter<FileTreeItem | SettingTreeItem | undefined | null | void> =
|
||||
new vscode.EventEmitter<FileTreeItem | SettingTreeItem | undefined | null | void>();
|
||||
|
||||
readonly onDidChangeTreeData: vscode.Event<FileTreeItem | SettingTreeItem | undefined | null | void> =
|
||||
this._onDidChangeTreeData.event;
|
||||
|
||||
private selectedFiles: Set<string> = new Set();
|
||||
private settings: PrompterSettings = { ...DEFAULT_SETTINGS };
|
||||
private showingSettings: boolean = false;
|
||||
|
||||
constructor(private workspaceRoot: string | undefined) {}
|
||||
|
||||
// Toggle between file view and settings view
|
||||
toggleSettingsView(): void {
|
||||
this.showingSettings = !this.showingSettings;
|
||||
this.refresh();
|
||||
}
|
||||
|
||||
getTreeItem(element: FileTreeItem | SettingTreeItem): vscode.TreeItem {
|
||||
// Return the element as is if it's a SettingTreeItem
|
||||
if (element instanceof SettingTreeItem) {
|
||||
return element;
|
||||
}
|
||||
|
||||
// Handle FileTreeItem
|
||||
const fileItem = element as FileTreeItem;
|
||||
if (fileItem.resourceUri && this.selectedFiles.has(fileItem.resourceUri.fsPath)) {
|
||||
fileItem.checkboxState = vscode.TreeItemCheckboxState.Checked;
|
||||
} else {
|
||||
fileItem.checkboxState = vscode.TreeItemCheckboxState.Unchecked;
|
||||
}
|
||||
return fileItem;
|
||||
}
|
||||
|
||||
async getChildren(element?: FileTreeItem | SettingTreeItem): Promise<(FileTreeItem | SettingTreeItem)[]> {
|
||||
// If we're showing settings, return settings items
|
||||
if (this.showingSettings && !element) {
|
||||
return this.getSettingsItems();
|
||||
}
|
||||
|
||||
// Otherwise show files
|
||||
if (!this.workspaceRoot) {
|
||||
vscode.window.showInformationMessage('No workspace folder is opened');
|
||||
return Promise.resolve([]);
|
||||
}
|
||||
|
||||
if (element) {
|
||||
// Make sure we're dealing with a FileTreeItem that has a resourceUri
|
||||
if (!(element instanceof SettingTreeItem) && element.resourceUri) {
|
||||
return this.getFilesInDirectory(element.resourceUri.fsPath);
|
||||
}
|
||||
return Promise.resolve([]);
|
||||
} else {
|
||||
return this.getFilesInDirectory(this.workspaceRoot);
|
||||
}
|
||||
}
|
||||
|
||||
private async getFilesInDirectory(dirPath: string): Promise<FileTreeItem[]> {
|
||||
try {
|
||||
const files = await vscode.workspace.fs.readDirectory(vscode.Uri.file(dirPath));
|
||||
|
||||
return files.map(([name, type]) => {
|
||||
const filePath = path.join(dirPath, name);
|
||||
const uri = vscode.Uri.file(filePath);
|
||||
|
||||
return new FileTreeItem(
|
||||
uri,
|
||||
type === vscode.FileType.Directory
|
||||
? vscode.TreeItemCollapsibleState.Collapsed
|
||||
: vscode.TreeItemCollapsibleState.None
|
||||
);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(`Error reading directory: ${dirPath}`, error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
// Refresh the tree view
|
||||
refresh(): void {
|
||||
this._onDidChangeTreeData.fire();
|
||||
}
|
||||
|
||||
// Add a file to the selection
|
||||
addToSelection(item: FileTreeItem): void {
|
||||
if (item.resourceUri) {
|
||||
this.selectedFiles.add(item.resourceUri.fsPath);
|
||||
console.log(`Added ${item.resourceUri.fsPath} to selection`);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove a file from the selection
|
||||
removeFromSelection(item: FileTreeItem): void {
|
||||
if (item.resourceUri) {
|
||||
this.selectedFiles.delete(item.resourceUri.fsPath);
|
||||
console.log(`Removed ${item.resourceUri.fsPath} from selection`);
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle a file's selection status
|
||||
toggleSelection(item: FileTreeItem): void {
|
||||
if (item.resourceUri) {
|
||||
const filePath = item.resourceUri.fsPath;
|
||||
if (this.selectedFiles.has(filePath)) {
|
||||
this.removeFromSelection(item);
|
||||
} else {
|
||||
this.addToSelection(item);
|
||||
}
|
||||
this.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
// Get the selected files
|
||||
getSelectedFiles(): Set<string> {
|
||||
console.log('getSelectedFiles called, count:', this.selectedFiles.size);
|
||||
return this.selectedFiles;
|
||||
}
|
||||
|
||||
// Get settings items for the tree view
|
||||
private getSettingsItems(): SettingTreeItem[] {
|
||||
return [
|
||||
new SettingTreeItem('XML Edits', 'xmlEditsEnabled', this.settings.xmlEditsEnabled),
|
||||
new SettingTreeItem('Include Line Numbers', 'includeLineNumbers', this.settings.includeLineNumbers),
|
||||
new SettingTreeItem('Include Comments', 'includeComments', this.settings.includeComments),
|
||||
new SettingTreeItem('Token Calculation', 'tokenCalculationEnabled', this.settings.tokenCalculationEnabled)
|
||||
];
|
||||
}
|
||||
|
||||
// Update a setting value
|
||||
updateSetting(key: keyof PrompterSettings, value: boolean): void {
|
||||
this.settings[key] = value;
|
||||
this.refresh();
|
||||
}
|
||||
|
||||
// Check if showing settings view
|
||||
isShowingSettings(): boolean {
|
||||
return this.showingSettings;
|
||||
}
|
||||
|
||||
// Toggle XML edits setting
|
||||
toggleXmlEdits(): void {
|
||||
this.settings.xmlEditsEnabled = !this.settings.xmlEditsEnabled;
|
||||
this.refresh();
|
||||
}
|
||||
|
||||
// Check if XML edits are enabled
|
||||
isXmlEditsEnabled(): boolean {
|
||||
return this.settings.xmlEditsEnabled;
|
||||
}
|
||||
|
||||
// Get all settings
|
||||
getSettings(): PrompterSettings {
|
||||
return { ...this.settings };
|
||||
}
|
||||
|
||||
// Update all settings at once
|
||||
updateSettings(newSettings: PrompterSettings): void {
|
||||
this.settings = { ...newSettings };
|
||||
this.refresh();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user