mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-09 17:52:34 -05:00
Merge VS Code 1.23.1 (#1520)
This commit is contained in:
@@ -308,7 +308,8 @@ class Widget {
|
||||
private _layoutBoxInPage(topLeft: Coordinate, width: number, height: number, ctx: RenderingContext): IBoxLayoutResult {
|
||||
let left0 = topLeft.left - ctx.scrollLeft;
|
||||
|
||||
if (left0 + width < 0 || left0 > this._contentWidth) {
|
||||
if (left0 < 0 || left0 > this._contentWidth) {
|
||||
// Don't render if position is scrolled outside viewport
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -85,8 +85,14 @@ export class DecorationsOverlay extends DynamicViewOverlay {
|
||||
|
||||
// Sort decorations for consistent render output
|
||||
decorations = decorations.sort((a, b) => {
|
||||
let aClassName = a.options.className;
|
||||
let bClassName = b.options.className;
|
||||
if (a.options.zIndex < b.options.zIndex) {
|
||||
return -1;
|
||||
}
|
||||
if (a.options.zIndex > b.options.zIndex) {
|
||||
return 1;
|
||||
}
|
||||
const aClassName = a.options.className;
|
||||
const bClassName = b.options.className;
|
||||
|
||||
if (aClassName < bClassName) {
|
||||
return -1;
|
||||
@@ -142,8 +148,12 @@ export class DecorationsOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
|
||||
private _renderNormalDecorations(ctx: RenderingContext, decorations: ViewModelDecoration[], output: string[]): void {
|
||||
let lineHeight = String(this._lineHeight);
|
||||
let visibleStartLineNumber = ctx.visibleRange.startLineNumber;
|
||||
const lineHeight = String(this._lineHeight);
|
||||
const visibleStartLineNumber = ctx.visibleRange.startLineNumber;
|
||||
|
||||
let prevClassName: string = null;
|
||||
let prevShowIfCollapsed: boolean = false;
|
||||
let prevRange: Range = null;
|
||||
|
||||
for (let i = 0, lenI = decorations.length; i < lenI; i++) {
|
||||
const d = decorations[i];
|
||||
@@ -160,39 +170,60 @@ export class DecorationsOverlay extends DynamicViewOverlay {
|
||||
range = new Range(range.startLineNumber, range.startColumn, range.endLineNumber - 1, this._context.model.getLineMaxColumn(range.endLineNumber - 1));
|
||||
}
|
||||
|
||||
let linesVisibleRanges = ctx.linesVisibleRangesForRange(range, /*TODO@Alex*/className === 'findMatch');
|
||||
if (!linesVisibleRanges) {
|
||||
if (prevClassName === className && prevShowIfCollapsed === showIfCollapsed && Range.areIntersectingOrTouching(prevRange, range)) {
|
||||
// merge into previous decoration
|
||||
prevRange = Range.plusRange(prevRange, range);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (let j = 0, lenJ = linesVisibleRanges.length; j < lenJ; j++) {
|
||||
let lineVisibleRanges = linesVisibleRanges[j];
|
||||
const lineIndex = lineVisibleRanges.lineNumber - visibleStartLineNumber;
|
||||
// flush previous decoration
|
||||
if (prevClassName !== null) {
|
||||
this._renderNormalDecoration(ctx, prevRange, prevClassName, prevShowIfCollapsed, lineHeight, visibleStartLineNumber, output);
|
||||
}
|
||||
|
||||
if (showIfCollapsed && lineVisibleRanges.ranges.length === 1) {
|
||||
const singleVisibleRange = lineVisibleRanges.ranges[0];
|
||||
if (singleVisibleRange.width === 0) {
|
||||
// collapsed range case => make the decoration visible by faking its width
|
||||
lineVisibleRanges.ranges[0] = new HorizontalRange(singleVisibleRange.left, this._typicalHalfwidthCharacterWidth);
|
||||
}
|
||||
}
|
||||
prevClassName = className;
|
||||
prevShowIfCollapsed = showIfCollapsed;
|
||||
prevRange = range;
|
||||
}
|
||||
|
||||
for (let k = 0, lenK = lineVisibleRanges.ranges.length; k < lenK; k++) {
|
||||
const visibleRange = lineVisibleRanges.ranges[k];
|
||||
const decorationOutput = (
|
||||
'<div class="cdr '
|
||||
+ className
|
||||
+ '" style="left:'
|
||||
+ String(visibleRange.left)
|
||||
+ 'px;width:'
|
||||
+ String(visibleRange.width)
|
||||
+ 'px;height:'
|
||||
+ lineHeight
|
||||
+ 'px;"></div>'
|
||||
);
|
||||
output[lineIndex] += decorationOutput;
|
||||
if (prevClassName !== null) {
|
||||
this._renderNormalDecoration(ctx, prevRange, prevClassName, prevShowIfCollapsed, lineHeight, visibleStartLineNumber, output);
|
||||
}
|
||||
}
|
||||
|
||||
private _renderNormalDecoration(ctx: RenderingContext, range: Range, className: string, showIfCollapsed: boolean, lineHeight: string, visibleStartLineNumber: number, output: string[]): void {
|
||||
let linesVisibleRanges = ctx.linesVisibleRangesForRange(range, /*TODO@Alex*/className === 'findMatch');
|
||||
if (!linesVisibleRanges) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (let j = 0, lenJ = linesVisibleRanges.length; j < lenJ; j++) {
|
||||
let lineVisibleRanges = linesVisibleRanges[j];
|
||||
const lineIndex = lineVisibleRanges.lineNumber - visibleStartLineNumber;
|
||||
|
||||
if (showIfCollapsed && lineVisibleRanges.ranges.length === 1) {
|
||||
const singleVisibleRange = lineVisibleRanges.ranges[0];
|
||||
if (singleVisibleRange.width === 0) {
|
||||
// collapsed range case => make the decoration visible by faking its width
|
||||
lineVisibleRanges.ranges[0] = new HorizontalRange(singleVisibleRange.left, this._typicalHalfwidthCharacterWidth);
|
||||
}
|
||||
}
|
||||
|
||||
for (let k = 0, lenK = lineVisibleRanges.ranges.length; k < lenK; k++) {
|
||||
const visibleRange = lineVisibleRanges.ranges[k];
|
||||
const decorationOutput = (
|
||||
'<div class="cdr '
|
||||
+ className
|
||||
+ '" style="left:'
|
||||
+ String(visibleRange.left)
|
||||
+ 'px;width:'
|
||||
+ String(visibleRange.width)
|
||||
+ 'px;height:'
|
||||
+ lineHeight
|
||||
+ 'px;"></div>'
|
||||
);
|
||||
output[lineIndex] += decorationOutput;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,3 +10,6 @@
|
||||
.monaco-editor .lines-content .cigr {
|
||||
position: absolute;
|
||||
}
|
||||
.monaco-editor .lines-content .cigra {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
@@ -11,13 +11,13 @@ 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 { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { editorIndentGuides } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { editorIndentGuides, editorActiveIndentGuides } from 'vs/editor/common/view/editorColorRegistry';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
|
||||
export class IndentGuidesOverlay extends DynamicViewOverlay {
|
||||
|
||||
private _context: ViewContext;
|
||||
private _primaryLineNumber: number;
|
||||
private _lineHeight: number;
|
||||
private _spaceWidth: number;
|
||||
private _renderResult: string[];
|
||||
@@ -26,6 +26,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay {
|
||||
constructor(context: ViewContext) {
|
||||
super();
|
||||
this._context = context;
|
||||
this._primaryLineNumber = 0;
|
||||
this._lineHeight = this._context.configuration.editor.lineHeight;
|
||||
this._spaceWidth = this._context.configuration.editor.fontInfo.spaceWidth;
|
||||
this._enabled = this._context.configuration.editor.viewInfo.renderIndentGuides;
|
||||
@@ -55,6 +56,17 @@ export class IndentGuidesOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean {
|
||||
const selection = e.selections[0];
|
||||
const newPrimaryLineNumber = selection.isEmpty() ? selection.positionLineNumber : 0;
|
||||
|
||||
if (this._primaryLineNumber !== newPrimaryLineNumber) {
|
||||
this._primaryLineNumber = newPrimaryLineNumber;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean {
|
||||
// true for inline decorations
|
||||
return true;
|
||||
@@ -94,20 +106,32 @@ export class IndentGuidesOverlay extends DynamicViewOverlay {
|
||||
const tabSize = this._context.model.getTabSize();
|
||||
const tabWidth = tabSize * this._spaceWidth;
|
||||
const lineHeight = this._lineHeight;
|
||||
const indentGuideWidth = dom.computeScreenAwareSize(1);
|
||||
const indentGuideWidth = tabWidth;
|
||||
|
||||
const indents = this._context.model.getLinesIndentGuides(visibleStartLineNumber, visibleEndLineNumber);
|
||||
|
||||
let activeIndentStartLineNumber = 0;
|
||||
let activeIndentEndLineNumber = 0;
|
||||
let activeIndentLevel = 0;
|
||||
if (this._primaryLineNumber) {
|
||||
const activeIndentInfo = this._context.model.getActiveIndentGuide(this._primaryLineNumber, visibleStartLineNumber, visibleEndLineNumber);
|
||||
activeIndentStartLineNumber = activeIndentInfo.startLineNumber;
|
||||
activeIndentEndLineNumber = activeIndentInfo.endLineNumber;
|
||||
activeIndentLevel = activeIndentInfo.indent;
|
||||
}
|
||||
|
||||
let output: string[] = [];
|
||||
for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {
|
||||
const containsActiveIndentGuide = (activeIndentStartLineNumber <= lineNumber && lineNumber <= activeIndentEndLineNumber);
|
||||
const lineIndex = lineNumber - visibleStartLineNumber;
|
||||
const indent = indents[lineIndex];
|
||||
|
||||
let result = '';
|
||||
let leftMostVisiblePosition = ctx.visibleRangeForPosition(new Position(lineNumber, 1));
|
||||
let left = leftMostVisiblePosition ? leftMostVisiblePosition.left : 0;
|
||||
for (let i = 0; i < indent; i++) {
|
||||
result += `<div class="cigr" style="left:${left}px;height:${lineHeight}px;width:${indentGuideWidth}px"></div>`;
|
||||
for (let i = 1; i <= indent; i++) {
|
||||
let className = (containsActiveIndentGuide && i === activeIndentLevel ? 'cigra' : 'cigr');
|
||||
result += `<div class="${className}" style="left:${left}px;height:${lineHeight}px;width:${indentGuideWidth}px"></div>`;
|
||||
left += tabWidth;
|
||||
}
|
||||
|
||||
@@ -129,8 +153,12 @@ export class IndentGuidesOverlay extends DynamicViewOverlay {
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let editorGuideColor = theme.getColor(editorIndentGuides);
|
||||
if (editorGuideColor) {
|
||||
collector.addRule(`.monaco-editor .lines-content .cigr { background-color: ${editorGuideColor}; }`);
|
||||
let 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;
|
||||
if (editorActiveIndentGuidesColor) {
|
||||
collector.addRule(`.monaco-editor .lines-content .cigra { box-shadow: 1px 0 0 0 ${editorActiveIndentGuidesColor} inset; }`);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -6,11 +6,10 @@
|
||||
|
||||
import * as browser from 'vs/base/browser/browser';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import * as strings from 'vs/base/common/strings';
|
||||
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 } from 'vs/editor/common/viewLayout/viewLineRenderer';
|
||||
import { renderViewLine, RenderLineInput, CharacterMapping, ForeignElementType } from 'vs/editor/common/viewLayout/viewLineRenderer';
|
||||
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';
|
||||
@@ -192,7 +191,8 @@ export class ViewLine implements IVisibleLine {
|
||||
let renderLineInput = new RenderLineInput(
|
||||
options.useMonospaceOptimizations,
|
||||
lineData.content,
|
||||
lineData.mightContainRTL,
|
||||
lineData.isBasicASCII,
|
||||
lineData.containsRTL,
|
||||
lineData.minColumn - 1,
|
||||
lineData.tokens,
|
||||
actualInlineDecorations,
|
||||
@@ -222,18 +222,16 @@ export class ViewLine implements IVisibleLine {
|
||||
sb.appendASCIIString('</div>');
|
||||
|
||||
let renderedViewLine: IRenderedViewLine = null;
|
||||
if (canUseFastRenderedViewLine && options.useMonospaceOptimizations && !output.containsForeignElements) {
|
||||
let isRegularASCII = true;
|
||||
if (lineData.mightContainNonBasicASCII) {
|
||||
isRegularASCII = strings.isBasicASCII(lineData.content);
|
||||
}
|
||||
|
||||
if (isRegularASCII && lineData.content.length < 1000 && renderLineInput.lineTokens.getCount() < 100) {
|
||||
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
|
||||
// view line only for short lines. Please test before removing the length check...
|
||||
// ---
|
||||
// Another rounding error has been observed on Linux in VSCode, where <span> width
|
||||
// rounding errors add up to an observable large number...
|
||||
// ---
|
||||
// Also see another example of rounding errors on Windows in
|
||||
// https://github.com/Microsoft/vscode/issues/33178
|
||||
renderedViewLine = new FastRenderedViewLine(
|
||||
this._renderedViewLine ? this._renderedViewLine.domNode : null,
|
||||
renderLineInput,
|
||||
@@ -385,7 +383,7 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
|
||||
protected readonly _characterMapping: CharacterMapping;
|
||||
private readonly _isWhitespaceOnly: boolean;
|
||||
private readonly _containsForeignElements: boolean;
|
||||
private readonly _containsForeignElements: ForeignElementType;
|
||||
private _cachedWidth: number;
|
||||
|
||||
/**
|
||||
@@ -393,7 +391,7 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
*/
|
||||
private _pixelOffsetCache: Int32Array;
|
||||
|
||||
constructor(domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: boolean) {
|
||||
constructor(domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType) {
|
||||
this.domNode = domNode;
|
||||
this.input = renderLineInput;
|
||||
this._characterMapping = characterMapping;
|
||||
@@ -471,10 +469,18 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
protected _readPixelOffset(column: number, context: DomReadingContext): number {
|
||||
if (this._characterMapping.length === 0) {
|
||||
// This line has no content
|
||||
if (!this._containsForeignElements) {
|
||||
if (this._containsForeignElements === ForeignElementType.None) {
|
||||
// We can assume the line is really empty
|
||||
return 0;
|
||||
}
|
||||
if (this._containsForeignElements === ForeignElementType.After) {
|
||||
// We have foreign elements after the (empty) line
|
||||
return 0;
|
||||
}
|
||||
if (this._containsForeignElements === ForeignElementType.Before) {
|
||||
// We have foreign element before the (empty) line
|
||||
return this.getWidth();
|
||||
}
|
||||
}
|
||||
|
||||
if (this._pixelOffsetCache !== null) {
|
||||
@@ -503,7 +509,7 @@ class RenderedViewLine implements IRenderedViewLine {
|
||||
return r[0].left;
|
||||
}
|
||||
|
||||
if (column === this._characterMapping.length && this._isWhitespaceOnly && !this._containsForeignElements) {
|
||||
if (column === this._characterMapping.length && this._isWhitespaceOnly && this._containsForeignElements === ForeignElementType.None) {
|
||||
// This branch helps in the case of whitespace only lines which have a width set
|
||||
return this.getWidth();
|
||||
}
|
||||
@@ -586,17 +592,17 @@ class WebKitRenderedViewLine extends RenderedViewLine {
|
||||
}
|
||||
}
|
||||
|
||||
const createRenderedLine: (domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: boolean) => RenderedViewLine = (function () {
|
||||
const createRenderedLine: (domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType) => RenderedViewLine = (function () {
|
||||
if (browser.isWebKit) {
|
||||
return createWebKitRenderedLine;
|
||||
}
|
||||
return createNormalRenderedLine;
|
||||
})();
|
||||
|
||||
function createWebKitRenderedLine(domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: boolean): RenderedViewLine {
|
||||
function createWebKitRenderedLine(domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType): RenderedViewLine {
|
||||
return new WebKitRenderedViewLine(domNode, renderLineInput, characterMapping, containsRTL, containsForeignElements);
|
||||
}
|
||||
|
||||
function createNormalRenderedLine(domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: boolean): RenderedViewLine {
|
||||
function createNormalRenderedLine(domNode: FastDomNode<HTMLElement>, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType): RenderedViewLine {
|
||||
return new RenderedViewLine(domNode, renderLineInput, characterMapping, containsRTL, containsForeignElements);
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
export class Margin extends ViewPart {
|
||||
|
||||
public static readonly CLASS_NAME = 'glyph-margin';
|
||||
public static readonly OUTER_CLASS_NAME = 'margin';
|
||||
|
||||
private _domNode: FastDomNode<HTMLElement>;
|
||||
private _canUseLayerHinting: boolean;
|
||||
@@ -42,7 +43,7 @@ export class Margin extends ViewPart {
|
||||
|
||||
private _createDomNode(): FastDomNode<HTMLElement> {
|
||||
let domNode = createFastDomNode(document.createElement('div'));
|
||||
domNode.setClassName('margin');
|
||||
domNode.setClassName(Margin.OUTER_CLASS_NAME);
|
||||
domNode.setPosition('absolute');
|
||||
domNode.setAttribute('role', 'presentation');
|
||||
domNode.setAttribute('aria-hidden', 'true');
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
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';
|
||||
@@ -897,17 +898,22 @@ export class Minimap extends ViewPart {
|
||||
// No need to render anything since space is invisible
|
||||
dx += charWidth;
|
||||
} else {
|
||||
if (renderMinimap === RenderMinimap.Large) {
|
||||
minimapCharRenderer.x2RenderChar(target, dx, dy, charCode, tokenColor, backgroundColor, useLighterFont);
|
||||
} else if (renderMinimap === RenderMinimap.Small) {
|
||||
minimapCharRenderer.x1RenderChar(target, dx, dy, charCode, tokenColor, backgroundColor, useLighterFont);
|
||||
} else if (renderMinimap === RenderMinimap.LargeBlocks) {
|
||||
minimapCharRenderer.x2BlockRenderChar(target, dx, dy, tokenColor, backgroundColor, useLighterFont);
|
||||
} else {
|
||||
// RenderMinimap.SmallBlocks
|
||||
minimapCharRenderer.x1BlockRenderChar(target, dx, dy, tokenColor, backgroundColor, useLighterFont);
|
||||
// Render twice for a full width character
|
||||
let count = strings.isFullWidthCharacter(charCode) ? 2 : 1;
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
if (renderMinimap === RenderMinimap.Large) {
|
||||
minimapCharRenderer.x2RenderChar(target, dx, dy, charCode, tokenColor, backgroundColor, useLighterFont);
|
||||
} else if (renderMinimap === RenderMinimap.Small) {
|
||||
minimapCharRenderer.x1RenderChar(target, dx, dy, charCode, tokenColor, backgroundColor, useLighterFont);
|
||||
} else if (renderMinimap === RenderMinimap.LargeBlocks) {
|
||||
minimapCharRenderer.x2BlockRenderChar(target, dx, dy, tokenColor, backgroundColor, useLighterFont);
|
||||
} else {
|
||||
// RenderMinimap.SmallBlocks
|
||||
minimapCharRenderer.x1BlockRenderChar(target, dx, dy, tokenColor, backgroundColor, useLighterFont);
|
||||
}
|
||||
dx += charWidth;
|
||||
}
|
||||
dx += charWidth;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,8 +58,13 @@ class Settings {
|
||||
this.themeType = theme.type;
|
||||
|
||||
const minimapEnabled = config.editor.viewInfo.minimap.enabled;
|
||||
const minimapSide = config.editor.viewInfo.minimap.side;
|
||||
const backgroundColor = (minimapEnabled ? TokenizationRegistry.getDefaultBackground() : null);
|
||||
this.backgroundColor = (backgroundColor ? Color.Format.CSS.formatHex(backgroundColor) : null);
|
||||
if (backgroundColor === null || minimapSide === 'left') {
|
||||
this.backgroundColor = null;
|
||||
} else {
|
||||
this.backgroundColor = Color.Format.CSS.formatHex(backgroundColor);
|
||||
}
|
||||
|
||||
const position = config.editor.layoutInfo.overviewRuler;
|
||||
this.top = position.top;
|
||||
|
||||
@@ -13,7 +13,6 @@ import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/v
|
||||
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';
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
|
||||
export class Rulers extends ViewPart {
|
||||
|
||||
@@ -67,7 +66,7 @@ export class Rulers extends ViewPart {
|
||||
}
|
||||
|
||||
if (currentCount < desiredCount) {
|
||||
const rulerWidth = dom.computeScreenAwareSize(1);
|
||||
const rulerWidth = this._context.model.getTabSize();
|
||||
let addCount = desiredCount - currentCount;
|
||||
while (addCount > 0) {
|
||||
let node = createFastDomNode(document.createElement('div'));
|
||||
@@ -104,6 +103,6 @@ export class Rulers extends ViewPart {
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let rulerColor = theme.getColor(editorRuler);
|
||||
if (rulerColor) {
|
||||
collector.addRule(`.monaco-editor .view-ruler { background-color: ${rulerColor}; }`);
|
||||
collector.addRule(`.monaco-editor .view-ruler { box-shadow: 1px 0 0 0 ${rulerColor} inset; }`);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -54,7 +54,12 @@ export class ScrollDecorationViewPart extends ViewPart {
|
||||
|
||||
private _updateWidth(): boolean {
|
||||
const layoutInfo = this._context.configuration.editor.layoutInfo;
|
||||
let newWidth = layoutInfo.width - layoutInfo.minimapWidth;
|
||||
let newWidth = 0;
|
||||
if (layoutInfo.renderMinimap === 0 || (layoutInfo.minimapWidth > 0 && layoutInfo.minimapLeft === 0)) {
|
||||
newWidth = layoutInfo.width;
|
||||
} else {
|
||||
newWidth = layoutInfo.width - layoutInfo.minimapWidth - layoutInfo.verticalScrollbarWidth;
|
||||
}
|
||||
if (this._width !== newWidth) {
|
||||
this._width = newWidth;
|
||||
return true;
|
||||
|
||||
@@ -78,6 +78,7 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
private _context: ViewContext;
|
||||
private _lineHeight: number;
|
||||
private _roundedSelection: boolean;
|
||||
private _typicalHalfwidthCharacterWidth: number;
|
||||
private _selections: Range[];
|
||||
private _renderResult: string[];
|
||||
|
||||
@@ -86,6 +87,7 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
this._context = context;
|
||||
this._lineHeight = this._context.configuration.editor.lineHeight;
|
||||
this._roundedSelection = this._context.configuration.editor.viewInfo.roundedSelection;
|
||||
this._typicalHalfwidthCharacterWidth = this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth;
|
||||
this._selections = [];
|
||||
this._renderResult = null;
|
||||
this._context.addEventHandler(this);
|
||||
@@ -108,6 +110,9 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
if (e.viewInfo) {
|
||||
this._roundedSelection = this._context.configuration.editor.viewInfo.roundedSelection;
|
||||
}
|
||||
if (e.fontInfo) {
|
||||
this._typicalHalfwidthCharacterWidth = this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean {
|
||||
@@ -153,23 +158,28 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
return false;
|
||||
}
|
||||
|
||||
private _enrichVisibleRangesWithStyle(linesVisibleRanges: LineVisibleRangesWithStyle[], previousFrame: LineVisibleRangesWithStyle[]): void {
|
||||
private _enrichVisibleRangesWithStyle(viewport: Range, linesVisibleRanges: LineVisibleRangesWithStyle[], previousFrame: LineVisibleRangesWithStyle[]): void {
|
||||
const epsilon = this._typicalHalfwidthCharacterWidth / 4;
|
||||
let previousFrameTop: HorizontalRangeWithStyle = null;
|
||||
let previousFrameBottom: HorizontalRangeWithStyle = null;
|
||||
|
||||
if (previousFrame && previousFrame.length > 0 && linesVisibleRanges.length > 0) {
|
||||
|
||||
let topLineNumber = linesVisibleRanges[0].lineNumber;
|
||||
for (let i = 0; !previousFrameTop && i < previousFrame.length; i++) {
|
||||
if (previousFrame[i].lineNumber === topLineNumber) {
|
||||
previousFrameTop = previousFrame[i].ranges[0];
|
||||
if (topLineNumber === viewport.startLineNumber) {
|
||||
for (let i = 0; !previousFrameTop && i < previousFrame.length; i++) {
|
||||
if (previousFrame[i].lineNumber === topLineNumber) {
|
||||
previousFrameTop = previousFrame[i].ranges[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let bottomLineNumber = linesVisibleRanges[linesVisibleRanges.length - 1].lineNumber;
|
||||
for (let i = previousFrame.length - 1; !previousFrameBottom && i >= 0; i--) {
|
||||
if (previousFrame[i].lineNumber === bottomLineNumber) {
|
||||
previousFrameBottom = previousFrame[i].ranges[0];
|
||||
if (bottomLineNumber === viewport.endLineNumber) {
|
||||
for (let i = previousFrame.length - 1; !previousFrameBottom && i >= 0; i--) {
|
||||
if (previousFrame[i].lineNumber === bottomLineNumber) {
|
||||
previousFrameBottom = previousFrame[i].ranges[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,13 +212,13 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
let prevLeft = linesVisibleRanges[i - 1].ranges[0].left;
|
||||
let prevRight = linesVisibleRanges[i - 1].ranges[0].left + linesVisibleRanges[i - 1].ranges[0].width;
|
||||
|
||||
if (curLeft === prevLeft) {
|
||||
if (abs(curLeft - prevLeft) < epsilon) {
|
||||
startStyle.top = CornerStyle.FLAT;
|
||||
} else if (curLeft > prevLeft) {
|
||||
startStyle.top = CornerStyle.INTERN;
|
||||
}
|
||||
|
||||
if (curRight === prevRight) {
|
||||
if (abs(curRight - prevRight) < epsilon) {
|
||||
endStyle.top = CornerStyle.FLAT;
|
||||
} else if (prevLeft < curRight && curRight < prevRight) {
|
||||
endStyle.top = CornerStyle.INTERN;
|
||||
@@ -224,13 +234,13 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
let nextLeft = linesVisibleRanges[i + 1].ranges[0].left;
|
||||
let nextRight = linesVisibleRanges[i + 1].ranges[0].left + linesVisibleRanges[i + 1].ranges[0].width;
|
||||
|
||||
if (curLeft === nextLeft) {
|
||||
if (abs(curLeft - nextLeft) < epsilon) {
|
||||
startStyle.bottom = CornerStyle.FLAT;
|
||||
} else if (nextLeft < curLeft && curLeft < nextRight) {
|
||||
startStyle.bottom = CornerStyle.INTERN;
|
||||
}
|
||||
|
||||
if (curRight === nextRight) {
|
||||
if (abs(curRight - nextRight) < epsilon) {
|
||||
endStyle.bottom = CornerStyle.FLAT;
|
||||
} else if (curRight < nextRight) {
|
||||
endStyle.bottom = CornerStyle.INTERN;
|
||||
@@ -252,7 +262,7 @@ export class SelectionsOverlay extends DynamicViewOverlay {
|
||||
let visibleRangesHaveGaps = this._visibleRangesHaveGaps(linesVisibleRanges);
|
||||
|
||||
if (!isIEWithZoomingIssuesNearRoundedBorders && !visibleRangesHaveGaps && this._roundedSelection) {
|
||||
this._enrichVisibleRangesWithStyle(linesVisibleRanges, previousFrame);
|
||||
this._enrichVisibleRangesWithStyle(ctx.visibleRange, linesVisibleRanges, previousFrame);
|
||||
}
|
||||
|
||||
// The visible ranges are sorted TOP-BOTTOM and LEFT-RIGHT
|
||||
@@ -407,3 +417,7 @@ registerThemingParticipant((theme, collector) => {
|
||||
collector.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${editorSelectionForegroundColor}; }`);
|
||||
}
|
||||
});
|
||||
|
||||
function abs(n: number): number {
|
||||
return n < 0 ? -n : n;
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import { ViewContext } from 'vs/editor/common/view/viewContext';
|
||||
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
|
||||
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;
|
||||
@@ -28,7 +29,8 @@ class ViewCursorRenderData {
|
||||
public readonly left: number,
|
||||
public readonly width: number,
|
||||
public readonly height: number,
|
||||
public readonly textContent: string
|
||||
public readonly textContent: string,
|
||||
public readonly textContentClassName: string
|
||||
) { }
|
||||
}
|
||||
|
||||
@@ -118,6 +120,7 @@ export class ViewCursor {
|
||||
|
||||
private _prepareRender(ctx: RenderingContext): ViewCursorRenderData {
|
||||
let textContent = '';
|
||||
let textContentClassName = '';
|
||||
|
||||
if (this._cursorStyle === TextEditorCursorStyle.Line || this._cursorStyle === TextEditorCursorStyle.LineThin) {
|
||||
const visibleRange = ctx.visibleRangeForPosition(this._position);
|
||||
@@ -136,7 +139,7 @@ export class ViewCursor {
|
||||
width = dom.computeScreenAwareSize(1);
|
||||
}
|
||||
const top = ctx.getVerticalOffsetForLineNumber(this._position.lineNumber) - ctx.bigNumbersDelta;
|
||||
return new ViewCursorRenderData(top, visibleRange.left, width, this._lineHeight, textContent);
|
||||
return new ViewCursorRenderData(top, visibleRange.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);
|
||||
@@ -150,8 +153,13 @@ export class ViewCursor {
|
||||
const width = range.width < 1 ? this._typicalHalfwidthCharacterWidth : range.width;
|
||||
|
||||
if (this._cursorStyle === TextEditorCursorStyle.Block) {
|
||||
const lineContent = this._context.model.getLineContent(this._position.lineNumber);
|
||||
textContent = lineContent.charAt(this._position.column - 1);
|
||||
const lineData = this._context.model.getViewLineData(this._position.lineNumber);
|
||||
textContent = lineData.content.charAt(this._position.column - 1);
|
||||
if (strings.isHighSurrogate(lineData.content.charCodeAt(this._position.column - 1))) {
|
||||
textContent += lineData.content.charAt(this._position.column);
|
||||
}
|
||||
const tokenIndex = lineData.tokens.findTokenIndexAtOffset(this._position.column - 1);
|
||||
textContentClassName = lineData.tokens.getClassName(tokenIndex);
|
||||
}
|
||||
|
||||
let top = ctx.getVerticalOffsetForLineNumber(this._position.lineNumber) - ctx.bigNumbersDelta;
|
||||
@@ -163,7 +171,7 @@ export class ViewCursor {
|
||||
height = 2;
|
||||
}
|
||||
|
||||
return new ViewCursorRenderData(top, range.left, width, height, textContent);
|
||||
return new ViewCursorRenderData(top, range.left, width, height, textContent, textContentClassName);
|
||||
}
|
||||
|
||||
public prepareRender(ctx: RenderingContext): void {
|
||||
@@ -181,6 +189,8 @@ export class ViewCursor {
|
||||
this._domNode.domNode.textContent = this._lastRenderedContent;
|
||||
}
|
||||
|
||||
this._domNode.setClassName('cursor ' + this._renderData.textContentClassName);
|
||||
|
||||
this._domNode.setDisplay('block');
|
||||
this._domNode.setTop(this._renderData.top);
|
||||
this._domNode.setLeft(this._renderData.left);
|
||||
|
||||
@@ -99,7 +99,11 @@ export class ViewZones extends ViewPart {
|
||||
}
|
||||
|
||||
public onLineMappingChanged(e: viewEvents.ViewLineMappingChangedEvent): boolean {
|
||||
return this._recomputeWhitespacesProps();
|
||||
const hadAChange = this._recomputeWhitespacesProps();
|
||||
if (hadAChange) {
|
||||
this._context.viewLayout.onHeightMaybeChanged();
|
||||
}
|
||||
return hadAChange;
|
||||
}
|
||||
|
||||
public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean {
|
||||
|
||||
Reference in New Issue
Block a user