提交 bfe5a942 编写于 作者: A Alex Dima

addAction returns IDisposable (fixes Microsoft/monaco-editor#286)

上级 18101697
......@@ -24,7 +24,7 @@ import { getDefaultValues as getDefaultConfiguration } from 'vs/platform/configu
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IProgressService, IProgressRunner } from 'vs/platform/progress/common/progress';
import { ITextModelResolverService, ITextModelContentProvider, ITextEditorModel } from 'vs/editor/common/services/resolverService';
import { IDisposable, IReference, ImmortalReference } from 'vs/base/common/lifecycle';
import { IDisposable, IReference, ImmortalReference, combinedDisposable } from 'vs/base/common/lifecycle';
import * as dom from 'vs/base/browser/dom';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry';
......@@ -275,8 +275,13 @@ export class StandaloneCommandService implements ICommandService {
this._dynamicCommands = Object.create(null);
}
public addCommand(id: string, command: ICommand): void {
public addCommand(id: string, command: ICommand): IDisposable {
this._dynamicCommands[id] = command;
return {
dispose: () => {
delete this._dynamicCommands[id];
}
};
}
public executeCommand<T>(id: string, ...args: any[]): TPromise<T> {
......@@ -320,11 +325,14 @@ export class StandaloneKeybindingService extends AbstractKeybindingService {
}));
}
public addDynamicKeybinding(keybinding: number, handler: ICommandHandler, when: string, commandId: string = null): string {
public addDynamicKeybinding(keybinding: number, handler: ICommandHandler, when: string, commandId: string = null): [string, IDisposable] {
let toDispose: IDisposable[] = [];
if (commandId === null) {
commandId = 'DYNAMIC_' + (++StandaloneKeybindingService.LAST_GENERATED_ID);
}
let parsedContext = IOSupport.readKeybindingWhen(when);
this._dynamicKeybindings.push({
keybinding: keybinding,
command: commandId,
......@@ -333,16 +341,30 @@ export class StandaloneKeybindingService extends AbstractKeybindingService {
weight2: 0
});
toDispose.push({
dispose: () => {
for (let i = 0; i < this._dynamicKeybindings.length; i++) {
let kb = this._dynamicKeybindings[i];
if (kb.command === commandId) {
this._dynamicKeybindings.splice(i, 1);
this.updateResolver({ source: KeybindingSource.Default });
return;
}
}
}
});
let commandService = this._commandService;
if (commandService instanceof StandaloneCommandService) {
commandService.addCommand(commandId, {
toDispose.push(commandService.addCommand(commandId, {
handler: handler
});
}));
} else {
throw new Error('Unknown command service!');
}
this.updateResolver({ source: KeybindingSource.Default });
return commandId;
return [commandId, combinedDisposable(toDispose)];
}
private updateResolver(event: IKeybindingEvent): void {
......
......@@ -5,7 +5,7 @@
'use strict';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle';
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { ICommandService, ICommandHandler } from 'vs/platform/commands/common/commands';
......@@ -46,13 +46,13 @@ export interface IDiffEditorConstructionOptions extends IDiffEditorOptions {
export interface IStandaloneCodeEditor extends ICodeEditor {
addCommand(keybinding: number, handler: ICommandHandler, context: string): string;
createContextKey<T>(key: string, defaultValue: T): IContextKey<T>;
addAction(descriptor: IActionDescriptor): void;
addAction(descriptor: IActionDescriptor): IDisposable;
}
export interface IStandaloneDiffEditor extends IDiffEditor {
addCommand(keybinding: number, handler: ICommandHandler, context: string): string;
createContextKey<T>(key: string, defaultValue: T): IContextKey<T>;
addAction(descriptor: IActionDescriptor): void;
addAction(descriptor: IActionDescriptor): IDisposable;
}
export class StandaloneEditor extends CodeEditor implements IStandaloneCodeEditor {
......@@ -130,7 +130,8 @@ export class StandaloneEditor extends CodeEditor implements IStandaloneCodeEdito
console.warn('Cannot add command because the editor is configured with an unrecognized KeybindingService');
return null;
}
return this._standaloneKeybindingService.addDynamicKeybinding(keybinding, handler, context);
let r = this._standaloneKeybindingService.addDynamicKeybinding(keybinding, handler, context);
return r[0];
}
public createContextKey<T>(key: string, defaultValue: T): IContextKey<T> {
......@@ -141,8 +142,8 @@ export class StandaloneEditor extends CodeEditor implements IStandaloneCodeEdito
return this._contextKeyService.createKey(key, defaultValue);
}
public addAction(descriptor: IActionDescriptor): void {
super.addAction(descriptor);
public addAction(descriptor: IActionDescriptor): IDisposable {
let toDispose = [super.addAction(descriptor)];
if (!this._standaloneKeybindingService) {
console.warn('Cannot add keybinding because the editor is configured with an unrecognized KeybindingService');
return null;
......@@ -151,10 +152,14 @@ export class StandaloneEditor extends CodeEditor implements IStandaloneCodeEdito
let handler: ICommandHandler = (accessor) => {
return this.trigger('keyboard', descriptor.id, null);
};
descriptor.keybindings.forEach((kb) => {
this._standaloneKeybindingService.addDynamicKeybinding(kb, handler, descriptor.keybindingContext, descriptor.id);
});
}
toDispose = toDispose.concat(
descriptor.keybindings.map((kb) => {
let r = this._standaloneKeybindingService.addDynamicKeybinding(kb, handler, descriptor.keybindingContext, descriptor.id);
return r[1];
})
);
}
return combinedDisposable(toDispose);
}
_attachModel(model: IModel): void {
......@@ -216,7 +221,8 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon
console.warn('Cannot add command because the editor is configured with an unrecognized KeybindingService');
return null;
}
return this._standaloneKeybindingService.addDynamicKeybinding(keybinding, handler, context);
let r = this._standaloneKeybindingService.addDynamicKeybinding(keybinding, handler, context);
return r[0];
}
public createContextKey<T>(key: string, defaultValue: T): IContextKey<T> {
......@@ -227,8 +233,8 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon
return this._contextKeyService.createKey(key, defaultValue);
}
public addAction(descriptor: IActionDescriptor): void {
super.addAction(descriptor);
public addAction(descriptor: IActionDescriptor): IDisposable {
let toDispose = [super.addAction(descriptor)];
if (!this._standaloneKeybindingService) {
console.warn('Cannot add keybinding because the editor is configured with an unrecognized KeybindingService');
return null;
......@@ -237,9 +243,13 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon
let handler: ICommandHandler = (ctx) => {
return this.trigger('keyboard', descriptor.id, null);
};
descriptor.keybindings.forEach((kb) => {
this._standaloneKeybindingService.addDynamicKeybinding(kb, handler, descriptor.keybindingContext, descriptor.id);
});
}
toDispose = toDispose.concat(
descriptor.keybindings.map((kb) => {
let r = this._standaloneKeybindingService.addDynamicKeybinding(kb, handler, descriptor.keybindingContext, descriptor.id);
return r[1];
})
);
}
return combinedDisposable(toDispose);
}
}
......@@ -611,8 +611,8 @@ export class DiffEditorWidget extends EventEmitter implements editorBrowser.IDif
this.modifiedEditor.revealRangeInCenterIfOutsideViewport(range);
}
public addAction(descriptor: editorCommon.IActionDescriptor): void {
this.modifiedEditor.addAction(descriptor);
public addAction(descriptor: editorCommon.IActionDescriptor): IDisposable {
return this.modifiedEditor.addAction(descriptor);
}
public getActions(): editorCommon.IEditorAction[] {
......
......@@ -7,7 +7,7 @@
import { onUnexpectedError } from 'vs/base/common/errors';
import Event, { fromEventEmitter } from 'vs/base/common/event';
import { EventEmitter, IEventEmitter } from 'vs/base/common/eventEmitter';
import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
import { Disposable, IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle';
import { TPromise } from 'vs/base/common/winjs.base';
import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
......@@ -510,7 +510,7 @@ export abstract class CommonCodeEditor extends EventEmitter implements editorCom
return <T>(this._contributions[id] || null);
}
public addAction(descriptor: editorCommon.IActionDescriptor): void {
public addAction(descriptor: editorCommon.IActionDescriptor): IDisposable {
if (
(typeof descriptor.id !== 'string')
|| (typeof descriptor.label !== 'string')
......@@ -518,6 +518,7 @@ export abstract class CommonCodeEditor extends EventEmitter implements editorCom
) {
throw new Error('Invalid action descriptor, `id`, `label` and `run` are required properties!');
}
let toDispose: IDisposable[] = [];
// Generate a unique id to allow the same descriptor.id across multiple editor instances
let uniqueId = this.getId() + ':' + descriptor.id;
......@@ -525,7 +526,7 @@ export abstract class CommonCodeEditor extends EventEmitter implements editorCom
let action = new DynamicEditorAction(descriptor, this);
// Register the command
CommandsRegistry.registerCommand(uniqueId, () => action.run());
toDispose.push(CommandsRegistry.registerCommand(uniqueId, () => action.run()));
if (descriptor.contextMenuGroupId) {
let menuItem: IMenuItem = {
......@@ -539,10 +540,17 @@ export abstract class CommonCodeEditor extends EventEmitter implements editorCom
};
// Register the menu item
MenuRegistry.appendMenuItem(MenuId.EditorContext, menuItem);
toDispose.push(MenuRegistry.appendMenuItem(MenuId.EditorContext, menuItem));
}
this._actions[action.id] = action;
toDispose.push({
dispose: () => {
delete this._actions[action.id];
}
});
return combinedDisposable(toDispose);
}
public getActions(): editorCommon.IEditorAction[] {
......
......@@ -3481,7 +3481,7 @@ export interface IEditor {
/**
* Add a new action to this editor.
*/
addAction(descriptor: IActionDescriptor): void;
addAction(descriptor: IActionDescriptor): IDisposable;
/**
* Returns all actions associated with this editor.
......
......@@ -951,13 +951,13 @@ declare module monaco.editor {
export interface IStandaloneCodeEditor extends ICodeEditor {
addCommand(keybinding: number, handler: ICommandHandler, context: string): string;
createContextKey<T>(key: string, defaultValue: T): IContextKey<T>;
addAction(descriptor: IActionDescriptor): void;
addAction(descriptor: IActionDescriptor): IDisposable;
}
export interface IStandaloneDiffEditor extends IDiffEditor {
addCommand(keybinding: number, handler: ICommandHandler, context: string): string;
createContextKey<T>(key: string, defaultValue: T): IContextKey<T>;
addAction(descriptor: IActionDescriptor): void;
addAction(descriptor: IActionDescriptor): IDisposable;
}
export interface ICommandHandler {
(...args: any[]): void;
......@@ -2891,7 +2891,7 @@ declare module monaco.editor {
/**
* Add a new action to this editor.
*/
addAction(descriptor: IActionDescriptor): void;
addAction(descriptor: IActionDescriptor): IDisposable;
/**
* Returns all actions associated with this editor.
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册