debt - suggest widget shouldn't know about that controller model but the completion model
This commit is contained in:
parent
027483f1b9
commit
7f15980aaa
|
@ -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 });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue