Editor scroll by wrapped lines, lines, page, half page #9609

This commit is contained in:
Sandeep Somavarapu 2016-08-04 17:56:48 +02:00
parent 63765cc2d4
commit 7abe1a6427
4 changed files with 59 additions and 7 deletions

View file

@ -1455,26 +1455,46 @@ export class Cursor extends EventEmitter {
private _editorScroll(ctx: IMultipleCursorOperationContext): boolean {
let editorScrollArg: editorCommon.EditorScrollArguments = ctx.eventData;
let value = editorScrollArg.value || 1;
editorScrollArg.value = editorScrollArg.value || 1;
switch (editorScrollArg.to) {
case editorCommon.EditorScrollDirection.Up:
value = -(value);
case editorCommon.EditorScrollDirection.Down:
ctx.requestScrollDeltaLines = value * (editorCommon.EditorScrollByUnit.Page === editorScrollArg.by ? this.cursors.getAll()[0].getPageSize() : 1);
return this._scrollUpOrDown(editorScrollArg, ctx);
}
return true;
}
private _scrollUpOrDown(editorScrollArg: editorCommon.EditorScrollArguments, ctx: IMultipleCursorOperationContext): boolean {
let up = editorScrollArg.to === editorCommon.EditorScrollDirection.Up;
let noOfLines = 1;
let cursor: OneCursor = this.cursors.getAll()[0];
switch (editorScrollArg.by) {
case editorCommon.EditorScrollByUnit.WrappedLine:
noOfLines = editorScrollArg.value;
break;
case editorCommon.EditorScrollByUnit.Line:
noOfLines = (up ? cursor.getDeltaViewLinesToRevealModelLineBeforeViewPortTop(editorScrollArg.value) : cursor.getDeltaViewLinesToRevealModelLineAfteriewPortBottom(editorScrollArg.value)) || 1;
break;
case editorCommon.EditorScrollByUnit.Page:
noOfLines = cursor.getPageSize() * editorScrollArg.value;
break;
case editorCommon.EditorScrollByUnit.HalfPage:
noOfLines = Math.round(this.cursors.getAll()[0].getPageSize() / 2) * editorScrollArg.value;
break;
}
ctx.requestScrollDeltaLines = (up ? -1 : 1) * noOfLines;
return true;
}
private _scrollUp(isPaged: boolean, ctx: IMultipleCursorOperationContext): boolean {
ctx.eventData = <editorCommon.EditorScrollArguments>{ to: editorCommon.EditorScrollDirection.Up, value: 1 };
ctx.eventData.by = isPaged ? editorCommon.EditorScrollByUnit.Page : editorCommon.EditorScrollByUnit.Line;
ctx.eventData.by = isPaged ? editorCommon.EditorScrollByUnit.Page : editorCommon.EditorScrollByUnit.WrappedLine;
return this._editorScroll(ctx);
}
private _scrollDown(isPaged: boolean, ctx: IMultipleCursorOperationContext): boolean {
ctx.eventData = <editorCommon.EditorScrollArguments>{ to: editorCommon.EditorScrollDirection.Down, value: 1 };
ctx.eventData.by = isPaged ? editorCommon.EditorScrollByUnit.Page : editorCommon.EditorScrollByUnit.Line;
ctx.eventData.by = isPaged ? editorCommon.EditorScrollByUnit.Page : editorCommon.EditorScrollByUnit.WrappedLine;
return this._editorScroll(ctx);
}

View file

@ -518,6 +518,34 @@ export class OneCursor {
}
// -- model
public getDeltaViewLinesToRevealModelLineBeforeViewPortTop(noOfLinesBeforeTop: number): number {
let visibleModelRange = this.viewModelHelper.getCurrentVisibleModelRangeInViewPort();
let visibleViewRange = this.viewModelHelper.getCurrentVisibleViewRangeInViewPort();
let startColumn = this.model.getLineMinColumn(visibleModelRange.startLineNumber);
let startViewLineOfModelLine = this.viewModelHelper.convertModelPositionToViewPosition(visibleModelRange.startLineNumber, startColumn).lineNumber;
// Reveal first line if it is partially visible
let revealLineNumber = (startViewLineOfModelLine !== visibleViewRange.startLineNumber ? visibleModelRange.startLineNumber : visibleModelRange.startLineNumber - 1) - (noOfLinesBeforeTop - 1);
revealLineNumber = revealLineNumber > 1 ? revealLineNumber : 1;
let revealLineEndColumn = this.model.getLineMinColumn(revealLineNumber);
let revealViewLineNumber = this.viewModelHelper.convertModelPositionToViewPosition(revealLineNumber, revealLineEndColumn).lineNumber;
return visibleViewRange.startLineNumber - revealViewLineNumber;
}
public getDeltaViewLinesToRevealModelLineAfteriewPortBottom(noOfLinesAfterBottom: number): number {
let visibleModelRange = this.viewModelHelper.getCurrentVisibleModelRangeInViewPort();
let visibleViewRange = this.viewModelHelper.getCurrentVisibleViewRangeInViewPort();
let endColumn = this.model.getLineMaxColumn(visibleModelRange.endLineNumber);
let endViewLineOfModelLine = this.viewModelHelper.convertModelPositionToViewPosition(visibleModelRange.endLineNumber, endColumn).lineNumber;
// Reveal last line if it is partially visible
let revealLineNumber = (endViewLineOfModelLine !== visibleViewRange.endLineNumber ? visibleModelRange.endLineNumber : visibleModelRange.endLineNumber + 1) + (noOfLinesAfterBottom - 1);
revealLineNumber = revealLineNumber < this.model.getLineCount() ? revealLineNumber : this.model.getLineCount();
let revealLineEndColumn = this.model.getLineMaxColumn(revealLineNumber);
let revealViewLineNumber = this.viewModelHelper.convertModelPositionToViewPosition(revealLineNumber, revealLineEndColumn).lineNumber;
return revealViewLineNumber - visibleViewRange.endLineNumber;
}
public getLineFromViewPortTop(lineFromTop: number = 1): number {
let visibleRange = this.viewModelHelper.getCurrentVisibleModelRangeInViewPort();
let startColumn = this.model.getLineMinColumn(visibleRange.startLineNumber);

View file

@ -4290,7 +4290,9 @@ export const EditorScrollDirection = {
*/
export const EditorScrollByUnit = {
Line: 'line',
Page: 'page'
WrappedLine: 'wrappedLine',
Page: 'page',
HalfPage: 'halfPage'
};
/**
@ -4366,7 +4368,7 @@ export var CommandDescription = {
\`\`\`
'by': Unit to move. Default is computed based on 'to' value.
\`\`\`
'line', 'page'
'line', 'wrappedLine', page', 'halfPage'
\`\`\`
'value': Number of units to move. Default is '1'.
`,

2
src/vs/monaco.d.ts vendored
View file

@ -3228,7 +3228,9 @@ declare module monaco.editor {
*/
export const EditorScrollByUnit: {
Line: string;
WrappedLine: string;
Page: string;
HalfPage: string;
};
/**