Skip to content

Commit 6ff4290

Browse files
committed
Add ViewModelEventDispatcher
1 parent a1ed386 commit 6ff4290

12 files changed

Lines changed: 173 additions & 205 deletions

File tree

src/vs/editor/browser/controller/textAreaHandler.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -258,14 +258,13 @@ export class TextAreaHandler extends ViewPart {
258258
const lineNumber = this._selections[0].startLineNumber;
259259
const column = this._selections[0].startColumn - (e.moveOneCharacterLeft ? 1 : 0);
260260

261-
this._context.privateViewEventBus.emit(new viewEvents.ViewRevealRangeRequestEvent(
261+
this._context.model.revealRange(
262262
'keyboard',
263+
true,
263264
new Range(lineNumber, column, lineNumber, column),
264-
null,
265265
viewEvents.VerticalRevealType.Simple,
266-
true,
267266
ScrollType.Immediate
268-
));
267+
);
269268

270269
// Find range pixel position
271270
const visibleRange = this._viewHelper.visibleRangeForPositionRelativeToEditor(lineNumber, column);
@@ -308,12 +307,10 @@ export class TextAreaHandler extends ViewPart {
308307

309308
this._register(this._textAreaInput.onFocus(() => {
310309
this._context.model.setHasFocus(true);
311-
this._context.privateViewEventBus.emit(new viewEvents.ViewFocusChangedEvent(true));
312310
}));
313311

314312
this._register(this._textAreaInput.onBlur(() => {
315313
this._context.model.setHasFocus(false);
316-
this._context.privateViewEventBus.emit(new viewEvents.ViewFocusChangedEvent(false));
317314
}));
318315
}
319316

src/vs/editor/browser/view/viewImpl.ts

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ import { Range } from 'vs/editor/common/core/range';
4242
import { IConfiguration, ScrollType } from 'vs/editor/common/editorCommon';
4343
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
4444
import { ViewContext } from 'vs/editor/common/view/viewContext';
45-
import { ViewEventDispatcher } from 'vs/editor/common/view/viewEventDispatcher';
4645
import * as viewEvents from 'vs/editor/common/view/viewEvents';
4746
import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
4847
import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler';
@@ -64,8 +63,6 @@ export interface IOverlayWidgetData {
6463

6564
export class View extends ViewEventHandler {
6665

67-
private readonly eventDispatcher: ViewEventDispatcher;
68-
6966
private _scrollbar: EditorScrollbar;
7067
private readonly _context: ViewContext;
7168
private _selections: Selection[];
@@ -107,18 +104,15 @@ export class View extends ViewEventHandler {
107104

108105
const viewController = new ViewController(configuration, model, this.outgoingEvents, commandDelegate);
109106

110-
// The event dispatcher will always go through _renderOnce before dispatching any events
111-
this.eventDispatcher = new ViewEventDispatcher((callback: () => void) => this._renderOnce(callback));
107+
// The view context is passed on to most classes (basically to reduce param. counts in ctors)
108+
this._context = new ViewContext(configuration, themeService.getColorTheme(), model);
112109

113110
// Ensure the view is the first event handler in order to update the layout
114-
this.eventDispatcher.addEventHandler(this);
115-
116-
// The view context is passed on to most classes (basically to reduce param. counts in ctors)
117-
this._context = new ViewContext(configuration, themeService.getColorTheme(), model, this.eventDispatcher);
111+
this._context.addEventHandler(this);
118112

119113
this._register(themeService.onDidColorThemeChange(theme => {
120114
this._context.theme.update(theme);
121-
this.eventDispatcher.emit(new viewEvents.ViewThemeChangedEvent());
115+
this._context.model.onDidColorThemeChange();
122116
this.render(true, false);
123117
}));
124118

@@ -224,10 +218,6 @@ export class View extends ViewEventHandler {
224218

225219
// Pointer handler
226220
this.pointerHandler = this._register(new PointerHandler(this._context, viewController, this.createPointerHandlerHelper()));
227-
228-
this._register(model.addViewEventListener((events: viewEvents.ViewEvent[]) => {
229-
this.eventDispatcher.emitMany(events);
230-
}));
231221
}
232222

233223
private _flushAccumulatedAndRenderNow(): void {
@@ -300,7 +290,10 @@ export class View extends ViewEventHandler {
300290
}
301291

302292
// --- begin event handlers
303-
293+
public handleEvents(events: viewEvents.ViewEvent[]): void {
294+
super.handleEvents(events);
295+
this._scheduleRender();
296+
}
304297
public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean {
305298
this.domNode.setClassName(this.getEditorClassName());
306299
this._applyLayout();
@@ -340,7 +333,7 @@ export class View extends ViewEventHandler {
340333
this._renderAnimationFrame = null;
341334
}
342335

343-
this.eventDispatcher.removeEventHandler(this);
336+
this._context.removeEventHandler(this);
344337
this.outgoingEvents.dispose();
345338

346339
this.viewLines.dispose();
@@ -354,12 +347,6 @@ export class View extends ViewEventHandler {
354347
super.dispose();
355348
}
356349

357-
private _renderOnce<T>(callback: () => T): T {
358-
const r = safeInvokeNoArg(callback);
359-
this._scheduleRender();
360-
return r;
361-
}
362-
363350
private _scheduleRender(): void {
364351
if (this._renderAnimationFrame === null) {
365352
this._renderAnimationFrame = dom.runAtThisOrScheduleAtNextAnimationFrame(this._onRenderScheduled.bind(this), 100);
@@ -477,13 +464,9 @@ export class View extends ViewEventHandler {
477464
}
478465

479466
public change(callback: (changeAccessor: IViewZoneChangeAccessor) => any): boolean {
480-
return this._renderOnce(() => {
481-
const zonesHaveChanged = this.viewZones.changeViewZones(callback);
482-
if (zonesHaveChanged) {
483-
this._context.privateViewEventBus.emit(new viewEvents.ViewZonesChangedEvent());
484-
}
485-
return zonesHaveChanged;
486-
});
467+
const hadAChange = this.viewZones.changeViewZones(callback);
468+
this._scheduleRender();
469+
return hadAChange;
487470
}
488471

489472
public render(now: boolean, everything: boolean): void {

src/vs/editor/browser/viewParts/minimap/minimap.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,14 +1011,13 @@ export class Minimap extends ViewPart implements IMinimapModel {
10111011
if (this._samplingState) {
10121012
lineNumber = this._samplingState.minimapLines[lineNumber - 1];
10131013
}
1014-
this._context.privateViewEventBus.emit(new viewEvents.ViewRevealRangeRequestEvent(
1014+
this._context.model.revealRange(
10151015
'mouse',
1016+
false,
10161017
new Range(lineNumber, 1, lineNumber, 1),
1017-
null,
10181018
viewEvents.VerticalRevealType.Center,
1019-
false,
10201019
ScrollType.Smooth
1021-
));
1020+
);
10221021
}
10231022

10241023
public setScrollTop(scrollTop: number): void {

src/vs/editor/browser/viewParts/viewZones/viewZones.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,6 @@ export class ViewZones extends ViewPart {
222222
changeAccessor.addZone = invalidFunc;
223223
changeAccessor.removeZone = invalidFunc;
224224
changeAccessor.layoutZone = invalidFunc;
225-
226-
return zonesHaveChanged;
227225
});
228226

229227
return zonesHaveChanged;

src/vs/editor/common/view/viewContext.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { IConfiguration } from 'vs/editor/common/editorCommon';
7-
import { ViewEventDispatcher } from 'vs/editor/common/view/viewEventDispatcher';
87
import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler';
98
import { IViewLayout, IViewModel } from 'vs/editor/common/viewModel/viewModel';
109
import { IColorTheme, ThemeType } from 'vs/platform/theme/common/themeService';
@@ -37,27 +36,24 @@ export class ViewContext {
3736
public readonly configuration: IConfiguration;
3837
public readonly model: IViewModel;
3938
public readonly viewLayout: IViewLayout;
40-
public readonly privateViewEventBus: ViewEventDispatcher;
4139
public readonly theme: EditorTheme;
4240

4341
constructor(
4442
configuration: IConfiguration,
4543
theme: IColorTheme,
46-
model: IViewModel,
47-
privateViewEventBus: ViewEventDispatcher
44+
model: IViewModel
4845
) {
4946
this.configuration = configuration;
5047
this.theme = new EditorTheme(theme);
5148
this.model = model;
5249
this.viewLayout = model.viewLayout;
53-
this.privateViewEventBus = privateViewEventBus;
5450
}
5551

5652
public addEventHandler(eventHandler: ViewEventHandler): void {
57-
this.privateViewEventBus.addEventHandler(eventHandler);
53+
this.model.addViewEventHandler(eventHandler);
5854
}
5955

6056
public removeEventHandler(eventHandler: ViewEventHandler): void {
61-
this.privateViewEventBus.removeEventHandler(eventHandler);
57+
this.model.removeViewEventHandler(eventHandler);
6258
}
6359
}

src/vs/editor/common/view/viewEventDispatcher.ts

Lines changed: 0 additions & 92 deletions
This file was deleted.

src/vs/editor/common/view/viewEvents.ts

Lines changed: 7 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import * as errors from 'vs/base/common/errors';
7-
import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
6+
import { ViewModelEventDispatcher } from 'vs/editor/common/viewModel/viewModelEventDispatcher';
7+
import { Disposable } from 'vs/base/common/lifecycle';
88
import { ScrollEvent } from 'vs/base/common/scrollable';
99
import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions';
1010
import { Range } from 'vs/editor/common/core/range';
@@ -330,27 +330,16 @@ export interface IViewEventListener {
330330
(events: ViewEvent[]): void;
331331
}
332332

333-
export interface IViewEventEmitter {
334-
addViewEventListener(listener: IViewEventListener): IDisposable;
335-
}
336-
337-
export class ViewEventEmitter extends Disposable implements IViewEventEmitter {
338-
private _listeners: IViewEventListener[];
333+
export class ViewEventEmitter extends Disposable {
339334
private _collector: ViewEventsCollector | null;
340335
private _collectorCnt: number;
341336

342337
constructor() {
343338
super();
344-
this._listeners = [];
345339
this._collector = null;
346340
this._collectorCnt = 0;
347341
}
348342

349-
public dispose(): void {
350-
this._listeners = [];
351-
super.dispose();
352-
}
353-
354343
protected _beginEmitViewEvents(): ViewEventsCollector {
355344
this._collectorCnt++;
356345
if (this._collectorCnt === 1) {
@@ -359,45 +348,25 @@ export class ViewEventEmitter extends Disposable implements IViewEventEmitter {
359348
return this._collector!;
360349
}
361350

362-
protected _endEmitViewEvents(): void {
351+
protected _endEmitViewEvents(eventDispatcher: ViewModelEventDispatcher): void {
363352
this._collectorCnt--;
364353
if (this._collectorCnt === 0) {
365354
const events = this._collector!.finalize();
366355
this._collector = null;
367356
if (events.length > 0) {
368-
this._emit(events);
357+
eventDispatcher.emitMany(events);
369358
}
370359
}
371360
}
372361

373-
protected _emitSingleViewEvent(event: ViewEvent): void {
362+
protected _emitSingleViewEvent(eventDispatcher: ViewModelEventDispatcher, event: ViewEvent): void {
374363
try {
375364
const eventsCollector = this._beginEmitViewEvents();
376365
eventsCollector.emit(event);
377366
} finally {
378-
this._endEmitViewEvents();
379-
}
380-
}
381-
382-
private _emit(events: ViewEvent[]): void {
383-
const listeners = this._listeners.slice(0);
384-
for (let i = 0, len = listeners.length; i < len; i++) {
385-
safeInvokeListener(listeners[i], events);
367+
this._endEmitViewEvents(eventDispatcher);
386368
}
387369
}
388-
389-
public addViewEventListener(listener: IViewEventListener): IDisposable {
390-
this._listeners.push(listener);
391-
return toDisposable(() => {
392-
let listeners = this._listeners;
393-
for (let i = 0, len = listeners.length; i < len; i++) {
394-
if (listeners[i] === listener) {
395-
listeners.splice(i, 1);
396-
break;
397-
}
398-
}
399-
});
400-
}
401370
}
402371

403372
export class ViewEventsCollector {
@@ -421,11 +390,3 @@ export class ViewEventsCollector {
421390
}
422391

423392
}
424-
425-
function safeInvokeListener(listener: IViewEventListener, events: ViewEvent[]): void {
426-
try {
427-
listener(events);
428-
} catch (e) {
429-
errors.onUnexpectedError(e);
430-
}
431-
}

0 commit comments

Comments
 (0)