diff --git a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts
index c1a0c97a1da..38205f5a997 100644
--- a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts
+++ b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts
@@ -13,31 +13,45 @@ import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay';
import { ViewContext } from 'vs/editor/common/view/viewContext';
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
import * as viewEvents from 'vs/editor/common/view/viewEvents';
+import { Position } from 'vs/editor/common/core/position';
export class LineNumbersOverlay extends DynamicViewOverlay {
public static CLASS_NAME = 'line-numbers';
private _context: ViewContext;
+
private _lineHeight: number;
private _renderLineNumbers: boolean;
+ private _renderCustomLineNumbers: (lineNumber: number) => string;
private _renderRelativeLineNumbers: boolean;
private _lineNumbersLeft: number;
private _lineNumbersWidth: number;
+
+ private _lastCursorModelPosition: Position;
private _renderResult: string[];
constructor(context: ViewContext) {
super();
this._context = context;
- this._lineHeight = this._context.configuration.editor.lineHeight;
- this._renderLineNumbers = this._context.configuration.editor.viewInfo.renderLineNumbers;
- this._renderRelativeLineNumbers = this._context.configuration.editor.viewInfo.renderRelativeLineNumbers;
- this._lineNumbersLeft = this._context.configuration.editor.layoutInfo.lineNumbersLeft;
- this._lineNumbersWidth = this._context.configuration.editor.layoutInfo.lineNumbersWidth;
+
+ this._readConfig();
+
+ this._lastCursorModelPosition = new Position(1, 1);
this._renderResult = null;
this._context.addEventHandler(this);
}
+ private _readConfig(): void {
+ const config = this._context.configuration.editor;
+ this._lineHeight = config.lineHeight;
+ this._renderLineNumbers = config.viewInfo.renderLineNumbers;
+ this._renderCustomLineNumbers = config.viewInfo.renderCustomLineNumbers;
+ this._renderRelativeLineNumbers = config.viewInfo.renderRelativeLineNumbers;
+ this._lineNumbersLeft = config.layoutInfo.lineNumbersLeft;
+ this._lineNumbersWidth = config.layoutInfo.lineNumbersWidth;
+ }
+
public dispose(): void {
this._context.removeEventHandler(this);
this._context = null;
@@ -48,20 +62,12 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
// --- begin event handlers
public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean {
- if (e.lineHeight) {
- this._lineHeight = this._context.configuration.editor.lineHeight;
- }
- if (e.viewInfo) {
- this._renderLineNumbers = this._context.configuration.editor.viewInfo.renderLineNumbers;
- this._renderRelativeLineNumbers = this._context.configuration.editor.viewInfo.renderRelativeLineNumbers;
- }
- if (e.layoutInfo) {
- this._lineNumbersLeft = this._context.configuration.editor.layoutInfo.lineNumbersLeft;
- this._lineNumbersWidth = this._context.configuration.editor.layoutInfo.lineNumbersWidth;
- }
+ this._readConfig();
return true;
}
public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean {
+ this._lastCursorModelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(e.position);
+
if (this._renderRelativeLineNumbers) {
return true;
}
@@ -88,6 +94,28 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
// --- end event handlers
+ private _getLineRenderLineNumber(viewLineNumber: number): string {
+ const modelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1));
+ if (modelPosition.column !== 1) {
+ return '';
+ }
+ let modelLineNumber = modelPosition.lineNumber;
+
+ if (this._renderCustomLineNumbers) {
+ return this._renderCustomLineNumbers(modelLineNumber);
+ }
+
+ if (this._renderRelativeLineNumbers) {
+ let diff = Math.abs(this._lastCursorModelPosition.lineNumber - modelLineNumber);
+ if (diff === 0) {
+ return '' + modelLineNumber + '';
+ }
+ return String(diff);
+ }
+
+ return String(modelLineNumber);
+ }
+
public prepareRender(ctx: RenderingContext): void {
if (!this._renderLineNumbers) {
this._renderResult = null;
@@ -103,7 +131,7 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {
let lineIndex = lineNumber - visibleStartLineNumber;
- let renderLineNumber = this._context.model.getLineRenderLineNumber(lineNumber);
+ let renderLineNumber = this._getLineRenderLineNumber(lineNumber);
if (renderLineNumber) {
output[lineIndex] = (
common
diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts
index 19a4b265f78..ab2b17027ac 100644
--- a/src/vs/editor/common/viewModel/viewModel.ts
+++ b/src/vs/editor/common/viewModel/viewModel.ts
@@ -110,7 +110,6 @@ export interface IViewModel {
getLineIndentGuide(lineNumber: number): number;
getLineMinColumn(lineNumber: number): number;
getLineMaxColumn(lineNumber: number): number;
- getLineRenderLineNumber(lineNumber: number): string;
getAllOverviewRulerDecorations(): ViewModelDecoration[];
getValueInRange(range: Range, eol: EndOfLinePreference): string;
diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts
index 7d5ff82c7f0..77521cdacc2 100644
--- a/src/vs/editor/common/viewModel/viewModelImpl.ts
+++ b/src/vs/editor/common/viewModel/viewModelImpl.ts
@@ -100,10 +100,6 @@ export class ViewModel extends Disposable implements IViewModel {
private _isDisposing: boolean;
- private _renderCustomLineNumbers: (lineNumber: number) => string;
- private _renderRelativeLineNumbers: boolean;
- private _lastCursorPosition: Position;
-
private _centeredViewLine: number;
private _listeners: IViewModelListener[];
@@ -119,10 +115,6 @@ export class ViewModel extends Disposable implements IViewModel {
this.coordinatesConverter = new CoordinatesConverter(this.lines);
- this._lastCursorPosition = new Position(1, 1);
- this._renderCustomLineNumbers = this.configuration.editor.viewInfo.renderCustomLineNumbers;
- this._renderRelativeLineNumbers = this.configuration.editor.viewInfo.renderRelativeLineNumbers;
-
this._centeredViewLine = -1;
this.decorations = new ViewModelDecorations(this.editorId, this.model, this.configuration, this.coordinatesConverter);
@@ -230,8 +222,44 @@ export class ViewModel extends Disposable implements IViewModel {
return lineMappingChanged;
}
- public addEventSource(eventSource: Cursor): void {
- this._register(eventSource.addBulkListener((events: EmitterEvent[]) => this.onEvents(events)));
+ public addEventSource(cursor: Cursor): void {
+ this._register(cursor.addBulkListener((events: EmitterEvent[]) => {
+ const eventsCollector = new ViewEventsCollector();
+
+ for (let i = 0, len = events.length; i < len; i++) {
+ const _e = events[i];
+ const type = _e.type;
+ const data = _e.data;
+
+ switch (type) {
+ case CursorEventType.CursorPositionChanged: {
+ const e = data;
+ this.cursors.onCursorPositionChanged(eventsCollector, e);
+ break;
+ }
+ case CursorEventType.CursorSelectionChanged: {
+ const e = data;
+ this.cursors.onCursorSelectionChanged(eventsCollector, e);
+ break;
+ }
+ case CursorEventType.CursorRevealRange: {
+ const e = data;
+ this.cursors.onCursorRevealRange(eventsCollector, e);
+ break;
+ }
+ case CursorEventType.CursorScrollRequest: {
+ const e = data;
+ this.cursors.onCursorScrollRequest(eventsCollector, e);
+ break;
+ }
+ default:
+ console.info('View received unknown event: ');
+ console.info(type, data);
+ }
+ }
+
+ this._emit(eventsCollector.finalize());
+ }));
}
private onEvents(events: EmitterEvent[]): void {
@@ -389,35 +417,11 @@ export class ViewModel extends Disposable implements IViewModel {
// Ignore, since the editor will take care of this and destroy the view shortly
break;
}
- case CursorEventType.CursorPositionChanged: {
- const e = data;
- this.cursors.onCursorPositionChanged(eventsCollector, e);
- this._lastCursorPosition = e.position;
- break;
- }
- case CursorEventType.CursorSelectionChanged: {
- const e = data;
- this.cursors.onCursorSelectionChanged(eventsCollector, e);
- break;
- }
- case CursorEventType.CursorRevealRange: {
- const e = data;
- this.cursors.onCursorRevealRange(eventsCollector, e);
- break;
- }
- case CursorEventType.CursorScrollRequest: {
- const e = data;
- this.cursors.onCursorScrollRequest(eventsCollector, e);
- break;
- }
case ConfigurationChanged: {
const e = data;
revealPreviousCenteredModelRange = this._onWrappingIndentChange(eventsCollector, this.configuration.editor.wrappingInfo.wrappingIndent) || revealPreviousCenteredModelRange;
revealPreviousCenteredModelRange = this._onWrappingColumnChange(eventsCollector, this.configuration.editor.wrappingInfo.wrappingColumn, this.configuration.editor.fontInfo.typicalFullwidthCharacterWidth / this.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth) || revealPreviousCenteredModelRange;
- this._renderCustomLineNumbers = this.configuration.editor.viewInfo.renderCustomLineNumbers;
- this._renderRelativeLineNumbers = this.configuration.editor.viewInfo.renderRelativeLineNumbers;
-
if (e.readOnly) {
// Must read again all decorations due to readOnly filtering
this.decorations.reset();
@@ -491,28 +495,6 @@ export class ViewModel extends Disposable implements IViewModel {
return result + 2;
}
- public getLineRenderLineNumber(viewLineNumber: number): string {
- let modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1));
- if (modelPosition.column !== 1) {
- return '';
- }
- let modelLineNumber = modelPosition.lineNumber;
-
- if (this._renderCustomLineNumbers) {
- return this._renderCustomLineNumbers(modelLineNumber);
- }
-
- if (this._renderRelativeLineNumbers) {
- let diff = Math.abs(this._lastCursorPosition.lineNumber - modelLineNumber);
- if (diff === 0) {
- return '' + modelLineNumber + '';
- }
- return String(diff);
- }
-
- return String(modelLineNumber);
- }
-
public getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[] {
return this.decorations.getDecorationsViewportData(visibleRange).decorations;
}