diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index c8812f2dedb..38df157763e 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -76,6 +76,7 @@ async function init(context: ExtensionContext, disposables: Disposable[]): Promi } } + scm.inputBox.onDidAccept(commandCenter.commitWithInput, commandCenter, disposables); scm.inputBox.value = await model.getCommitTemplate(); } diff --git a/extensions/git/src/scmProvider.ts b/extensions/git/src/scmProvider.ts index de08757e17d..c0672088771 100644 --- a/extensions/git/src/scmProvider.ts +++ b/extensions/git/src/scmProvider.ts @@ -50,10 +50,6 @@ export class GitSCMProvider implements SCMProvider { return this.commandCenter.open(resource); } - acceptChanges(): ProviderResult { - return this.commandCenter.commitWithInput(); - } - getOriginalResource(uri: Uri): Uri | undefined { if (uri.scheme !== 'file') { return; diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index db0a30804fc..086ac731526 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -733,9 +733,6 @@ declare module 'vscode' { * @return A thenable which resolves when the resource is open. */ open?(resource: SCMResource, token: CancellationToken): ProviderResult; - - // TODO@joao: move to SCMInput? - acceptChanges?(token: CancellationToken): ProviderResult; } /** @@ -752,6 +749,11 @@ declare module 'vscode' { * An [event](#Event) which fires when the input box value has changed. */ readonly onDidChange: Event; + + /** + * An [event](#Event) which fires when the user has accepted the changes. + */ + readonly onDidAccept: Event; } export namespace scm { diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index c8c0dadd479..dbb5bdf0dc8 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -253,7 +253,6 @@ export abstract class MainProcessExtensionServiceShape { export interface SCMProviderFeatures { label: string; supportsOpen: boolean; - supportsAcceptChanges: boolean; supportsOriginalResource: boolean; } @@ -419,9 +418,9 @@ export abstract class ExtHostTerminalServiceShape { export abstract class ExtHostSCMShape { $open(id: string, uri: string): TPromise { throw ni(); } - $acceptChanges(id: string): TPromise { throw ni(); } $getOriginalResource(id: string, uri: URI): TPromise { throw ni(); } $onInputBoxValueChange(value: string): TPromise { throw ni(); } + $onInputBoxAcceptChanges(): TPromise { throw ni(); } } export abstract class ExtHostTaskShape { diff --git a/src/vs/workbench/api/node/extHostSCM.ts b/src/vs/workbench/api/node/extHostSCM.ts index 52ae24cd9a4..45dd58b3603 100644 --- a/src/vs/workbench/api/node/extHostSCM.ts +++ b/src/vs/workbench/api/node/extHostSCM.ts @@ -49,6 +49,12 @@ class ExtHostSCMInputBox { return this._onDidChange.event; } + private _onDidAccept = new Emitter(); + + get onDidAccept(): Event { + return this._onDidAccept.event; + } + constructor(private _proxy: MainThreadSCMShape) { // noop } @@ -57,6 +63,10 @@ class ExtHostSCMInputBox { this.updateValue(value); } + $onInputBoxAcceptChanges(): void { + this._onDidAccept.fire(this._value); + } + private updateValue(value: string): void { this._value = value; this._onDidChange.fire(value); @@ -97,7 +107,6 @@ export class ExtHostSCM { this._proxy.$register(providerId, { label: provider.label, supportsOpen: !!provider.open, - supportsAcceptChanges: !!provider.acceptChanges, supportsOriginalResource: !!provider.getOriginalResource }); @@ -158,16 +167,6 @@ export class ExtHostSCM { return asWinJsPromise(token => provider.open(resource, token)); } - $acceptChanges(providerId: string): TPromise { - const provider = this._providers[providerId]; - - if (!provider) { - return TPromise.as(null); - } - - return asWinJsPromise(token => provider.acceptChanges(token)); - } - $getOriginalResource(id: string, uri: URI): TPromise { const provider = this._providers[id]; @@ -182,4 +181,9 @@ export class ExtHostSCM { this._inputBox.$onInputBoxValueChange(value); return TPromise.as(null); } + + $onInputBoxAcceptChanges(): TPromise { + this._inputBox.$onInputBoxAcceptChanges(); + return TPromise.as(null); + } } diff --git a/src/vs/workbench/api/node/mainThreadSCM.ts b/src/vs/workbench/api/node/mainThreadSCM.ts index fbd9b74b082..6bf13fcdcd5 100644 --- a/src/vs/workbench/api/node/mainThreadSCM.ts +++ b/src/vs/workbench/api/node/mainThreadSCM.ts @@ -52,14 +52,6 @@ class MainThreadSCMProvider implements ISCMProvider { return this.proxy.$open(this.id, resource.uri.toString()); } - acceptChanges(): TPromise { - if (!this.features.supportsAcceptChanges) { - return TPromise.as(null); - } - - return this.proxy.$acceptChanges(this.id); - } - getOriginalResource(uri: URI): TPromise { if (!this.features.supportsOriginalResource) { return TPromise.as(null); @@ -116,7 +108,7 @@ export class MainThreadSCM extends MainThreadSCMShape { private proxy: ExtHostSCMShape; private providers: { [id: string]: MainThreadSCMProvider; } = Object.create(null); - private inputBoxListener: IDisposable; + private inputBoxListeners: IDisposable[] = []; constructor( @IThreadService threadService: IThreadService, @@ -126,9 +118,8 @@ export class MainThreadSCM extends MainThreadSCMShape { super(); this.proxy = threadService.get(ExtHostContext.ExtHostSCM); - this.inputBoxListener = this.scmService.input.onDidChange(value => { - this.proxy.$onInputBoxValueChange(value); - }); + this.scmService.input.onDidChange(this.proxy.$onInputBoxValueChange, this.proxy, this.inputBoxListeners); + this.scmService.input.onDidAccept(this.proxy.$onInputBoxAcceptChanges, this.proxy, this.inputBoxListeners); } $register(id: string, features: SCMProviderFeatures): void { @@ -165,6 +156,6 @@ export class MainThreadSCM extends MainThreadSCMShape { .forEach(id => this.providers[id].dispose()); this.providers = Object.create(null); - this.inputBoxListener = dispose(this.inputBoxListener); + this.inputBoxListeners = dispose(this.inputBoxListeners); } } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 687267e9adf..d3ee18ad6bb 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -257,7 +257,7 @@ export class SCMViewlet extends Viewlet { chain(domEvent(this.inputBox.inputElement, 'keydown')) .map(e => new StandardKeyboardEvent(e)) .filter(e => e.equals(KeyMod.CtrlCmd | KeyCode.Enter) || e.equals(KeyMod.CtrlCmd | KeyCode.KEY_S)) - .on(this.acceptChanges, this, this.disposables); + .on(this.scmService.input.acceptChanges, this.scmService.input, this.disposables); this.listContainer = append(root, $('.scm-status.show-file-icons')); const delegate = new Delegate(); @@ -334,10 +334,6 @@ export class SCMViewlet extends Viewlet { this.scmService.activeProvider.open(e); } - private acceptChanges(): void { - this.scmService.activeProvider.acceptChanges(); - } - getActions(): IAction[] { return this.menus.getTitleActions(); } diff --git a/src/vs/workbench/services/scm/common/scm.ts b/src/vs/workbench/services/scm/common/scm.ts index a599f5af349..ff30d9875b3 100644 --- a/src/vs/workbench/services/scm/common/scm.ts +++ b/src/vs/workbench/services/scm/common/scm.ts @@ -46,13 +46,14 @@ export interface ISCMProvider extends IDisposable { readonly state?: string; open(uri: ISCMResource): TPromise; - acceptChanges(): TPromise; getOriginalResource(uri: URI): TPromise; } export interface ISCMInput { value: string; readonly onDidChange: Event; + readonly onDidAccept: Event; + acceptChanges(): void; } export interface ISCMService { diff --git a/src/vs/workbench/services/scm/common/scmService.ts b/src/vs/workbench/services/scm/common/scmService.ts index 5eb30f7f59d..b1c26021750 100644 --- a/src/vs/workbench/services/scm/common/scmService.ts +++ b/src/vs/workbench/services/scm/common/scmService.ts @@ -26,6 +26,13 @@ class SCMInput implements ISCMInput { private _onDidChange = new Emitter(); get onDidChange(): Event { return this._onDidChange.event; } + + private _onDidAccept = new Emitter(); + get onDidAccept(): Event { return this._onDidAccept.event; } + + acceptChanges(): void { + this._onDidAccept.fire(this._value); + } } export class SCMService implements ISCMService {