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

debt - suggest widget shouldn't know about that controller model but the completion model

上级 027483f1
......@@ -17,6 +17,7 @@ import { EditorBrowserRegistry } from 'vs/editor/browser/editorBrowserExtensions
import { getSnippetController } from 'vs/editor/contrib/snippet/common/snippet';
import { Context as SuggestContext } from 'vs/editor/contrib/suggest/common/suggest';
import { SuggestModel } from '../common/suggestModel';
import { CompletionItem } from '../common/completionModel';
import { SuggestWidget } from './suggestWidget';
export class SuggestController implements IEditorContribution {
......@@ -29,18 +30,23 @@ export class SuggestController implements IEditorContribution {
private model: SuggestModel;
private widget: SuggestWidget;
private triggerCharacterListeners: IDisposable[];
private toDispose: IDisposable[];
private toDispose: IDisposable[] = [];
constructor(
private editor: ICodeEditor,
@IInstantiationService instantiationService: IInstantiationService
) {
this.model = new SuggestModel(this.editor);
this.widget = instantiationService.createInstance(SuggestWidget, this.editor, this.model);
this.widget = instantiationService.createInstance(SuggestWidget, this.editor);
this.toDispose.push(this.model.onDidTrigger(e => this.widget.showTriggered(e)));
this.toDispose.push(this.model.onDidSuggest(e => this.widget.showSuggestions(e)));
this.toDispose.push(this.model.onDidCancel(e => this.widget.showDidCancel(e)));
this.toDispose.push(this.widget.onDidSelect(this.onDidSelectItem, this));
this.triggerCharacterListeners = [];
this.toDispose = [];
this.toDispose.push(editor.onDidChangeConfiguration(() => this.update()));
this.toDispose.push(editor.onDidChangeModel(() => this.update()));
this.toDispose.push(editor.onDidChangeModelMode(() => this.update()));
......@@ -69,6 +75,15 @@ export class SuggestController implements IEditorContribution {
}
}
private onDidSelectItem(item: CompletionItem): void {
if (!item) {
this.model.cancel();
return;
}
const {overwriteBefore, overwriteAfter} = item.suggestion;
this.model.accept(item.suggestion, overwriteBefore, overwriteAfter);
}
private update(): void {
this.triggerCharacterListeners = dispose(this.triggerCharacterListeners);
......@@ -126,7 +141,8 @@ export class SuggestController implements IEditorContribution {
acceptSelectedSuggestion(): void {
if (this.widget) {
this.widget.acceptSelectedSuggestion();
const item = this.widget.getFocusedItem();
this.onDidSelectItem(item);
}
}
......
......@@ -8,6 +8,7 @@
import 'vs/css!./suggest';
import * as nls from 'vs/nls';
import * as strings from 'vs/base/common/strings';
import Event, { Emitter } from 'vs/base/common/event';
import { TPromise } from 'vs/base/common/winjs.base';
import { isPromiseCanceledError, onUnexpectedError } from 'vs/base/common/errors';
import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle';
......@@ -22,7 +23,7 @@ import { IConfigurationChangedEvent } from 'vs/editor/common/editorCommon';
import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser';
import { Context as SuggestContext } from '../common/suggest';
import { CompletionItem, CompletionModel } from '../common/completionModel';
import { ICancelEvent, ISuggestEvent, ITriggerEvent, SuggestModel } from '../common/suggestModel';
import { ICancelEvent, ISuggestEvent, ITriggerEvent } from '../common/suggestModel';
import { alert } from 'vs/base/browser/ui/aria/aria';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
......@@ -322,13 +323,14 @@ export class SuggestWidget implements IContentWidget, IDisposable {
private suggestWidgetMultipleSuggestions: IKeybindingContextKey<boolean>;
private suggestionSupportsAutoAccept: IKeybindingContextKey<boolean>;
private onDidSelectEmitter = new Emitter<CompletionItem>();
private editorBlurTimeout: TPromise<void>;
private showTimeout: TPromise<void>;
private toDispose: IDisposable[];
constructor(
private editor: ICodeEditor,
private model: SuggestModel,
@ITelemetryService private telemetryService: ITelemetryService,
@IKeybindingService keybindingService: IKeybindingService,
@IInstantiationService instantiationService: IInstantiationService
......@@ -360,10 +362,7 @@ export class SuggestWidget implements IContentWidget, IDisposable {
editor.onDidBlurEditorText(() => this.onEditorBlur()),
this.list.onSelectionChange(e => this.onListSelection(e)),
this.list.onFocusChange(e => this.onListFocus(e)),
this.editor.onDidChangeCursorSelection(() => this.onCursorSelectionChanged()),
this.model.onDidTrigger(e => this.onDidTrigger(e)),
this.model.onDidSuggest(e => this.onDidSuggest(e)),
this.model.onDidCancel(e => this.onDidCancel(e))
this.editor.onDidChangeCursorSelection(() => this.onCursorSelectionChanged())
];
this.suggestWidgetVisible = SuggestContext.Visible.bindTo(keybindingService);
......@@ -410,8 +409,7 @@ export class SuggestWidget implements IContentWidget, IDisposable {
}
const item = e.elements[0];
const {overwriteBefore, overwriteAfter} = item.suggestion;
this.model.accept(item.suggestion, overwriteBefore, overwriteAfter);
this.onDidSelectEmitter.fire(item);
alert(nls.localize('suggestionAriaAccepted', "{0}, accepted", item.suggestion.label));
......@@ -543,7 +541,11 @@ export class SuggestWidget implements IContentWidget, IDisposable {
}
}
private onDidTrigger(e: ITriggerEvent) {
get onDidSelect():Event<CompletionItem> {
return this.onDidSelectEmitter.event;
}
showTriggered(e: ITriggerEvent) {
if (this.state !== State.Hidden) {
return;
}
......@@ -558,7 +560,7 @@ export class SuggestWidget implements IContentWidget, IDisposable {
}
}
private onDidSuggest(e: ISuggestEvent): void {
showSuggestions(e: ISuggestEvent): void {
if (this.loadingTimeout) {
clearTimeout(this.loadingTimeout);
this.loadingTimeout = null;
......@@ -622,7 +624,7 @@ export class SuggestWidget implements IContentWidget, IDisposable {
}
}
private onDidCancel(e: ICancelEvent) {
showDidCancel(e: ICancelEvent) {
if (this.loadingTimeout) {
clearTimeout(this.loadingTimeout);
this.loadingTimeout = null;
......@@ -693,22 +695,12 @@ export class SuggestWidget implements IContentWidget, IDisposable {
}
}
acceptSelectedSuggestion(): boolean {
switch (this.state) {
case State.Hidden:
return false;
case State.Empty:
return false;
case State.Loading:
return !this.isAuto;
default:
const focus = this.list.getFocusedElements()[0];
if (focus) {
this.list.setSelection(this.completionModel.items.indexOf(focus));
} else {
this.model.cancel();
}
return true;
getFocusedItem(): CompletionItem {
if (this.state !== State.Hidden
&& this.state !== State.Empty
&& this.state !== State.Loading) {
return this.list.getFocusedElements()[0];
}
}
......@@ -751,7 +743,7 @@ export class SuggestWidget implements IContentWidget, IDisposable {
if (this.state === State.Details) {
this.toggleDetails();
} else {
this.model.cancel();
this.showDidCancel({ retrigger: false });
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册