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

parameter hints: multiple signatures context

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