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

more changes

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