mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 02:48:30 -05:00
Merge from vscode e3c4990c67c40213af168300d1cfeb71d680f877 (#16569)
This commit is contained in:
@@ -9,6 +9,7 @@ import { Range } from 'vs/editor/common/core/range';
|
||||
import * as strings from 'vs/base/common/strings';
|
||||
import { Constants } from 'vs/base/common/uint';
|
||||
import { AtomicTabMoveOperations, Direction } from 'vs/editor/common/controller/cursorAtomicMoveOperations';
|
||||
import { PositionNormalizationAffinity } from 'vs/editor/common/model';
|
||||
|
||||
export class CursorPosition {
|
||||
_cursorPositionBrand: void;
|
||||
@@ -25,51 +26,86 @@ export class CursorPosition {
|
||||
}
|
||||
|
||||
export class MoveOperations {
|
||||
|
||||
public static leftPosition(model: ICursorSimpleModel, lineNumber: number, column: number): Position {
|
||||
if (column > model.getLineMinColumn(lineNumber)) {
|
||||
column = column - strings.prevCharLength(model.getLineContent(lineNumber), column - 1);
|
||||
} else if (lineNumber > 1) {
|
||||
lineNumber = lineNumber - 1;
|
||||
column = model.getLineMaxColumn(lineNumber);
|
||||
public static leftPosition(model: ICursorSimpleModel, position: Position): Position {
|
||||
if (position.column > model.getLineMinColumn(position.lineNumber)) {
|
||||
return position.delta(undefined, -strings.prevCharLength(model.getLineContent(position.lineNumber), position.column - 1));
|
||||
} else if (position.lineNumber > 1) {
|
||||
const newLineNumber = position.lineNumber - 1;
|
||||
return new Position(newLineNumber, model.getLineMaxColumn(newLineNumber));
|
||||
} else {
|
||||
return position;
|
||||
}
|
||||
return new Position(lineNumber, column);
|
||||
}
|
||||
|
||||
public static leftPositionAtomicSoftTabs(model: ICursorSimpleModel, lineNumber: number, column: number, tabSize: number): Position {
|
||||
const minColumn = model.getLineMinColumn(lineNumber);
|
||||
const lineContent = model.getLineContent(lineNumber);
|
||||
const newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, column - 1, tabSize, Direction.Left);
|
||||
if (newPosition === -1 || newPosition + 1 < minColumn) {
|
||||
return this.leftPosition(model, lineNumber, column);
|
||||
private static leftPositionAtomicSoftTabs(model: ICursorSimpleModel, position: Position, tabSize: number): Position {
|
||||
if (position.column <= model.getLineIndentColumn(position.lineNumber)) {
|
||||
const minColumn = model.getLineMinColumn(position.lineNumber);
|
||||
const lineContent = model.getLineContent(position.lineNumber);
|
||||
const newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, position.column - 1, tabSize, Direction.Left);
|
||||
if (newPosition !== -1 && newPosition + 1 >= minColumn) {
|
||||
return new Position(position.lineNumber, newPosition + 1);
|
||||
}
|
||||
}
|
||||
return new Position(lineNumber, newPosition + 1);
|
||||
return this.leftPosition(model, position);
|
||||
}
|
||||
|
||||
public static left(config: CursorConfiguration, model: ICursorSimpleModel, lineNumber: number, column: number): CursorPosition {
|
||||
private static left(config: CursorConfiguration, model: ICursorSimpleModel, position: Position): CursorPosition {
|
||||
const pos = config.stickyTabStops
|
||||
? MoveOperations.leftPositionAtomicSoftTabs(model, lineNumber, column, config.tabSize)
|
||||
: MoveOperations.leftPosition(model, lineNumber, column);
|
||||
? MoveOperations.leftPositionAtomicSoftTabs(model, position, config.tabSize)
|
||||
: MoveOperations.leftPosition(model, position);
|
||||
return new CursorPosition(pos.lineNumber, pos.column, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param noOfColumns Must be either `1`
|
||||
* or `Math.round(viewModel.getLineContent(viewLineNumber).length / 2)` (for half lines).
|
||||
*/
|
||||
public static moveLeft(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean, noOfColumns: number): SingleCursorState {
|
||||
let lineNumber: number,
|
||||
column: number;
|
||||
|
||||
if (cursor.hasSelection() && !inSelectionMode) {
|
||||
// If we are in selection mode, move left without selection cancels selection and puts cursor at the beginning of the selection
|
||||
// If the user has a selection and does not want to extend it,
|
||||
// put the cursor at the beginning of the selection.
|
||||
lineNumber = cursor.selection.startLineNumber;
|
||||
column = cursor.selection.startColumn;
|
||||
} else {
|
||||
let r = MoveOperations.left(config, model, cursor.position.lineNumber, cursor.position.column - (noOfColumns - 1));
|
||||
lineNumber = r.lineNumber;
|
||||
column = r.column;
|
||||
// This has no effect if noOfColumns === 1.
|
||||
// It is ok to do so in the half-line scenario.
|
||||
const pos = cursor.position.delta(undefined, -(noOfColumns - 1));
|
||||
// We clip the position before normalization, as normalization is not defined
|
||||
// for possibly negative columns.
|
||||
const normalizedPos = model.normalizePosition(MoveOperations.clipPositionColumn(pos, model), PositionNormalizationAffinity.Left);
|
||||
const p = MoveOperations.left(config, model, normalizedPos);
|
||||
|
||||
lineNumber = p.lineNumber;
|
||||
column = p.column;
|
||||
}
|
||||
|
||||
return cursor.move(inSelectionMode, lineNumber, column, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjusts the column so that it is within min/max of the line.
|
||||
*/
|
||||
private static clipPositionColumn(position: Position, model: ICursorSimpleModel): Position {
|
||||
return new Position(
|
||||
position.lineNumber,
|
||||
MoveOperations.clipRange(position.column, model.getLineMinColumn(position.lineNumber),
|
||||
model.getLineMaxColumn(position.lineNumber))
|
||||
);
|
||||
}
|
||||
|
||||
private static clipRange(value: number, min: number, max: number): number {
|
||||
if (value < min) {
|
||||
return min;
|
||||
}
|
||||
if (value > max) {
|
||||
return max;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public static rightPosition(model: ICursorSimpleModel, lineNumber: number, column: number): Position {
|
||||
if (column < model.getLineMaxColumn(lineNumber)) {
|
||||
column = column + strings.nextCharLength(model.getLineContent(lineNumber), column - 1);
|
||||
@@ -81,18 +117,20 @@ export class MoveOperations {
|
||||
}
|
||||
|
||||
public static rightPositionAtomicSoftTabs(model: ICursorSimpleModel, lineNumber: number, column: number, tabSize: number, indentSize: number): Position {
|
||||
const lineContent = model.getLineContent(lineNumber);
|
||||
const newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, column - 1, tabSize, Direction.Right);
|
||||
if (newPosition === -1) {
|
||||
return this.rightPosition(model, lineNumber, column);
|
||||
if (column < model.getLineIndentColumn(lineNumber)) {
|
||||
const lineContent = model.getLineContent(lineNumber);
|
||||
const newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, column - 1, tabSize, Direction.Right);
|
||||
if (newPosition !== -1) {
|
||||
return new Position(lineNumber, newPosition + 1);
|
||||
}
|
||||
}
|
||||
return new Position(lineNumber, newPosition + 1);
|
||||
return this.rightPosition(model, lineNumber, column);
|
||||
}
|
||||
|
||||
public static right(config: CursorConfiguration, model: ICursorSimpleModel, lineNumber: number, column: number): CursorPosition {
|
||||
public static right(config: CursorConfiguration, model: ICursorSimpleModel, position: Position): CursorPosition {
|
||||
const pos = config.stickyTabStops
|
||||
? MoveOperations.rightPositionAtomicSoftTabs(model, lineNumber, column, config.tabSize, config.indentSize)
|
||||
: MoveOperations.rightPosition(model, lineNumber, column);
|
||||
? MoveOperations.rightPositionAtomicSoftTabs(model, position.lineNumber, position.column, config.tabSize, config.indentSize)
|
||||
: MoveOperations.rightPosition(model, position.lineNumber, position.column);
|
||||
return new CursorPosition(pos.lineNumber, pos.column, 0);
|
||||
}
|
||||
|
||||
@@ -105,7 +143,9 @@ export class MoveOperations {
|
||||
lineNumber = cursor.selection.endLineNumber;
|
||||
column = cursor.selection.endColumn;
|
||||
} else {
|
||||
let r = MoveOperations.right(config, model, cursor.position.lineNumber, cursor.position.column + (noOfColumns - 1));
|
||||
const pos = cursor.position.delta(undefined, noOfColumns - 1);
|
||||
const normalizedPos = model.normalizePosition(MoveOperations.clipPositionColumn(pos, model), PositionNormalizationAffinity.Right);
|
||||
const r = MoveOperations.right(config, model, normalizedPos);
|
||||
lineNumber = r.lineNumber;
|
||||
column = r.column;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user