提交 65d45fd9 编写于 作者: J Johannes Rieken

wip - make IWorkbenchActionRegistry not hold any data but make it just a forwarder

上级 64e6e228
...@@ -17,7 +17,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; ...@@ -17,7 +17,6 @@ import { Registry } from 'vs/platform/registry/common/platform';
import { ICommandService } from 'vs/platform/commands/common/commands'; import { ICommandService } from 'vs/platform/commands/common/commands';
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
import { Part } from 'vs/workbench/browser/part'; import { Part } from 'vs/workbench/browser/part';
import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions';
import { StatusbarAlignment, IStatusbarRegistry, Extensions, IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { StatusbarAlignment, IStatusbarRegistry, Extensions, IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
...@@ -287,29 +286,6 @@ class StatusBarEntryItem implements IStatusbarItem { ...@@ -287,29 +286,6 @@ class StatusBarEntryItem implements IStatusbarItem {
private executeCommand(id: string, args?: any[]) { private executeCommand(id: string, args?: any[]) {
args = args || []; args = args || [];
// Lookup built in commands
const builtInActionDescriptor = Registry.as<IWorkbenchActionRegistry>(ActionExtensions.WorkbenchActions).getWorkbenchAction(id);
if (builtInActionDescriptor) {
const action = this.instantiationService.createInstance(builtInActionDescriptor.syncDescriptor);
if (action.enabled) {
/* __GDPR__
"workbenchActionExecuted" : {
"id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
"from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
}
*/
this.telemetryService.publicLog('workbenchActionExecuted', { id: action.id, from: 'status bar' });
(action.run() || TPromise.as(null)).done(() => {
action.dispose();
}, (err) => this.messageService.show(Severity.Error, toErrorMessage(err)));
} else {
this.messageService.show(Severity.Warning, nls.localize('canNotRun', "Command '{0}' is currently not enabled and can not be run.", action.label || id));
}
return;
}
// Maintain old behaviour of always focusing the editor here // Maintain old behaviour of always focusing the editor here
const activeEditor = this.editorService.getActiveEditor(); const activeEditor = this.editorService.getActiveEditor();
const codeEditor = getCodeEditor(activeEditor); const codeEditor = getCodeEditor(activeEditor);
...@@ -317,7 +293,13 @@ class StatusBarEntryItem implements IStatusbarItem { ...@@ -317,7 +293,13 @@ class StatusBarEntryItem implements IStatusbarItem {
codeEditor.focus(); codeEditor.focus();
} }
// Fallback to the command service for any other case /* __GDPR__
"workbenchActionExecuted" : {
"id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
"from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
}
*/
this.telemetryService.publicLog('workbenchActionExecuted', { id, from: 'status bar' });
this.commandService.executeCommand(id, ...args).done(undefined, err => this.messageService.show(Severity.Error, toErrorMessage(err))); this.commandService.executeCommand(id, ...args).done(undefined, err => this.messageService.show(Severity.Error, toErrorMessage(err)));
} }
} }
...@@ -355,4 +337,4 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { ...@@ -355,4 +337,4 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
if (statusBarProminentItemHoverBackground) { if (statusBarProminentItemHoverBackground) {
collector.addRule(`.monaco-workbench > .part.statusbar > .statusbar-item a.status-bar-info:hover:not([disabled]):not(.disabled) { background-color: ${statusBarProminentItemHoverBackground}; }`); collector.addRule(`.monaco-workbench > .part.statusbar > .statusbar-item a.status-bar-info:hover:not([disabled]):not(.disabled) { background-color: ${statusBarProminentItemHoverBackground}; }`);
} }
}); });
\ No newline at end of file
...@@ -5,13 +5,12 @@ ...@@ -5,13 +5,12 @@
'use strict'; 'use strict';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
import collections = require('vs/base/common/collections');
import { Registry } from 'vs/platform/registry/common/platform'; import { Registry } from 'vs/platform/registry/common/platform';
import { IAction } from 'vs/base/common/actions'; import { IAction } from 'vs/base/common/actions';
import { KeybindingsRegistry, ICommandAndKeybindingRule } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry';
import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPartService } from 'vs/workbench/services/part/common/partService';
import { ICommandHandler } from 'vs/platform/commands/common/commands'; import { ICommandHandler, CommandsRegistry } from 'vs/platform/commands/common/commands';
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions';
import { IMessageService } from 'vs/platform/message/common/message'; import { IMessageService } from 'vs/platform/message/common/message';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
...@@ -65,83 +64,87 @@ interface IActionMeta { ...@@ -65,83 +64,87 @@ interface IActionMeta {
} }
class WorkbenchActionRegistry implements IWorkbenchActionRegistry { class WorkbenchActionRegistry implements IWorkbenchActionRegistry {
private workbenchActions: collections.IStringDictionary<SyncActionDescriptor>;
private mapActionIdToMeta: { [id: string]: IActionMeta; };
constructor() {
this.workbenchActions = Object.create(null);
this.mapActionIdToMeta = Object.create(null);
}
public registerWorkbenchAction(descriptor: SyncActionDescriptor, alias: string, category?: string): void { public registerWorkbenchAction(descriptor: SyncActionDescriptor, alias: string, category?: string): void {
if (!this.workbenchActions[descriptor.id]) { registerWorkbenchCommandFromAction(descriptor, alias, category);
this.workbenchActions[descriptor.id] = descriptor;
registerWorkbenchCommandFromAction(descriptor);
const meta: IActionMeta = { alias };
if (typeof category === 'string') {
meta.category = category;
}
this.mapActionIdToMeta[descriptor.id] = meta;
}
} }
public unregisterWorkbenchAction(id: string): boolean { public unregisterWorkbenchAction(id: string): boolean {
if (!this.workbenchActions[id]) {
return false;
}
delete this.workbenchActions[id];
delete this.mapActionIdToMeta[id];
return true; return true;
} }
public getWorkbenchAction(id: string): SyncActionDescriptor { public getWorkbenchAction(id: string): SyncActionDescriptor {
return this.workbenchActions[id] || null; return null;
} }
public getCategory(id: string): string { public getCategory(id: string): string {
return (this.mapActionIdToMeta[id] && this.mapActionIdToMeta[id].category) || null; const commandAction = MenuRegistry.getCommand(id);
if (!commandAction || !commandAction.category) {
return null;
}
const { category } = commandAction;
if (typeof category === 'string') {
return category;
} else {
return category.value;
}
} }
public getAlias(id: string): string { public getAlias(id: string): string {
return (this.mapActionIdToMeta[id] && this.mapActionIdToMeta[id].alias) || null; const commandAction = MenuRegistry.getCommand(id);
if (!commandAction) {
return null;
}
const { title } = commandAction;
if (typeof title === 'string') {
return null;
} else {
return title.original;
}
} }
public getWorkbenchActions(): SyncActionDescriptor[] { public getWorkbenchActions(): SyncActionDescriptor[] {
return collections.values(this.workbenchActions); return [];
}
public setWorkbenchActions(actions: SyncActionDescriptor[]): void {
this.workbenchActions = Object.create(null);
this.mapActionIdToMeta = Object.create(null);
actions.forEach(action => this.registerWorkbenchAction(action, ''), this);
} }
} }
Registry.add(Extensions.WorkbenchActions, new WorkbenchActionRegistry()); Registry.add(Extensions.WorkbenchActions, new WorkbenchActionRegistry());
function registerWorkbenchCommandFromAction(descriptor: SyncActionDescriptor): void { function registerWorkbenchCommandFromAction(descriptor: SyncActionDescriptor, alias: string, category?: string): void {
const when = descriptor.keybindingContext;
const weight = (typeof descriptor.keybindingWeight === 'undefined' ? KeybindingsRegistry.WEIGHT.workbenchContrib() : descriptor.keybindingWeight); CommandsRegistry.registerCommand(descriptor.id, createCommandHandler(descriptor));
const keybindings = descriptor.keybindings;
{
const desc: ICommandAndKeybindingRule = { // register keybinding
id: descriptor.id, const when = descriptor.keybindingContext;
handler: createCommandHandler(descriptor), const weight = (typeof descriptor.keybindingWeight === 'undefined' ? KeybindingsRegistry.WEIGHT.workbenchContrib() : descriptor.keybindingWeight);
weight: weight, const keybindings = descriptor.keybindings;
when: when, KeybindingsRegistry.registerKeybindingRule({
primary: keybindings && keybindings.primary, id: descriptor.id,
secondary: keybindings && keybindings.secondary, weight: weight,
win: keybindings && keybindings.win, when: when,
mac: keybindings && keybindings.mac, primary: keybindings && keybindings.primary,
linux: keybindings && keybindings.linux secondary: keybindings && keybindings.secondary,
}; win: keybindings && keybindings.win,
mac: keybindings && keybindings.mac,
linux: keybindings && keybindings.linux
});
}
KeybindingsRegistry.registerCommandAndKeybindingRule(desc); {
// register menu item
if (descriptor.label) {
// slightly weird if-check required because of
// https://github.com/Microsoft/vscode/blob/d28ace31aa147596e35adf101a27768a048c79ec/src/vs/workbench/parts/files/browser/fileActions.contribution.ts#L194
MenuRegistry.appendMenuItem(MenuId.CommandPalette, {
command: {
id: descriptor.id,
title: { value: descriptor.label, original: alias },
category
}
});
}
}
} }
function createCommandHandler(descriptor: SyncActionDescriptor): ICommandHandler { function createCommandHandler(descriptor: SyncActionDescriptor): ICommandHandler {
...@@ -193,4 +196,4 @@ function triggerAndDisposeAction(instantitationService: IInstantiationService, t ...@@ -193,4 +196,4 @@ function triggerAndDisposeAction(instantitationService: IInstantiationService, t
return TPromise.wrapError(err); return TPromise.wrapError(err);
} }
}); });
} }
\ No newline at end of file
...@@ -16,8 +16,6 @@ import { Mode, IEntryRunContext, IAutoFocus, IModel, IQuickNavigateConfiguration ...@@ -16,8 +16,6 @@ import { Mode, IEntryRunContext, IAutoFocus, IModel, IQuickNavigateConfiguration
import { QuickOpenEntryGroup, IHighlight, QuickOpenModel, QuickOpenEntry } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { QuickOpenEntryGroup, IHighlight, QuickOpenModel, QuickOpenEntry } from 'vs/base/parts/quickopen/browser/quickOpenModel';
import { SyncActionDescriptor, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { SyncActionDescriptor, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions';
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions';
import { Registry } from 'vs/platform/registry/common/platform';
import { QuickOpenHandler, IWorkbenchQuickOpenConfiguration } from 'vs/workbench/browser/quickopen'; import { QuickOpenHandler, IWorkbenchQuickOpenConfiguration } from 'vs/workbench/browser/quickopen';
import { IEditorAction, IEditor, ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { IEditorAction, IEditor, ICommonCodeEditor } from 'vs/editor/common/editorCommon';
import { matchesWords, matchesPrefix, matchesContiguousSubString, or } from 'vs/base/common/filters'; import { matchesWords, matchesPrefix, matchesContiguousSubString, or } from 'vs/base/common/filters';
...@@ -418,11 +416,6 @@ export class CommandsHandler extends QuickOpenHandler { ...@@ -418,11 +416,6 @@ export class CommandsHandler extends QuickOpenHandler {
searchValue = searchValue.trim(); searchValue = searchValue.trim();
this.lastSearchValue = searchValue; this.lastSearchValue = searchValue;
// Workbench Actions
let workbenchEntries: CommandEntry[] = [];
const workbenchActions = Registry.as<IWorkbenchActionRegistry>(ActionExtensions.WorkbenchActions).getWorkbenchActions();
workbenchEntries = this.actionDescriptorsToEntries(workbenchActions, searchValue);
// Editor Actions // Editor Actions
const activeEditor = this.editorService.getActiveEditor(); const activeEditor = this.editorService.getActiveEditor();
const activeEditorControl = activeEditor ? activeEditor.getControl() : null; const activeEditorControl = activeEditor ? activeEditor.getControl() : null;
...@@ -443,7 +436,7 @@ export class CommandsHandler extends QuickOpenHandler { ...@@ -443,7 +436,7 @@ export class CommandsHandler extends QuickOpenHandler {
const commandEntries = this.menuItemActionsToEntries(menuActions, searchValue); const commandEntries = this.menuItemActionsToEntries(menuActions, searchValue);
// Concat // Concat
let entries = [...workbenchEntries, ...editorEntries, ...commandEntries]; let entries = [...editorEntries, ...commandEntries];
// Remove duplicates // Remove duplicates
entries = arrays.distinct(entries, entry => `${entry.getLabel()}${entry.getGroupLabel()}${entry.getCommandId()}`); entries = arrays.distinct(entries, entry => `${entry.getLabel()}${entry.getGroupLabel()}${entry.getCommandId()}`);
...@@ -498,35 +491,6 @@ export class CommandsHandler extends QuickOpenHandler { ...@@ -498,35 +491,6 @@ export class CommandsHandler extends QuickOpenHandler {
return TPromise.as(new QuickOpenModel(entries)); return TPromise.as(new QuickOpenModel(entries));
} }
private actionDescriptorsToEntries(actionDescriptors: SyncActionDescriptor[], searchValue: string): CommandEntry[] {
const entries: CommandEntry[] = [];
const registry = Registry.as<IWorkbenchActionRegistry>(ActionExtensions.WorkbenchActions);
for (let i = 0; i < actionDescriptors.length; i++) {
const actionDescriptor = actionDescriptors[i];
if (actionDescriptor.label) {
// Label (with optional category)
let label = actionDescriptor.label;
const category = registry.getCategory(actionDescriptor.id);
if (category) {
label = nls.localize('commandLabel', "{0}: {1}", category, label);
}
// Alias for non default languages
const alias = (language !== LANGUAGE_DEFAULT) ? registry.getAlias(actionDescriptor.id) : null;
const labelHighlights = wordFilter(searchValue, label);
const aliasHighlights = alias ? wordFilter(searchValue, alias) : null;
if (labelHighlights || aliasHighlights) {
entries.push(this.instantiationService.createInstance(CommandEntry, actionDescriptor.id, this.keybindingService.lookupKeybinding(actionDescriptor.id), label, alias, { label: labelHighlights, alias: aliasHighlights }, actionDescriptor, (id: string) => this.onBeforeRunCommand(id)));
}
}
}
return entries;
}
private editorActionsToEntries(actions: IEditorAction[], searchValue: string): EditorActionCommandEntry[] { private editorActionsToEntries(actions: IEditorAction[], searchValue: string): EditorActionCommandEntry[] {
const entries: EditorActionCommandEntry[] = []; const entries: EditorActionCommandEntry[] = [];
...@@ -621,4 +585,4 @@ export class CommandsHandler extends QuickOpenHandler { ...@@ -621,4 +585,4 @@ export class CommandsHandler extends QuickOpenHandler {
lastCommandPaletteInput = void 0; // clear last input when user canceled quick open lastCommandPaletteInput = void 0; // clear last input when user canceled quick open
} }
} }
} }
\ No newline at end of file
...@@ -6,10 +6,7 @@ ...@@ -6,10 +6,7 @@
'use strict'; 'use strict';
import * as assert from 'assert'; import * as assert from 'assert';
import * as Platform from 'vs/platform/registry/common/platform';
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
import { Extensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions';
import { prepareActions } from 'vs/workbench/browser/actions'; import { prepareActions } from 'vs/workbench/browser/actions';
import { Action } from 'vs/base/common/actions'; import { Action } from 'vs/base/common/actions';
...@@ -22,26 +19,6 @@ class MyClass extends Action { ...@@ -22,26 +19,6 @@ class MyClass extends Action {
suite('Workbench Action Registry', () => { suite('Workbench Action Registry', () => {
test('Workbench Action Registration', function () {
let Registry = <IWorkbenchActionRegistry>Platform.Registry.as(Extensions.WorkbenchActions);
let d = new SyncActionDescriptor(MyClass, 'id', 'name');
let oldActions = Registry.getWorkbenchActions().slice(0);
let oldCount = Registry.getWorkbenchActions().length;
Registry.registerWorkbenchAction(d, 'My Alias', 'category');
Registry.registerWorkbenchAction(d, null);
assert.equal(Registry.getWorkbenchActions().length, 1 + oldCount);
assert.strictEqual(d, Registry.getWorkbenchAction('id'));
assert.deepEqual(Registry.getAlias(d.id), 'My Alias');
assert.equal(Registry.getCategory(d.id), 'category');
(<any>Registry).setWorkbenchActions(oldActions);
});
test('Workbench Action Bar prepareActions()', function () { test('Workbench Action Bar prepareActions()', function () {
let a1 = new Separator(); let a1 = new Separator();
let a2 = new Separator(); let a2 = new Separator();
...@@ -57,4 +34,4 @@ suite('Workbench Action Registry', () => { ...@@ -57,4 +34,4 @@ suite('Workbench Action Registry', () => {
assert(actions[1] === a5); assert(actions[1] === a5);
assert(actions[2] === a6); assert(actions[2] === a6);
}); });
}); });
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册