提交 77d49069 编写于 作者: J Johannes Rieken

💄

上级 8dbf25e4
......@@ -20,13 +20,13 @@ import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { OutlineConfigKeys } from 'vs/editor/contrib/documentSymbols/outline';
export type NOutlineItem = OutlineGroup | OutlineElement;
export type OutlineItem = OutlineGroup | OutlineElement;
export class NOutlineNavigationLabelProvider implements IKeyboardNavigationLabelProvider<NOutlineItem> {
export class OutlineNavigationLabelProvider implements IKeyboardNavigationLabelProvider<OutlineItem> {
constructor(@IKeybindingService private readonly _keybindingService: IKeybindingService) { }
getKeyboardNavigationLabel(element: NOutlineItem): { toString(): string; } {
getKeyboardNavigationLabel(element: OutlineItem): { toString(): string; } {
if (element instanceof OutlineGroup) {
return element.provider.displayName;
} else {
......@@ -40,66 +40,66 @@ export class NOutlineNavigationLabelProvider implements IKeyboardNavigationLabel
}
export class NOutlineIdentityProvider implements IIdentityProvider<NOutlineItem> {
export class OutlineIdentityProvider implements IIdentityProvider<OutlineItem> {
getId(element: TreeElement): { toString(): string; } {
return element.id;
}
}
export class NOutlineGroupTemplate {
export class OutlineGroupTemplate {
static id = 'OutlineGroupTemplate';
labelContainer: HTMLElement;
label: HighlightedLabel;
}
export class NOutlineElementTemplate {
export class OutlineElementTemplate {
static id = 'OutlineElementTemplate';
iconLabel: IconLabel;
decoration: HTMLElement;
}
export class NOutlineVirtualDelegate implements IListVirtualDelegate<NOutlineItem> {
export class OutlineVirtualDelegate implements IListVirtualDelegate<OutlineItem> {
getHeight(_element: NOutlineItem): number {
getHeight(_element: OutlineItem): number {
return 22;
}
getTemplateId(element: NOutlineItem): string {
getTemplateId(element: OutlineItem): string {
if (element instanceof OutlineGroup) {
return NOutlineGroupTemplate.id;
return OutlineGroupTemplate.id;
} else {
return NOutlineElementTemplate.id;
return OutlineElementTemplate.id;
}
}
}
export class NOutlineGroupRenderer implements ITreeRenderer<OutlineGroup, FuzzyScore, NOutlineGroupTemplate> {
export class OutlineGroupRenderer implements ITreeRenderer<OutlineGroup, FuzzyScore, OutlineGroupTemplate> {
readonly templateId: string = NOutlineGroupTemplate.id;
readonly templateId: string = OutlineGroupTemplate.id;
renderTemplate(container: HTMLElement): NOutlineGroupTemplate {
renderTemplate(container: HTMLElement): OutlineGroupTemplate {
const labelContainer = dom.$('.outline-element-label');
dom.addClass(container, 'outline-element');
dom.append(container, labelContainer);
return { labelContainer, label: new HighlightedLabel(labelContainer, true) };
}
renderElement(node: ITreeNode<OutlineGroup, FuzzyScore>, index: number, template: NOutlineGroupTemplate): void {
renderElement(node: ITreeNode<OutlineGroup, FuzzyScore>, index: number, template: OutlineGroupTemplate): void {
template.label.set(
node.element.provider.displayName || localize('provider', "Outline Provider"),
createMatches(node.filterData)
);
}
disposeTemplate(_template: NOutlineGroupTemplate): void {
disposeTemplate(_template: OutlineGroupTemplate): void {
// nothing
}
}
export class NOutlineElementRenderer implements ITreeRenderer<OutlineElement, FuzzyScore, NOutlineElementTemplate> {
export class OutlineElementRenderer implements ITreeRenderer<OutlineElement, FuzzyScore, OutlineElementTemplate> {
readonly templateId: string = NOutlineElementTemplate.id;
readonly templateId: string = OutlineElementTemplate.id;
renderProblemColors = true;
renderProblemBadges = true;
......@@ -109,7 +109,7 @@ export class NOutlineElementRenderer implements ITreeRenderer<OutlineElement, Fu
@IConfigurationService private readonly _configurationService: IConfigurationService,
) { }
renderTemplate(container: HTMLElement): NOutlineElementTemplate {
renderTemplate(container: HTMLElement): OutlineElementTemplate {
// const labelContainer = dom.$('.outline-element-label');
const iconLabel = new IconLabel(container, { supportHighlights: true });
const decoration = dom.$('.outline-element-decoration');
......@@ -117,12 +117,12 @@ export class NOutlineElementRenderer implements ITreeRenderer<OutlineElement, Fu
return { iconLabel, decoration };
}
renderElement(node: ITreeNode<OutlineElement, FuzzyScore>, index: number, template: NOutlineElementTemplate): void {
renderElement(node: ITreeNode<OutlineElement, FuzzyScore>, index: number, template: OutlineElementTemplate): void {
const { element } = node;
const options = {
matches: createMatches(node.filterData),
extraClasses: [],
title: localize('title.template', "{0} ({1})", element.symbol.name, NOutlineElementRenderer._symbolKindNames[element.symbol.kind])
title: localize('title.template', "{0} ({1})", element.symbol.name, OutlineElementRenderer._symbolKindNames[element.symbol.kind])
};
if (this._configurationService.getValue(OutlineConfigKeys.icons)) {
options.extraClasses.push(`outline-element-icon ${symbolKindToCssClass(element.symbol.kind, true)}`);
......@@ -199,33 +199,33 @@ export class NOutlineElementRenderer implements ITreeRenderer<OutlineElement, Fu
[SymbolKind.Variable]: localize('Variable', "variable"),
};
disposeTemplate(_template: NOutlineElementTemplate): void {
disposeTemplate(_template: OutlineElementTemplate): void {
_template.iconLabel.dispose();
}
}
export const enum NOutlineItemCompareType {
export const enum OutlineSortOrder {
ByPosition,
ByName,
ByKind
}
export class NOutlineItemComparator implements ITreeSorter<NOutlineItem> {
export class OutlineItemComparator implements ITreeSorter<OutlineItem> {
constructor(
public type: NOutlineItemCompareType = NOutlineItemCompareType.ByPosition
public type: OutlineSortOrder = OutlineSortOrder.ByPosition
) { }
compare(a: NOutlineItem, b: NOutlineItem): number {
compare(a: OutlineItem, b: OutlineItem): number {
if (a instanceof OutlineGroup && b instanceof OutlineGroup) {
return a.providerIndex - b.providerIndex;
} else if (a instanceof OutlineElement && b instanceof OutlineElement) {
if (this.type === NOutlineItemCompareType.ByKind) {
if (this.type === OutlineSortOrder.ByKind) {
return a.symbol.kind - b.symbol.kind || a.symbol.name.localeCompare(b.symbol.name);
} else if (this.type === NOutlineItemCompareType.ByName) {
} else if (this.type === OutlineSortOrder.ByName) {
return a.symbol.name.localeCompare(b.symbol.name) || Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range);
} else if (this.type === NOutlineItemCompareType.ByPosition) {
} else if (this.type === OutlineSortOrder.ByPosition) {
return Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range) || a.symbol.name.localeCompare(b.symbol.name);
}
}
......@@ -233,9 +233,9 @@ export class NOutlineItemComparator implements ITreeSorter<NOutlineItem> {
}
}
export class NOutlineDataSource implements IDataSource<OutlineModel, NOutlineItem> {
export class OutlineDataSource implements IDataSource<OutlineModel, OutlineItem> {
getChildren(element: undefined | OutlineModel | OutlineGroup | OutlineElement): NOutlineItem[] {
getChildren(element: undefined | OutlineModel | OutlineGroup | OutlineElement): OutlineItem[] {
if (!element) {
return [];
}
......
......@@ -27,11 +27,14 @@ import { BreadcrumbsConfig } from 'vs/workbench/browser/parts/editor/breadcrumbs
import { BreadcrumbElement, FileElement } from 'vs/workbench/browser/parts/editor/breadcrumbsModel';
import { IFileIconTheme, IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
import { IAsyncDataSource, ITreeRenderer, ITreeNode, ITreeFilter, TreeVisibility, ITreeSorter } from 'vs/base/browser/ui/tree/tree';
import { NOutlineVirtualDelegate, NOutlineGroupRenderer, NOutlineElementRenderer, NOutlineItemComparator, NOutlineIdentityProvider, NOutlineNavigationLabelProvider, NOutlineDataSource, NOutlineItemCompareType } from 'vs/editor/contrib/documentSymbols/outlineTree2';
import { OutlineVirtualDelegate, OutlineGroupRenderer, OutlineElementRenderer, OutlineItemComparator, OutlineIdentityProvider, OutlineNavigationLabelProvider, OutlineDataSource, OutlineSortOrder, OutlineItem } from 'vs/editor/contrib/documentSymbols/outlineTree2';
import { IIdentityProvider, IListVirtualDelegate, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list';
export function createBreadcrumbsPicker(instantiationService: IInstantiationService, parent: HTMLElement, element: BreadcrumbElement): BreadcrumbsPicker {
let ctor: IConstructorSignature1<HTMLElement, BreadcrumbsPicker> = element instanceof FileElement ? BreadcrumbsFilePicker : BreadcrumbsOutlinePicker;
const ctor: IConstructorSignature1<HTMLElement, BreadcrumbsPicker> = element instanceof FileElement
? BreadcrumbsFilePicker
: BreadcrumbsOutlinePicker;
return instantiationService.createInstance(ctor, parent);
}
......@@ -43,7 +46,7 @@ interface ILayoutInfo {
inputHeight: number;
}
type Tree<E> = WorkbenchDataTree<any, E, FuzzyScore> | WorkbenchAsyncDataTree<any, E, FuzzyScore>;
type Tree<I, E> = WorkbenchDataTree<I, E, FuzzyScore> | WorkbenchAsyncDataTree<I, E, FuzzyScore>;
export abstract class BreadcrumbsPicker {
......@@ -51,10 +54,9 @@ export abstract class BreadcrumbsPicker {
protected readonly _domNode: HTMLDivElement;
protected readonly _arrow: HTMLDivElement;
protected readonly _treeContainer: HTMLDivElement;
protected readonly _tree: Tree<any>;
protected readonly _tree: Tree<any, any>;
protected readonly _fakeEvent = new UIEvent('fakeEvent');
protected readonly _focus: dom.IFocusTracker;
protected readonly _symbolSortOrder: BreadcrumbsConfig<'position' | 'name' | 'type'>;
private _layoutInfo: ILayoutInfo;
private readonly _onDidPickElement = new Emitter<{ target: any, payload: any }>();
......@@ -67,7 +69,7 @@ export abstract class BreadcrumbsPicker {
parent: HTMLElement,
@IInstantiationService protected readonly _instantiationService: IInstantiationService,
@IWorkbenchThemeService protected readonly _themeService: IWorkbenchThemeService,
@IConfigurationService private readonly _configurationService: IConfigurationService,
@IConfigurationService protected readonly _configurationService: IConfigurationService,
) {
this._domNode = document.createElement('div');
this._domNode.className = 'monaco-breadcrumbs-picker show-file-icons';
......@@ -91,19 +93,10 @@ export abstract class BreadcrumbsPicker {
this._treeContainer.style.boxShadow = `0px 5px 8px ${this._themeService.getTheme().getColor(widgetShadow)}`;
this._domNode.appendChild(this._treeContainer);
this._symbolSortOrder = BreadcrumbsConfig.SymbolSortOrder.bindTo(this._configurationService);
const filterConfig = BreadcrumbsConfig.FilterOnType.bindTo(this._configurationService);
this._disposables.push(filterConfig);
// const treeConfig = this._completeTreeConfiguration({ dataSource: undefined, renderer: undefined, highlighter: undefined });
// this._tree = this._instantiationService.createInstance(
// HighlightingWorkbenchTree,
// this._treeContainer,
// treeConfig,
// <IHighlightingTreeOptions>{ useShadows: false, filterOnType: filterConfig.getValue(), showTwistie: false, twistiePixels: 12 },
// { placeholder: localize('placeholder', "Find") }
// );
this._tree = this._createTree(this._treeContainer);
this._disposables.push(this._tree.onDidChangeSelection(e => {
......@@ -144,7 +137,6 @@ export abstract class BreadcrumbsPicker {
this._onDidPickElement.dispose();
this._tree.dispose();
this._focus.dispose();
this._symbolSortOrder.dispose();
}
setInput(input: any, maxHeight: number, width: number, arrowSize: number, arrowOffset: number): void {
......@@ -154,35 +146,13 @@ export abstract class BreadcrumbsPicker {
this._setInput(input).then(() => {
this._layout();
}).catch(onUnexpectedError);
// let actualInput = this._getInput(input);
// Promise.resolve(this._tree.setInput(actualInput, undefined)).then(() => {
// this._layoutInfo = { maxHeight, width, arrowSize, arrowOffset, inputHeight: 0 };
// this._layout();
// // use proper selection, reveal
// let selection = this._getInitialSelection(this._tree, input);
// if (selection) {
// return this._tree.reveal(selection, 0.5).then(() => {
// this._tree.setSelection([selection], this._tree);
// this._tree.setFocus(selection);
// this._tree.domFocus();
// });
// } else {
// this._tree.focusFirst();
// this._tree.setSelection([this._tree.getFocus()], this._tree);
// this._tree.domFocus();
// return Promise.resolve(null);
// }
// }, onUnexpectedError);
}
private _layout(info: ILayoutInfo = this._layoutInfo): void {
protected _layout(info: ILayoutInfo = this._layoutInfo): void {
let headerHeight = 2 * info.arrowSize;
let treeHeight = Math.min(info.maxHeight - headerHeight, this._tree.visibleNodeCount * 22);
let totalHeight = treeHeight + headerHeight;
const headerHeight = 2 * info.arrowSize;
const treeHeight = Math.min(info.maxHeight - headerHeight, this._tree.visibleNodeCount * 22);
const totalHeight = treeHeight + headerHeight;
this._domNode.style.height = `${totalHeight}px`;
this._domNode.style.width = `${info.width}px`;
......@@ -198,7 +168,7 @@ export abstract class BreadcrumbsPicker {
protected abstract _setInput(element: BreadcrumbElement): Promise<void>;
protected abstract _createTree(container: HTMLElement): Tree<any>;
protected abstract _createTree(container: HTMLElement): Tree<any, any>;
protected abstract _getTargetFromEvent(element: any, payload: UIEvent): any | undefined;
}
......@@ -469,21 +439,38 @@ export class BreadcrumbsFilePicker extends BreadcrumbsPicker {
export class BreadcrumbsOutlinePicker extends BreadcrumbsPicker {
protected readonly _symbolSortOrder: BreadcrumbsConfig<'position' | 'name' | 'type'>;
constructor(
parent: HTMLElement,
@IInstantiationService instantiationService: IInstantiationService,
@IWorkbenchThemeService themeService: IWorkbenchThemeService,
@IConfigurationService configurationService: IConfigurationService,
) {
super(parent, instantiationService, themeService, configurationService);
this._symbolSortOrder = BreadcrumbsConfig.SymbolSortOrder.bindTo(this._configurationService);
}
protected _createTree(container: HTMLElement) {
return this._instantiationService.createInstance(
WorkbenchDataTree,
container,
new NOutlineVirtualDelegate(),
[new NOutlineGroupRenderer(), this._instantiationService.createInstance(NOutlineElementRenderer)],
new NOutlineDataSource(),
new OutlineVirtualDelegate(),
[new OutlineGroupRenderer(), this._instantiationService.createInstance(OutlineElementRenderer)],
new OutlineDataSource(),
{
filterOnType: true,
expandOnlyOnTwistieClick: true,
sorter: new NOutlineItemComparator(this._getOutlineItemCompareType()),
identityProvider: new NOutlineIdentityProvider(),
keyboardNavigationLabelProvider: this._instantiationService.createInstance(NOutlineNavigationLabelProvider)
sorter: new OutlineItemComparator(this._getOutlineItemCompareType()),
identityProvider: new OutlineIdentityProvider(),
keyboardNavigationLabelProvider: this._instantiationService.createInstance(OutlineNavigationLabelProvider)
}
) as WorkbenchDataTree<OutlineModel, any, FuzzyScore>;
) as WorkbenchDataTree<OutlineModel, OutlineItem, FuzzyScore>;
}
dispose(): void {
this._symbolSortOrder.dispose();
super.dispose();
}
protected _setInput(input: BreadcrumbElement): Promise<void> {
......@@ -515,15 +502,15 @@ export class BreadcrumbsOutlinePicker extends BreadcrumbsPicker {
}
}
private _getOutlineItemCompareType(): NOutlineItemCompareType {
private _getOutlineItemCompareType(): OutlineSortOrder {
switch (this._symbolSortOrder.getValue()) {
case 'name':
return NOutlineItemCompareType.ByName;
return OutlineSortOrder.ByName;
case 'type':
return NOutlineItemCompareType.ByKind;
return OutlineSortOrder.ByKind;
case 'position':
default:
return NOutlineItemCompareType.ByPosition;
return OutlineSortOrder.ByPosition;
}
}
}
......
......@@ -44,7 +44,7 @@ import { CollapseAction2 } from 'vs/workbench/browser/viewlet';
import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';
import { OutlineConfigKeys, OutlineViewFiltered, OutlineViewFocused } from '../../../../editor/contrib/documentSymbols/outline';
import { FuzzyScore } from 'vs/base/common/filters';
import { NOutlineDataSource, NOutlineItemComparator, NOutlineItemCompareType, NOutlineVirtualDelegate, NOutlineGroupRenderer, NOutlineElementRenderer, NOutlineItem, NOutlineIdentityProvider, NOutlineNavigationLabelProvider } from 'vs/editor/contrib/documentSymbols/outlineTree2';
import { OutlineDataSource, OutlineItemComparator, OutlineSortOrder, OutlineVirtualDelegate, OutlineGroupRenderer, OutlineElementRenderer, OutlineItem, OutlineIdentityProvider, OutlineNavigationLabelProvider } from 'vs/editor/contrib/documentSymbols/outlineTree2';
import { IDataTreeViewState } from 'vs/base/browser/ui/tree/dataTree';
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
......@@ -159,7 +159,7 @@ class OutlineViewState {
private _followCursor = false;
private _filterOnType = true;
private _sortBy = NOutlineItemCompareType.ByKind;
private _sortBy = OutlineSortOrder.ByKind;
private _onDidChange = new Emitter<{ followCursor?: boolean, sortBy?: boolean, filterOnType?: boolean }>();
readonly onDidChange = this._onDidChange.event;
......@@ -186,14 +186,14 @@ class OutlineViewState {
}
}
set sortBy(value: NOutlineItemCompareType) {
set sortBy(value: OutlineSortOrder) {
if (value !== this._sortBy) {
this._sortBy = value;
this._onDidChange.fire({ sortBy: true });
}
}
get sortBy(): NOutlineItemCompareType {
get sortBy(): OutlineSortOrder {
return this._sortBy;
}
......@@ -229,10 +229,10 @@ export class OutlinePanel extends ViewletPanel {
private _message: HTMLDivElement;
private _inputContainer: HTMLDivElement;
private _progressBar: ProgressBar;
private _tree: WorkbenchDataTree<OutlineModel, NOutlineItem, FuzzyScore>;
private _treeDataSource: NOutlineDataSource;
private _treeRenderer: NOutlineElementRenderer;
private _treeComparator: NOutlineItemComparator;
private _tree: WorkbenchDataTree<OutlineModel, OutlineItem, FuzzyScore>;
private _treeDataSource: OutlineDataSource;
private _treeRenderer: OutlineElementRenderer;
private _treeComparator: OutlineItemComparator;
private _treeStates = new LRUCache<string, IDataTreeViewState>(10);
private _treeFakeUIEvent = new UIEvent('me');
......@@ -298,23 +298,23 @@ export class OutlinePanel extends ViewletPanel {
progressContainer, this._message, this._inputContainer, treeContainer
);
this._treeRenderer = this._instantiationService.createInstance(NOutlineElementRenderer);
this._treeDataSource = new NOutlineDataSource();
this._treeComparator = new NOutlineItemComparator(this._outlineViewState.sortBy);
this._treeRenderer = this._instantiationService.createInstance(OutlineElementRenderer);
this._treeDataSource = new OutlineDataSource();
this._treeComparator = new OutlineItemComparator(this._outlineViewState.sortBy);
this._tree = this._instantiationService.createInstance(
WorkbenchDataTree,
treeContainer,
new NOutlineVirtualDelegate(),
[new NOutlineGroupRenderer(), this._treeRenderer],
new OutlineVirtualDelegate(),
[new OutlineGroupRenderer(), this._treeRenderer],
this._treeDataSource,
{
expandOnlyOnTwistieClick: true,
filterOnType: this._outlineViewState.filterOnType,
sorter: new NOutlineItemComparator(),
identityProvider: new NOutlineIdentityProvider(),
keyboardNavigationLabelProvider: this._instantiationService.createInstance(NOutlineNavigationLabelProvider)
sorter: new OutlineItemComparator(),
identityProvider: new OutlineIdentityProvider(),
keyboardNavigationLabelProvider: this._instantiationService.createInstance(OutlineNavigationLabelProvider)
}
) as WorkbenchDataTree<OutlineModel, NOutlineItem, FuzzyScore>;
) as WorkbenchDataTree<OutlineModel, OutlineItem, FuzzyScore>;
this._treeRenderer.renderProblemColors = this._configurationService.getValue(OutlineConfigKeys.problemsColors);
this._treeRenderer.renderProblemBadges = this._configurationService.getValue(OutlineConfigKeys.problemsBadges);
......@@ -356,9 +356,9 @@ export class OutlinePanel extends ViewletPanel {
getSecondaryActions(): IAction[] {
let group = new RadioGroup([
new SimpleToggleAction(localize('sortByPosition', "Sort By: Position"), this._outlineViewState.sortBy === NOutlineItemCompareType.ByPosition, _ => this._outlineViewState.sortBy = NOutlineItemCompareType.ByPosition),
new SimpleToggleAction(localize('sortByName', "Sort By: Name"), this._outlineViewState.sortBy === NOutlineItemCompareType.ByName, _ => this._outlineViewState.sortBy = NOutlineItemCompareType.ByName),
new SimpleToggleAction(localize('sortByKind', "Sort By: Type"), this._outlineViewState.sortBy === NOutlineItemCompareType.ByKind, _ => this._outlineViewState.sortBy = NOutlineItemCompareType.ByKind),
new SimpleToggleAction(localize('sortByPosition', "Sort By: Position"), this._outlineViewState.sortBy === OutlineSortOrder.ByPosition, _ => this._outlineViewState.sortBy = OutlineSortOrder.ByPosition),
new SimpleToggleAction(localize('sortByName', "Sort By: Name"), this._outlineViewState.sortBy === OutlineSortOrder.ByName, _ => this._outlineViewState.sortBy = OutlineSortOrder.ByName),
new SimpleToggleAction(localize('sortByKind', "Sort By: Type"), this._outlineViewState.sortBy === OutlineSortOrder.ByKind, _ => this._outlineViewState.sortBy = OutlineSortOrder.ByKind),
]);
let result = [
new SimpleToggleAction(localize('followCur', "Follow Cursor"), this._outlineViewState.followCursor, action => this._outlineViewState.followCursor = action.checked),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册