提交 10659a11 编写于 作者: J Joao Moreno

Merge branch 'fix-menu-actions-args' of https://github.com/joaomoreno/vscode...

Merge branch 'fix-menu-actions-args' of https://github.com/joaomoreno/vscode into joaomoreno-fix-menu-actions-args
......@@ -234,6 +234,6 @@ export class ActionRunner extends EventEmitter implements IActionRunner {
}
protected runAction(action: IAction, context?: any): TPromise<any> {
return TPromise.as(action.run(context));
return TPromise.as(context ? action.run(context) : action.run());
}
}
......@@ -126,7 +126,7 @@ export class ContextMenuController implements IEditorContribution {
const result: IAction[] = [];
let contextMenu = this._menuService.createMenu(MenuId.EditorContext, this._contextKeyService);
const groups = contextMenu.getActions(this._editor.getModel().uri);
const groups = contextMenu.getActions({ arg: this._editor.getModel().uri });
contextMenu.dispose();
for (let group of groups) {
......
......@@ -7,7 +7,7 @@
import { localize } from 'vs/nls';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { IMenu, MenuItemAction } from 'vs/platform/actions/common/actions';
import { IMenu, MenuItemAction, IMenuActionOptions } from 'vs/platform/actions/common/actions';
import { IMessageService } from 'vs/platform/message/common/message';
import Severity from 'vs/base/common/severity';
import { IAction } from 'vs/base/common/actions';
......@@ -17,8 +17,8 @@ import { domEvent } from 'vs/base/browser/event';
import { Emitter } from 'vs/base/common/event';
export function fillInActions(menu: IMenu, context: any, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void {
const groups = menu.getActions(context);
export function fillInActions(menu: IMenu, options: IMenuActionOptions, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void {
const groups = menu.getActions(options);
if (groups.length === 0) {
return;
}
......
......@@ -60,9 +60,14 @@ export class MenuId {
}
}
export interface IMenuActionOptions {
arg?: any;
shouldForwardArgs?: boolean;
}
export interface IMenu extends IDisposable {
onDidChange: Event<IMenu>;
getActions(arg?: any): [string, MenuItemAction[]][];
getActions(options?: IMenuActionOptions): [string, MenuItemAction[]][];
}
export const IMenuService = createDecorator<IMenuService>('menuService');
......@@ -158,7 +163,7 @@ export class ExecuteCommandAction extends Action {
export class MenuItemAction extends ExecuteCommandAction {
private _arg: any;
private _options: IMenuActionOptions;
readonly item: ICommandAction;
readonly alt: MenuItemAction;
......@@ -166,24 +171,30 @@ export class MenuItemAction extends ExecuteCommandAction {
constructor(
item: ICommandAction,
alt: ICommandAction,
arg: any,
options: IMenuActionOptions,
@ICommandService commandService: ICommandService
) {
typeof item.title === 'string' ? super(item.id, item.title, commandService) : super(item.id, item.title.value, commandService);
this._cssClass = item.iconClass;
this._enabled = true;
this._arg = arg;
this._options = options;
this.item = item;
this.alt = alt ? new MenuItemAction(alt, undefined, arg, commandService) : undefined;
this.alt = alt ? new MenuItemAction(alt, undefined, this._options, commandService) : undefined;
}
run(...args: any[]): TPromise<any> {
if (this._arg) {
return super.run(this._arg, ...args);
} else {
return super.run(...args);
let runArgs = [];
if (this._options.arg) {
runArgs = [...runArgs, this._options.arg];
}
if (this._options.shouldForwardArgs) {
runArgs = [...runArgs, ...args];
}
return super.run(...runArgs);
}
}
......
......@@ -9,7 +9,7 @@ import Event, { Emitter } from 'vs/base/common/event';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { TPromise } from 'vs/base/common/winjs.base';
import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
import { MenuId, MenuRegistry, MenuItemAction, IMenu, IMenuItem } from 'vs/platform/actions/common/actions';
import { MenuId, MenuRegistry, MenuItemAction, IMenu, IMenuItem, IMenuActionOptions } from 'vs/platform/actions/common/actions';
import { ICommandService } from 'vs/platform/commands/common/commands';
type MenuItemGroup = [string, IMenuItem[]];
......@@ -69,14 +69,14 @@ export class Menu implements IMenu {
return this._onDidChange.event;
}
getActions(arg?: any): [string, MenuItemAction[]][] {
getActions(options: IMenuActionOptions): [string, MenuItemAction[]][] {
const result: [string, MenuItemAction[]][] = [];
for (let group of this._menuGroups) {
const [id, items] = group;
const activeActions: MenuItemAction[] = [];
for (const item of items) {
if (this._contextKeyService.contextMatchesRules(item.when)) {
const action = new MenuItemAction(item.command, item.alt, arg, this._commandService);
const action = new MenuItemAction(item.command, item.alt, options, this._commandService);
action.order = item.order; //TODO@Ben order is menu item property, not an action property
activeActions.push(action);
}
......
......@@ -325,7 +325,7 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl
const titleBarMenu = this.menuService.createMenu(MenuId.EditorTitle, scopedContextKeyService);
this.disposeOnEditorActions.push(titleBarMenu, titleBarMenu.onDidChange(_ => this.update()));
fillInActions(titleBarMenu, this.resourceContext.get(), { primary, secondary });
fillInActions(titleBarMenu, { arg: this.resourceContext.get() }, { primary, secondary });
}
return { primary, secondary };
......@@ -475,7 +475,7 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl
}
// Fill in contributed actions
fillInActions(this.contextMenu, this.resourceContext.get(), actions);
fillInActions(this.contextMenu, { arg: this.resourceContext.get() }, actions);
return actions;
}
......
......@@ -220,7 +220,7 @@ export class BaseDebugController extends DefaultController {
this.contextMenuService.showContextMenu({
getAnchor: () => anchor,
getActions: () => this.actionProvider.getSecondaryActions(tree, element).then(actions => {
fillInActions(this.contributedContextMenu, this.getContext(element), actions);
fillInActions(this.contributedContextMenu, { arg: this.getContext(element) }, actions);
return actions;
}),
onHide: (wasCancelled?: boolean) => {
......
......@@ -484,7 +484,7 @@ export class FileController extends DefaultController {
getAnchor: () => anchor,
getActions: () => {
return this.state.actionProvider.getSecondaryActions(tree, stat).then(actions => {
fillInActions(this.contributedContextMenu, stat.resource, actions);
fillInActions(this.contributedContextMenu, { arg: stat.resource }, actions);
return actions;
});
},
......
......@@ -142,7 +142,7 @@ export class SCMMenus implements IDisposable {
const primary = [];
const secondary = [];
const result = { primary, secondary };
fillInActions(menu, null, result, g => g === 'inline');
fillInActions(menu, { shouldForwardArgs: true }, result, g => g === 'inline');
menu.dispose();
contextKeyService.dispose();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册