提交 48667fcc 编写于 作者: J Johannes Rieken

have _tree, _treeRefresher, and _treeModel instead of _tree...

上级 bca39e1d
...@@ -20,6 +20,7 @@ import { WorkbenchTreeController } from 'vs/platform/list/browser/listService'; ...@@ -20,6 +20,7 @@ import { WorkbenchTreeController } from 'vs/platform/list/browser/listService';
import { MarkerSeverity } from 'vs/platform/markers/common/markers'; import { MarkerSeverity } from 'vs/platform/markers/common/markers';
import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry'; import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry';
import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IThemeService } from 'vs/platform/theme/common/themeService';
import { AbstractTree } from 'vs/base/browser/ui/tree/abstractTree';
export const enum OutlineItemCompareType { export const enum OutlineItemCompareType {
ByPosition, ByPosition,
...@@ -251,7 +252,7 @@ export class OutlineTreeState { ...@@ -251,7 +252,7 @@ export class OutlineTreeState {
readonly focused: string; readonly focused: string;
readonly expanded: string[]; readonly expanded: string[];
static capture(tree: ITree): OutlineTreeState { static capture(tree: AbstractTree<any, any, any>): OutlineTreeState {
// selection // selection
let selected: string; let selected: string;
let element = tree.getSelection()[0]; let element = tree.getSelection()[0];
...@@ -261,14 +262,15 @@ export class OutlineTreeState { ...@@ -261,14 +262,15 @@ export class OutlineTreeState {
// focus // focus
let focused: string; let focused: string;
element = tree.getFocus(true); // element = tree.getFocus(true);
element = tree.getFocus()[0]; // todo@joh include hidden?
if (element instanceof TreeElement) { if (element instanceof TreeElement) {
focused = element.id; focused = element.id;
} }
// expansion // expansion
let expanded = new Array<string>(); let expanded = new Array<string>();
let nav = tree.getNavigator(); let nav = tree.navigate();
while (nav.next()) { while (nav.next()) {
let element = nav.current(); let element = nav.current();
if (element instanceof TreeElement) { if (element instanceof TreeElement) {
...@@ -280,8 +282,10 @@ export class OutlineTreeState { ...@@ -280,8 +282,10 @@ export class OutlineTreeState {
return { selected, focused, expanded }; return { selected, focused, expanded };
} }
static async restore(tree: ITree, state: OutlineTreeState, eventPayload: any): Promise<void> { static async restore(tree: AbstractTree<TreeElement, any, any>, state: OutlineTreeState, eventPayload: any): Promise<void> {
let model = <OutlineModel>tree.getInput(); // let model = <OutlineModel>tree.getInput();
let root = tree.getNode();
let model = OutlineModel.get(root.children[0].element);
if (!state || !(model instanceof OutlineModel)) { if (!state || !(model instanceof OutlineModel)) {
return Promise.resolve(undefined); return Promise.resolve(undefined);
} }
...@@ -294,14 +298,15 @@ export class OutlineTreeState { ...@@ -294,14 +298,15 @@ export class OutlineTreeState {
items.push(item); items.push(item);
} }
} }
await tree.collapseAll(undefined);
await tree.expandAll(items); tree.collapseAll();
await tree.expandAll(items); // https://github.com/Microsoft/vscode/issues/64887
// selection & focus // selection & focus
let selected = model.getItemById(state.selected); let selected = model.getItemById(state.selected);
let focused = model.getItemById(state.focused); let focused = model.getItemById(state.focused);
tree.setSelection([selected], eventPayload); tree.setSelection([selected], eventPayload);
tree.setFocus(focused, eventPayload); tree.setFocus([focused], eventPayload);
} }
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
import { posix } from 'path'; import { posix } from 'path';
import * as dom from 'vs/base/browser/dom'; import * as dom from 'vs/base/browser/dom';
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
...@@ -14,14 +13,13 @@ import { Action, IAction, RadioGroup } from 'vs/base/common/actions'; ...@@ -14,14 +13,13 @@ import { Action, IAction, RadioGroup } from 'vs/base/common/actions';
import { firstIndex } from 'vs/base/common/arrays'; import { firstIndex } from 'vs/base/common/arrays';
import { createCancelablePromise, TimeoutTimer } from 'vs/base/common/async'; import { createCancelablePromise, TimeoutTimer } from 'vs/base/common/async';
import { isPromiseCanceledError, onUnexpectedError } from 'vs/base/common/errors'; import { isPromiseCanceledError, onUnexpectedError } from 'vs/base/common/errors';
import { Emitter, Event } from 'vs/base/common/event'; import { Emitter } from 'vs/base/common/event';
import { defaultGenerator } from 'vs/base/common/idGenerator'; import { defaultGenerator } from 'vs/base/common/idGenerator';
import { KeyCode } from 'vs/base/common/keyCodes'; import { KeyCode } from 'vs/base/common/keyCodes';
import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { LRUCache } from 'vs/base/common/map'; import { LRUCache } from 'vs/base/common/map';
import { escape } from 'vs/base/common/strings'; import { escape } from 'vs/base/common/strings';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { ITree } from 'vs/base/parts/tree/browser/tree';
import 'vs/css!./outlinePanel'; import 'vs/css!./outlinePanel';
import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser';
import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions';
...@@ -49,7 +47,7 @@ import { ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; ...@@ -49,7 +47,7 @@ import { ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet';
import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet';
import { IViewsService } from 'vs/workbench/common/views'; import { IViewsService } from 'vs/workbench/common/views';
import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';
import { OutlineController, OutlineItemComparator, OutlineItemCompareType, OutlineTreeState } from '../../../../editor/contrib/documentSymbols/outlineTree'; import { OutlineItemComparator, OutlineItemCompareType, OutlineTreeState } from '../../../../editor/contrib/documentSymbols/outlineTree';
import { OutlineConfigKeys, OutlineViewFiltered, OutlineViewFocused, OutlineViewId } from './outline'; import { OutlineConfigKeys, OutlineViewFiltered, OutlineViewFocused, OutlineViewId } from './outline';
import { NOutlineItem, NOutlineVirtualDelegate, NOutlineGroupRenderer, NOutlineElementRenderer, NOutlineFilter, NOutlineIdentityProvider, createModelIterator as createOutlineModelIterator } from 'vs/editor/contrib/documentSymbols/outlineTree2'; import { NOutlineItem, NOutlineVirtualDelegate, NOutlineGroupRenderer, NOutlineElementRenderer, NOutlineFilter, NOutlineIdentityProvider, createModelIterator as createOutlineModelIterator } from 'vs/editor/contrib/documentSymbols/outlineTree2';
...@@ -238,6 +236,7 @@ export class OutlinePanel extends ViewletPanel { ...@@ -238,6 +236,7 @@ export class OutlinePanel extends ViewletPanel {
// private _tree: WorkbenchTree; // private _tree: WorkbenchTree;
private _tree: WorkbenchObjectTree<NOutlineItem>; private _tree: WorkbenchObjectTree<NOutlineItem>;
// private _treeDataSource: OutlineDataSource; // private _treeDataSource: OutlineDataSource;
private _treeRefresh: Emitter<any>;
private _treeGroupRenderer: NOutlineGroupRenderer; private _treeGroupRenderer: NOutlineGroupRenderer;
private _treeElementRenderer: NOutlineElementRenderer; private _treeElementRenderer: NOutlineElementRenderer;
private _treeFilter: NOutlineFilter; private _treeFilter: NOutlineFilter;
...@@ -329,35 +328,10 @@ export class OutlinePanel extends ViewletPanel { ...@@ -329,35 +328,10 @@ export class OutlinePanel extends ViewletPanel {
} }
})); }));
const $this = this;
const controller = new class extends OutlineController {
constructor() {
super({}, $this.configurationService);
}
onKeyDown(tree: ITree, event: IKeyboardEvent) {
let handled = super.onKeyDown(tree, event);
if (handled) {
return true;
}
if (this.upKeyBindingDispatcher.has(event.keyCode)) {
return false;
}
// crazy -> during keydown focus moves to the input box
// and because of that the keyup event is handled by the
// input field
if ($this._keybindingService.mightProducePrintableCharacter(event)) {
$this._input.focus();
return true;
}
return false;
}
};
// TODO@joh: pass along to the renderers an event which should trigger a re-render of elements // TODO@joh: pass along to the renderers an event which should trigger a re-render of elements
this._treeGroupRenderer = this._instantiationService.createInstance(NOutlineGroupRenderer, Event.None); this._treeRefresh = new Emitter();
this._treeElementRenderer = this._instantiationService.createInstance(NOutlineElementRenderer, Event.None); this._treeGroupRenderer = this._instantiationService.createInstance(NOutlineGroupRenderer, this._treeRefresh.event);
this._treeElementRenderer = this._instantiationService.createInstance(NOutlineElementRenderer, this._treeRefresh.event);
this._treeFilter = this._instantiationService.createInstance(NOutlineFilter); this._treeFilter = this._instantiationService.createInstance(NOutlineFilter);
this._tree = <any>this._instantiationService.createInstance(WorkbenchObjectTree, this._tree = <any>this._instantiationService.createInstance(WorkbenchObjectTree,
...@@ -376,6 +350,38 @@ export class OutlinePanel extends ViewletPanel { ...@@ -376,6 +350,38 @@ export class OutlinePanel extends ViewletPanel {
this._disposables.push(this._tree, this._input, this._treeGroupRenderer, this._treeElementRenderer); this._disposables.push(this._tree, this._input, this._treeGroupRenderer, this._treeElementRenderer);
this._disposables.push(this._outlineViewState.onDidChange(this._onDidChangeUserState, this)); this._disposables.push(this._outlineViewState.onDidChange(this._onDidChangeUserState, this));
//
// const $this = this;
// const controller = new class extends OutlineController {
// constructor() {
// super({}, $this.configurationService);
// }
// onKeyDown(tree: ITree, event: IKeyboardEvent) {
// let handled = super.onKeyDown(tree, event);
// if (handled) {
// return true;
// }
// if (this.upKeyBindingDispatcher.has(event.keyCode)) {
// return false;
// }
// // crazy -> during keydown focus moves to the input box
// // and because of that the keyup event is handled by the
// // input field
// if ($this._keybindingService.mightProducePrintableCharacter(event)) {
// $this._input.focus();
// return true;
// }
// return false;
// }
// };
this._tree.onKeyDown(event => {
if (this._keybindingService.mightProducePrintableCharacter(event)) {
// todo@joh old would check if the tree handled the event...
this._input.focus();
event.preventDefault();
}
});
// feature: toggle icons // feature: toggle icons
dom.toggleClass(this._domNode, 'no-icons', !this._configurationService.getValue(OutlineConfigKeys.icons)); dom.toggleClass(this._domNode, 'no-icons', !this._configurationService.getValue(OutlineConfigKeys.icons));
this.disposables.push(this._configurationService.onDidChangeConfiguration(e => { this.disposables.push(this._configurationService.onDidChangeConfiguration(e => {
...@@ -450,7 +456,8 @@ export class OutlinePanel extends ViewletPanel { ...@@ -450,7 +456,8 @@ export class OutlinePanel extends ViewletPanel {
} }
if (e.sortBy) { if (e.sortBy) {
this._treeComparator.type = this._outlineViewState.sortBy; this._treeComparator.type = this._outlineViewState.sortBy;
this._tree.refresh(undefined, true); // this._tree.refresh(undefined, true);
this._treeRefresh.fire();
} }
if (e.filterOnType) { if (e.filterOnType) {
this._applyTypeToFilter(); this._applyTypeToFilter();
...@@ -459,7 +466,7 @@ export class OutlinePanel extends ViewletPanel { ...@@ -459,7 +466,7 @@ export class OutlinePanel extends ViewletPanel {
private _showMessage(message: string) { private _showMessage(message: string) {
dom.addClass(this._domNode, 'message'); dom.addClass(this._domNode, 'message');
this._tree.setInput(undefined); this._tree.setChildren(null);
this._tree.setChildren(null); this._tree.setChildren(null);
this._progressBar.stop().hide(); this._progressBar.stop().hide();
this._message.innerText = escape(message); this._message.innerText = escape(message);
...@@ -492,6 +499,7 @@ export class OutlinePanel extends ViewletPanel { ...@@ -492,6 +499,7 @@ export class OutlinePanel extends ViewletPanel {
let textModel = editor.getModel(); let textModel = editor.getModel();
let loadingMessage: IDisposable; let loadingMessage: IDisposable;
let oldModel = <OutlineModel>this._tree.getInput(); let oldModel = <OutlineModel>this._tree.getInput();
if (!oldModel) { if (!oldModel) {
loadingMessage = new TimeoutTimer( loadingMessage = new TimeoutTimer(
...@@ -587,9 +595,10 @@ export class OutlinePanel extends ViewletPanel { ...@@ -587,9 +595,10 @@ export class OutlinePanel extends ViewletPanel {
beforePatternState = OutlineTreeState.capture(this._tree); beforePatternState = OutlineTreeState.capture(this._tree);
} }
let item = model.updateMatches(pattern); let item = model.updateMatches(pattern);
await this._tree.refresh(undefined, true); // await this._tree.refresh(undefined, true);
this._tree.refilter();
if (item) { if (item) {
await this._tree.expandAll(undefined /*all*/); await this._tree.expandAll(undefined /*all*/); // https://github.com/Microsoft/vscode/issues/64887
this._tree.reveal(item); this._tree.reveal(item);
this._tree.setFocus([item], this); this._tree.setFocus([item], this);
this._tree.setSelection([item], this); this._tree.setSelection([item], this);
...@@ -610,7 +619,7 @@ export class OutlinePanel extends ViewletPanel { ...@@ -610,7 +619,7 @@ export class OutlinePanel extends ViewletPanel {
// feature: reveal outline selection in editor // feature: reveal outline selection in editor
// on change -> reveal/select defining range // on change -> reveal/select defining range
this._editorDisposables.push(this._tree.onDidChangeSelection(e => { this._editorDisposables.push(this._tree.onDidChangeSelection(e => {
if (e.payload === this || e.payload && e.payload.didClickOnTwistie) { if (e.payload === this || e.payload && e.payload.didClickOnTwistie) { // https://github.com/Microsoft/vscode/issues/64743
return; return;
} }
let [first] = e.selection; let [first] = e.selection;
...@@ -656,7 +665,8 @@ export class OutlinePanel extends ViewletPanel { ...@@ -656,7 +665,8 @@ export class OutlinePanel extends ViewletPanel {
const marker = this._markerService.read({ resource: textModel.uri, severities: MarkerSeverity.Error | MarkerSeverity.Warning }); const marker = this._markerService.read({ resource: textModel.uri, severities: MarkerSeverity.Error | MarkerSeverity.Warning });
if (marker.length > 0 || !ignoreEmpty) { if (marker.length > 0 || !ignoreEmpty) {
model.updateMarker(marker); model.updateMarker(marker);
this._tree.refresh(undefined, true); // this._tree.refresh(undefined, true);
this._treeRefresh.fire();
} }
}; };
updateMarker([textModel.uri], true); updateMarker([textModel.uri], true);
...@@ -666,7 +676,8 @@ export class OutlinePanel extends ViewletPanel { ...@@ -666,7 +676,8 @@ export class OutlinePanel extends ViewletPanel {
if (e.affectsConfiguration(OutlineConfigKeys.problemsBadges) || e.affectsConfiguration(OutlineConfigKeys.problemsColors)) { if (e.affectsConfiguration(OutlineConfigKeys.problemsBadges) || e.affectsConfiguration(OutlineConfigKeys.problemsColors)) {
this._treeElementRenderer.renderProblemColors = this._configurationService.getValue(OutlineConfigKeys.problemsColors); this._treeElementRenderer.renderProblemColors = this._configurationService.getValue(OutlineConfigKeys.problemsColors);
this._treeElementRenderer.renderProblemBadges = this._configurationService.getValue(OutlineConfigKeys.problemsBadges); this._treeElementRenderer.renderProblemBadges = this._configurationService.getValue(OutlineConfigKeys.problemsBadges);
this._tree.refresh(undefined, true); // this._tree.refresh(undefined, true);
this._treeRefresh.fire();
return; return;
} }
if (!e.affectsConfiguration(OutlineConfigKeys.problemsEnabled)) { if (!e.affectsConfiguration(OutlineConfigKeys.problemsEnabled)) {
...@@ -674,7 +685,8 @@ export class OutlinePanel extends ViewletPanel { ...@@ -674,7 +685,8 @@ export class OutlinePanel extends ViewletPanel {
} }
if (!this._configurationService.getValue(OutlineConfigKeys.problemsEnabled)) { if (!this._configurationService.getValue(OutlineConfigKeys.problemsEnabled)) {
model.updateMarker([]); model.updateMarker([]);
this._tree.refresh(undefined, true); // this._tree.refresh(undefined, true);
this._treeRefresh.fire();
} else { } else {
updateMarker([textModel.uri], true); updateMarker([textModel.uri], true);
} }
...@@ -711,7 +723,7 @@ export class OutlinePanel extends ViewletPanel { ...@@ -711,7 +723,7 @@ export class OutlinePanel extends ViewletPanel {
} }
private async _revealEditorSelection(model: OutlineModel, selection: Selection): Promise<void> { private async _revealEditorSelection(model: OutlineModel, selection: Selection): Promise<void> {
if (!this._outlineViewState.followCursor || !this._tree.getInput() || !selection) { if (!this._outlineViewState.followCursor || !this._tree.getNode() || !selection) {
return; return;
} }
let [first] = this._tree.getSelection(); let [first] = this._tree.getSelection();
...@@ -728,19 +740,20 @@ export class OutlinePanel extends ViewletPanel { ...@@ -728,19 +740,20 @@ export class OutlinePanel extends ViewletPanel {
// only when outside view port // only when outside view port
await this._tree.reveal(item, .5); await this._tree.reveal(item, .5);
} }
this._tree.setFocus(item, this); this._tree.setFocus([item], this); // todo@joao focus is weird
this._tree.setSelection([item], this); this._tree.setSelection([item], this); // https://github.com/Microsoft/vscode/issues/64743
} }
focusHighlightedElement(up: boolean): void { focusHighlightedElement(up: boolean): void {
if (!this._tree.getInput()) {
if (!this._tree.getNode()) {
return; return;
} }
if (!this._tree.isDOMFocused()) { if (!this._tree.isDOMFocused()) {
this._tree.domFocus(); this._tree.domFocus();
return; return;
} }
let navi = this._tree.getNavigator(this._tree.getFocus(), false); let navi = this._tree.getNavigator(this._tree.getFocus(), false); // https://github.com/Microsoft/vscode/issues/64793
let candidate: any; let candidate: any;
while (candidate = up ? navi.previous() : navi.next()) { while (candidate = up ? navi.previous() : navi.next()) {
if (candidate instanceof OutlineElement && candidate.score && candidate.score[1].length > 0) { if (candidate instanceof OutlineElement && candidate.score && candidate.score[1].length > 0) {
...@@ -749,12 +762,6 @@ export class OutlinePanel extends ViewletPanel { ...@@ -749,12 +762,6 @@ export class OutlinePanel extends ViewletPanel {
break; break;
} }
} }
let focused = this._tree.getFocus()[0];
if (!focused) {
return;
}
let root = this._tree.getNode(focused);
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册