提交 6cb2f18d 编写于 作者: J Joao Moreno

parameter hints: multiple signatures context

fixes #7137
上级 f3993616
...@@ -10,7 +10,10 @@ import { TPromise } from 'vs/base/common/winjs.base'; ...@@ -10,7 +10,10 @@ import { TPromise } from 'vs/base/common/winjs.base';
import { dispose } from 'vs/base/common/lifecycle'; import { dispose } from 'vs/base/common/lifecycle';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { EditorAction } from 'vs/editor/common/editorAction'; import { EditorAction } from 'vs/editor/common/editorAction';
import { ICommonCodeEditor, IEditorActionDescriptorData, IEditorContribution } from 'vs/editor/common/editorCommon'; import { ICommonCodeEditor, IEditorActionDescriptorData, IEditorContribution, KEYBINDING_CONTEXT_EDITOR_TEXT_FOCUS } from 'vs/editor/common/editorCommon';
import { KbExpr } from 'vs/platform/keybinding/common/keybindingService';
import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry';
import { withCodeEditorFromCommandHandler } from 'vs/editor/common/config/config';
import { CommonEditorRegistry, ContextKey, EditorActionDescriptor } from 'vs/editor/common/editorCommonExtensions'; import { CommonEditorRegistry, ContextKey, EditorActionDescriptor } from 'vs/editor/common/editorCommonExtensions';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { EditorBrowserRegistry } from 'vs/editor/browser/editorBrowserExtensions'; import { EditorBrowserRegistry } from 'vs/editor/browser/editorBrowserExtensions';
...@@ -38,16 +41,16 @@ class ParameterHintsController implements IEditorContribution { ...@@ -38,16 +41,16 @@ class ParameterHintsController implements IEditorContribution {
return ParameterHintsController.ID; return ParameterHintsController.ID;
} }
closeWidget(): void { cancel(): void {
this.widget.cancel(); this.widget.cancel();
} }
showPrevHint(): void { previous(): void {
this.widget.selectPrevious(); this.widget.previous();
} }
showNextHint(): void { next(): void {
this.widget.selectNext(); this.widget.next();
} }
trigger(): void { trigger(): void {
...@@ -79,8 +82,10 @@ export class TriggerParameterHintsAction extends EditorAction { ...@@ -79,8 +82,10 @@ export class TriggerParameterHintsAction extends EditorAction {
const weight = CommonEditorRegistry.commandWeight(75); const weight = CommonEditorRegistry.commandWeight(75);
function handler(fn: (controller: ParameterHintsController)=>void): (ctx, editor: ICommonCodeEditor)=>void { function handler(id: string, fn: (controller: ParameterHintsController) => void) {
return (ctx, editor: ICommonCodeEditor) => fn(ParameterHintsController.get(editor)); return accessor => withCodeEditorFromCommandHandler(id, accessor, editor => {
fn(ParameterHintsController.get(editor));
});
} }
EditorBrowserRegistry.registerEditorContribution(ParameterHintsController); EditorBrowserRegistry.registerEditorContribution(ParameterHintsController);
...@@ -93,29 +98,29 @@ CommonEditorRegistry.registerEditorAction(new EditorActionDescriptor( ...@@ -93,29 +98,29 @@ CommonEditorRegistry.registerEditorAction(new EditorActionDescriptor(
'Trigger Parameter Hints' 'Trigger Parameter Hints'
)); ));
CommonEditorRegistry.registerEditorCommand( KeybindingsRegistry.registerCommandDesc({
'closeParameterHints', id: 'closeParameterHints',
handler: handler('closeParameterHints', c => c.cancel()),
weight, weight,
{ primary: KeyCode.Escape, secondary: [KeyMod.Shift | KeyCode.Escape] }, when: KbExpr.and(KbExpr.has(KEYBINDING_CONTEXT_EDITOR_TEXT_FOCUS), KbExpr.has(Context.Visible)),
true, primary: KeyCode.Escape,
Context.Visible, secondary: [KeyMod.Shift | KeyCode.Escape]
handler(c => c.closeWidget()) });
);
KeybindingsRegistry.registerCommandDesc({
CommonEditorRegistry.registerEditorCommand( id: 'showPrevParameterHint',
'showPrevParameterHint', handler: handler('showPrevParameterHint', c => c.previous()),
weight, weight,
{ primary: KeyCode.UpArrow, secondary: [KeyMod.Alt | KeyCode.UpArrow] }, when: KbExpr.and(KbExpr.has(KEYBINDING_CONTEXT_EDITOR_TEXT_FOCUS), KbExpr.has(Context.Visible), KbExpr.has(Context.MultipleSignatures)),
true, primary: KeyCode.UpArrow,
Context.Visible, secondary: [KeyMod.Alt | KeyCode.UpArrow]
handler(c =>c.showPrevHint()) });
);
KeybindingsRegistry.registerCommandDesc({
CommonEditorRegistry.registerEditorCommand( id: 'showNextParameterHint',
'showNextParameterHint', handler: handler('showNextParameterHint', c => c.next()),
weight, weight,
{ primary: KeyCode.DownArrow, secondary: [KeyMod.Alt | KeyCode.DownArrow] }, when: KbExpr.and(KbExpr.has(KEYBINDING_CONTEXT_EDITOR_TEXT_FOCUS), KbExpr.has(Context.Visible), KbExpr.has(Context.MultipleSignatures)),
true, primary: KeyCode.DownArrow,
Context.Visible, secondary: [KeyMod.Alt | KeyCode.DownArrow]
handler(c => c.showNextHint()) });
); \ No newline at end of file
...@@ -148,7 +148,8 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { ...@@ -148,7 +148,8 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
static ID = 'editor.widget.parameterHintsWidget'; static ID = 'editor.widget.parameterHintsWidget';
private model: ParameterHintsModel; private model: ParameterHintsModel;
private parameterHintsVisible: IKeybindingContextKey<boolean>; private keyVisible: IKeybindingContextKey<boolean>;
private keyMultipleSignatures: IKeybindingContextKey<boolean>;
private element: HTMLElement; private element: HTMLElement;
private signatures: HTMLElement; private signatures: HTMLElement;
private overloads: HTMLElement; private overloads: HTMLElement;
...@@ -164,7 +165,8 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { ...@@ -164,7 +165,8 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
constructor(private editor: ICodeEditor, @IKeybindingService keybindingService: IKeybindingService) { constructor(private editor: ICodeEditor, @IKeybindingService keybindingService: IKeybindingService) {
this.model = new ParameterHintsModel(editor); this.model = new ParameterHintsModel(editor);
this.parameterHintsVisible = keybindingService.createKey(Context.Visible, false); this.keyVisible = keybindingService.createKey(Context.Visible, false);
this.keyMultipleSignatures = keybindingService.createKey(Context.MultipleSignatures, false);
this.visible = false; this.visible = false;
this.disposables = []; this.disposables = [];
...@@ -183,7 +185,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { ...@@ -183,7 +185,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
this.element = $('.editor-widget.parameter-hints-widget'); this.element = $('.editor-widget.parameter-hints-widget');
this.disposables.push(dom.addDisposableListener(this.element, 'click', () => { this.disposables.push(dom.addDisposableListener(this.element, 'click', () => {
this.selectNext(); this.next();
this.editor.focus(); this.editor.focus();
})); }));
...@@ -195,13 +197,13 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { ...@@ -195,13 +197,13 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
this.disposables.push(dom.addDisposableListener(previous, 'click', e => { this.disposables.push(dom.addDisposableListener(previous, 'click', e => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
this.selectPrevious(); this.previous();
})); }));
this.disposables.push(dom.addDisposableListener(next, 'click', e => { this.disposables.push(dom.addDisposableListener(next, 'click', e => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
this.selectNext(); this.next();
})); }));
this.overloads = dom.append(wrapper, $('.overloads')); this.overloads = dom.append(wrapper, $('.overloads'));
...@@ -225,7 +227,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { ...@@ -225,7 +227,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
return; return;
} }
this.parameterHintsVisible.set(true); this.keyVisible.set(true);
this.visible = true; this.visible = true;
TPromise.timeout(100).done(() => dom.addClass(this.element, 'visible')); TPromise.timeout(100).done(() => dom.addClass(this.element, 'visible'));
this.editor.layoutContentWidget(this); this.editor.layoutContentWidget(this);
...@@ -236,7 +238,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { ...@@ -236,7 +238,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
return; return;
} }
this.parameterHintsVisible.reset(); this.keyVisible.reset();
this.visible = false; this.visible = false;
this.parameterHints = null; this.parameterHints = null;
this.announcedLabel = null; this.announcedLabel = null;
...@@ -280,6 +282,8 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { ...@@ -280,6 +282,8 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
height += signatureHeight; height += signatureHeight;
} }
this.keyMultipleSignatures.set(this.signatureViews.length > 1);
} }
private applyFont(element: HTMLElement): void { private applyFont(element: HTMLElement): void {
...@@ -395,7 +399,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { ...@@ -395,7 +399,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
this.editor.layoutContentWidget(this); this.editor.layoutContentWidget(this);
} }
selectNext(): boolean { next(): boolean {
if (this.signatureViews.length < 2) { if (this.signatureViews.length < 2) {
this.cancel(); this.cancel();
return false; return false;
...@@ -406,7 +410,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { ...@@ -406,7 +410,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
return true; return true;
} }
selectPrevious(): boolean { previous(): boolean {
if (this.signatureViews.length < 2) { if (this.signatureViews.length < 2) {
this.cancel(); this.cancel();
return false; return false;
......
...@@ -13,7 +13,8 @@ import { asWinJsPromise } from 'vs/base/common/async'; ...@@ -13,7 +13,8 @@ import { asWinJsPromise } from 'vs/base/common/async';
import { Position } from 'vs/editor/common/core/position'; import { Position } from 'vs/editor/common/core/position';
export const Context = { export const Context = {
Visible: 'parameterHintsVisible' Visible: 'parameterHintsVisible',
MultipleSignatures: 'parameterHintsMultipleSignatures',
}; };
export function provideSignatureHelp(model:IReadOnlyModel, position:Position): TPromise<SignatureHelp> { export function provideSignatureHelp(model:IReadOnlyModel, position:Position): TPromise<SignatureHelp> {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册