Skip to content

Commit a3b932f

Browse files
authored
* Sets focus border for focused editors * Fixes microsoft#205850 * Fixes CI and don't use focus
1 parent 19781f2 commit a3b932f

File tree

4 files changed

+51
-23
lines changed

4 files changed

+51
-23
lines changed

src/vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidget.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ export class MultiDiffEditorWidget extends Disposable {
4646
this._register(recomputeInitiallyAndOnChange(this._widgetImpl));
4747
}
4848

49-
public reveal(resource: IMultiDiffResource, range: Range): void {
50-
this._widgetImpl.get().reveal(resource, range);
49+
public reveal(resource: IMultiDiffResource, options?: RevealOptions): void {
50+
this._widgetImpl.get().reveal(resource, options);
5151
}
5252

5353
public createViewModel(model: IMultiDiffEditorModel): MultiDiffEditorViewModel {
@@ -82,3 +82,8 @@ export class MultiDiffEditorWidget extends Disposable {
8282
return this._widgetImpl.get().tryGetCodeEditor(resource);
8383
}
8484
}
85+
86+
export interface RevealOptions {
87+
range?: Range;
88+
highlight: boolean;
89+
}

src/vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidgetImpl.ts

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,24 @@ import { Disposable, IReference, toDisposable } from 'vs/base/common/lifecycle';
1010
import { IObservable, IReader, autorun, autorunWithStore, derived, derivedObservableWithCache, derivedWithStore, observableFromEvent, observableValue } from 'vs/base/common/observable';
1111
import { ITransaction, disposableObservableValue, globalTransaction, transaction } from 'vs/base/common/observableInternal/base';
1212
import { Scrollable, ScrollbarVisibility } from 'vs/base/common/scrollable';
13+
import { URI } from 'vs/base/common/uri';
1314
import 'vs/css!./style';
15+
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1416
import { ObservableElementSizeObserver } from 'vs/editor/browser/widget/diffEditor/utils';
17+
import { RevealOptions } from 'vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidget';
1518
import { IWorkbenchUIElementFactory } from 'vs/editor/browser/widget/multiDiffEditorWidget/workbenchUIElementFactory';
1619
import { OffsetRange } from 'vs/editor/common/core/offsetRange';
20+
import { IRange } from 'vs/editor/common/core/range';
21+
import { ISelection, Selection } from 'vs/editor/common/core/selection';
22+
import { IDiffEditor } from 'vs/editor/common/editorCommon';
23+
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
24+
import { ContextKeyValue, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
25+
import { ITextEditorOptions } from 'vs/platform/editor/common/editor';
1726
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
27+
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
1828
import { DiffEditorItemTemplate, TemplateData } from './diffEditorItemTemplate';
1929
import { DocumentDiffItemViewModel, MultiDiffEditorViewModel } from './multiDiffEditorViewModel';
2030
import { ObjectPool } from './objectPool';
21-
import { ContextKeyValue, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
22-
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
23-
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
24-
import { ISelection, Selection } from 'vs/editor/common/core/selection';
25-
import { URI } from 'vs/base/common/uri';
26-
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
27-
import { IDiffEditor } from 'vs/editor/common/editorCommon';
28-
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
29-
import { Range } from 'vs/editor/common/core/range';
30-
import { ITextEditorOptions } from 'vs/platform/editor/common/editor';
3131

3232
export class MultiDiffEditorWidgetImpl extends Disposable {
3333
private readonly _elements = h('div.monaco-component.multiDiffEditor', [
@@ -107,7 +107,6 @@ export class MultiDiffEditorWidgetImpl extends Disposable {
107107
private readonly _workbenchUIElementFactory: IWorkbenchUIElementFactory,
108108
@IContextKeyService private readonly _parentContextKeyService: IContextKeyService,
109109
@IInstantiationService private readonly _parentInstantiationService: IInstantiationService,
110-
@IConfigurationService private readonly _configurationService: IConfigurationService,
111110
) {
112111
super();
113112

@@ -190,8 +189,7 @@ export class MultiDiffEditorWidgetImpl extends Disposable {
190189
this._scrollableElement.setScrollPosition({ scrollLeft: scrollState.left, scrollTop: scrollState.top });
191190
}
192191

193-
// todo@aiday-mar need to reveal the range instead of just the start line number
194-
public reveal(resource: IMultiDiffResource, range: Range): void {
192+
public reveal(resource: IMultiDiffResource, options?: RevealOptions): void {
195193
const viewItems = this._viewItems.get();
196194
let searchCallback: (item: VirtualizedViewItem) => boolean;
197195
if ('original' in resource) {
@@ -200,11 +198,18 @@ export class MultiDiffEditorWidgetImpl extends Disposable {
200198
searchCallback = (item) => item.viewModel.modifiedUri?.toString() === resource.modified.toString();
201199
}
202200
const index = viewItems.findIndex(searchCallback);
203-
let scrollTop = (range.startLineNumber - 1) * this._configurationService.getValue<number>('editor.lineHeight');
201+
let scrollTop = 0;
204202
for (let i = 0; i < index; i++) {
205203
scrollTop += viewItems[i].contentHeight.get() + this._spaceBetweenPx;
206204
}
207205
this._scrollableElement.setScrollPosition({ scrollTop });
206+
207+
const diffEditor = viewItems[index].template.get()?.editor;
208+
const editor = 'original' in resource ? diffEditor?.getOriginalEditor() : diffEditor?.getModifiedEditor();
209+
if (editor && options?.range) {
210+
editor.revealRangeInCenter(options.range);
211+
highlightRange(editor, options.range);
212+
}
208213
}
209214

210215
public getViewState(): IMultiDiffEditorViewState {
@@ -290,6 +295,16 @@ export class MultiDiffEditorWidgetImpl extends Disposable {
290295
}
291296
}
292297

298+
function highlightRange(targetEditor: ICodeEditor, range: IRange) {
299+
const modelNow = targetEditor.getModel();
300+
const decorations = targetEditor.createDecorationsCollection([{ range, options: { description: 'symbol-navigate-action-highlight', className: 'symbolHighlight' } }]);
301+
setTimeout(() => {
302+
if (targetEditor.getModel() === modelNow) {
303+
decorations.clear();
304+
}
305+
}, 350);
306+
}
307+
293308
export interface IMultiDiffEditorViewState {
294309
scrollState: { top: number; left: number };
295310
docStates?: Record<string, IMultiDiffDocState>;
@@ -307,7 +322,7 @@ export interface IMultiDiffEditorOptions extends ITextEditorOptions {
307322
export interface IMultiDiffEditorOptionsViewState {
308323
revealData?: {
309324
resource: IMultiDiffResource;
310-
range: Range;
325+
range?: IRange;
311326
};
312327
}
313328

src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ import { ButtonBar } from 'vs/base/browser/ui/button/button';
3737
import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles';
3838
import { Mutable } from 'vs/base/common/types';
3939
import { IResourceDiffEditorInput } from 'vs/workbench/common/editor';
40-
import { Range } from 'vs/editor/common/core/range';
4140
import { IMultiDiffEditorOptions } from 'vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidgetImpl';
41+
import { IRange } from 'vs/editor/common/core/range';
4242

4343
const enum State {
4444
Data = 'data',
@@ -325,11 +325,15 @@ export class BulkEditPane extends ViewPane {
325325
if (!fileOperations) {
326326
return;
327327
}
328+
329+
let selection: IRange | undefined = undefined;
328330
let fileElement: FileElement;
329331
if (e.element instanceof TextEditElement) {
330332
fileElement = e.element.parent;
333+
selection = e.element.edit.textEdit.textEdit.range;
331334
} else if (e.element instanceof FileElement) {
332335
fileElement = e.element;
336+
selection = e.element.edit.textEdits[0]?.textEdit.textEdit.range;
333337
} else {
334338
// invalid event
335339
return;
@@ -341,7 +345,7 @@ export class BulkEditPane extends ViewPane {
341345
viewState: {
342346
revealData: {
343347
resource: { original: fileElement.edit.uri },
344-
range: new Range(1, 1, 1, 1)
348+
range: selection,
345349
}
346350
}
347351
};

src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { MultiDiffEditorViewModel } from 'vs/editor/browser/widget/multiDiffEdit
2626
import { IMultiDiffEditorOptions, IMultiDiffEditorViewState } from 'vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidgetImpl';
2727
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
2828
import { IDiffEditor } from 'vs/editor/common/editorCommon';
29+
import { Range } from 'vs/editor/common/core/range';
2930

3031
export class MultiDiffEditor extends AbstractEditorWithViewState<IMultiDiffEditorViewState> {
3132
static readonly ID = 'multiDiffEditor';
@@ -80,19 +81,22 @@ export class MultiDiffEditor extends AbstractEditorWithViewState<IMultiDiffEdito
8081
if (viewState) {
8182
this._multiDiffEditorWidget!.setViewState(viewState);
8283
}
83-
this._reveal(options);
84+
this._applyOptions(options);
8485
}
8586

8687
override setOptions(options: IMultiDiffEditorOptions | undefined): void {
87-
this._reveal(options);
88+
this._applyOptions(options);
8889
}
8990

90-
private _reveal(options: IMultiDiffEditorOptions | undefined): void {
91+
private _applyOptions(options: IMultiDiffEditorOptions | undefined): void {
9192
const viewState = options?.viewState;
9293
if (!viewState || !viewState.revealData) {
9394
return;
9495
}
95-
this._multiDiffEditorWidget?.reveal(viewState.revealData.resource, viewState.revealData.range);
96+
this._multiDiffEditorWidget?.reveal(viewState.revealData.resource, {
97+
range: viewState.revealData.range ? Range.lift(viewState.revealData.range) : undefined,
98+
highlight: true
99+
});
96100
}
97101

98102
override async clearInput(): Promise<void> {

0 commit comments

Comments
 (0)