提交 6f94a1fd 编写于 作者: S Sandeep Somavarapu

Implement lineViewTop, lineViewBottom, lineViewCenter

上级 b7cfce2c
......@@ -58,6 +58,7 @@ export interface IView extends IDisposable {
getCodeEditorHelper(): ICodeEditorHelper;
getCenteredRangeInViewport(): Range;
getVisibleRangeInViewport(): Range;
change(callback:(changeAccessor:IViewZoneChangeAccessor) => any): boolean;
getWhitespaces(): editorCommon.IEditorWhitespace[];
......
......@@ -596,6 +596,14 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp
return viewModel.convertViewRangeToModelRange(currentCenteredViewRange);
}
public getVisibleRangeInViewport(): Range {
if (this._isDisposed) {
throw new Error('ViewImpl.getVisibleRangeInViewport: View is disposed');
}
let visibleRange= this.layoutProvider.getLinesViewportData().visibleRange;
return this._context.model.convertViewRangeToModelRange(visibleRange);
}
// public getLineInfoProvider():view.ILineInfoProvider {
// return this.viewLines;
// }
......@@ -921,6 +929,10 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp
this._context.privateViewEventBus.emit(editorCommon.EventType.ViewFocusChanged, this.hasFocus);
}
}
public getLinesViewportData(): ViewLinesViewportData {
return this.layoutProvider.getLinesViewportData();
}
}
function safeInvokeNoArg(func:Function): any {
......
......@@ -159,6 +159,13 @@ export class CodeEditorWidget extends CommonCodeEditor implements editorBrowser.
return this._view.getCenteredRangeInViewport();
}
public getVisibleRangeInViewport(): Range {
if (!this.hasView) {
return null;
}
return this._view.getVisibleRangeInViewport();
}
public getScrollWidth(): number {
if (!this.hasView) {
return -1;
......
......@@ -287,6 +287,8 @@ export abstract class CommonCodeEditor extends EventEmitter implements editorCom
public abstract getCenteredRangeInViewport(): Range;
public abstract getVisibleRangeInViewport(): Range;
public getVisibleColumnFromPosition(rawPosition:editorCommon.IPosition): number {
if (!this.model) {
return rawPosition.column;
......@@ -788,6 +790,12 @@ export abstract class CommonCodeEditor extends EventEmitter implements editorCom
var viewModelHelper:IViewModelHelper = {
viewModel: this.viewModel,
getCurrentVisibleRange: () => {
return this.viewModel.convertModelRangeToViewRange(this.getVisibleRangeInViewport());
},
getCurrentCenteredRange: () => {
return this.viewModel.convertModelRangeToViewRange(this.getCenteredRangeInViewport());
},
convertModelPositionToViewPosition: (lineNumber:number, column:number) => {
return this.viewModel.convertModelPositionToViewPosition(lineNumber, column);
},
......
......@@ -102,31 +102,6 @@ export class Cursor extends EventEmitter {
this.model = model;
this.viewModelHelper = viewModelHelper;
this.enableEmptySelectionClipboard = enableEmptySelectionClipboard;
if (!this.viewModelHelper) {
this.viewModelHelper = {
viewModel: this.model,
convertModelPositionToViewPosition: (lineNumber:number, column:number) => {
return new Position(lineNumber, column);
},
convertModelRangeToViewRange: (modelRange: Range) => {
return modelRange;
},
convertViewToModelPosition: (lineNumber:number, column:number) => {
return new Position(lineNumber, column);
},
convertViewSelectionToModelSelection: (viewSelection:Selection) => {
return viewSelection;
},
validateViewPosition: (viewLineNumber:number, viewColumn:number, modelPosition:Position) => {
return modelPosition;
},
validateViewRange: (viewStartLineNumber:number, viewStartColumn:number, viewEndLineNumber:number, viewEndColumn:number, modelRange:Range) => {
return modelRange;
}
};
}
this.cursors = new CursorCollection(this.editorId, this.model, this.configuration, this.viewModelHelper);
this.cursorUndoStack = [];
......
......@@ -57,6 +57,9 @@ export interface IViewModelHelper {
viewModel:ICursorMoveHelperModel;
getCurrentVisibleRange(): Range;
getCurrentCenteredRange(): Range;
convertModelPositionToViewPosition(lineNumber:number, column:number): Position;
convertModelRangeToViewRange(modelRange:Range): Range;
......@@ -547,6 +550,20 @@ export class OneCursor {
public getViewLineCount(): number {
return this.viewModelHelper.viewModel.getLineCount();
}
public getViewTopLine(lineFromTop: number): number {
let visibleRange = this.viewModelHelper.getCurrentVisibleRange();
let lineNumber = visibleRange.startLineNumber + lineFromTop - 1;
return lineNumber > visibleRange.endLineNumber ? visibleRange.endLineNumber : lineNumber;
}
public getViewCenterLine(): number {
let centeredRange = this.viewModelHelper.getCurrentCenteredRange();
return centeredRange.startLineNumber;
}
public getViewBottomLine(lineFromBottom: number): number {
let visibleRange = this.viewModelHelper.getCurrentVisibleRange();
let lineNumber = visibleRange.endLineNumber - lineFromBottom + 1;
return lineNumber > visibleRange.startLineNumber ? lineNumber : visibleRange.startLineNumber;
}
public getViewLineMaxColumn(lineNumber:number): number {
return this.viewModelHelper.viewModel.getLineMaxColumn(lineNumber);
}
......@@ -671,6 +688,18 @@ export class OneCursorOp {
return this.moveUp(cursor, inSelectionMode, noOfLines, ctx);
case editorCommon.CursorMoveViewPosition.LineDown:
return this.moveDown(cursor, inSelectionMode, noOfLines, ctx);
case editorCommon.CursorMoveViewPosition.LineViewTop:
viewLineNumber= cursor.getViewTopLine(moveParams.noOfLines || 1);
viewColumn = cursor.getViewLineFirstNonWhiteSpaceColumn(viewLineNumber);
break;
case editorCommon.CursorMoveViewPosition.LineViewBottom:
viewLineNumber= cursor.getViewBottomLine(moveParams.noOfLines || 1);
viewColumn = cursor.getViewLineFirstNonWhiteSpaceColumn(viewLineNumber);
break;
case editorCommon.CursorMoveViewPosition.LineViewCenter:
viewLineNumber= cursor.getViewCenterLine();
viewColumn = cursor.getViewLineFirstNonWhiteSpaceColumn(viewLineNumber);
break;
default:
return false;
}
......
......@@ -4184,7 +4184,10 @@ export const CursorMoveViewPosition = {
LineEnd: 'lineEnd',
LineLastNonWhitespaceCharacter: 'lineLastNonWhitespaceCharacter',
LineUp: 'lineUp',
LineDown: 'lineDown'
LineDown: 'lineDown',
LineViewTop: 'lineViewTop',
LineViewCenter: 'lineViewCenter',
LineViewBottom: 'lineViewBottom'
};
/**
......
......@@ -6,12 +6,14 @@
import * as assert from 'assert';
import {Cursor} from 'vs/editor/common/controller/cursor';
import {Position} from 'vs/editor/common/core/position';
import {Range} from 'vs/editor/common/core/range';
import {Selection} from 'vs/editor/common/core/selection';
import * as editorCommon from 'vs/editor/common/editorCommon';
import {Model} from 'vs/editor/common/model/model';
import {IMode} from 'vs/editor/common/modes';
import {MockConfiguration} from 'vs/editor/test/common/mocks/mockConfiguration';
import {viewModelHelper} from 'vs/editor/test/common/editorTestUtils';
export function testCommand(
lines: string[],
......@@ -24,7 +26,7 @@ export function testCommand(
let model = Model.createFromString(lines.join('\n'), undefined, mode);
let config = new MockConfiguration(null);
let cursor = new Cursor(0, config, model, null, false);
let cursor = new Cursor(0, config, model, viewModelHelper(model), false);
cursor.setSelections('tests', [selection]);
......
......@@ -14,13 +14,14 @@ import {IIdentifiedSingleEditOperation} from 'vs/editor/common/editorCommon';
import {Model} from 'vs/editor/common/model/model';
import {ILineEdit, ModelLine} from 'vs/editor/common/model/modelLine';
import {MockConfiguration} from 'vs/editor/test/common/mocks/mockConfiguration';
import {viewModelHelper} from 'vs/editor/test/common/editorTestUtils';
const NO_TAB_SIZE = 0;
function testCommand(lines:string[], selection:Selection, edits:IIdentifiedSingleEditOperation[], expectedLines:string[], expectedSelection:Selection): void {
let model = Model.createFromString(lines.join('\n'));
let config = new MockConfiguration(null);
let cursor = new Cursor(0, config, model, null, false);
let cursor = new Cursor(0, config, model, viewModelHelper(model), false);
cursor.setSelections('tests', [selection]);
......
......@@ -21,6 +21,7 @@ import {LanguageConfigurationRegistry} from 'vs/editor/common/modes/languageConf
import {MockConfiguration} from 'vs/editor/test/common/mocks/mockConfiguration';
import {BracketMode} from 'vs/editor/test/common/testModes';
import {MockMode} from 'vs/editor/test/common/mocks/mockMode';
import {viewModelHelper} from 'vs/editor/test/common/editorTestUtils';
let H = Handler;
......@@ -205,7 +206,7 @@ suite('Editor Controller - Cursor', () => {
thisModel = Model.createFromString(text);
thisConfiguration = new MockConfiguration(null);
thisCursor = new Cursor(1, thisConfiguration, thisModel, null, false);
thisCursor = new Cursor(1, thisConfiguration, thisModel, viewModelHelper(thisModel), false);
});
teardown(() => {
......@@ -992,7 +993,7 @@ suite('Editor Controller - Cursor', () => {
'\t\t}',
'\t}'
].join('\n'));
let cursor = new Cursor(1, new MockConfiguration(null), model, null, true);
let cursor = new Cursor(1, new MockConfiguration(null), model, viewModelHelper(model), true);
moveTo(cursor, 1, 7, false);
cursorEqual(cursor, 1, 7);
......@@ -1026,7 +1027,7 @@ suite('Editor Controller - Cursor', () => {
'var concat = require("gulp-concat");',
'var newer = require("gulp-newer");',
].join('\n'));
let cursor = new Cursor(1, new MockConfiguration(null), model, null, true);
let cursor = new Cursor(1, new MockConfiguration(null), model, viewModelHelper(model), true);
moveTo(cursor, 1, 4, false);
cursorEqual(cursor, 1, 4);
......@@ -1058,7 +1059,7 @@ suite('Editor Controller - Cursor', () => {
'var concat = require("gulp-concat");',
'var newer = require("gulp-newer");',
].join('\n'));
let cursor = new Cursor(1, new MockConfiguration(null), model, null, true);
let cursor = new Cursor(1, new MockConfiguration(null), model, viewModelHelper(model), true);
moveTo(cursor, 1, 4, false);
cursorEqual(cursor, 1, 4);
......@@ -1595,7 +1596,7 @@ suite('Editor Controller - Regression tests', () => {
'qwerty'
];
let model = Model.createFromString(text.join('\n'));
let cursor = new Cursor(1, new MockConfiguration(null), model, null, true);
let cursor = new Cursor(1, new MockConfiguration(null), model, viewModelHelper(model), true);
moveTo(cursor, 2, 1, false);
cursorEqual(cursor, 2, 1, 2, 1);
......@@ -1613,7 +1614,7 @@ suite('Editor Controller - Regression tests', () => {
''
];
model = Model.createFromString(text.join('\n'));
cursor = new Cursor(1, new MockConfiguration(null), model, null, true);
cursor = new Cursor(1, new MockConfiguration(null), model, viewModelHelper(model), true);
moveTo(cursor, 2, 1, false);
cursorEqual(cursor, 2, 1, 2, 1);
......@@ -2798,7 +2799,7 @@ interface ICursorOpts {
function usingCursor(opts:ICursorOpts, callback:(model:Model, cursor:Cursor)=>void): void {
let model = Model.createFromString(opts.text.join('\n'), opts.modelOpts, opts.mode);
let config = new MockConfiguration(opts.editorOpts);
let cursor = new Cursor(1, config, model, null, false);
let cursor = new Cursor(1, config, model, viewModelHelper(model), false);
callback(model, cursor);
......
......@@ -5,9 +5,39 @@
'use strict';
import {Model} from 'vs/editor/common/model/model';
import {IViewModelHelper} from 'vs/editor/common/controller/oneCursor';
import {Position} from 'vs/editor/common/core/position';
import {Range} from 'vs/editor/common/core/range';
import {Selection} from 'vs/editor/common/core/selection';
export function withEditorModel(text:string[], callback:(model:Model) => void): void {
var model = Model.createFromString(text.join('\n'));
callback(model);
model.dispose();
}
export function viewModelHelper(model): IViewModelHelper{
return {
viewModel: model,
getCurrentVisibleRange: () => { return null; },
getCurrentCenteredRange: () => { return null; },
convertModelPositionToViewPosition: (lineNumber: number, column: number) => {
return new Position(lineNumber, column);
},
convertModelRangeToViewRange: (modelRange: Range) => {
return modelRange;
},
convertViewToModelPosition: (lineNumber: number, column: number) => {
return new Position(lineNumber, column);
},
convertViewSelectionToModelSelection: (viewSelection: Selection) => {
return viewSelection;
},
validateViewPosition: (viewLineNumber: number, viewColumn: number, modelPosition: Position) => {
return modelPosition;
},
validateViewRange: (viewStartLineNumber: number, viewStartColumn: number, viewEndLineNumber: number, viewEndColumn: number, modelRange: Range) => {
return modelRange;
}
};
}
......@@ -26,6 +26,7 @@ export class MockCodeEditor extends CommonCodeEditor {
return new MockConfiguration(options);
}
public getCenteredRangeInViewport(): Range { return null; }
public getVisibleRangeInViewport(): Range { return null; }
public getScrollWidth(): number { return 0; }
public getScrollLeft(): number { return 0; }
......
......@@ -3200,6 +3200,9 @@ declare module monaco.editor {
LineLastNonWhitespaceCharacter: string;
LineUp: string;
LineDown: string;
LineViewTop: string;
LineViewCenter: string;
LineViewBottom: string;
};
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册