提交 01164801 编写于 作者: J Johannes Rieken

more changes

上级 8959d790
...@@ -14,7 +14,7 @@ import { diffInserted, diffRemoved } from 'vs/platform/theme/common/colorRegistr ...@@ -14,7 +14,7 @@ import { diffInserted, diffRemoved } from 'vs/platform/theme/common/colorRegistr
import { localize } from 'vs/nls'; import { localize } from 'vs/nls';
import { DisposableStore } from 'vs/base/common/lifecycle'; import { DisposableStore } from 'vs/base/common/lifecycle';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { BulkEditPreviewProvider, BulkFileOperations, BulkCategory } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview'; import { BulkEditPreviewProvider, BulkModel, BulkCategory } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview';
import { ILabelService } from 'vs/platform/label/common/label'; import { ILabelService } from 'vs/platform/label/common/label';
import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { ITextModelService } from 'vs/editor/common/services/resolverService';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
...@@ -51,7 +51,7 @@ export class BulkEditPane extends ViewPane { ...@@ -51,7 +51,7 @@ export class BulkEditPane extends ViewPane {
private static readonly _memGroupByFile = `${BulkEditPane.ID}.groupByFile`; private static readonly _memGroupByFile = `${BulkEditPane.ID}.groupByFile`;
private _tree!: WorkbenchAsyncDataTree<BulkFileOperations, BulkEditElement, FuzzyScore>; private _tree!: WorkbenchAsyncDataTree<BulkModel, BulkEditElement, FuzzyScore>;
private _treeDataSource!: BulkEditDataSource; private _treeDataSource!: BulkEditDataSource;
private _treeViewStates = new Map<boolean, IAsyncDataTreeViewState>(); private _treeViewStates = new Map<boolean, IAsyncDataTreeViewState>();
private _message!: HTMLSpanElement; private _message!: HTMLSpanElement;
...@@ -62,7 +62,7 @@ export class BulkEditPane extends ViewPane { ...@@ -62,7 +62,7 @@ export class BulkEditPane extends ViewPane {
private readonly _disposables = new DisposableStore(); private readonly _disposables = new DisposableStore();
private readonly _sessionDisposables = new DisposableStore(); private readonly _sessionDisposables = new DisposableStore();
private _currentResolve?: (edit?: WorkspaceEdit) => void; private _currentResolve?: (edit?: WorkspaceEdit) => void;
private _currentInput?: BulkFileOperations; private _currentInput?: BulkModel;
constructor( constructor(
...@@ -163,7 +163,7 @@ export class BulkEditPane extends ViewPane { ...@@ -163,7 +163,7 @@ export class BulkEditPane extends ViewPane {
this._currentResolve = undefined; this._currentResolve = undefined;
} }
const input = await this._instaService.invokeFunction(BulkFileOperations.create, edit); const input = await this._instaService.invokeFunction(BulkModel.create, edit);
const provider = this._instaService.createInstance(BulkEditPreviewProvider, input); const provider = this._instaService.createInstance(BulkEditPreviewProvider, input);
this._sessionDisposables.add(provider); this._sessionDisposables.add(provider);
this._sessionDisposables.add(input); this._sessionDisposables.add(input);
...@@ -189,7 +189,7 @@ export class BulkEditPane extends ViewPane { ...@@ -189,7 +189,7 @@ export class BulkEditPane extends ViewPane {
}); });
} }
private async _setTreeInput(input: BulkFileOperations) { private async _setTreeInput(input: BulkModel) {
const viewState = this._treeViewStates.get(this._treeDataSource.groupByFile); const viewState = this._treeViewStates.get(this._treeDataSource.groupByFile);
await this._tree.setInput(input, viewState); await this._tree.setInput(input, viewState);
...@@ -307,21 +307,21 @@ export class BulkEditPane extends ViewPane { ...@@ -307,21 +307,21 @@ export class BulkEditPane extends ViewPane {
let leftResource: URI | undefined; let leftResource: URI | undefined;
if (fileElement.edit.isTextEdit) { if (fileElement.edit.isTextEdit) {
try { try {
(await this._textModelService.createModelReference(fileElement.uri)).dispose(); (await this._textModelService.createModelReference(fileElement.edit.uri)).dispose();
leftResource = fileElement.uri; leftResource = fileElement.edit.uri;
} catch { } catch {
leftResource = BulkEditPreviewProvider.emptyPreview; leftResource = BulkEditPreviewProvider.emptyPreview;
} }
} }
const previewUri = BulkEditPreviewProvider.asPreviewUri(fileElement.uri); const previewUri = BulkEditPreviewProvider.asPreviewUri(fileElement.edit.uri);
if (leftResource) { if (leftResource) {
// show diff editor // show diff editor
this._editorService.openEditor({ this._editorService.openEditor({
leftResource, leftResource,
rightResource: previewUri, rightResource: previewUri,
label: localize('edt.title', "{0} (refactor preview)", basename(fileElement.uri)), label: localize('edt.title', "{0} (refactor preview)", basename(fileElement.edit.uri)),
options options
}); });
} else { } else {
...@@ -336,7 +336,7 @@ export class BulkEditPane extends ViewPane { ...@@ -336,7 +336,7 @@ export class BulkEditPane extends ViewPane {
} }
this._editorService.openEditor({ this._editorService.openEditor({
label: typeLabel && localize('edt.title2', "{0} ({1}, refactor preview)", basename(fileElement.uri), typeLabel), label: typeLabel && localize('edt.title2', "{0} ({1}, refactor preview)", basename(fileElement.edit.uri), typeLabel),
resource: previewUri, resource: previewUri,
options options
}); });
......
...@@ -21,6 +21,25 @@ import { ConflictDetector } from 'vs/workbench/services/bulkEdit/browser/conflic ...@@ -21,6 +21,25 @@ import { ConflictDetector } from 'vs/workbench/services/bulkEdit/browser/conflic
import { values } from 'vs/base/common/map'; import { values } from 'vs/base/common/map';
import { localize } from 'vs/nls'; import { localize } from 'vs/nls';
class CheckedStates<T extends object> {
private readonly _onDidChange = new Emitter<T>();
readonly onDidChange: Event<T> = this._onDidChange.event;
private readonly _states = new WeakMap<T, boolean>();
isChecked(obj: T): boolean {
return this._states.get(obj) ?? false;
}
updateChecked(obj: T, value: boolean): void {
if (this._states.get(obj) !== value) {
this._states.set(obj, value);
this._onDidChange.fire(obj);
}
}
}
export class CheckedObject { export class CheckedObject {
private _checked: boolean = true; private _checked: boolean = true;
...@@ -66,7 +85,7 @@ export class BulkFileOperation extends CheckedObject { ...@@ -66,7 +85,7 @@ export class BulkFileOperation extends CheckedObject {
constructor( constructor(
readonly uri: URI, readonly uri: URI,
readonly parent: BulkFileOperations readonly parent: BulkModel
) { ) {
super(parent._onDidChangeCheckedState); super(parent._onDidChangeCheckedState);
} }
...@@ -131,16 +150,18 @@ export class BulkCategory { ...@@ -131,16 +150,18 @@ export class BulkCategory {
} }
} }
export class BulkFileOperations { export class BulkModel {
static async create(accessor: ServicesAccessor, bulkEdit: WorkspaceEdit): Promise<BulkFileOperations> { static async create(accessor: ServicesAccessor, bulkEdit: WorkspaceEdit): Promise<BulkModel> {
const result = accessor.get(IInstantiationService).createInstance(BulkFileOperations, bulkEdit); const result = accessor.get(IInstantiationService).createInstance(BulkModel, bulkEdit);
return await result._init(); return await result._init();
} }
readonly _onDidChangeCheckedState = new Emitter<BulkFileOperation | BulkTextEdit>(); readonly _onDidChangeCheckedState = new Emitter<BulkFileOperation | BulkTextEdit>();
readonly onDidChangeCheckedState: Event<BulkFileOperation | BulkTextEdit> = this._onDidChangeCheckedState.event; readonly onDidChangeCheckedState: Event<BulkFileOperation | BulkTextEdit> = this._onDidChangeCheckedState.event;
readonly checked = new CheckedStates<WorkspaceFileEdit | WorkspaceTextEdit>();
readonly fileOperations: BulkFileOperation[] = []; readonly fileOperations: BulkFileOperation[] = [];
readonly categories: BulkCategory[] = []; readonly categories: BulkCategory[] = [];
readonly conflicts: ConflictDetector; readonly conflicts: ConflictDetector;
...@@ -217,6 +238,8 @@ export class BulkFileOperations { ...@@ -217,6 +238,8 @@ export class BulkFileOperations {
continue; continue;
} }
this.checked.updateChecked(edit, !edit.metadata?.needsConfirmation);
const insert = (map: Map<string, BulkFileOperation>) => { const insert = (map: Map<string, BulkFileOperation>) => {
let key = uri.toString(); let key = uri.toString();
let operation = map.get(key); let operation = map.get(key);
...@@ -311,7 +334,7 @@ export class BulkEditPreviewProvider implements ITextModelContentProvider { ...@@ -311,7 +334,7 @@ export class BulkEditPreviewProvider implements ITextModelContentProvider {
private readonly _modelPreviewEdits = new Map<string, IIdentifiedSingleEditOperation[]>(); private readonly _modelPreviewEdits = new Map<string, IIdentifiedSingleEditOperation[]>();
constructor( constructor(
private readonly _operations: BulkFileOperations, private readonly _operations: BulkModel,
@IModeService private readonly _modeService: IModeService, @IModeService private readonly _modeService: IModeService,
@IModelService private readonly _modelService: IModelService, @IModelService private readonly _modelService: IModelService,
@ITextModelService private readonly _textModelResolverService: ITextModelService @ITextModelService private readonly _textModelResolverService: ITextModelService
......
...@@ -7,7 +7,6 @@ import { IAsyncDataSource, ITreeRenderer, ITreeNode } from 'vs/base/browser/ui/t ...@@ -7,7 +7,6 @@ import { IAsyncDataSource, ITreeRenderer, ITreeNode } from 'vs/base/browser/ui/t
import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { ITextModelService } from 'vs/editor/common/services/resolverService';
import { FuzzyScore, createMatches } from 'vs/base/common/filters'; import { FuzzyScore, createMatches } from 'vs/base/common/filters';
import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels';
import { URI } from 'vs/base/common/uri';
import { HighlightedLabel, IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { HighlightedLabel, IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
import { IIdentityProvider, IListVirtualDelegate, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list'; import { IIdentityProvider, IListVirtualDelegate, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list';
import { Range } from 'vs/editor/common/core/range'; import { Range } from 'vs/editor/common/core/range';
...@@ -15,7 +14,7 @@ import * as dom from 'vs/base/browser/dom'; ...@@ -15,7 +14,7 @@ import * as dom from 'vs/base/browser/dom';
import { ITextModel } from 'vs/editor/common/model'; import { ITextModel } from 'vs/editor/common/model';
import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle';
import { TextModel } from 'vs/editor/common/model/textModel'; import { TextModel } from 'vs/editor/common/model/textModel';
import { BulkFileOperations, BulkFileOperation, BulkTextEdit, BulkCategory } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview'; import { BulkModel, BulkFileOperation, BulkTextEdit, BulkCategory } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview';
import { FileKind } from 'vs/platform/files/common/files'; import { FileKind } from 'vs/platform/files/common/files';
import { localize } from 'vs/nls'; import { localize } from 'vs/nls';
import { ILabelService } from 'vs/platform/label/common/label'; import { ILabelService } from 'vs/platform/label/common/label';
...@@ -29,14 +28,10 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService'; ...@@ -29,14 +28,10 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService';
export class FileElement { export class FileElement {
readonly uri: URI;
constructor( constructor(
readonly parent: BulkCategory | undefined, readonly parent: BulkCategory | undefined,
readonly edit: BulkFileOperation readonly edit: BulkFileOperation
) { ) { }
this.uri = edit.uri;
}
} }
export class TextEditElement { export class TextEditElement {
...@@ -52,13 +47,13 @@ export type BulkEditElement = BulkCategory | FileElement | TextEditElement; ...@@ -52,13 +47,13 @@ export type BulkEditElement = BulkCategory | FileElement | TextEditElement;
// --- DATA SOURCE // --- DATA SOURCE
export class BulkEditDataSource implements IAsyncDataSource<BulkFileOperations, BulkEditElement> { export class BulkEditDataSource implements IAsyncDataSource<BulkModel, BulkEditElement> {
public groupByFile: boolean = true; public groupByFile: boolean = true;
constructor(@ITextModelService private readonly _textModelService: ITextModelService) { } constructor(@ITextModelService private readonly _textModelService: ITextModelService) { }
hasChildren(element: BulkFileOperations | BulkEditElement): boolean { hasChildren(element: BulkModel | BulkEditElement): boolean {
if (element instanceof FileElement) { if (element instanceof FileElement) {
return element.edit.textEdits.length > 0; return element.edit.textEdits.length > 0;
} }
...@@ -68,10 +63,10 @@ export class BulkEditDataSource implements IAsyncDataSource<BulkFileOperations, ...@@ -68,10 +63,10 @@ export class BulkEditDataSource implements IAsyncDataSource<BulkFileOperations,
return true; return true;
} }
async getChildren(element: BulkFileOperations | BulkEditElement): Promise<BulkEditElement[]> { async getChildren(element: BulkModel | BulkEditElement): Promise<BulkEditElement[]> {
// root -> file/text edits // root -> file/text edits
if (element instanceof BulkFileOperations) { if (element instanceof BulkModel) {
return this.groupByFile return this.groupByFile
? element.fileOperations.map(op => new FileElement(undefined, op)) ? element.fileOperations.map(op => new FileElement(undefined, op))
: element.categories; : element.categories;
...@@ -209,9 +204,9 @@ export class BulkEditIdentityProvider implements IIdentityProvider<BulkEditEleme ...@@ -209,9 +204,9 @@ export class BulkEditIdentityProvider implements IIdentityProvider<BulkEditEleme
getId(element: BulkEditElement): { toString(): string; } { getId(element: BulkEditElement): { toString(): string; } {
if (element instanceof FileElement) { if (element instanceof FileElement) {
return element.uri + JSON.stringify(element.parent?.metadata); return element.edit.uri + JSON.stringify(element.parent?.metadata);
} else if (element instanceof TextEditElement) { } else if (element instanceof TextEditElement) {
return element.parent.uri.toString() + JSON.stringify(element.edit.textEdit); return element.parent.edit.uri.toString() + JSON.stringify(element.edit.textEdit);
} else { } else {
return JSON.stringify(element.metadata); return JSON.stringify(element.metadata);
} }
...@@ -340,12 +335,12 @@ class FileElementTemplate { ...@@ -340,12 +335,12 @@ class FileElementTemplate {
this._details.innerText = localize( this._details.innerText = localize(
'detail.rename', "(renaming from {0})", 'detail.rename', "(renaming from {0})",
this._labelService.getUriLabel(element.uri, { relative: true }) this._labelService.getUriLabel(element.edit.uri, { relative: true })
); );
} else { } else {
// create, delete, edit: NAME // create, delete, edit: NAME
this._label.setFile(element.uri, { this._label.setFile(element.edit.uri, {
matches: createMatches(score), matches: createMatches(score),
fileKind: FileKind.FILE, fileKind: FileKind.FILE,
fileDecorations: { colors: true, badges: false }, fileDecorations: { colors: true, badges: false },
...@@ -489,7 +484,7 @@ export class BulkEditNaviLabelProvider implements IKeyboardNavigationLabelProvid ...@@ -489,7 +484,7 @@ export class BulkEditNaviLabelProvider implements IKeyboardNavigationLabelProvid
getKeyboardNavigationLabel(element: BulkEditElement) { getKeyboardNavigationLabel(element: BulkEditElement) {
if (element instanceof FileElement) { if (element instanceof FileElement) {
return basename(element.uri); return basename(element.edit.uri);
} else if (element instanceof BulkCategory) { } else if (element instanceof BulkCategory) {
return element.metadata.label; return element.metadata.label;
} }
......
...@@ -13,7 +13,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti ...@@ -13,7 +13,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
import { IModelService } from 'vs/editor/common/services/modelService'; import { IModelService } from 'vs/editor/common/services/modelService';
import type { WorkspaceEdit } from 'vs/editor/common/modes'; import type { WorkspaceEdit } from 'vs/editor/common/modes';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { BulkFileOperations } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview'; import { BulkModel } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview';
suite('BulkEditPreview', function () { suite('BulkEditPreview', function () {
...@@ -54,7 +54,7 @@ suite('BulkEditPreview', function () { ...@@ -54,7 +54,7 @@ suite('BulkEditPreview', function () {
] ]
}; };
const ops = await instaService.invokeFunction(BulkFileOperations.create, edit); const ops = await instaService.invokeFunction(BulkModel.create, edit);
assert.equal(ops.fileOperations.length, 1); assert.equal(ops.fileOperations.length, 1);
assert.equal(ops.fileOperations[0].isChecked(), false); assert.equal(ops.fileOperations[0].isChecked(), false);
}); });
...@@ -68,7 +68,7 @@ suite('BulkEditPreview', function () { ...@@ -68,7 +68,7 @@ suite('BulkEditPreview', function () {
] ]
}; };
const ops = await instaService.invokeFunction(BulkFileOperations.create, edit); const ops = await instaService.invokeFunction(BulkModel.create, edit);
assert.equal(ops.categories.length, 2); assert.equal(ops.categories.length, 2);
assert.equal(ops.categories[0].metadata.label, 'uri1'); // unconfirmed! assert.equal(ops.categories[0].metadata.label, 'uri1'); // unconfirmed!
assert.equal(ops.categories[1].metadata.label, 'uri2'); assert.equal(ops.categories[1].metadata.label, 'uri2');
...@@ -83,7 +83,7 @@ suite('BulkEditPreview', function () { ...@@ -83,7 +83,7 @@ suite('BulkEditPreview', function () {
] ]
}; };
const ops = await instaService.invokeFunction(BulkFileOperations.create, edit); const ops = await instaService.invokeFunction(BulkModel.create, edit);
assert.equal(ops.categories.length, 1); assert.equal(ops.categories.length, 1);
assert.equal(ops.categories[0].metadata.label, 'uri1'); // unconfirmed! assert.equal(ops.categories[0].metadata.label, 'uri1'); // unconfirmed!
assert.equal(ops.categories[0].metadata.label, 'uri1'); assert.equal(ops.categories[0].metadata.label, 'uri1');
...@@ -98,7 +98,7 @@ suite('BulkEditPreview', function () { ...@@ -98,7 +98,7 @@ suite('BulkEditPreview', function () {
] ]
}; };
const ops = await instaService.invokeFunction(BulkFileOperations.create, edit); const ops = await instaService.invokeFunction(BulkModel.create, edit);
assert.equal(ops.categories.length, 2); assert.equal(ops.categories.length, 2);
const [first, second] = ops.categories; const [first, second] = ops.categories;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册