mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 18:46:40 -05:00
Merge from master
This commit is contained in:
@@ -3,15 +3,15 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { ContentWidgetPositionPreference, IContentWidget } from 'vs/editor/browser/editorBrowser';
|
||||
import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { PartFingerprint, PartFingerprints, ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { IPosition, Position } from 'vs/editor/common/core/position';
|
||||
import { IRange, Range } from 'vs/editor/common/core/range';
|
||||
import { Constants } from 'vs/editor/common/core/uint';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { Position, IPosition } from 'vs/editor/common/core/position';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
|
||||
|
||||
@@ -53,8 +53,7 @@ export class ViewContentWidgets extends ViewPart {
|
||||
|
||||
public dispose(): void {
|
||||
super.dispose();
|
||||
this._widgets = null;
|
||||
this.domNode = null;
|
||||
this._widgets = {};
|
||||
}
|
||||
|
||||
// --- begin event handlers
|
||||
@@ -113,9 +112,9 @@ export class ViewContentWidgets extends ViewPart {
|
||||
this.setShouldRender();
|
||||
}
|
||||
|
||||
public setWidgetPosition(widget: IContentWidget, position: IPosition, preference: ContentWidgetPositionPreference[]): void {
|
||||
public setWidgetPosition(widget: IContentWidget, position: IPosition | null | undefined, range: IRange | null | undefined, preference: ContentWidgetPositionPreference[] | null | undefined): void {
|
||||
const myWidget = this._widgets[widget.getId()];
|
||||
myWidget.setPosition(position, preference);
|
||||
myWidget.setPosition(position, range, preference);
|
||||
|
||||
this.setShouldRender();
|
||||
}
|
||||
@@ -127,7 +126,7 @@ export class ViewContentWidgets extends ViewPart {
|
||||
delete this._widgets[widgetId];
|
||||
|
||||
const domNode = myWidget.domNode.domNode;
|
||||
domNode.parentNode.removeChild(domNode);
|
||||
domNode.parentNode!.removeChild(domNode);
|
||||
domNode.removeAttribute('monaco-visible-content-widget');
|
||||
|
||||
this.setShouldRender();
|
||||
@@ -167,11 +166,13 @@ export class ViewContentWidgets extends ViewPart {
|
||||
}
|
||||
|
||||
interface IBoxLayoutResult {
|
||||
aboveTop: number;
|
||||
fitsAbove: boolean;
|
||||
belowTop: number;
|
||||
aboveTop: number;
|
||||
aboveLeft: number;
|
||||
|
||||
fitsBelow: boolean;
|
||||
left: number;
|
||||
belowTop: number;
|
||||
belowLeft: number;
|
||||
}
|
||||
|
||||
class Widget {
|
||||
@@ -189,15 +190,17 @@ class Widget {
|
||||
private _contentLeft: number;
|
||||
private _lineHeight: number;
|
||||
|
||||
private _position: IPosition;
|
||||
private _viewPosition: Position;
|
||||
private _preference: ContentWidgetPositionPreference[];
|
||||
private _position: IPosition | null;
|
||||
private _viewPosition: Position | null;
|
||||
private _range: IRange | null;
|
||||
private _viewRange: Range | null;
|
||||
private _preference: ContentWidgetPositionPreference[] | null;
|
||||
private _cachedDomNodeClientWidth: number;
|
||||
private _cachedDomNodeClientHeight: number;
|
||||
private _maxWidth: number;
|
||||
private _isVisible: boolean;
|
||||
|
||||
private _renderData: Coordinate;
|
||||
private _renderData: Coordinate | null;
|
||||
|
||||
constructor(context: ViewContext, viewDomNode: FastDomNode<HTMLElement>, actual: IContentWidget) {
|
||||
this._context = context;
|
||||
@@ -214,8 +217,8 @@ class Widget {
|
||||
this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft;
|
||||
this._lineHeight = this._context.configuration.editor.lineHeight;
|
||||
|
||||
this._setPosition(null);
|
||||
this._preference = null;
|
||||
this._setPosition(null, null);
|
||||
this._preference = [];
|
||||
this._cachedDomNodeClientWidth = -1;
|
||||
this._cachedDomNodeClientHeight = -1;
|
||||
this._maxWidth = this._getMaxWidth();
|
||||
@@ -240,12 +243,14 @@ class Widget {
|
||||
}
|
||||
|
||||
public onLineMappingChanged(e: viewEvents.ViewLineMappingChangedEvent): void {
|
||||
this._setPosition(this._position);
|
||||
this._setPosition(this._position, this._range);
|
||||
}
|
||||
|
||||
private _setPosition(position: IPosition): void {
|
||||
this._position = position;
|
||||
private _setPosition(position: IPosition | null | undefined, range: IRange | null | undefined): void {
|
||||
this._position = position || null;
|
||||
this._range = range || null;
|
||||
this._viewPosition = null;
|
||||
this._viewRange = null;
|
||||
|
||||
if (this._position) {
|
||||
// Do not trust that widgets give a valid position
|
||||
@@ -254,24 +259,29 @@ class Widget {
|
||||
this._viewPosition = this._context.model.coordinatesConverter.convertModelPositionToViewPosition(validModelPosition);
|
||||
}
|
||||
}
|
||||
if (this._range) {
|
||||
// Do not trust that widgets give a valid position
|
||||
const validModelRange = this._context.model.validateModelRange(this._range);
|
||||
this._viewRange = this._context.model.coordinatesConverter.convertModelRangeToViewRange(validModelRange);
|
||||
}
|
||||
}
|
||||
|
||||
private _getMaxWidth(): number {
|
||||
return (
|
||||
this.allowEditorOverflow
|
||||
? window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth
|
||||
? window.innerWidth || document.documentElement!.clientWidth || document.body.clientWidth
|
||||
: this._contentWidth
|
||||
);
|
||||
}
|
||||
|
||||
public setPosition(position: IPosition, preference: ContentWidgetPositionPreference[]): void {
|
||||
this._setPosition(position);
|
||||
this._preference = preference;
|
||||
public setPosition(position: IPosition | null | undefined, range: IRange | null | undefined, preference: ContentWidgetPositionPreference[] | null | undefined): void {
|
||||
this._setPosition(position, range);
|
||||
this._preference = preference || null;
|
||||
this._cachedDomNodeClientWidth = -1;
|
||||
this._cachedDomNodeClientHeight = -1;
|
||||
}
|
||||
|
||||
private _layoutBoxInViewport(topLeft: Coordinate, width: number, height: number, ctx: RenderingContext): IBoxLayoutResult {
|
||||
private _layoutBoxInViewport(topLeft: Coordinate, bottomLeft: Coordinate, width: number, height: number, ctx: RenderingContext): IBoxLayoutResult {
|
||||
// Our visible box is split horizontally by the current line => 2 boxes
|
||||
|
||||
// a) the box above the line
|
||||
@@ -279,7 +289,7 @@ class Widget {
|
||||
let heightAboveLine = aboveLineTop;
|
||||
|
||||
// b) the box under the line
|
||||
let underLineTop = topLeft.top + this._lineHeight;
|
||||
let underLineTop = bottomLeft.top + this._lineHeight;
|
||||
let heightUnderLine = ctx.viewportHeight - underLineTop;
|
||||
|
||||
let aboveTop = aboveLineTop - height;
|
||||
@@ -288,42 +298,54 @@ class Widget {
|
||||
let fitsBelow = (heightUnderLine >= height);
|
||||
|
||||
// And its left
|
||||
let actualLeft = topLeft.left;
|
||||
if (actualLeft + width > ctx.scrollLeft + ctx.viewportWidth) {
|
||||
actualLeft = ctx.scrollLeft + ctx.viewportWidth - width;
|
||||
let actualAboveLeft = topLeft.left;
|
||||
let actualBelowLeft = bottomLeft.left;
|
||||
if (actualAboveLeft + width > ctx.scrollLeft + ctx.viewportWidth) {
|
||||
actualAboveLeft = ctx.scrollLeft + ctx.viewportWidth - width;
|
||||
}
|
||||
if (actualLeft < ctx.scrollLeft) {
|
||||
actualLeft = ctx.scrollLeft;
|
||||
if (actualBelowLeft + width > ctx.scrollLeft + ctx.viewportWidth) {
|
||||
actualBelowLeft = ctx.scrollLeft + ctx.viewportWidth - width;
|
||||
}
|
||||
if (actualAboveLeft < ctx.scrollLeft) {
|
||||
actualAboveLeft = ctx.scrollLeft;
|
||||
}
|
||||
if (actualBelowLeft < ctx.scrollLeft) {
|
||||
actualBelowLeft = ctx.scrollLeft;
|
||||
}
|
||||
|
||||
return {
|
||||
aboveTop: aboveTop,
|
||||
fitsAbove: fitsAbove,
|
||||
belowTop: belowTop,
|
||||
aboveTop: aboveTop,
|
||||
aboveLeft: actualAboveLeft,
|
||||
|
||||
fitsBelow: fitsBelow,
|
||||
left: actualLeft
|
||||
belowTop: belowTop,
|
||||
belowLeft: actualBelowLeft,
|
||||
};
|
||||
}
|
||||
|
||||
private _layoutBoxInPage(topLeft: Coordinate, width: number, height: number, ctx: RenderingContext): IBoxLayoutResult {
|
||||
let left0 = topLeft.left - ctx.scrollLeft;
|
||||
private _layoutBoxInPage(topLeft: Coordinate, bottomLeft: Coordinate, width: number, height: number, ctx: RenderingContext): IBoxLayoutResult | null {
|
||||
let aboveLeft0 = topLeft.left - ctx.scrollLeft;
|
||||
let belowLeft0 = bottomLeft.left - ctx.scrollLeft;
|
||||
|
||||
if (left0 < 0 || left0 > this._contentWidth) {
|
||||
if (aboveLeft0 < 0 || aboveLeft0 > this._contentWidth) {
|
||||
// Don't render if position is scrolled outside viewport
|
||||
return null;
|
||||
}
|
||||
|
||||
let aboveTop = topLeft.top - height;
|
||||
let belowTop = topLeft.top + this._lineHeight;
|
||||
let left = left0 + this._contentLeft;
|
||||
let belowTop = bottomLeft.top + this._lineHeight;
|
||||
let aboveLeft = aboveLeft0 + this._contentLeft;
|
||||
let belowLeft = belowLeft0 + this._contentLeft;
|
||||
|
||||
let domNodePosition = dom.getDomNodePagePosition(this._viewDomNode.domNode);
|
||||
let absoluteAboveTop = domNodePosition.top + aboveTop - dom.StandardWindow.scrollY;
|
||||
let absoluteBelowTop = domNodePosition.top + belowTop - dom.StandardWindow.scrollY;
|
||||
let absoluteLeft = domNodePosition.left + left - dom.StandardWindow.scrollX;
|
||||
let absoluteAboveLeft = domNodePosition.left + aboveLeft - dom.StandardWindow.scrollX;
|
||||
let absoluteBelowLeft = domNodePosition.left + belowLeft - dom.StandardWindow.scrollX;
|
||||
|
||||
let INNER_WIDTH = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
||||
let INNER_HEIGHT = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
|
||||
let INNER_WIDTH = window.innerWidth || document.documentElement!.clientWidth || document.body.clientWidth;
|
||||
let INNER_HEIGHT = window.innerHeight || document.documentElement!.clientHeight || document.body.clientHeight;
|
||||
|
||||
// Leave some clearance to the bottom
|
||||
let TOP_PADDING = 22;
|
||||
@@ -332,24 +354,35 @@ class Widget {
|
||||
let fitsAbove = (absoluteAboveTop >= TOP_PADDING),
|
||||
fitsBelow = (absoluteBelowTop + height <= INNER_HEIGHT - BOTTOM_PADDING);
|
||||
|
||||
if (absoluteLeft + width + 20 > INNER_WIDTH) {
|
||||
let delta = absoluteLeft - (INNER_WIDTH - width - 20);
|
||||
absoluteLeft -= delta;
|
||||
left -= delta;
|
||||
if (absoluteAboveLeft + width + 20 > INNER_WIDTH) {
|
||||
let delta = absoluteAboveLeft - (INNER_WIDTH - width - 20);
|
||||
absoluteAboveLeft -= delta;
|
||||
aboveLeft -= delta;
|
||||
}
|
||||
if (absoluteLeft < 0) {
|
||||
let delta = absoluteLeft;
|
||||
absoluteLeft -= delta;
|
||||
left -= delta;
|
||||
if (absoluteBelowLeft + width + 20 > INNER_WIDTH) {
|
||||
let delta = absoluteBelowLeft - (INNER_WIDTH - width - 20);
|
||||
absoluteBelowLeft -= delta;
|
||||
belowLeft -= delta;
|
||||
}
|
||||
if (absoluteAboveLeft < 0) {
|
||||
let delta = absoluteAboveLeft;
|
||||
absoluteAboveLeft -= delta;
|
||||
aboveLeft -= delta;
|
||||
}
|
||||
if (absoluteBelowLeft < 0) {
|
||||
let delta = absoluteBelowLeft;
|
||||
absoluteBelowLeft -= delta;
|
||||
belowLeft -= delta;
|
||||
}
|
||||
|
||||
if (this._fixedOverflowWidgets) {
|
||||
aboveTop = absoluteAboveTop;
|
||||
belowTop = absoluteBelowTop;
|
||||
left = absoluteLeft;
|
||||
aboveLeft = absoluteAboveLeft;
|
||||
belowLeft = absoluteBelowLeft;
|
||||
}
|
||||
|
||||
return { aboveTop, fitsAbove, belowTop, fitsBelow, left };
|
||||
return { fitsAbove, aboveTop, aboveLeft, fitsBelow, belowTop, belowLeft };
|
||||
}
|
||||
|
||||
private _prepareRenderWidgetAtExactPositionOverflowing(topLeft: Coordinate): Coordinate {
|
||||
@@ -359,71 +392,97 @@ class Widget {
|
||||
/**
|
||||
* Compute `this._topLeft`
|
||||
*/
|
||||
private _getTopLeft(ctx: RenderingContext): Coordinate {
|
||||
private _getTopAndBottomLeft(ctx: RenderingContext): [Coordinate, Coordinate] | [null, null] {
|
||||
if (!this._viewPosition) {
|
||||
return null;
|
||||
return [null, null];
|
||||
}
|
||||
|
||||
const visibleRange = ctx.visibleRangeForPosition(this._viewPosition);
|
||||
if (!visibleRange) {
|
||||
return null;
|
||||
const visibleRangeForPosition = ctx.visibleRangeForPosition(this._viewPosition);
|
||||
if (!visibleRangeForPosition) {
|
||||
return [null, null];
|
||||
}
|
||||
|
||||
const top = ctx.getVerticalOffsetForLineNumber(this._viewPosition.lineNumber) - ctx.scrollTop;
|
||||
return new Coordinate(top, visibleRange.left);
|
||||
const topForPosition = ctx.getVerticalOffsetForLineNumber(this._viewPosition.lineNumber) - ctx.scrollTop;
|
||||
const topLeft = new Coordinate(topForPosition, visibleRangeForPosition.left);
|
||||
|
||||
let largestLineNumber = this._viewPosition.lineNumber;
|
||||
let smallestLeft = visibleRangeForPosition.left;
|
||||
|
||||
if (this._viewRange) {
|
||||
const visibleRangesForRange = ctx.linesVisibleRangesForRange(this._viewRange, false);
|
||||
if (visibleRangesForRange && visibleRangesForRange.length > 0) {
|
||||
for (let i = visibleRangesForRange.length - 1; i >= 0; i--) {
|
||||
const visibleRangesForLine = visibleRangesForRange[i];
|
||||
if (visibleRangesForLine.lineNumber >= largestLineNumber) {
|
||||
if (visibleRangesForLine.lineNumber > largestLineNumber) {
|
||||
largestLineNumber = visibleRangesForLine.lineNumber;
|
||||
smallestLeft = Constants.MAX_SAFE_SMALL_INTEGER;
|
||||
}
|
||||
for (let j = 0, lenJ = visibleRangesForLine.ranges.length; j < lenJ; j++) {
|
||||
const visibleRange = visibleRangesForLine.ranges[j];
|
||||
|
||||
if (visibleRange.left < smallestLeft) {
|
||||
smallestLeft = visibleRange.left;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const topForBottomLine = ctx.getVerticalOffsetForLineNumber(largestLineNumber) - ctx.scrollTop;
|
||||
const bottomLeft = new Coordinate(topForBottomLine, smallestLeft);
|
||||
|
||||
return [topLeft, bottomLeft];
|
||||
}
|
||||
|
||||
private _prepareRenderWidget(topLeft: Coordinate, ctx: RenderingContext): Coordinate {
|
||||
if (!topLeft) {
|
||||
private _prepareRenderWidget(ctx: RenderingContext): Coordinate | null {
|
||||
const [topLeft, bottomLeft] = this._getTopAndBottomLeft(ctx);
|
||||
if (!topLeft || !bottomLeft) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let placement: IBoxLayoutResult = null;
|
||||
let fetchPlacement = (): void => {
|
||||
if (placement) {
|
||||
return;
|
||||
}
|
||||
if (this._cachedDomNodeClientWidth === -1 || this._cachedDomNodeClientHeight === -1) {
|
||||
const domNode = this.domNode.domNode;
|
||||
this._cachedDomNodeClientWidth = domNode.clientWidth;
|
||||
this._cachedDomNodeClientHeight = domNode.clientHeight;
|
||||
}
|
||||
|
||||
if (this._cachedDomNodeClientWidth === -1 || this._cachedDomNodeClientHeight === -1) {
|
||||
const domNode = this.domNode.domNode;
|
||||
this._cachedDomNodeClientWidth = domNode.clientWidth;
|
||||
this._cachedDomNodeClientHeight = domNode.clientHeight;
|
||||
}
|
||||
|
||||
if (this.allowEditorOverflow) {
|
||||
placement = this._layoutBoxInPage(topLeft, this._cachedDomNodeClientWidth, this._cachedDomNodeClientHeight, ctx);
|
||||
} else {
|
||||
placement = this._layoutBoxInViewport(topLeft, this._cachedDomNodeClientWidth, this._cachedDomNodeClientHeight, ctx);
|
||||
}
|
||||
};
|
||||
let placement: IBoxLayoutResult | null;
|
||||
if (this.allowEditorOverflow) {
|
||||
placement = this._layoutBoxInPage(topLeft, bottomLeft, this._cachedDomNodeClientWidth, this._cachedDomNodeClientHeight, ctx);
|
||||
} else {
|
||||
placement = this._layoutBoxInViewport(topLeft, bottomLeft, this._cachedDomNodeClientWidth, this._cachedDomNodeClientHeight, ctx);
|
||||
}
|
||||
|
||||
// Do two passes, first for perfect fit, second picks first option
|
||||
for (let pass = 1; pass <= 2; pass++) {
|
||||
for (let i = 0; i < this._preference.length; i++) {
|
||||
let pref = this._preference[i];
|
||||
if (pref === ContentWidgetPositionPreference.ABOVE) {
|
||||
fetchPlacement();
|
||||
if (!placement) {
|
||||
// Widget outside of viewport
|
||||
return null;
|
||||
}
|
||||
if (pass === 2 || placement.fitsAbove) {
|
||||
return new Coordinate(placement.aboveTop, placement.left);
|
||||
}
|
||||
} else if (pref === ContentWidgetPositionPreference.BELOW) {
|
||||
fetchPlacement();
|
||||
if (!placement) {
|
||||
// Widget outside of viewport
|
||||
return null;
|
||||
}
|
||||
if (pass === 2 || placement.fitsBelow) {
|
||||
return new Coordinate(placement.belowTop, placement.left);
|
||||
}
|
||||
} else {
|
||||
if (this.allowEditorOverflow) {
|
||||
return this._prepareRenderWidgetAtExactPositionOverflowing(topLeft);
|
||||
if (this._preference) {
|
||||
for (let pass = 1; pass <= 2; pass++) {
|
||||
for (let i = 0; i < this._preference.length; i++) {
|
||||
// placement
|
||||
let pref = this._preference[i];
|
||||
if (pref === ContentWidgetPositionPreference.ABOVE) {
|
||||
if (!placement) {
|
||||
// Widget outside of viewport
|
||||
return null;
|
||||
}
|
||||
if (pass === 2 || placement.fitsAbove) {
|
||||
return new Coordinate(placement.aboveTop, placement.aboveLeft);
|
||||
}
|
||||
} else if (pref === ContentWidgetPositionPreference.BELOW) {
|
||||
if (!placement) {
|
||||
// Widget outside of viewport
|
||||
return null;
|
||||
}
|
||||
if (pass === 2 || placement.fitsBelow) {
|
||||
return new Coordinate(placement.belowTop, placement.belowLeft);
|
||||
}
|
||||
} else {
|
||||
return topLeft;
|
||||
if (this.allowEditorOverflow) {
|
||||
return this._prepareRenderWidgetAtExactPositionOverflowing(topLeft);
|
||||
} else {
|
||||
return topLeft;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -448,8 +507,7 @@ class Widget {
|
||||
}
|
||||
|
||||
public prepareRender(ctx: RenderingContext): void {
|
||||
const topLeft = this._getTopLeft(ctx);
|
||||
this._renderData = this._prepareRenderWidget(topLeft, ctx);
|
||||
this._renderData = this._prepareRenderWidget(ctx);
|
||||
}
|
||||
|
||||
public render(ctx: RestrictedRenderingContext): void {
|
||||
|
||||
@@ -3,15 +3,13 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./currentLineHighlight';
|
||||
import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { editorLineHighlight, editorLineHighlightBorder } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { editorLineHighlight, editorLineHighlightBorder } from 'vs/editor/common/view/editorColorRegistry';
|
||||
|
||||
export class CurrentLineHighlightOverlay extends DynamicViewOverlay {
|
||||
private _context: ViewContext;
|
||||
@@ -38,7 +36,6 @@ export class CurrentLineHighlightOverlay extends DynamicViewOverlay {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._context = null;
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -131,12 +128,12 @@ export class CurrentLineHighlightOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let lineHighlight = theme.getColor(editorLineHighlight);
|
||||
const lineHighlight = theme.getColor(editorLineHighlight);
|
||||
if (lineHighlight) {
|
||||
collector.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${lineHighlight}; }`);
|
||||
}
|
||||
if (!lineHighlight || lineHighlight.isTransparent() || theme.defines(editorLineHighlightBorder)) {
|
||||
let lineHighlightBorder = theme.getColor(editorLineHighlightBorder);
|
||||
const lineHighlightBorder = theme.getColor(editorLineHighlightBorder);
|
||||
if (lineHighlightBorder) {
|
||||
collector.addRule(`.monaco-editor .view-overlays .current-line { border: 2px solid ${lineHighlightBorder}; }`);
|
||||
if (theme.type === 'hc') {
|
||||
|
||||
@@ -3,15 +3,13 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./currentLineMarginHighlight';
|
||||
import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { editorLineHighlight, editorLineHighlightBorder } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { editorLineHighlight, editorLineHighlightBorder } from 'vs/editor/common/view/editorColorRegistry';
|
||||
|
||||
export class CurrentLineMarginHighlightOverlay extends DynamicViewOverlay {
|
||||
private _context: ViewContext;
|
||||
@@ -36,7 +34,6 @@ export class CurrentLineMarginHighlightOverlay extends DynamicViewOverlay {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._context = null;
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -125,11 +122,11 @@ export class CurrentLineMarginHighlightOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let lineHighlight = theme.getColor(editorLineHighlight);
|
||||
const lineHighlight = theme.getColor(editorLineHighlight);
|
||||
if (lineHighlight) {
|
||||
collector.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${lineHighlight}; border: none; }`);
|
||||
} else {
|
||||
let lineHighlightBorder = theme.getColor(editorLineHighlightBorder);
|
||||
const lineHighlightBorder = theme.getColor(editorLineHighlightBorder);
|
||||
if (lineHighlightBorder) {
|
||||
collector.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { border: 2px solid ${lineHighlightBorder}; }`);
|
||||
}
|
||||
|
||||
@@ -3,22 +3,20 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./decorations';
|
||||
import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { HorizontalRange, RenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext, HorizontalRange } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel';
|
||||
|
||||
export class DecorationsOverlay extends DynamicViewOverlay {
|
||||
|
||||
private _context: ViewContext;
|
||||
private _lineHeight: number;
|
||||
private _typicalHalfwidthCharacterWidth: number;
|
||||
private _renderResult: string[];
|
||||
private _renderResult: string[] | null;
|
||||
|
||||
constructor(context: ViewContext) {
|
||||
super();
|
||||
@@ -32,7 +30,6 @@ export class DecorationsOverlay extends DynamicViewOverlay {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._context = null;
|
||||
this._renderResult = null;
|
||||
super.dispose();
|
||||
}
|
||||
@@ -85,14 +82,14 @@ export class DecorationsOverlay extends DynamicViewOverlay {
|
||||
|
||||
// Sort decorations for consistent render output
|
||||
decorations = decorations.sort((a, b) => {
|
||||
if (a.options.zIndex < b.options.zIndex) {
|
||||
if (a.options.zIndex! < b.options.zIndex!) {
|
||||
return -1;
|
||||
}
|
||||
if (a.options.zIndex > b.options.zIndex) {
|
||||
if (a.options.zIndex! > b.options.zIndex!) {
|
||||
return 1;
|
||||
}
|
||||
const aClassName = a.options.className;
|
||||
const bClassName = b.options.className;
|
||||
const aClassName = a.options.className!;
|
||||
const bClassName = b.options.className!;
|
||||
|
||||
if (aClassName < bClassName) {
|
||||
return -1;
|
||||
@@ -151,9 +148,9 @@ export class DecorationsOverlay extends DynamicViewOverlay {
|
||||
const lineHeight = String(this._lineHeight);
|
||||
const visibleStartLineNumber = ctx.visibleRange.startLineNumber;
|
||||
|
||||
let prevClassName: string = null;
|
||||
let prevClassName: string | null = null;
|
||||
let prevShowIfCollapsed: boolean = false;
|
||||
let prevRange: Range = null;
|
||||
let prevRange: Range | null = null;
|
||||
|
||||
for (let i = 0, lenI = decorations.length; i < lenI; i++) {
|
||||
const d = decorations[i];
|
||||
@@ -162,23 +159,23 @@ export class DecorationsOverlay extends DynamicViewOverlay {
|
||||
continue;
|
||||
}
|
||||
|
||||
const className = d.options.className;
|
||||
const showIfCollapsed = d.options.showIfCollapsed;
|
||||
const className = d.options.className!;
|
||||
const showIfCollapsed = Boolean(d.options.showIfCollapsed);
|
||||
|
||||
let range = d.range;
|
||||
if (showIfCollapsed && range.endColumn === 1 && range.endLineNumber !== range.startLineNumber) {
|
||||
range = new Range(range.startLineNumber, range.startColumn, range.endLineNumber - 1, this._context.model.getLineMaxColumn(range.endLineNumber - 1));
|
||||
}
|
||||
|
||||
if (prevClassName === className && prevShowIfCollapsed === showIfCollapsed && Range.areIntersectingOrTouching(prevRange, range)) {
|
||||
if (prevClassName === className && prevShowIfCollapsed === showIfCollapsed && Range.areIntersectingOrTouching(prevRange!, range)) {
|
||||
// merge into previous decoration
|
||||
prevRange = Range.plusRange(prevRange, range);
|
||||
prevRange = Range.plusRange(prevRange!, range);
|
||||
continue;
|
||||
}
|
||||
|
||||
// flush previous decoration
|
||||
if (prevClassName !== null) {
|
||||
this._renderNormalDecoration(ctx, prevRange, prevClassName, prevShowIfCollapsed, lineHeight, visibleStartLineNumber, output);
|
||||
this._renderNormalDecoration(ctx, prevRange!, prevClassName, prevShowIfCollapsed, lineHeight, visibleStartLineNumber, output);
|
||||
}
|
||||
|
||||
prevClassName = className;
|
||||
@@ -187,7 +184,7 @@ export class DecorationsOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
|
||||
if (prevClassName !== null) {
|
||||
this._renderNormalDecoration(ctx, prevRange, prevClassName, prevShowIfCollapsed, lineHeight, visibleStartLineNumber, output);
|
||||
this._renderNormalDecoration(ctx, prevRange!, prevClassName, prevShowIfCollapsed, lineHeight, visibleStartLineNumber, output);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,19 +2,18 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { ScrollableElementCreationOptions, ScrollableElementChangeOptions } from 'vs/base/browser/ui/scrollbar/scrollableElementOptions';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { IMouseEvent } from 'vs/base/browser/mouseEvent';
|
||||
import { IOverviewRulerLayoutInfo, SmoothScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
|
||||
import { ScrollableElementChangeOptions, ScrollableElementCreationOptions } from 'vs/base/browser/ui/scrollbar/scrollableElementOptions';
|
||||
import { PartFingerprint, PartFingerprints, ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { INewScrollPosition } from 'vs/editor/common/editorCommon';
|
||||
import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { getThemeTypeSelector } from 'vs/platform/theme/common/themeService';
|
||||
import { IMouseEvent } from 'vs/base/browser/mouseEvent';
|
||||
|
||||
export class EditorScrollbar extends ViewPart {
|
||||
|
||||
|
||||
@@ -3,12 +3,10 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./glyphMargin';
|
||||
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 { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
|
||||
export class DecorationToRender {
|
||||
@@ -49,7 +47,7 @@ export abstract class DedupOverlay extends DynamicViewOverlay {
|
||||
return (a.className < b.className ? -1 : 1);
|
||||
});
|
||||
|
||||
let prevClassName: string = null;
|
||||
let prevClassName: string | null = null;
|
||||
let prevEndLineIndex = 0;
|
||||
for (let i = 0, len = decorations.length; i < len; i++) {
|
||||
let d = decorations[i];
|
||||
@@ -81,7 +79,7 @@ export class GlyphMarginOverlay extends DedupOverlay {
|
||||
private _glyphMargin: boolean;
|
||||
private _glyphMarginLeft: number;
|
||||
private _glyphMarginWidth: number;
|
||||
private _renderResult: string[];
|
||||
private _renderResult: string[] | null;
|
||||
|
||||
constructor(context: ViewContext) {
|
||||
super();
|
||||
@@ -96,7 +94,6 @@ export class GlyphMarginOverlay extends DedupOverlay {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._context = null;
|
||||
this._renderResult = null;
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -3,16 +3,14 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./indentGuides';
|
||||
import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { editorActiveIndentGuides, editorIndentGuides } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { editorIndentGuides, editorActiveIndentGuides } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
|
||||
export class IndentGuidesOverlay extends DynamicViewOverlay {
|
||||
|
||||
@@ -20,7 +18,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay {
|
||||
private _primaryLineNumber: number;
|
||||
private _lineHeight: number;
|
||||
private _spaceWidth: number;
|
||||
private _renderResult: string[];
|
||||
private _renderResult: string[] | null;
|
||||
private _enabled: boolean;
|
||||
private _activeIndentEnabled: boolean;
|
||||
|
||||
@@ -39,7 +37,6 @@ export class IndentGuidesOverlay extends DynamicViewOverlay {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._context = null;
|
||||
this._renderResult = null;
|
||||
super.dispose();
|
||||
}
|
||||
@@ -160,11 +157,11 @@ export class IndentGuidesOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let editorIndentGuidesColor = theme.getColor(editorIndentGuides);
|
||||
const editorIndentGuidesColor = theme.getColor(editorIndentGuides);
|
||||
if (editorIndentGuidesColor) {
|
||||
collector.addRule(`.monaco-editor .lines-content .cigr { box-shadow: 1px 0 0 0 ${editorIndentGuidesColor} inset; }`);
|
||||
}
|
||||
let editorActiveIndentGuidesColor = theme.getColor(editorActiveIndentGuides) || editorIndentGuidesColor;
|
||||
const editorActiveIndentGuidesColor = theme.getColor(editorActiveIndentGuides) || editorIndentGuidesColor;
|
||||
if (editorActiveIndentGuidesColor) {
|
||||
collector.addRule(`.monaco-editor .lines-content .cigra { box-shadow: 1px 0 0 0 ${editorActiveIndentGuidesColor} inset; }`);
|
||||
}
|
||||
|
||||
@@ -3,18 +3,16 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./lineNumbers';
|
||||
import { editorLineNumbers, editorActiveLineNumber } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
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';
|
||||
import { RenderLineNumbersType } from 'vs/editor/common/config/editorOptions';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { editorActiveLineNumber, editorLineNumbers } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
|
||||
export class LineNumbersOverlay extends DynamicViewOverlay {
|
||||
|
||||
@@ -24,11 +22,11 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
|
||||
|
||||
private _lineHeight: number;
|
||||
private _renderLineNumbers: RenderLineNumbersType;
|
||||
private _renderCustomLineNumbers: (lineNumber: number) => string;
|
||||
private _renderCustomLineNumbers: ((lineNumber: number) => string) | null;
|
||||
private _lineNumbersLeft: number;
|
||||
private _lineNumbersWidth: number;
|
||||
private _lastCursorModelPosition: Position;
|
||||
private _renderResult: string[];
|
||||
private _renderResult: string[] | null;
|
||||
|
||||
constructor(context: ViewContext) {
|
||||
super();
|
||||
@@ -52,7 +50,6 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._context = null;
|
||||
this._renderResult = null;
|
||||
super.dispose();
|
||||
}
|
||||
@@ -171,7 +168,7 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
|
||||
// theming
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let lineNumbers = theme.getColor(editorLineNumbers);
|
||||
const lineNumbers = theme.getColor(editorLineNumbers);
|
||||
if (lineNumbers) {
|
||||
collector.addRule(`.monaco-editor .line-numbers { color: ${lineNumbers}; }`);
|
||||
}
|
||||
|
||||
@@ -2,10 +2,9 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import { HorizontalRange } from 'vs/editor/common/view/renderingContext';
|
||||
import { Constants } from 'vs/editor/common/core/uint';
|
||||
import { HorizontalRange } from 'vs/editor/common/view/renderingContext';
|
||||
|
||||
class FloatHorizontalRange {
|
||||
_floatHorizontalRangeBrand: void;
|
||||
@@ -49,7 +48,7 @@ export class RangeUtil {
|
||||
range.selectNodeContents(endNode);
|
||||
}
|
||||
|
||||
private static _readClientRects(startElement: Node, startOffset: number, endElement: Node, endOffset: number, endNode: HTMLElement): ClientRectList {
|
||||
private static _readClientRects(startElement: Node, startOffset: number, endElement: Node, endOffset: number, endNode: HTMLElement): ClientRectList | DOMRectList | null {
|
||||
let range = this._createRange();
|
||||
try {
|
||||
range.setStart(startElement, startOffset);
|
||||
@@ -95,7 +94,7 @@ export class RangeUtil {
|
||||
return result;
|
||||
}
|
||||
|
||||
private static _createHorizontalRangesFromClientRects(clientRects: ClientRectList, clientRectDeltaLeft: number): HorizontalRange[] {
|
||||
private static _createHorizontalRangesFromClientRects(clientRects: ClientRectList | DOMRectList | null, clientRectDeltaLeft: number): HorizontalRange[] | null {
|
||||
if (!clientRects || clientRects.length === 0) {
|
||||
return null;
|
||||
}
|
||||
@@ -112,7 +111,7 @@ export class RangeUtil {
|
||||
return this._mergeAdjacentRanges(result);
|
||||
}
|
||||
|
||||
public static readHorizontalRanges(domNode: HTMLElement, startChildIndex: number, startOffset: number, endChildIndex: number, endOffset: number, clientRectDeltaLeft: number, endNode: HTMLElement): HorizontalRange[] {
|
||||
public static readHorizontalRanges(domNode: HTMLElement, startChildIndex: number, startOffset: number, endChildIndex: number, endOffset: number, clientRectDeltaLeft: number, endNode: HTMLElement): HorizontalRange[] | null {
|
||||
// Panic check
|
||||
let min = 0;
|
||||
let max = domNode.children.length - 1;
|
||||
@@ -150,8 +149,8 @@ export class RangeUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
startOffset = Math.min(startElement.textContent.length, Math.max(0, startOffset));
|
||||
endOffset = Math.min(endElement.textContent.length, Math.max(0, endOffset));
|
||||
startOffset = Math.min(startElement.textContent!.length, Math.max(0, startOffset));
|
||||
endOffset = Math.min(endElement.textContent!.length, Math.max(0, endOffset));
|
||||
|
||||
let clientRects = this._readClientRects(startElement, startOffset, endElement, endOffset, endNode);
|
||||
return this._createHorizontalRangesFromClientRects(clientRects, clientRectDeltaLeft);
|
||||
|
||||
@@ -2,21 +2,20 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import * as browser from 'vs/base/browser/browser';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { IConfiguration } from 'vs/editor/common/editorCommon';
|
||||
import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations';
|
||||
import { renderViewLine, RenderLineInput, CharacterMapping, ForeignElementType } from 'vs/editor/common/viewLayout/viewLineRenderer';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import { IVisibleLine } from 'vs/editor/browser/view/viewLayer';
|
||||
import { RangeUtil } from 'vs/editor/browser/viewParts/lines/rangeUtil';
|
||||
import { HorizontalRange } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
|
||||
import { ThemeType, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService';
|
||||
import { IStringBuilder } from 'vs/editor/common/core/stringBuilder';
|
||||
import { IConfiguration } from 'vs/editor/common/editorCommon';
|
||||
import { HorizontalRange } from 'vs/editor/common/view/renderingContext';
|
||||
import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations';
|
||||
import { CharacterMapping, ForeignElementType, RenderLineInput, renderViewLine } from 'vs/editor/common/viewLayout/viewLineRenderer';
|
||||
import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
|
||||
import { InlineDecorationType } from 'vs/editor/common/viewModel/viewModel';
|
||||
import { HIGH_CONTRAST, ThemeType } from 'vs/platform/theme/common/themeService';
|
||||
|
||||
const canUseFastRenderedViewLine = (function () {
|
||||
if (platform.isNative) {
|
||||
@@ -74,6 +73,7 @@ export class ViewLineOptions {
|
||||
public readonly renderControlCharacters: boolean;
|
||||
public readonly spaceWidth: number;
|
||||
public readonly useMonospaceOptimizations: boolean;
|
||||
public readonly canUseHalfwidthRightwardsArrow: boolean;
|
||||
public readonly lineHeight: number;
|
||||
public readonly stopRenderingLineAfter: number;
|
||||
public readonly fontLigatures: boolean;
|
||||
@@ -87,6 +87,7 @@ export class ViewLineOptions {
|
||||
config.editor.fontInfo.isMonospace
|
||||
&& !config.editor.viewInfo.disableMonospaceOptimizations
|
||||
);
|
||||
this.canUseHalfwidthRightwardsArrow = config.editor.fontInfo.canUseHalfwidthRightwardsArrow;
|
||||
this.lineHeight = config.editor.lineHeight;
|
||||
this.stopRenderingLineAfter = config.editor.viewInfo.stopRenderingLineAfter;
|
||||
this.fontLigatures = config.editor.viewInfo.fontLigatures;
|
||||
@@ -99,6 +100,7 @@ export class ViewLineOptions {
|
||||
&& this.renderControlCharacters === other.renderControlCharacters
|
||||
&& this.spaceWidth === other.spaceWidth
|
||||
&& this.useMonospaceOptimizations === other.useMonospaceOptimizations
|
||||
&& this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow
|
||||
&& this.lineHeight === other.lineHeight
|
||||
&& this.stopRenderingLineAfter === other.stopRenderingLineAfter
|
||||
&& this.fontLigatures === other.fontLigatures
|
||||
@@ -112,7 +114,7 @@ export class ViewLine implements IVisibleLine {
|
||||
|
||||
private _options: ViewLineOptions;
|
||||
private _isMaybeInvalid: boolean;
|
||||
private _renderedViewLine: IRenderedViewLine;
|
||||
private _renderedViewLine: IRenderedViewLine | null;
|
||||
|
||||
constructor(options: ViewLineOptions) {
|
||||
this._options = options;
|
||||
@@ -122,7 +124,7 @@ export class ViewLine implements IVisibleLine {
|
||||
|
||||
// --- begin IVisibleLineData
|
||||
|
||||
public getDomNode(): HTMLElement {
|
||||
public getDomNode(): HTMLElement | null {
|
||||
if (this._renderedViewLine && this._renderedViewLine.domNode) {
|
||||
return this._renderedViewLine.domNode.domNode;
|
||||
}
|
||||
@@ -190,6 +192,7 @@ export class ViewLine implements IVisibleLine {
|
||||
|
||||
let renderLineInput = new RenderLineInput(
|
||||
options.useMonospaceOptimizations,
|
||||
options.canUseHalfwidthRightwardsArrow,
|
||||
lineData.content,
|
||||
lineData.continuesWithWrappedLine,
|
||||
lineData.isBasicASCII,
|
||||
@@ -222,7 +225,7 @@ export class ViewLine implements IVisibleLine {
|
||||
|
||||
sb.appendASCIIString('</div>');
|
||||
|
||||
let renderedViewLine: IRenderedViewLine = null;
|
||||
let renderedViewLine: IRenderedViewLine | null = null;
|
||||
if (canUseFastRenderedViewLine && lineData.isBasicASCII && options.useMonospaceOptimizations && output.containsForeignElements === ForeignElementType.None) {
|
||||
if (lineData.content.length < 300 && renderLineInput.lineTokens.getCount() < 100) {
|
||||
// Browser rounding errors have been observed in Chrome and IE, so using the fast
|
||||
@@ -279,7 +282,10 @@ export class ViewLine implements IVisibleLine {
|
||||
return this._renderedViewLine.getWidthIsFast();
|
||||
}
|
||||
|
||||
public getVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] {
|
||||
public getVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] | null {
|
||||
if (!this._renderedViewLine) {
|
||||
return null;
|
||||
}
|
||||
startColumn = startColumn | 0; // @perf
|
||||
endColumn = endColumn | 0; // @perf
|
||||
|
||||
@@ -305,16 +311,19 @@ export class ViewLine implements IVisibleLine {
|
||||
}
|
||||
|
||||
public getColumnOfNodeOffset(lineNumber: number, spanNode: HTMLElement, offset: number): number {
|
||||
if (!this._renderedViewLine) {
|
||||
return 1;
|
||||
}
|
||||
return this._renderedViewLine.getColumnOfNodeOffset(lineNumber, spanNode, offset);
|
||||
}
|
||||
}
|
||||
|
||||
interface IRenderedViewLine {
|
||||
domNode: FastDomNode<HTMLElement>;
|
||||
domNode: FastDomNode<HTMLElement> | null;
|
||||
readonly input: RenderLineInput;
|
||||
getWidth(): number;
|
||||
getWidthIsFast(): boolean;
|
||||
getVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[];
|
||||
getVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] | null;
|
||||
getColumnOfNodeOffset(lineNumber: number, spanNode: HTMLElement, offset: number): number;
|
||||
}
|
||||
|
||||
@@ -323,13 +332,13 @@ interface IRenderedViewLine {
|
||||
*/
|
||||
class FastRenderedViewLine implements IRenderedViewLine {
|
||||
|
||||
public domNode: FastDomNode<HTMLElement>;
|
||||
public domNode: FastDomNode<HTMLElement> | null;
|
||||
public readonly input: RenderLineInput;
|
||||
|
||||
private readonly _characterMapping: CharacterMapping;
|
||||
private readonly _charWidth: number;
|
||||
|
||||
constructor(domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping) {
|
||||
constructor(domNode: FastDomNode<HTMLElement> | null, renderLineInput: RenderLineInput, characterMapping: CharacterMapping) {
|
||||
this.domNode = domNode;
|
||||
this.input = renderLineInput;
|
||||
|
||||
@@ -345,7 +354,7 @@ class FastRenderedViewLine implements IRenderedViewLine {
|
||||
return true;
|
||||
}
|
||||
|
||||
public getVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] {
|
||||
public getVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] | null {
|
||||
const startPosition = this._getCharPosition(startColumn);
|
||||
const endPosition = this._getCharPosition(endColumn);
|
||||
return [new HorizontalRange(startPosition, endPosition - startPosition)];
|
||||
@@ -361,7 +370,7 @@ class FastRenderedViewLine implements IRenderedViewLine {
|
||||
}
|
||||
|
||||
public getColumnOfNodeOffset(lineNumber: number, spanNode: HTMLElement, offset: number): number {
|
||||
let spanNodeTextContentLength = spanNode.textContent.length;
|
||||
let spanNodeTextContentLength = spanNode.textContent!.length;
|
||||
|
||||
let spanIndex = -1;
|
||||
while (spanNode) {
|
||||
@@ -390,7 +399,7 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
/**
|
||||
* This is a map that is used only when the line is guaranteed to have no RTL text.
|
||||
*/
|
||||
private _pixelOffsetCache: Int32Array;
|
||||
private _pixelOffsetCache: Int32Array | null;
|
||||
|
||||
constructor(domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType) {
|
||||
this.domNode = domNode;
|
||||
@@ -435,7 +444,7 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
/**
|
||||
* Visible ranges for a model range
|
||||
*/
|
||||
public getVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] {
|
||||
public getVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] | null {
|
||||
if (this._pixelOffsetCache !== null) {
|
||||
// the text is LTR
|
||||
let startOffset = this._readPixelOffset(startColumn, context);
|
||||
@@ -454,7 +463,7 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
return this._readVisibleRangesForRange(startColumn, endColumn, context);
|
||||
}
|
||||
|
||||
protected _readVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] {
|
||||
protected _readVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] | null {
|
||||
if (startColumn === endColumn) {
|
||||
let pixelOffset = this._readPixelOffset(startColumn, context);
|
||||
if (pixelOffset === -1) {
|
||||
@@ -526,7 +535,7 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
return r[0].left;
|
||||
}
|
||||
|
||||
private _readRawVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] {
|
||||
private _readRawVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] | null {
|
||||
|
||||
if (startColumn === 1 && endColumn === this._characterMapping.length) {
|
||||
// This branch helps IE with bidi text & gives a performance boost to other browsers when reading visible ranges for an entire line
|
||||
@@ -549,7 +558,7 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
* Returns the column for the text found at a specific offset inside a rendered dom node
|
||||
*/
|
||||
public getColumnOfNodeOffset(lineNumber: number, spanNode: HTMLElement, offset: number): number {
|
||||
let spanNodeTextContentLength = spanNode.textContent.length;
|
||||
let spanNodeTextContentLength = spanNode.textContent!.length;
|
||||
|
||||
let spanIndex = -1;
|
||||
while (spanNode) {
|
||||
@@ -563,7 +572,7 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
}
|
||||
|
||||
class WebKitRenderedViewLine extends RenderedViewLine {
|
||||
protected _readVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] {
|
||||
protected _readVisibleRangesForRange(startColumn: number, endColumn: number, context: DomReadingContext): HorizontalRange[] | null {
|
||||
let output = super._readVisibleRangesForRange(startColumn, endColumn, context);
|
||||
|
||||
if (!output || output.length === 0 || startColumn === endColumn || (startColumn === 1 && endColumn === this._characterMapping.length)) {
|
||||
@@ -572,20 +581,16 @@ class WebKitRenderedViewLine extends RenderedViewLine {
|
||||
|
||||
// WebKit is buggy and returns an expanded range (to contain words in some cases)
|
||||
// The last client rect is enlarged (I think)
|
||||
|
||||
// This is an attempt to patch things up
|
||||
// Find position of previous column
|
||||
let beforeEndPixelOffset = this._readPixelOffset(endColumn - 1, context);
|
||||
// Find position of last column
|
||||
let endPixelOffset = this._readPixelOffset(endColumn, context);
|
||||
|
||||
if (beforeEndPixelOffset !== -1 && endPixelOffset !== -1) {
|
||||
let isLTR = (beforeEndPixelOffset <= endPixelOffset);
|
||||
let lastRange = output[output.length - 1];
|
||||
|
||||
if (isLTR && lastRange.left < endPixelOffset) {
|
||||
// Trim down the width of the last visible range to not go after the last column's position
|
||||
lastRange.width = endPixelOffset - lastRange.left;
|
||||
if (!this.input.containsRTL) {
|
||||
// This is an attempt to patch things up
|
||||
// Find position of last column
|
||||
let endPixelOffset = this._readPixelOffset(endColumn, context);
|
||||
if (endPixelOffset !== -1) {
|
||||
let lastRange = output[output.length - 1];
|
||||
if (lastRange.left < endPixelOffset) {
|
||||
// Trim down the width of the last visible range to not go after the last column's position
|
||||
lastRange.width = endPixelOffset - lastRange.left;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -593,7 +598,7 @@ class WebKitRenderedViewLine extends RenderedViewLine {
|
||||
}
|
||||
}
|
||||
|
||||
const createRenderedLine: (domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType) => RenderedViewLine = (function () {
|
||||
const createRenderedLine: (domNode: FastDomNode<HTMLElement> | null, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType) => RenderedViewLine = (function () {
|
||||
if (browser.isWebKit) {
|
||||
return createWebKitRenderedLine;
|
||||
}
|
||||
|
||||
@@ -2,23 +2,22 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./viewLines';
|
||||
import { RunOnceScheduler } from 'vs/base/common/async';
|
||||
import { FastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { VisibleLinesCollection, IVisibleLinesHost } from 'vs/editor/browser/view/viewLayer';
|
||||
import { ViewLineOptions, DomReadingContext, ViewLine } from 'vs/editor/browser/viewParts/lines/viewLine';
|
||||
import { RunOnceScheduler } from 'vs/base/common/async';
|
||||
import { Configuration } from 'vs/editor/browser/config/configuration';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
|
||||
import { IViewLines, HorizontalRange, LineVisibleRanges } from 'vs/editor/common/view/renderingContext';
|
||||
import { Viewport } from 'vs/editor/common/viewModel/viewModel';
|
||||
import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { IVisibleLinesHost, VisibleLinesCollection } from 'vs/editor/browser/view/viewLayer';
|
||||
import { PartFingerprint, PartFingerprints, ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { DomReadingContext, ViewLine, ViewLineOptions } from 'vs/editor/browser/viewParts/lines/viewLine';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { ScrollType } from 'vs/editor/common/editorCommon';
|
||||
import { HorizontalRange, IViewLines, LineVisibleRanges } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
|
||||
import { Viewport } from 'vs/editor/common/viewModel/viewModel';
|
||||
|
||||
class LastRenderedData {
|
||||
|
||||
@@ -58,7 +57,7 @@ class HorizontalRevealRequest {
|
||||
|
||||
export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>, IViewLines {
|
||||
/**
|
||||
* Adds this ammount of pixels to the right of lines (no-one wants to type near the edge of the viewport)
|
||||
* Adds this amount of pixels to the right of lines (no-one wants to type near the edge of the viewport)
|
||||
*/
|
||||
private static readonly HORIZONTAL_EXTRA_PX = 30;
|
||||
|
||||
@@ -79,7 +78,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
|
||||
private _maxLineWidth: number;
|
||||
private _asyncUpdateLineWidths: RunOnceScheduler;
|
||||
|
||||
private _horizontalRevealRequest: HorizontalRevealRequest;
|
||||
private _horizontalRevealRequest: HorizontalRevealRequest | null;
|
||||
private _lastRenderedData: LastRenderedData;
|
||||
|
||||
constructor(context: ViewContext, linesContent: FastDomNode<HTMLElement>) {
|
||||
@@ -282,7 +281,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
|
||||
|
||||
// ----------- HELPERS FOR OTHERS
|
||||
|
||||
public getPositionFromDOMInfo(spanNode: HTMLElement, offset: number): Position {
|
||||
public getPositionFromDOMInfo(spanNode: HTMLElement, offset: number): Position | null {
|
||||
let viewLineDomNode = this._getViewLineDomNode(spanNode);
|
||||
if (viewLineDomNode === null) {
|
||||
// Couldn't find view line node
|
||||
@@ -320,7 +319,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
|
||||
return new Position(lineNumber, column);
|
||||
}
|
||||
|
||||
private _getViewLineDomNode(node: HTMLElement): HTMLElement {
|
||||
private _getViewLineDomNode(node: HTMLElement | null): HTMLElement | null {
|
||||
while (node && node.nodeType === 1) {
|
||||
if (node.className === ViewLine.CLASS_NAME) {
|
||||
return node;
|
||||
@@ -356,15 +355,15 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
|
||||
return this._visibleLines.getVisibleLine(lineNumber).getWidth();
|
||||
}
|
||||
|
||||
public linesVisibleRangesForRange(range: Range, includeNewLines: boolean): LineVisibleRanges[] {
|
||||
public linesVisibleRangesForRange(_range: Range, includeNewLines: boolean): LineVisibleRanges[] | null {
|
||||
if (this.shouldRender()) {
|
||||
// Cannot read from the DOM because it is dirty
|
||||
// i.e. the model & the dom are out of sync, so I'd be reading something stale
|
||||
return null;
|
||||
}
|
||||
|
||||
let originalEndLineNumber = range.endLineNumber;
|
||||
range = Range.intersectRanges(range, this._lastRenderedData.getCurrentVisibleRange());
|
||||
let originalEndLineNumber = _range.endLineNumber;
|
||||
const range = Range.intersectRanges(_range, this._lastRenderedData.getCurrentVisibleRange());
|
||||
if (!range) {
|
||||
return null;
|
||||
}
|
||||
@@ -372,7 +371,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
|
||||
let visibleRanges: LineVisibleRanges[] = [], visibleRangesLen = 0;
|
||||
let domReadingContext = new DomReadingContext(this.domNode.domNode, this._textRangeRestingSpot);
|
||||
|
||||
let nextLineModelLineNumber: number;
|
||||
let nextLineModelLineNumber: number = 0;
|
||||
if (includeNewLines) {
|
||||
nextLineModelLineNumber = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber;
|
||||
}
|
||||
@@ -412,7 +411,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
|
||||
return visibleRanges;
|
||||
}
|
||||
|
||||
public visibleRangesForRange2(range: Range): HorizontalRange[] {
|
||||
private visibleRangesForRange2(_range: Range): HorizontalRange[] | null {
|
||||
|
||||
if (this.shouldRender()) {
|
||||
// Cannot read from the DOM because it is dirty
|
||||
@@ -420,7 +419,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
|
||||
return null;
|
||||
}
|
||||
|
||||
range = Range.intersectRanges(range, this._lastRenderedData.getCurrentVisibleRange());
|
||||
const range = Range.intersectRanges(_range, this._lastRenderedData.getCurrentVisibleRange());
|
||||
if (!range) {
|
||||
return null;
|
||||
}
|
||||
@@ -454,6 +453,14 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
|
||||
return result;
|
||||
}
|
||||
|
||||
public visibleRangeForPosition(position: Position): HorizontalRange | null {
|
||||
const visibleRanges = this.visibleRangesForRange2(new Range(position.lineNumber, position.column, position.lineNumber, position.column));
|
||||
if (!visibleRanges) {
|
||||
return null;
|
||||
}
|
||||
return visibleRanges[0];
|
||||
}
|
||||
|
||||
// --- implementation
|
||||
|
||||
public updateLineWidths(): void {
|
||||
|
||||
@@ -3,12 +3,10 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./linesDecorations';
|
||||
import { DecorationToRender, DedupOverlay } from 'vs/editor/browser/viewParts/glyphMargin/glyphMargin';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
|
||||
export class LinesDecorationsOverlay extends DedupOverlay {
|
||||
@@ -17,7 +15,7 @@ export class LinesDecorationsOverlay extends DedupOverlay {
|
||||
|
||||
private _decorationsLeft: number;
|
||||
private _decorationsWidth: number;
|
||||
private _renderResult: string[];
|
||||
private _renderResult: string[] | null;
|
||||
|
||||
constructor(context: ViewContext) {
|
||||
super();
|
||||
@@ -30,7 +28,6 @@ export class LinesDecorationsOverlay extends DedupOverlay {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._context = null;
|
||||
this._renderResult = null;
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -3,12 +3,10 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
|
||||
export class Margin extends ViewPart {
|
||||
|
||||
@@ -3,17 +3,15 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./marginDecorations';
|
||||
import { DecorationToRender, DedupOverlay } from 'vs/editor/browser/viewParts/glyphMargin/glyphMargin';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
|
||||
export class MarginViewLineDecorationsOverlay extends DedupOverlay {
|
||||
private _context: ViewContext;
|
||||
private _renderResult: string[];
|
||||
private _renderResult: string[] | null;
|
||||
|
||||
constructor(context: ViewContext) {
|
||||
super();
|
||||
@@ -24,7 +22,6 @@ export class MarginViewLineDecorationsOverlay extends DedupOverlay {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._context = null;
|
||||
this._renderResult = null;
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -3,38 +3,29 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./minimap';
|
||||
import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart';
|
||||
import * as strings from 'vs/base/common/strings';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { getOrCreateMinimapCharRenderer } from 'vs/editor/common/view/runtimeMinimapCharRenderer';
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { MinimapCharRenderer, MinimapTokensColorTracker, Constants } from 'vs/editor/common/view/minimapCharRenderer';
|
||||
import * as editorCommon from 'vs/editor/common/editorCommon';
|
||||
import { CharCode } from 'vs/base/common/charCode';
|
||||
import { ViewLineData } from 'vs/editor/common/viewModel/viewModel';
|
||||
import { ColorId } from 'vs/editor/common/modes';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { GlobalMouseMoveMonitor, IStandardMouseMoveEventData, standardMouseMoveMerger } from 'vs/base/browser/globalMouseMoveMonitor';
|
||||
import { CharCode } from 'vs/base/common/charCode';
|
||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { RenderedLinesCollection, ILine } from 'vs/editor/browser/view/viewLayer';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import * as strings from 'vs/base/common/strings';
|
||||
import { ILine, RenderedLinesCollection } from 'vs/editor/browser/view/viewLayer';
|
||||
import { PartFingerprint, PartFingerprints, ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { RenderMinimap } from 'vs/editor/common/config/editorOptions';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { RGBA8 } from 'vs/editor/common/core/rgba';
|
||||
import { IConfiguration, ScrollType } from 'vs/editor/common/editorCommon';
|
||||
import { ColorId } from 'vs/editor/common/modes';
|
||||
import { Constants, MinimapCharRenderer, MinimapTokensColorTracker } from 'vs/editor/common/view/minimapCharRenderer';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { getOrCreateMinimapCharRenderer } from 'vs/editor/common/view/runtimeMinimapCharRenderer';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { GlobalMouseMoveMonitor, IStandardMouseMoveEventData, standardMouseMoveMerger } from 'vs/base/browser/globalMouseMoveMonitor';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import { ViewLineData } from 'vs/editor/common/viewModel/viewModel';
|
||||
import { scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground, scrollbarShadow } from 'vs/platform/theme/common/colorRegistry';
|
||||
|
||||
const enum RenderMinimap {
|
||||
None = 0,
|
||||
Small = 1,
|
||||
Large = 2,
|
||||
SmallBlocks = 3,
|
||||
LargeBlocks = 4,
|
||||
}
|
||||
|
||||
function getMinimapLineHeight(renderMinimap: RenderMinimap): number {
|
||||
if (renderMinimap === RenderMinimap.Large) {
|
||||
@@ -114,7 +105,7 @@ class MinimapOptions {
|
||||
*/
|
||||
public readonly canvasOuterHeight: number;
|
||||
|
||||
constructor(configuration: editorCommon.IConfiguration) {
|
||||
constructor(configuration: IConfiguration) {
|
||||
const pixelRatio = configuration.editor.pixelRatio;
|
||||
const layoutInfo = configuration.editor.layoutInfo;
|
||||
const viewInfo = configuration.editor.viewInfo;
|
||||
@@ -222,7 +213,7 @@ class MinimapLayout {
|
||||
lineCount: number,
|
||||
scrollTop: number,
|
||||
scrollHeight: number,
|
||||
previousLayout: MinimapLayout
|
||||
previousLayout: MinimapLayout | null
|
||||
): MinimapLayout {
|
||||
const pixelRatio = options.pixelRatio;
|
||||
const minimapLineHeight = getMinimapLineHeight(options.renderMinimap);
|
||||
@@ -447,8 +438,8 @@ export class Minimap extends ViewPart {
|
||||
private readonly _sliderMouseDownListener: IDisposable;
|
||||
|
||||
private _options: MinimapOptions;
|
||||
private _lastRenderData: RenderData;
|
||||
private _buffers: MinimapBuffers;
|
||||
private _lastRenderData: RenderData | null;
|
||||
private _buffers: MinimapBuffers | null;
|
||||
|
||||
constructor(context: ViewContext) {
|
||||
super(context);
|
||||
@@ -509,7 +500,7 @@ export class Minimap extends ViewPart {
|
||||
new Range(lineNumber, 1, lineNumber, 1),
|
||||
viewEvents.VerticalRevealType.Center,
|
||||
false,
|
||||
editorCommon.ScrollType.Smooth
|
||||
ScrollType.Smooth
|
||||
));
|
||||
});
|
||||
|
||||
@@ -583,13 +574,13 @@ export class Minimap extends ViewPart {
|
||||
private _getBuffer(): ImageData {
|
||||
if (!this._buffers) {
|
||||
this._buffers = new MinimapBuffers(
|
||||
this._canvas.domNode.getContext('2d'),
|
||||
this._canvas.domNode.getContext('2d')!,
|
||||
this._options.canvasInnerWidth,
|
||||
this._options.canvasInnerHeight,
|
||||
this._tokensColorTracker.getColor(ColorId.DefaultBackground)
|
||||
);
|
||||
}
|
||||
return this._buffers.getBuffer();
|
||||
return this._buffers!.getBuffer();
|
||||
}
|
||||
|
||||
private _onOptionsMaybeChanged(): boolean {
|
||||
@@ -742,7 +733,7 @@ export class Minimap extends ViewPart {
|
||||
getOrCreateMinimapCharRenderer(),
|
||||
dy,
|
||||
tabSize,
|
||||
lineInfo.data[lineIndex]
|
||||
lineInfo.data[lineIndex]!
|
||||
);
|
||||
}
|
||||
renderedLines[lineIndex] = new MinimapLine(dy);
|
||||
@@ -754,7 +745,7 @@ export class Minimap extends ViewPart {
|
||||
const dirtyHeight = dirtyY2 - dirtyY1;
|
||||
|
||||
// Finally, paint to the canvas
|
||||
const ctx = this._canvas.domNode.getContext('2d');
|
||||
const ctx = this._canvas.domNode.getContext('2d')!;
|
||||
ctx.putImageData(imageData, 0, 0, 0, dirtyY1, imageData.width, dirtyHeight);
|
||||
|
||||
// Save rendered data for reuse on next frame if possible
|
||||
@@ -770,7 +761,7 @@ export class Minimap extends ViewPart {
|
||||
startLineNumber: number,
|
||||
endLineNumber: number,
|
||||
minimapLineHeight: number,
|
||||
lastRenderData: RenderData,
|
||||
lastRenderData: RenderData | null,
|
||||
): [number, number, boolean[]] {
|
||||
|
||||
let needed: boolean[] = [];
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./overlayWidgets';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { IOverlayWidget, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser';
|
||||
import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { PartFingerprint, PartFingerprints, ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
|
||||
interface IWidgetData {
|
||||
widget: IOverlayWidget;
|
||||
preference: OverlayWidgetPositionPreference;
|
||||
preference: OverlayWidgetPositionPreference | null;
|
||||
domNode: FastDomNode<HTMLElement>;
|
||||
}
|
||||
|
||||
@@ -51,7 +49,7 @@ export class ViewOverlayWidgets extends ViewPart {
|
||||
|
||||
public dispose(): void {
|
||||
super.dispose();
|
||||
this._widgets = null;
|
||||
this._widgets = {};
|
||||
}
|
||||
|
||||
public getDomNode(): FastDomNode<HTMLElement> {
|
||||
@@ -91,7 +89,7 @@ export class ViewOverlayWidgets extends ViewPart {
|
||||
this.setShouldRender();
|
||||
}
|
||||
|
||||
public setWidgetPosition(widget: IOverlayWidget, preference: OverlayWidgetPositionPreference): boolean {
|
||||
public setWidgetPosition(widget: IOverlayWidget, preference: OverlayWidgetPositionPreference | null): boolean {
|
||||
let widgetData = this._widgets[widget.getId()];
|
||||
if (widgetData.preference === preference) {
|
||||
return false;
|
||||
@@ -110,7 +108,7 @@ export class ViewOverlayWidgets extends ViewPart {
|
||||
const domNode = widgetData.domNode.domNode;
|
||||
delete this._widgets[widgetId];
|
||||
|
||||
domNode.parentNode.removeChild(domNode);
|
||||
domNode.parentNode!.removeChild(domNode);
|
||||
this.setShouldRender();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,20 +2,19 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import * as editorCommon from 'vs/editor/common/editorCommon';
|
||||
import { ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { TokenizationRegistry } from 'vs/editor/common/modes';
|
||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { editorOverviewRulerBorder, editorCursorForeground } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { Color } from 'vs/base/common/color';
|
||||
import { ITheme } from 'vs/platform/theme/common/themeService';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { Color } from 'vs/base/common/color';
|
||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { IConfiguration } from 'vs/editor/common/editorCommon';
|
||||
import { TokenizationRegistry } from 'vs/editor/common/modes';
|
||||
import { editorCursorForeground, editorOverviewRulerBorder } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { ITheme } from 'vs/platform/theme/common/themeService';
|
||||
|
||||
class Settings {
|
||||
|
||||
@@ -24,13 +23,13 @@ class Settings {
|
||||
public readonly overviewRulerLanes: number;
|
||||
|
||||
public readonly renderBorder: boolean;
|
||||
public readonly borderColor: string;
|
||||
public readonly borderColor: string | null;
|
||||
|
||||
public readonly hideCursor: boolean;
|
||||
public readonly cursorColor: string;
|
||||
public readonly cursorColor: string | null;
|
||||
|
||||
public readonly themeType: 'light' | 'dark' | 'hc';
|
||||
public readonly backgroundColor: string;
|
||||
public readonly backgroundColor: string | null;
|
||||
|
||||
public readonly top: number;
|
||||
public readonly right: number;
|
||||
@@ -42,7 +41,7 @@ class Settings {
|
||||
public readonly x: number[];
|
||||
public readonly w: number[];
|
||||
|
||||
constructor(config: editorCommon.IConfiguration, theme: ITheme) {
|
||||
constructor(config: IConfiguration, theme: ITheme) {
|
||||
this.lineHeight = config.editor.lineHeight;
|
||||
this.pixelRatio = config.editor.pixelRatio;
|
||||
this.overviewRulerLanes = config.editor.viewInfo.overviewRulerLanes;
|
||||
@@ -214,7 +213,6 @@ export class DecorationsOverviewRuler extends ViewPart {
|
||||
this._domNode.setLayerHinting(true);
|
||||
this._domNode.setAttribute('aria-hidden', 'true');
|
||||
|
||||
this._settings = null;
|
||||
this._updateSettings(false);
|
||||
|
||||
this._tokensColorTrackerListener = TokenizationRegistry.onDidChange((e) => {
|
||||
@@ -233,7 +231,7 @@ export class DecorationsOverviewRuler extends ViewPart {
|
||||
|
||||
private _updateSettings(renderNow: boolean): boolean {
|
||||
const newSettings = new Settings(this._context.configuration, this._context.theme);
|
||||
if (this._settings !== null && this._settings.equals(newSettings)) {
|
||||
if (this._settings && this._settings.equals(newSettings)) {
|
||||
// nothing to do
|
||||
return false;
|
||||
}
|
||||
@@ -311,7 +309,7 @@ export class DecorationsOverviewRuler extends ViewPart {
|
||||
const minDecorationHeight = (Constants.MIN_DECORATION_HEIGHT * this._settings.pixelRatio) | 0;
|
||||
const halfMinDecorationHeight = (minDecorationHeight / 2) | 0;
|
||||
|
||||
const canvasCtx = this._domNode.domNode.getContext('2d');
|
||||
const canvasCtx = this._domNode.domNode.getContext('2d')!;
|
||||
if (this._settings.backgroundColor === null) {
|
||||
canvasCtx.clearRect(0, 0, canvasWidth, canvasHeight);
|
||||
} else {
|
||||
@@ -373,7 +371,7 @@ export class DecorationsOverviewRuler extends ViewPart {
|
||||
}
|
||||
|
||||
// Draw cursors
|
||||
if (!this._settings.hideCursor) {
|
||||
if (!this._settings.hideCursor && this._settings.cursorColor) {
|
||||
const cursorHeight = (2 * this._settings.pixelRatio) | 0;
|
||||
const halfCursorHeight = (cursorHeight / 2) | 0;
|
||||
const cursorX = this._settings.x[OverviewRulerLane.Full];
|
||||
|
||||
@@ -2,15 +2,14 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { IOverviewRuler } from 'vs/editor/browser/editorBrowser';
|
||||
import { OverviewRulerPosition } from 'vs/editor/common/config/editorOptions';
|
||||
import { ColorZone, OverviewRulerZone, OverviewZoneManager } from 'vs/editor/common/view/overviewZoneManager';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { OverviewRulerPosition } from 'vs/editor/common/config/editorOptions';
|
||||
import { OverviewRulerZone, OverviewZoneManager, ColorZone } from 'vs/editor/common/view/overviewZoneManager';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler';
|
||||
|
||||
export class OverviewRuler extends ViewEventHandler implements IOverviewRuler {
|
||||
|
||||
@@ -40,7 +39,6 @@ export class OverviewRuler extends ViewEventHandler implements IOverviewRuler {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._zoneManager = null;
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -119,7 +117,7 @@ export class OverviewRuler extends ViewEventHandler implements IOverviewRuler {
|
||||
let colorZones = this._zoneManager.resolveColorZones();
|
||||
let id2Color = this._zoneManager.getId2Color();
|
||||
|
||||
let ctx = this._domNode.domNode.getContext('2d');
|
||||
let ctx = this._domNode.domNode.getContext('2d')!;
|
||||
ctx.clearRect(0, 0, width, height);
|
||||
if (colorZones.length > 0) {
|
||||
this._renderOneLane(ctx, colorZones, id2Color, width);
|
||||
|
||||
@@ -3,16 +3,14 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./rulers';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { editorRuler } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { editorRuler } from 'vs/editor/common/view/editorColorRegistry';
|
||||
|
||||
export class Rulers extends ViewPart {
|
||||
|
||||
@@ -81,7 +79,7 @@ export class Rulers extends ViewPart {
|
||||
|
||||
let removeCount = currentCount - desiredCount;
|
||||
while (removeCount > 0) {
|
||||
let node = this._renderedRulers.pop();
|
||||
let node = this._renderedRulers.pop()!;
|
||||
this.domNode.removeChild(node);
|
||||
removeCount--;
|
||||
}
|
||||
@@ -101,7 +99,7 @@ export class Rulers extends ViewPart {
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let rulerColor = theme.getColor(editorRuler);
|
||||
const rulerColor = theme.getColor(editorRuler);
|
||||
if (rulerColor) {
|
||||
collector.addRule(`.monaco-editor .view-ruler { box-shadow: 1px 0 0 0 ${rulerColor} inset; }`);
|
||||
}
|
||||
|
||||
@@ -3,16 +3,14 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./scrollDecoration';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { scrollbarShadow } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
|
||||
export class ScrollDecorationViewPart extends ViewPart {
|
||||
|
||||
@@ -97,7 +95,7 @@ export class ScrollDecorationViewPart extends ViewPart {
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let shadow = theme.getColor(scrollbarShadow);
|
||||
const shadow = theme.getColor(scrollbarShadow);
|
||||
if (shadow) {
|
||||
collector.addRule(`.monaco-editor .scroll-decoration { box-shadow: ${shadow} 0 6px 6px -6px inset; }`);
|
||||
}
|
||||
|
||||
@@ -3,17 +3,15 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./selections';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { editorSelectionBackground, editorInactiveSelection, editorSelectionForeground } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { HorizontalRange, LineVisibleRanges, RenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import * as browser from 'vs/base/browser/browser';
|
||||
import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { HorizontalRange, LineVisibleRanges, RenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { editorInactiveSelection, editorSelectionBackground, editorSelectionForeground } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
|
||||
const enum CornerStyle {
|
||||
EXTERN,
|
||||
@@ -29,8 +27,8 @@ interface IVisibleRangeEndPointStyle {
|
||||
class HorizontalRangeWithStyle {
|
||||
public left: number;
|
||||
public width: number;
|
||||
public startStyle: IVisibleRangeEndPointStyle;
|
||||
public endStyle: IVisibleRangeEndPointStyle;
|
||||
public startStyle: IVisibleRangeEndPointStyle | null;
|
||||
public endStyle: IVisibleRangeEndPointStyle | null;
|
||||
|
||||
constructor(other: HorizontalRange) {
|
||||
this.left = other.left;
|
||||
@@ -80,7 +78,7 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
private _roundedSelection: boolean;
|
||||
private _typicalHalfwidthCharacterWidth: number;
|
||||
private _selections: Range[];
|
||||
private _renderResult: string[];
|
||||
private _renderResult: string[] | null;
|
||||
|
||||
constructor(context: ViewContext) {
|
||||
super();
|
||||
@@ -95,8 +93,6 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
|
||||
public dispose(): void {
|
||||
this._context.removeEventHandler(this);
|
||||
this._context = null;
|
||||
this._selections = null;
|
||||
this._renderResult = null;
|
||||
super.dispose();
|
||||
}
|
||||
@@ -158,10 +154,10 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
return false;
|
||||
}
|
||||
|
||||
private _enrichVisibleRangesWithStyle(viewport: Range, linesVisibleRanges: LineVisibleRangesWithStyle[], previousFrame: LineVisibleRangesWithStyle[]): void {
|
||||
private _enrichVisibleRangesWithStyle(viewport: Range, linesVisibleRanges: LineVisibleRangesWithStyle[], previousFrame: LineVisibleRangesWithStyle[] | null): void {
|
||||
const epsilon = this._typicalHalfwidthCharacterWidth / 4;
|
||||
let previousFrameTop: HorizontalRangeWithStyle = null;
|
||||
let previousFrameBottom: HorizontalRangeWithStyle = null;
|
||||
let previousFrameTop: HorizontalRangeWithStyle | null = null;
|
||||
let previousFrameBottom: HorizontalRangeWithStyle | null = null;
|
||||
|
||||
if (previousFrame && previousFrame.length > 0 && linesVisibleRanges.length > 0) {
|
||||
|
||||
@@ -225,8 +221,8 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
} else if (previousFrameTop) {
|
||||
// Accept some hick-ups near the viewport edges to save on repaints
|
||||
startStyle.top = previousFrameTop.startStyle.top;
|
||||
endStyle.top = previousFrameTop.endStyle.top;
|
||||
startStyle.top = previousFrameTop.startStyle!.top;
|
||||
endStyle.top = previousFrameTop.endStyle!.top;
|
||||
}
|
||||
|
||||
if (i + 1 < len) {
|
||||
@@ -247,8 +243,8 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
} else if (previousFrameBottom) {
|
||||
// Accept some hick-ups near the viewport edges to save on repaints
|
||||
startStyle.bottom = previousFrameBottom.startStyle.bottom;
|
||||
endStyle.bottom = previousFrameBottom.endStyle.bottom;
|
||||
startStyle.bottom = previousFrameBottom.startStyle!.bottom;
|
||||
endStyle.bottom = previousFrameBottom.endStyle!.bottom;
|
||||
}
|
||||
|
||||
curLineRange.startStyle = startStyle;
|
||||
@@ -256,7 +252,7 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
}
|
||||
|
||||
private _getVisibleRangesWithStyle(selection: Range, ctx: RenderingContext, previousFrame: LineVisibleRangesWithStyle[]): LineVisibleRangesWithStyle[] {
|
||||
private _getVisibleRangesWithStyle(selection: Range, ctx: RenderingContext, previousFrame: LineVisibleRangesWithStyle[] | null): LineVisibleRangesWithStyle[] {
|
||||
let _linesVisibleRanges = ctx.linesVisibleRangesForRange(selection, true) || [];
|
||||
let linesVisibleRanges = _linesVisibleRanges.map(toStyled);
|
||||
let visibleRangesHaveGaps = this._visibleRangesHaveGaps(linesVisibleRanges);
|
||||
@@ -307,7 +303,9 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
let visibleRange = lineVisibleRanges.ranges[j];
|
||||
|
||||
if (visibleRangesHaveStyle) {
|
||||
if (visibleRange.startStyle.top === CornerStyle.INTERN || visibleRange.startStyle.bottom === CornerStyle.INTERN) {
|
||||
const startStyle = visibleRange.startStyle!;
|
||||
const endStyle = visibleRange.endStyle!;
|
||||
if (startStyle.top === CornerStyle.INTERN || startStyle.bottom === CornerStyle.INTERN) {
|
||||
// Reverse rounded corner to the left
|
||||
|
||||
// First comes the selection (blue layer)
|
||||
@@ -315,15 +313,15 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
|
||||
// Second comes the background (white layer) with inverse border radius
|
||||
let className = SelectionsOverlay.EDITOR_BACKGROUND_CLASS_NAME;
|
||||
if (visibleRange.startStyle.top === CornerStyle.INTERN) {
|
||||
if (startStyle.top === CornerStyle.INTERN) {
|
||||
className += ' ' + SelectionsOverlay.SELECTION_TOP_RIGHT;
|
||||
}
|
||||
if (visibleRange.startStyle.bottom === CornerStyle.INTERN) {
|
||||
if (startStyle.bottom === CornerStyle.INTERN) {
|
||||
className += ' ' + SelectionsOverlay.SELECTION_BOTTOM_RIGHT;
|
||||
}
|
||||
lineOutput += this._createSelectionPiece(top, lineHeight, className, visibleRange.left - SelectionsOverlay.ROUNDED_PIECE_WIDTH, SelectionsOverlay.ROUNDED_PIECE_WIDTH);
|
||||
}
|
||||
if (visibleRange.endStyle.top === CornerStyle.INTERN || visibleRange.endStyle.bottom === CornerStyle.INTERN) {
|
||||
if (endStyle.top === CornerStyle.INTERN || endStyle.bottom === CornerStyle.INTERN) {
|
||||
// Reverse rounded corner to the right
|
||||
|
||||
// First comes the selection (blue layer)
|
||||
@@ -331,10 +329,10 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
|
||||
// Second comes the background (white layer) with inverse border radius
|
||||
let className = SelectionsOverlay.EDITOR_BACKGROUND_CLASS_NAME;
|
||||
if (visibleRange.endStyle.top === CornerStyle.INTERN) {
|
||||
if (endStyle.top === CornerStyle.INTERN) {
|
||||
className += ' ' + SelectionsOverlay.SELECTION_TOP_LEFT;
|
||||
}
|
||||
if (visibleRange.endStyle.bottom === CornerStyle.INTERN) {
|
||||
if (endStyle.bottom === CornerStyle.INTERN) {
|
||||
className += ' ' + SelectionsOverlay.SELECTION_BOTTOM_LEFT;
|
||||
}
|
||||
lineOutput += this._createSelectionPiece(top, lineHeight, className, visibleRange.left + visibleRange.width, SelectionsOverlay.ROUNDED_PIECE_WIDTH);
|
||||
@@ -343,16 +341,18 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
|
||||
let className = SelectionsOverlay.SELECTION_CLASS_NAME;
|
||||
if (visibleRangesHaveStyle) {
|
||||
if (visibleRange.startStyle.top === CornerStyle.EXTERN) {
|
||||
const startStyle = visibleRange.startStyle!;
|
||||
const endStyle = visibleRange.endStyle!;
|
||||
if (startStyle.top === CornerStyle.EXTERN) {
|
||||
className += ' ' + SelectionsOverlay.SELECTION_TOP_LEFT;
|
||||
}
|
||||
if (visibleRange.startStyle.bottom === CornerStyle.EXTERN) {
|
||||
if (startStyle.bottom === CornerStyle.EXTERN) {
|
||||
className += ' ' + SelectionsOverlay.SELECTION_BOTTOM_LEFT;
|
||||
}
|
||||
if (visibleRange.endStyle.top === CornerStyle.EXTERN) {
|
||||
if (endStyle.top === CornerStyle.EXTERN) {
|
||||
className += ' ' + SelectionsOverlay.SELECTION_TOP_RIGHT;
|
||||
}
|
||||
if (visibleRange.endStyle.bottom === CornerStyle.EXTERN) {
|
||||
if (endStyle.bottom === CornerStyle.EXTERN) {
|
||||
className += ' ' + SelectionsOverlay.SELECTION_BOTTOM_RIGHT;
|
||||
}
|
||||
}
|
||||
@@ -363,7 +363,7 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
}
|
||||
|
||||
private _previousFrameVisibleRangesWithStyle: LineVisibleRangesWithStyle[][] = [];
|
||||
private _previousFrameVisibleRangesWithStyle: (LineVisibleRangesWithStyle[] | null)[] = [];
|
||||
public prepareRender(ctx: RenderingContext): void {
|
||||
|
||||
let output: string[] = [];
|
||||
@@ -374,7 +374,7 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
output[lineIndex] = '';
|
||||
}
|
||||
|
||||
let thisFrameVisibleRangesWithStyle: LineVisibleRangesWithStyle[][] = [];
|
||||
let thisFrameVisibleRangesWithStyle: (LineVisibleRangesWithStyle[] | null)[] = [];
|
||||
for (let i = 0, len = this._selections.length; i < len; i++) {
|
||||
let selection = this._selections[i];
|
||||
if (selection.isEmpty()) {
|
||||
@@ -404,15 +404,15 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let editorSelectionColor = theme.getColor(editorSelectionBackground);
|
||||
const editorSelectionColor = theme.getColor(editorSelectionBackground);
|
||||
if (editorSelectionColor) {
|
||||
collector.addRule(`.monaco-editor .focused .selected-text { background-color: ${editorSelectionColor}; }`);
|
||||
}
|
||||
let editorInactiveSelectionColor = theme.getColor(editorInactiveSelection);
|
||||
const editorInactiveSelectionColor = theme.getColor(editorInactiveSelection);
|
||||
if (editorInactiveSelectionColor) {
|
||||
collector.addRule(`.monaco-editor .selected-text { background-color: ${editorInactiveSelectionColor}; }`);
|
||||
}
|
||||
let editorSelectionForegroundColor = theme.getColor(editorSelectionForeground);
|
||||
const editorSelectionForegroundColor = theme.getColor(editorSelectionForeground);
|
||||
if (editorSelectionForegroundColor) {
|
||||
collector.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${editorSelectionForegroundColor}; }`);
|
||||
}
|
||||
|
||||
@@ -2,18 +2,17 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import * as strings from 'vs/base/common/strings';
|
||||
import { Configuration } from 'vs/editor/browser/config/configuration';
|
||||
import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions';
|
||||
import { Configuration } from 'vs/editor/browser/config/configuration';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import * as strings from 'vs/base/common/strings';
|
||||
|
||||
export interface IViewCursorRenderData {
|
||||
domNode: HTMLElement;
|
||||
@@ -48,7 +47,7 @@ export class ViewCursor {
|
||||
private _position: Position;
|
||||
|
||||
private _lastRenderedContent: string;
|
||||
private _renderData: ViewCursorRenderData;
|
||||
private _renderData: ViewCursorRenderData | null;
|
||||
|
||||
constructor(context: ViewContext) {
|
||||
this._context = context;
|
||||
@@ -118,7 +117,7 @@ export class ViewCursor {
|
||||
return true;
|
||||
}
|
||||
|
||||
private _prepareRender(ctx: RenderingContext): ViewCursorRenderData {
|
||||
private _prepareRender(ctx: RenderingContext): ViewCursorRenderData | null {
|
||||
let textContent = '';
|
||||
let textContentClassName = '';
|
||||
|
||||
@@ -138,8 +137,13 @@ export class ViewCursor {
|
||||
} else {
|
||||
width = dom.computeScreenAwareSize(1);
|
||||
}
|
||||
let left = visibleRange.left;
|
||||
if (width >= 2 && left >= 1) {
|
||||
// try to center cursor
|
||||
left -= 1;
|
||||
}
|
||||
const top = ctx.getVerticalOffsetForLineNumber(this._position.lineNumber) - ctx.bigNumbersDelta;
|
||||
return new ViewCursorRenderData(top, visibleRange.left, width, this._lineHeight, textContent, textContentClassName);
|
||||
return new ViewCursorRenderData(top, left, width, this._lineHeight, textContent, textContentClassName);
|
||||
}
|
||||
|
||||
const visibleRangeForCharacter = ctx.linesVisibleRangesForRange(new Range(this._position.lineNumber, this._position.column, this._position.lineNumber, this._position.column + 1), false);
|
||||
@@ -178,7 +182,7 @@ export class ViewCursor {
|
||||
this._renderData = this._prepareRender(ctx);
|
||||
}
|
||||
|
||||
public render(ctx: RestrictedRenderingContext): IViewCursorRenderData {
|
||||
public render(ctx: RestrictedRenderingContext): IViewCursorRenderData | null {
|
||||
if (!this._renderData) {
|
||||
this._domNode.setDisplay('none');
|
||||
return null;
|
||||
|
||||
@@ -13,6 +13,11 @@
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* -- smooth-caret-animation -- */
|
||||
.monaco-editor .cursors-layer.cursor-smooth-caret-animation > .cursor {
|
||||
transition: 80ms;
|
||||
}
|
||||
|
||||
/* -- block-outline-style -- */
|
||||
.monaco-editor .cursors-layer.cursor-block-outline-style > .cursor {
|
||||
box-sizing: border-box;
|
||||
|
||||
@@ -3,20 +3,18 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./viewCursors';
|
||||
import { ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { IViewCursorRenderData, ViewCursor } from 'vs/editor/browser/viewParts/viewCursors/viewCursor';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { TimeoutTimer, IntervalTimer } from 'vs/base/common/async';
|
||||
import { IntervalTimer, TimeoutTimer } from 'vs/base/common/async';
|
||||
import { ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { IViewCursorRenderData, ViewCursor } from 'vs/editor/browser/viewParts/viewCursors/viewCursor';
|
||||
import { TextEditorCursorBlinkingStyle, TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { editorCursorBackground, editorCursorForeground } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { editorCursorForeground, editorCursorBackground } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { TextEditorCursorBlinkingStyle, TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions';
|
||||
|
||||
export class ViewCursors extends ViewPart {
|
||||
|
||||
@@ -25,6 +23,7 @@ export class ViewCursors extends ViewPart {
|
||||
private _readOnly: boolean;
|
||||
private _cursorBlinking: TextEditorCursorBlinkingStyle;
|
||||
private _cursorStyle: TextEditorCursorStyle;
|
||||
private _cursorSmoothCaretAnimation: boolean;
|
||||
private _selectionIsEmpty: boolean;
|
||||
|
||||
private _isVisible: boolean;
|
||||
@@ -47,6 +46,7 @@ export class ViewCursors extends ViewPart {
|
||||
this._readOnly = this._context.configuration.editor.readOnly;
|
||||
this._cursorBlinking = this._context.configuration.editor.viewInfo.cursorBlinking;
|
||||
this._cursorStyle = this._context.configuration.editor.viewInfo.cursorStyle;
|
||||
this._cursorSmoothCaretAnimation = this._context.configuration.editor.viewInfo.cursorSmoothCaretAnimation;
|
||||
this._selectionIsEmpty = true;
|
||||
|
||||
this._primaryCursor = new ViewCursor(this._context);
|
||||
@@ -89,6 +89,7 @@ export class ViewCursors extends ViewPart {
|
||||
if (e.viewInfo) {
|
||||
this._cursorBlinking = this._context.configuration.editor.viewInfo.cursorBlinking;
|
||||
this._cursorStyle = this._context.configuration.editor.viewInfo.cursorStyle;
|
||||
this._cursorSmoothCaretAnimation = this._context.configuration.editor.viewInfo.cursorSmoothCaretAnimation;
|
||||
}
|
||||
|
||||
this._primaryCursor.onConfigurationChanged(e);
|
||||
@@ -297,6 +298,9 @@ export class ViewCursors extends ViewPart {
|
||||
} else {
|
||||
result += ' cursor-solid';
|
||||
}
|
||||
if (this._cursorSmoothCaretAnimation) {
|
||||
result += ' cursor-smooth-caret-animation';
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -349,7 +353,7 @@ export class ViewCursors extends ViewPart {
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let caret = theme.getColor(editorCursorForeground);
|
||||
const caret = theme.getColor(editorCursorForeground);
|
||||
if (caret) {
|
||||
let caretBackground = theme.getColor(editorCursorBackground);
|
||||
if (!caretBackground) {
|
||||
|
||||
@@ -2,24 +2,23 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import { onUnexpectedError } from 'vs/base/common/errors';
|
||||
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
|
||||
import { onUnexpectedError } from 'vs/base/common/errors';
|
||||
import { IViewZone } from 'vs/editor/browser/editorBrowser';
|
||||
import { ViewPart } from 'vs/editor/browser/view/viewPart';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
import { IViewWhitespaceViewportData } from 'vs/editor/common/viewModel/viewModel';
|
||||
import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { IViewWhitespaceViewportData } from 'vs/editor/common/viewModel/viewModel';
|
||||
|
||||
export interface IMyViewZone {
|
||||
whitespaceId: number;
|
||||
delegate: IViewZone;
|
||||
isVisible: boolean;
|
||||
domNode: FastDomNode<HTMLElement>;
|
||||
marginDomNode: FastDomNode<HTMLElement>;
|
||||
marginDomNode: FastDomNode<HTMLElement> | null;
|
||||
}
|
||||
|
||||
interface IComputedViewZoneProps {
|
||||
@@ -228,12 +227,12 @@ export class ViewZones extends ViewPart {
|
||||
|
||||
zone.domNode.removeAttribute('monaco-visible-view-zone');
|
||||
zone.domNode.removeAttribute('monaco-view-zone');
|
||||
zone.domNode.domNode.parentNode.removeChild(zone.domNode.domNode);
|
||||
zone.domNode.domNode.parentNode!.removeChild(zone.domNode.domNode);
|
||||
|
||||
if (zone.marginDomNode) {
|
||||
zone.marginDomNode.removeAttribute('monaco-visible-view-zone');
|
||||
zone.marginDomNode.removeAttribute('monaco-view-zone');
|
||||
zone.marginDomNode.domNode.parentNode.removeChild(zone.marginDomNode.domNode);
|
||||
zone.marginDomNode.domNode.parentNode!.removeChild(zone.marginDomNode.domNode);
|
||||
}
|
||||
|
||||
this.setShouldRender();
|
||||
@@ -263,7 +262,7 @@ export class ViewZones extends ViewPart {
|
||||
public shouldSuppressMouseDownOnViewZone(id: number): boolean {
|
||||
if (this._zones.hasOwnProperty(id.toString())) {
|
||||
let zone = this._zones[id.toString()];
|
||||
return zone.delegate.suppressMouseDown;
|
||||
return Boolean(zone.delegate.suppressMouseDown);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user