mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-11 10:38:31 -05:00
Refresh master with initial release/0.24 snapshot (#332)
* Initial port of release/0.24 source code * Fix additional headers * Fix a typo in launch.json
This commit is contained in:
@@ -10,10 +10,12 @@ import { Range } from 'vs/editor/common/core/range';
|
||||
import * as editorCommon from 'vs/editor/common/editorCommon';
|
||||
import { LineTokens } from 'vs/editor/common/core/lineTokens';
|
||||
import { PrefixSumComputerWithCache } from 'vs/editor/common/viewModel/prefixSumComputer';
|
||||
import { ViewLineData, ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel';
|
||||
import { ViewLineData, ICoordinatesConverter, IOverviewRulerDecorations } from 'vs/editor/common/viewModel/viewModel';
|
||||
import * as viewEvents from 'vs/editor/common/view/viewEvents';
|
||||
import { WrappingIndent } from 'vs/editor/common/config/editorOptions';
|
||||
import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations';
|
||||
import { ModelDecorationOptions, ModelDecorationOverviewRulerOptions } from 'vs/editor/common/model/textModelWithDecorations';
|
||||
import { ThemeColor, ITheme } from 'vs/platform/theme/common/themeService';
|
||||
import { Color } from 'vs/base/common/color';
|
||||
|
||||
export class OutputPosition {
|
||||
_outputPositionBrand: void;
|
||||
@@ -57,6 +59,7 @@ export interface ISplitLine {
|
||||
|
||||
getModelColumnOfViewPosition(outputLineIndex: number, outputColumn: number): number;
|
||||
getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position;
|
||||
getViewLineNumberOfModelPosition(deltaLineNumber: number, inputColumn: number): number;
|
||||
}
|
||||
|
||||
export interface IViewModelLinesCollection {
|
||||
@@ -76,12 +79,15 @@ export interface IViewModelLinesCollection {
|
||||
|
||||
getViewLineCount(): number;
|
||||
warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void;
|
||||
getViewLineIndentGuide(viewLineNumber: number): number;
|
||||
getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[];
|
||||
getViewLineContent(viewLineNumber: number): string;
|
||||
getViewLineMinColumn(viewLineNumber: number): number;
|
||||
getViewLineMaxColumn(viewLineNumber: number): number;
|
||||
getViewLineData(viewLineNumber: number): ViewLineData;
|
||||
getViewLinesData(viewStartLineNumber: number, viewEndLineNumber: number, needed: boolean[]): ViewLineData[];
|
||||
|
||||
getAllOverviewRulerDecorations(ownerId: number, filterOutValidation: boolean, theme: ITheme): IOverviewRulerDecorations;
|
||||
getDecorationsInRange(range: Range, ownerId: number, filterOutValidation: boolean): editorCommon.IModelDecoration[];
|
||||
}
|
||||
|
||||
export class CoordinatesConverter implements ICoordinatesConverter {
|
||||
@@ -493,11 +499,63 @@ export class SplitLinesCollection implements IViewModelLinesCollection {
|
||||
this.prefixSumComputer.warmUpCache(viewStartLineNumber - 1, viewEndLineNumber - 1);
|
||||
}
|
||||
|
||||
public getViewLineIndentGuide(viewLineNumber: number): number {
|
||||
public getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[] {
|
||||
this._ensureValidState();
|
||||
viewLineNumber = this._toValidViewLineNumber(viewLineNumber);
|
||||
let r = this.prefixSumComputer.getIndexOf(viewLineNumber - 1);
|
||||
return this.model.getLineIndentGuide(r.index + 1);
|
||||
viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber);
|
||||
viewEndLineNumber = this._toValidViewLineNumber(viewEndLineNumber);
|
||||
|
||||
const modelStart = this.convertViewPositionToModelPosition(viewStartLineNumber, this.getViewLineMinColumn(viewStartLineNumber));
|
||||
const modelEnd = this.convertViewPositionToModelPosition(viewEndLineNumber, this.getViewLineMaxColumn(viewEndLineNumber));
|
||||
|
||||
let result: number[] = [];
|
||||
let resultRepeatCount: number[] = [];
|
||||
const modelStartLineIndex = modelStart.lineNumber - 1;
|
||||
const modelEndLineIndex = modelEnd.lineNumber - 1;
|
||||
|
||||
let reqStart: Position = null;
|
||||
for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) {
|
||||
const line = this.lines[modelLineIndex];
|
||||
if (line.isVisible()) {
|
||||
let count = 0;
|
||||
if (modelLineIndex === modelStartLineIndex) {
|
||||
let viewLineStartIndex = line.getViewLineNumberOfModelPosition(0, modelStart.column);
|
||||
let viewLineEndIndex = line.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(modelLineIndex + 1));
|
||||
count = viewLineEndIndex - viewLineStartIndex + 1;
|
||||
} else {
|
||||
let viewLineStartIndex = line.getViewLineNumberOfModelPosition(0, 1);
|
||||
let viewLineEndIndex = line.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(modelLineIndex + 1));
|
||||
count = viewLineEndIndex - viewLineStartIndex + 1;
|
||||
}
|
||||
resultRepeatCount.push(count);
|
||||
// merge into previous request
|
||||
if (reqStart === null) {
|
||||
reqStart = new Position(modelLineIndex + 1, 0);
|
||||
}
|
||||
} else {
|
||||
// hit invisible line => flush request
|
||||
if (reqStart !== null) {
|
||||
result = result.concat(this.model.getLinesIndentGuides(reqStart.lineNumber, modelLineIndex));
|
||||
reqStart = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (reqStart !== null) {
|
||||
result = result.concat(this.model.getLinesIndentGuides(reqStart.lineNumber, modelEnd.lineNumber));
|
||||
reqStart = null;
|
||||
}
|
||||
|
||||
const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;
|
||||
let viewIndents = new Array<number>(viewLineCount);
|
||||
let currIndex = 0;
|
||||
for (let i = 0, len = result.length; i < len; i++) {
|
||||
let value = result[i];
|
||||
let count = Math.min(viewLineCount - currIndex, resultRepeatCount[i]);
|
||||
for (let j = 0; j < count; j++) {
|
||||
viewIndents[currIndex++] = value;
|
||||
}
|
||||
}
|
||||
return viewIndents;
|
||||
}
|
||||
|
||||
public getViewLineContent(viewLineNumber: number): string {
|
||||
@@ -650,6 +708,84 @@ export class SplitLinesCollection implements IViewModelLinesCollection {
|
||||
// console.log('in -> out ' + inputLineNumber + ',' + inputColumn + ' ===> ' + r.lineNumber + ',' + r);
|
||||
return r;
|
||||
}
|
||||
|
||||
private _getViewLineNumberForModelPosition(inputLineNumber: number, inputColumn: number): number {
|
||||
let lineIndex = inputLineNumber - 1;
|
||||
if (this.lines[lineIndex].isVisible()) {
|
||||
// this model line is visible
|
||||
const deltaLineNumber = 1 + (lineIndex === 0 ? 0 : this.prefixSumComputer.getAccumulatedValue(lineIndex - 1));
|
||||
return this.lines[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber, inputColumn);
|
||||
}
|
||||
|
||||
// this model line is not visible
|
||||
while (lineIndex > 0 && !this.lines[lineIndex].isVisible()) {
|
||||
lineIndex--;
|
||||
}
|
||||
if (lineIndex === 0 && !this.lines[lineIndex].isVisible()) {
|
||||
// Could not reach a real line
|
||||
return 1;
|
||||
}
|
||||
const deltaLineNumber = 1 + (lineIndex === 0 ? 0 : this.prefixSumComputer.getAccumulatedValue(lineIndex - 1));
|
||||
return this.lines[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1));
|
||||
}
|
||||
|
||||
public getAllOverviewRulerDecorations(ownerId: number, filterOutValidation: boolean, theme: ITheme): IOverviewRulerDecorations {
|
||||
const decorations = this.model.getOverviewRulerDecorations(ownerId, filterOutValidation);
|
||||
const result = new OverviewRulerDecorations();
|
||||
for (let i = 0, len = decorations.length; i < len; i++) {
|
||||
const decoration = decorations[i];
|
||||
const opts = <ModelDecorationOverviewRulerOptions>decoration.options.overviewRuler;
|
||||
const lane = opts.position;
|
||||
if (lane === 0) {
|
||||
continue;
|
||||
}
|
||||
const color = resolveColor(opts, theme);
|
||||
const viewStartLineNumber = this._getViewLineNumberForModelPosition(decoration.range.startLineNumber, decoration.range.startColumn);
|
||||
const viewEndLineNumber = this._getViewLineNumberForModelPosition(decoration.range.endLineNumber, decoration.range.endColumn);
|
||||
|
||||
result.accept(color, viewStartLineNumber, viewEndLineNumber, lane);
|
||||
}
|
||||
return result.result;
|
||||
}
|
||||
|
||||
public getDecorationsInRange(range: Range, ownerId: number, filterOutValidation: boolean): editorCommon.IModelDecoration[] {
|
||||
const modelStart = this.convertViewPositionToModelPosition(range.startLineNumber, range.startColumn);
|
||||
const modelEnd = this.convertViewPositionToModelPosition(range.endLineNumber, range.endColumn);
|
||||
|
||||
if (modelEnd.lineNumber - modelStart.lineNumber <= range.endLineNumber - range.startLineNumber) {
|
||||
// most likely there are no hidden lines => fast path
|
||||
return this.model.getDecorationsInRange(new Range(modelStart.lineNumber, modelStart.column, modelEnd.lineNumber, modelEnd.column), ownerId, filterOutValidation);
|
||||
}
|
||||
|
||||
let result: editorCommon.IModelDecoration[] = [];
|
||||
const modelStartLineIndex = modelStart.lineNumber - 1;
|
||||
const modelEndLineIndex = modelEnd.lineNumber - 1;
|
||||
|
||||
let reqStart: Position = null;
|
||||
for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) {
|
||||
const line = this.lines[modelLineIndex];
|
||||
if (line.isVisible()) {
|
||||
// merge into previous request
|
||||
if (reqStart === null) {
|
||||
reqStart = new Position(modelLineIndex + 1, modelLineIndex === modelStartLineIndex ? modelStart.column : 1);
|
||||
}
|
||||
} else {
|
||||
// hit invisible line => flush request
|
||||
if (reqStart !== null) {
|
||||
const maxLineColumn = this.model.getLineMaxColumn(modelLineIndex);
|
||||
result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelLineIndex, maxLineColumn), ownerId, filterOutValidation));
|
||||
reqStart = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (reqStart !== null) {
|
||||
result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelEnd.lineNumber, modelEnd.column), ownerId, filterOutValidation));
|
||||
reqStart = null;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
class VisibleIdentitySplitLine implements ISplitLine {
|
||||
@@ -711,6 +847,10 @@ class VisibleIdentitySplitLine implements ISplitLine {
|
||||
public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position {
|
||||
return new Position(deltaLineNumber, inputColumn);
|
||||
}
|
||||
|
||||
public getViewLineNumberOfModelPosition(deltaLineNumber: number, inputColumn: number): number {
|
||||
return deltaLineNumber;
|
||||
}
|
||||
}
|
||||
|
||||
class InvisibleIdentitySplitLine implements ISplitLine {
|
||||
@@ -761,6 +901,10 @@ class InvisibleIdentitySplitLine implements ISplitLine {
|
||||
public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position {
|
||||
throw new Error('Not supported');
|
||||
}
|
||||
|
||||
public getViewLineNumberOfModelPosition(deltaLineNumber: number, inputColumn: number): number {
|
||||
throw new Error('Not supported');
|
||||
}
|
||||
}
|
||||
|
||||
export class SplitLine implements ISplitLine {
|
||||
@@ -914,6 +1058,14 @@ export class SplitLine implements ISplitLine {
|
||||
// console.log('in -> out ' + deltaLineNumber + ',' + inputColumn + ' ===> ' + (deltaLineNumber+outputLineIndex) + ',' + outputColumn);
|
||||
return new Position(deltaLineNumber + outputLineIndex, outputColumn);
|
||||
}
|
||||
|
||||
public getViewLineNumberOfModelPosition(deltaLineNumber: number, inputColumn: number): number {
|
||||
if (!this._isVisible) {
|
||||
throw new Error('Not supported');
|
||||
}
|
||||
const r = this.positionMapper.getOutputPositionOfInputOffset(inputColumn - 1);
|
||||
return (deltaLineNumber + r.outputLineIndex);
|
||||
}
|
||||
}
|
||||
|
||||
function createSplitLine(linePositionMapperFactory: ILineMapperFactory, text: string, tabSize: number, wrappingColumn: number, columnsForFullWidthChar: number, wrappingIndent: WrappingIndent, isVisible: boolean): ISplitLine {
|
||||
@@ -1050,8 +1202,13 @@ export class IdentityLinesCollection implements IViewModelLinesCollection {
|
||||
public warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void {
|
||||
}
|
||||
|
||||
public getViewLineIndentGuide(viewLineNumber: number): number {
|
||||
return 0;
|
||||
public getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[] {
|
||||
const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;
|
||||
let result = new Array<number>(viewLineCount);
|
||||
for (let i = 0; i < viewLineCount; i++) {
|
||||
result[i] = 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public getViewLineContent(viewLineNumber: number): string {
|
||||
@@ -1093,4 +1250,77 @@ export class IdentityLinesCollection implements IViewModelLinesCollection {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public getAllOverviewRulerDecorations(ownerId: number, filterOutValidation: boolean, theme: ITheme): IOverviewRulerDecorations {
|
||||
const decorations = this.model.getOverviewRulerDecorations(ownerId, filterOutValidation);
|
||||
const result = new OverviewRulerDecorations();
|
||||
for (let i = 0, len = decorations.length; i < len; i++) {
|
||||
const decoration = decorations[i];
|
||||
const opts = <ModelDecorationOverviewRulerOptions>decoration.options.overviewRuler;
|
||||
const lane = opts.position;
|
||||
if (lane === 0) {
|
||||
continue;
|
||||
}
|
||||
const color = resolveColor(opts, theme);
|
||||
const viewStartLineNumber = decoration.range.startLineNumber;
|
||||
const viewEndLineNumber = decoration.range.endLineNumber;
|
||||
|
||||
result.accept(color, viewStartLineNumber, viewEndLineNumber, lane);
|
||||
}
|
||||
return result.result;
|
||||
}
|
||||
|
||||
public getDecorationsInRange(range: Range, ownerId: number, filterOutValidation: boolean): editorCommon.IModelDecoration[] {
|
||||
return this.model.getDecorationsInRange(range, ownerId, filterOutValidation);
|
||||
}
|
||||
}
|
||||
|
||||
class OverviewRulerDecorations {
|
||||
|
||||
readonly result: IOverviewRulerDecorations = Object.create(null);
|
||||
|
||||
constructor() {
|
||||
}
|
||||
|
||||
public accept(color: string, startLineNumber: number, endLineNumber: number, lane: number): void {
|
||||
let prev = this.result[color];
|
||||
|
||||
if (prev) {
|
||||
const prevLane = prev[prev.length - 3];
|
||||
const prevEndLineNumber = prev[prev.length - 1];
|
||||
if (prevLane === lane && prevEndLineNumber + 1 >= startLineNumber) {
|
||||
// merge into prev
|
||||
if (endLineNumber > prevEndLineNumber) {
|
||||
prev[prev.length - 1] = endLineNumber;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// push
|
||||
prev.push(lane, startLineNumber, endLineNumber);
|
||||
} else {
|
||||
this.result[color] = [lane, startLineNumber, endLineNumber];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function resolveColor(opts: ModelDecorationOverviewRulerOptions, theme: ITheme): string {
|
||||
if (!opts._resolvedColor) {
|
||||
const themeType = theme.type;
|
||||
const color = (themeType === 'dark' ? opts.darkColor : themeType === 'light' ? opts.color : opts.hcColor);
|
||||
opts._resolvedColor = resolveRulerColor(color, theme);
|
||||
}
|
||||
return opts._resolvedColor;
|
||||
}
|
||||
|
||||
function resolveRulerColor(color: string | ThemeColor, theme: ITheme): string {
|
||||
if (typeof color === 'string') {
|
||||
return color;
|
||||
}
|
||||
let c = color ? theme.getColor(color.id) : null;
|
||||
if (!c) {
|
||||
c = Color.transparent;
|
||||
}
|
||||
return c.toString();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user