diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts index 2a705730bae..104ed75e937 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts @@ -22,6 +22,7 @@ import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/co import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { WorkbenchListFocusContextKey } from 'vs/platform/list/browser/listService'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; +import { URI } from 'vs/base/common/uri'; function getBulkEditPane(panelService: IPanelService): BulkEditPane | undefined { let view: ViewPane | undefined; @@ -84,7 +85,15 @@ class BulkEditPreviewContribution { // (3) close preview editors for (let group of this._editorGroupsService.groups) { for (let input of group.editors) { - if (input instanceof DiffEditorInput && input.modifiedInput.getResource()?.scheme === BulkEditPreviewProvider.Schema) { + + let resource: URI | undefined; + if (input instanceof DiffEditorInput) { + resource = input.modifiedInput.getResource(); + } else { + resource = input.getResource(); + } + + if (resource?.scheme === BulkEditPreviewProvider.Schema) { group.closeEditor(input, { preserveFocus: true }); } } diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts index d0310fcc727..982e5704712 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts @@ -15,7 +15,7 @@ import { diffInserted, diffRemoved } from 'vs/platform/theme/common/colorRegistr import { localize } from 'vs/nls'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { BulkEditPreviewProvider, BulkFileOperations } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview'; +import { BulkEditPreviewProvider, BulkFileOperations, BulkTextEdit, BulkFileOperationType } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview'; import { ILabelService } from 'vs/platform/label/common/label'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { URI } from 'vs/base/common/uri'; @@ -28,6 +28,7 @@ import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewl import { ResourceLabels, IResourceLabelsContainer } from 'vs/workbench/browser/labels'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import Severity from 'vs/base/common/severity'; +import { basename } from 'vs/base/common/resources'; const enum State { Data = 'data', @@ -107,9 +108,9 @@ export class BulkEditPane extends ViewPane { this._disposables.add(this._tree.onDidOpen(e => { const [first] = e.elements; if (first instanceof TextEditElement) { - this._previewTextEditElement(first); + this._openElementAsEditor(first.parent, first.edit); } else if (first instanceof FileElement) { - this._previewFileElement(); + this._openElementAsEditor(first); } })); @@ -214,32 +215,54 @@ export class BulkEditPane extends ViewPane { this._sessionDisposables.clear(); } - private async _previewTextEditElement(element: TextEditElement): Promise { + private async _openElementAsEditor(fileElement: FileElement, textElement?: BulkTextEdit): Promise { - let leftResource: URI; - try { - (await this._textModelService.createModelReference(element.parent.uri)).dispose(); - leftResource = element.parent.uri; - } catch { - leftResource = BulkEditPreviewProvider.emptyPreview; + if (!textElement) { + textElement = fileElement.edit.textEdits[0]; } - const previewUri = BulkEditPreviewProvider.asPreviewUri(element.parent.uri); - - this._editorService.openEditor({ - leftResource, - rightResource: previewUri, - label: localize('edt.title', "{0} (Refactor Preview)", this._labelService.getUriLabel(element.parent.uri)), - options: { - selection: element.edit.edit.range, - revealInCenterIfOutsideViewport: true, - preserveFocus: true + let leftResource: URI | undefined; + if (fileElement.edit.type & BulkFileOperationType.TextEdit) { + try { + (await this._textModelService.createModelReference(fileElement.uri)).dispose(); + leftResource = fileElement.uri; + } catch { + leftResource = BulkEditPreviewProvider.emptyPreview; } - }); - } + } - private _previewFileElement(): void { + const previewUri = BulkEditPreviewProvider.asPreviewUri(fileElement.uri); + if (leftResource) { + // show diff editor + this._editorService.openEditor({ + leftResource, + rightResource: previewUri, + label: localize('edt.title', "{0} (refactor preview)", basename(fileElement.uri)), + options: { + selection: textElement?.edit.range, + revealInCenterIfOutsideViewport: true, + preserveFocus: true + } + }); + } else { + // show 'normal' editor + + let typeLabel: string | undefined; + if (fileElement.edit.type & BulkFileOperationType.Rename) { + typeLabel = localize('rename', "rename"); + } else if (fileElement.edit.type & BulkFileOperationType.Create) { + typeLabel = localize('create', "create"); + } else if (fileElement.edit.type & BulkFileOperationType.Delete) { + typeLabel = localize('delete', "delete"); + } + + this._editorService.openEditor({ + label: typeLabel && localize('edt.title2', "{0} ({1}, refactor preview)", basename(fileElement.uri), typeLabel), + resource: previewUri, + options: { preserveFocus: true } + }); + } } } diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts index 614c152f94a..6f9ae847448 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts @@ -49,15 +49,15 @@ export class BulkTextEdit extends CheckedObject { } export const enum BulkFileOperationType { - None = 0, - Create = 0b0001, - Delete = 0b0010, - Rename = 0b0100, + TextEdit = 1, + Create = 2, + Delete = 4, + Rename = 8, } export class BulkFileOperation extends CheckedObject { - type = BulkFileOperationType.None; + type: BulkFileOperationType = 0; textEdits: BulkTextEdit[] = []; originalEdits = new Map(); newUri?: URI; @@ -118,7 +118,7 @@ export class BulkFileOperations { let type: BulkFileOperationType; if (isResourceTextEdit(edit)) { - type = BulkFileOperationType.None; + type = BulkFileOperationType.TextEdit; uri = edit.resource; } else if (edit.newUri && edit.oldUri) {