提交 98604a98 编写于 作者: A Alex Dima

Add RenderingContext and adopt it

上级 d9df1796
......@@ -12,7 +12,6 @@ import * as dom from 'vs/base/browser/dom';
import { StyleMutator } from 'vs/base/browser/styleMutator';
import { ICommandService } from 'vs/platform/commands/common/commands';
import { Range } from 'vs/editor/common/core/range';
import { Position } from 'vs/editor/common/core/position';
import * as editorCommon from 'vs/editor/common/editorCommon';
import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler';
import { Configuration } from 'vs/editor/browser/config/configuration';
......@@ -45,8 +44,7 @@ import { ViewZones } from 'vs/editor/browser/viewParts/viewZones/viewZones';
import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart';
import { ViewContext, IViewEventHandler } from 'vs/editor/common/view/viewContext';
import { IViewModel } from 'vs/editor/common/viewModel/viewModel';
import { ViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
import { IRenderingContext } from 'vs/editor/common/view/renderingContext';
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
import { IPointerHandlerHelper } from 'vs/editor/browser/controller/mouseHandler';
import { ViewOutgoingEvents } from 'vs/editor/browser/view/viewOutgoingEvents';
......@@ -846,56 +844,6 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp
safeInvokeNoArg(() => this._actualRender());
}
private createRenderingContext(linesViewportData: ViewLinesViewportData): IRenderingContext {
let vInfo = this.layoutProvider.getCurrentViewport();
let deltaTop = linesViewportData.visibleRangesDeltaTop;
let r: IRenderingContext = {
linesViewportData: linesViewportData,
scrollWidth: this.layoutProvider.getScrollWidth(),
scrollHeight: this.layoutProvider.getScrollHeight(),
visibleRange: linesViewportData.visibleRange,
bigNumbersDelta: linesViewportData.bigNumbersDelta,
viewportWidth: vInfo.width,
viewportHeight: vInfo.height,
viewportLeft: vInfo.left,
viewportTop: vInfo.top,
getScrolledTopFromAbsoluteTop: (absoluteTop: number) => {
return this.layoutProvider.getScrolledTopFromAbsoluteTop(absoluteTop);
},
getViewportVerticalOffsetForLineNumber: (lineNumber: number) => {
let verticalOffset = this.layoutProvider.getVerticalOffsetForLineNumber(lineNumber);
let scrolledTop = this.layoutProvider.getScrolledTopFromAbsoluteTop(verticalOffset);
return scrolledTop;
},
getDecorationsInViewport: () => linesViewportData.getDecorationsInViewport(),
linesVisibleRangesForRange: (range: Range, includeNewLines: boolean) => {
return this.viewLines.linesVisibleRangesForRange(range, includeNewLines);
},
visibleRangeForPosition: (position: Position) => {
let visibleRanges = this.viewLines.visibleRangesForRange2(new Range(position.lineNumber, position.column, position.lineNumber, position.column), deltaTop);
if (!visibleRanges) {
return null;
}
return visibleRanges[0];
},
lineIsVisible: (lineNumber: number) => {
return linesViewportData.visibleRange.startLineNumber <= lineNumber && lineNumber <= linesViewportData.visibleRange.endLineNumber;
}
};
return r;
}
private _getViewPartsToRender(): ViewPart[] {
let result: ViewPart[] = [];
for (let i = 0, len = this.viewParts.length; i < len; i++) {
......@@ -934,7 +882,7 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp
this.keyboardHandler.writeToTextArea();
}
let renderingContext = this.createRenderingContext(linesViewportData);
let renderingContext = new RenderingContext(this.viewLines, this.layoutProvider, linesViewportData);
// Render the rest of the parts
for (let i = 0, len = viewPartsToRender.length; i < len; i++) {
......
......@@ -13,6 +13,7 @@ import { ScrollManager } from 'vs/editor/browser/viewLayout/scrollManager';
import { IViewModel } from 'vs/editor/common/viewModel/viewModel';
import { ViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
import { IViewEventBus } from 'vs/editor/common/view/viewContext';
import { ILayoutProvider as IRenderingLayoutProvider } from 'vs/editor/common/view/renderingContext';
export interface IWhitespaceManager {
/**
......@@ -101,7 +102,7 @@ export interface IVerticalLayoutProvider {
}
export class LayoutProvider extends ViewEventHandler implements IDisposable, ILayoutProvider, IWhitespaceManager {
export class LayoutProvider extends ViewEventHandler implements IDisposable, ILayoutProvider, IWhitespaceManager, IRenderingLayoutProvider {
static LINES_HORIZONTAL_EXTRA_PX = 30;
......
......@@ -16,7 +16,7 @@ import { ViewLine } from 'vs/editor/browser/viewParts/lines/viewLine';
import { Configuration } from 'vs/editor/browser/config/configuration';
import { ViewContext } from 'vs/editor/common/view/viewContext';
import { ViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
import { VisibleRange, LineVisibleRanges } from 'vs/editor/common/view/renderingContext';
import { IViewLines, VisibleRange, LineVisibleRanges } from 'vs/editor/common/view/renderingContext';
import { ILayoutProvider } from 'vs/editor/browser/viewLayout/layoutProvider';
import { PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart';
......@@ -47,7 +47,7 @@ class LastRenderedData {
}
}
export class ViewLines extends ViewLayer<ViewLine> {
export class ViewLines extends ViewLayer<ViewLine> implements IViewLines {
/**
* Width to extends a line to render the line feed at the end of the line
*/
......
......@@ -8,6 +8,97 @@ import { ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel';
import { ViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
import { Range } from 'vs/editor/common/core/range';
import { Position } from 'vs/editor/common/core/position';
import { Viewport } from 'vs/editor/common/editorCommon';
export interface ILayoutProvider {
getScrollWidth(): number;
getScrollHeight(): number;
getCurrentViewport(): Viewport;
getScrolledTopFromAbsoluteTop(top: number): number;
getVerticalOffsetForLineNumber(lineNumber: number): number;
}
export interface IViewLines {
linesVisibleRangesForRange(range: Range, includeNewLines: boolean): LineVisibleRanges[];
visibleRangesForRange2(range: Range, deltaTop: number): VisibleRange[];
}
export class RenderingContext implements IRenderingContext {
_renderingContextBrand: void;
public readonly linesViewportData: ViewLinesViewportData;
public readonly scrollWidth: number;
public readonly scrollHeight: number;
public readonly visibleRange: Range;
public readonly bigNumbersDelta: number;
public readonly viewportTop: number;
public readonly viewportWidth: number;
public readonly viewportHeight: number;
public readonly viewportLeft: number;
private readonly _layoutProvider: ILayoutProvider;
private readonly _viewLines: IViewLines;
constructor(viewLines: IViewLines, layoutProvider: ILayoutProvider, linesViewportData: ViewLinesViewportData) {
this._viewLines = viewLines;
this._layoutProvider = layoutProvider;
this.linesViewportData = linesViewportData;
this.scrollWidth = this._layoutProvider.getScrollWidth();
this.scrollHeight = this._layoutProvider.getScrollHeight();
this.visibleRange = this.linesViewportData.visibleRange;
this.bigNumbersDelta = this.linesViewportData.bigNumbersDelta;
const vInfo = this._layoutProvider.getCurrentViewport();
this.viewportWidth = vInfo.width;
this.viewportHeight = vInfo.height;
this.viewportLeft = vInfo.left;
this.viewportTop = vInfo.top;
}
public getScrolledTopFromAbsoluteTop(absoluteTop: number): number {
return this._layoutProvider.getScrolledTopFromAbsoluteTop(absoluteTop);
}
public getViewportVerticalOffsetForLineNumber(lineNumber: number): number {
const verticalOffset = this._layoutProvider.getVerticalOffsetForLineNumber(lineNumber);
const scrolledTop = this._layoutProvider.getScrolledTopFromAbsoluteTop(verticalOffset);
return scrolledTop;
}
public lineIsVisible(lineNumber: number): boolean {
return (
this.linesViewportData.visibleRange.startLineNumber <= lineNumber
&& lineNumber <= this.linesViewportData.visibleRange.endLineNumber
);
}
public getDecorationsInViewport(): ViewModelDecoration[] {
return this.linesViewportData.getDecorationsInViewport();
}
public linesVisibleRangesForRange(range: Range, includeNewLines: boolean): LineVisibleRanges[] {
return this._viewLines.linesVisibleRangesForRange(range, includeNewLines);
}
public visibleRangeForPosition(position: Position): VisibleRange {
const deltaTop = this.linesViewportData.visibleRangesDeltaTop;
const visibleRanges = this._viewLines.visibleRangesForRange2(
new Range(position.lineNumber, position.column, position.lineNumber, position.column),
deltaTop
);
if (!visibleRanges) {
return null;
}
return visibleRanges[0];
}
}
export interface IRestrictedRenderingContext {
linesViewportData: ViewLinesViewportData;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册