提交 7bc7034b 编写于 作者: J Johannes Rieken

add filtering for breadcrumbs picker, #55449

上级 fa796356
...@@ -15,6 +15,7 @@ import { Emitter, Event } from 'vs/base/common/event'; ...@@ -15,6 +15,7 @@ import { Emitter, Event } from 'vs/base/common/event';
import { Registry } from 'vs/platform/registry/common/platform'; import { Registry } from 'vs/platform/registry/common/platform';
import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
import { localize } from 'vs/nls'; import { localize } from 'vs/nls';
import * as glob from 'vs/base/common/glob';
export const IBreadcrumbsService = createDecorator<IBreadcrumbsService>('IEditorBreadcrumbsService'); export const IBreadcrumbsService = createDecorator<IBreadcrumbsService>('IEditorBreadcrumbsService');
...@@ -59,8 +60,8 @@ export abstract class BreadcrumbsConfig<T> { ...@@ -59,8 +60,8 @@ export abstract class BreadcrumbsConfig<T> {
name: string; name: string;
onDidChange: Event<void>; onDidChange: Event<void>;
abstract getValue(): T; abstract getValue(overrides?: IConfigurationOverrides): T;
abstract updateValue(value: T): Thenable<void>; abstract updateValue(value: T, overrides?: IConfigurationOverrides): Thenable<void>;
abstract dispose(): void; abstract dispose(): void;
private constructor() { private constructor() {
...@@ -72,6 +73,8 @@ export abstract class BreadcrumbsConfig<T> { ...@@ -72,6 +73,8 @@ export abstract class BreadcrumbsConfig<T> {
static FilePath = BreadcrumbsConfig._stub<'on' | 'off' | 'last'>('breadcrumbs.filePath'); static FilePath = BreadcrumbsConfig._stub<'on' | 'off' | 'last'>('breadcrumbs.filePath');
static SymbolPath = BreadcrumbsConfig._stub<'on' | 'off' | 'last'>('breadcrumbs.symbolPath'); static SymbolPath = BreadcrumbsConfig._stub<'on' | 'off' | 'last'>('breadcrumbs.symbolPath');
static FileExcludes = BreadcrumbsConfig._stub<glob.IExpression>('files.exclude');
private static _stub<T>(name: string): { bindTo(service: IConfigurationService): BreadcrumbsConfig<T> } { private static _stub<T>(name: string): { bindTo(service: IConfigurationService): BreadcrumbsConfig<T> } {
return { return {
bindTo(service) { bindTo(service) {
......
...@@ -9,10 +9,10 @@ import * as dom from 'vs/base/browser/dom'; ...@@ -9,10 +9,10 @@ import * as dom from 'vs/base/browser/dom';
import { compareFileNames } from 'vs/base/common/comparers'; import { compareFileNames } from 'vs/base/common/comparers';
import { Emitter, Event } from 'vs/base/common/event'; import { Emitter, Event } from 'vs/base/common/event';
import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { dispose, IDisposable } from 'vs/base/common/lifecycle';
import { dirname, isEqual } from 'vs/base/common/resources'; import { dirname, isEqual, basename } from 'vs/base/common/resources';
import URI from 'vs/base/common/uri'; import URI from 'vs/base/common/uri';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
import { IDataSource, IRenderer, ISelectionEvent, ISorter, ITree } from 'vs/base/parts/tree/browser/tree'; import { IDataSource, IRenderer, ISelectionEvent, ISorter, ITree, IFilter } from 'vs/base/parts/tree/browser/tree';
import 'vs/css!./media/breadcrumbscontrol'; import 'vs/css!./media/breadcrumbscontrol';
import { OutlineElement, OutlineModel, TreeElement } from 'vs/editor/contrib/documentSymbols/outlineModel'; import { OutlineElement, OutlineModel, TreeElement } from 'vs/editor/contrib/documentSymbols/outlineModel';
import { OutlineDataSource, OutlineItemComparator, OutlineRenderer } from 'vs/editor/contrib/documentSymbols/outlineTree'; import { OutlineDataSource, OutlineItemComparator, OutlineRenderer } from 'vs/editor/contrib/documentSymbols/outlineTree';
...@@ -28,6 +28,9 @@ import { breadcrumbsPickerBackground, widgetShadow } from 'vs/platform/theme/com ...@@ -28,6 +28,9 @@ import { breadcrumbsPickerBackground, widgetShadow } from 'vs/platform/theme/com
import { FuzzyScore, createMatches, fuzzyScore } from 'vs/base/common/filters'; import { FuzzyScore, createMatches, fuzzyScore } from 'vs/base/common/filters';
import { IWorkspaceContextService, IWorkspace, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService, IWorkspace, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { BreadcrumbsConfig } from 'vs/workbench/browser/parts/editor/breadcrumbs';
import * as glob from 'vs/base/common/glob';
import { } from 'vs/base/common/paths';
export function createBreadcrumbsPicker(instantiationService: IInstantiationService, parent: HTMLElement, element: BreadcrumbElement): BreadcrumbsPicker { export function createBreadcrumbsPicker(instantiationService: IInstantiationService, parent: HTMLElement, element: BreadcrumbElement): BreadcrumbsPicker {
let ctor: IConstructorSignature1<HTMLElement, BreadcrumbsPicker> = element instanceof FileElement ? BreadcrumbsFilePicker : BreadcrumbsOutlinePicker; let ctor: IConstructorSignature1<HTMLElement, BreadcrumbsPicker> = element instanceof FileElement ? BreadcrumbsFilePicker : BreadcrumbsOutlinePicker;
...@@ -203,6 +206,52 @@ export class FileDataSource implements IDataSource { ...@@ -203,6 +206,52 @@ export class FileDataSource implements IDataSource {
} }
} }
export class FileFilter implements IFilter {
private readonly _cachedExpressions = new Map<string, glob.ParsedExpression>();
private readonly _disposables: IDisposable[] = [];
constructor(
@IWorkspaceContextService private readonly _workspaceService: IWorkspaceContextService,
@IConfigurationService configService: IConfigurationService,
) {
const config = BreadcrumbsConfig.FileExcludes.bindTo(configService);
const update = () => {
_workspaceService.getWorkspace().folders.forEach(folder => {
const excludesConfig = config.getValue({ resource: folder.uri });
if (excludesConfig) {
this._cachedExpressions.set(folder.uri.toString(), glob.parse(excludesConfig));
}
});
};
update();
this._disposables.push(
config,
config.onDidChange(update),
_workspaceService.onDidChangeWorkspaceFolders(update)
);
}
dispose(): void {
dispose(this._disposables);
}
isVisible(tree: ITree, element: IWorkspaceFolder | IFileStat): boolean {
if (IWorkspaceFolder.isIWorkspaceFolder(element)) {
// not a file
return true;
}
const folder = this._workspaceService.getWorkspaceFolder(element.resource);
if (!folder || !this._cachedExpressions.has(folder.uri.toString())) {
// no folder or no filer
return true;
}
const expression = this._cachedExpressions.get(folder.uri.toString());
return !expression(element.resource.path.substr(folder.uri.path.length), basename(element.resource));
}
}
export class FileRenderer implements IRenderer, IHighlightingRenderer { export class FileRenderer implements IRenderer, IHighlightingRenderer {
private readonly _scores = new Map<string, FuzzyScore>(); private readonly _scores = new Map<string, FuzzyScore>();
...@@ -317,9 +366,13 @@ export class BreadcrumbsFilePicker extends BreadcrumbsPicker { ...@@ -317,9 +366,13 @@ export class BreadcrumbsFilePicker extends BreadcrumbsPicker {
protected _completeTreeConfiguration(config: IHighlightingTreeConfiguration): IHighlightingTreeConfiguration { protected _completeTreeConfiguration(config: IHighlightingTreeConfiguration): IHighlightingTreeConfiguration {
// todo@joh reuse explorer implementations? // todo@joh reuse explorer implementations?
const filter = this._instantiationService.createInstance(FileFilter);
this._disposables.push(filter);
config.dataSource = this._instantiationService.createInstance(FileDataSource); config.dataSource = this._instantiationService.createInstance(FileDataSource);
config.renderer = this._instantiationService.createInstance(FileRenderer); config.renderer = this._instantiationService.createInstance(FileRenderer);
config.sorter = new FileSorter(); config.sorter = new FileSorter();
config.filter = filter;
return config; return config;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册