Simplification in cursor eventing

This commit is contained in:
Alex Dima 2017-05-22 16:40:04 +02:00
parent 9f896956eb
commit 94c647f246
5 changed files with 22 additions and 43 deletions

View file

@ -279,16 +279,17 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo
}
}
private _sendRevealRange(range: Range, verticalType: VerticalRevealType, revealHorizontal: boolean): void {
private _sendRevealRange(modelRange: Range, verticalType: VerticalRevealType, revealHorizontal: boolean): void {
if (!this.model || !this.cursor) {
return;
}
if (!Range.isIRange(range)) {
if (!Range.isIRange(modelRange)) {
throw new Error('Invalid arguments');
}
let validatedRange = this.model.validateRange(range);
const validatedModelRange = this.model.validateRange(modelRange);
const viewRange = this.viewModel.coordinatesConverter.convertModelRangeToViewRange(validatedModelRange);
this.cursor.emitCursorRevealRange(validatedRange, null, verticalType, revealHorizontal);
this.cursor.emitCursorRevealRange(viewRange, verticalType, revealHorizontal);
}
public revealLine(lineNumber: number): void {

View file

@ -1405,7 +1405,9 @@ export namespace CoreNavigationCommands {
}
}
cursors.revealRange(false, range, null, revealAt);
const viewRange = cursors.context.convertModelRangeToViewRange(range);
cursors.revealRange(false, viewRange, revealAt);
}
});

View file

@ -204,8 +204,8 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
this._revealRange(target, viewEvents.VerticalRevealType.Simple, horizontal);
}
public revealRange(revealHorizontal: boolean, modelRange: Range, viewRange: Range, verticalType: viewEvents.VerticalRevealType) {
this.emitCursorRevealRange(modelRange, viewRange, verticalType, revealHorizontal);
public revealRange(revealHorizontal: boolean, viewRange: Range, verticalType: viewEvents.VerticalRevealType) {
this.emitCursorRevealRange(viewRange, verticalType, revealHorizontal);
}
public scrollTo(desiredScrollTop: number): void {
@ -368,19 +368,11 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
return false;
}
this._emitStateChanged(source, reason);
return true;
}
private _emitStateChanged(source: string, reason: CursorChangeReason): void {
source = source || 'keyboard';
const positions = this._cursors.getPositions();
let isInEditableRange: boolean = true;
if (this._model.hasEditableRange()) {
const editableRange = this._model.getEditableRange();
if (!editableRange.containsPosition(positions[0])) {
if (!editableRange.containsPosition(newState.cursorState[0].modelState.position)) {
isInEditableRange = false;
}
}
@ -392,47 +384,40 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
this._emit([new viewEvents.ViewCursorStateChangedEvent(viewSelections, isInEditableRange)]);
// Only after the view has been notified, let the rest of the world know...
this._onDidChange.fire(new CursorStateChangedEvent(selections, source, reason));
this._onDidChange.fire(new CursorStateChangedEvent(selections, source || 'keyboard', reason));
return true;
}
private _revealRange(revealTarget: RevealTarget, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean): void {
const positions = this._cursors.getPositions();
const viewPositions = this._cursors.getViewPositions();
let position = positions[0];
let viewPosition = viewPositions[0];
if (revealTarget === RevealTarget.TopMost) {
for (let i = 1; i < positions.length; i++) {
if (positions[i].isBefore(position)) {
position = positions[i];
for (let i = 1; i < viewPositions.length; i++) {
if (viewPositions[i].isBefore(viewPosition)) {
viewPosition = viewPositions[i];
}
}
} else if (revealTarget === RevealTarget.BottomMost) {
for (let i = 1; i < positions.length; i++) {
if (position.isBeforeOrEqual(positions[i])) {
position = positions[i];
for (let i = 1; i < viewPositions.length; i++) {
if (viewPosition.isBeforeOrEqual(viewPositions[i])) {
viewPosition = viewPositions[i];
}
}
} else {
if (positions.length > 1) {
if (viewPositions.length > 1) {
// no revealing!
return;
}
}
const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column);
const viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);
this.emitCursorRevealRange(range, viewRange, verticalType, revealHorizontal);
this.emitCursorRevealRange(viewRange, verticalType, revealHorizontal);
}
public emitCursorRevealRange(range: Range, viewRange: Range, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean) {
// Ensure event has viewRange
if (!viewRange) {
viewRange = this.context.convertModelRangeToViewRange(range);
}
public emitCursorRevealRange(viewRange: Range, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean) {
this._emit([new viewEvents.ViewRevealRangeRequestEvent(viewRange, verticalType, revealHorizontal)]);
}

View file

@ -60,15 +60,6 @@ export class CursorCollection {
return result;
}
public getPositions(): Position[] {
let result: Position[] = [];
result[0] = this.primaryCursor.modelState.position;
for (let i = 0, len = this.secondaryCursors.length; i < len; i++) {
result[i + 1] = this.secondaryCursors[i].modelState.position;
}
return result;
}
public getViewPositions(): Position[] {
let result: Position[] = [];
result[0] = this.primaryCursor.viewState.position;

View file

@ -42,7 +42,7 @@ export interface ICursors {
setStates(source: string, reason: CursorChangeReason, states: CursorState[]): void;
reveal(horizontal: boolean, target: RevealTarget): void;
revealRange(revealHorizontal: boolean, modelRange: Range, viewRange: Range, verticalType: VerticalRevealType): void;
revealRange(revealHorizontal: boolean, viewRange: Range, verticalType: VerticalRevealType): void;
scrollTo(desiredScrollTop: number): void;
}