public void SetToOffsetWithDesiredColumn(int desiredOffset) { DocumentLocation old = Location; int desiredLineNumber = TextEditor.Document.OffsetToLineNumber(desiredOffset); var desiredLine = TextEditor.Document.GetLine(desiredLineNumber); int newColumn = desiredOffset - desiredLine.Offset + 1; if (desiredLine.Length + 1 < Column && newColumn == 1) { if (TextEditor.HasIndentationTracker && TextEditor.Options.IndentStyle == IndentStyle.Virtual) { newColumn = TextEditor.GetVirtualIndentationColumn(desiredLineNumber, 1); } } line = desiredLineNumber; column = newColumn; var logicalDesiredColumn = desiredLine.GetLogicalColumn(TextEditor, DesiredColumn); if (logicalDesiredColumn <= desiredLine.Length + 1) { int possibleOffset = TextEditor.Document.LocationToOffset(desiredLineNumber, logicalDesiredColumn); column = logicalDesiredColumn; } else { column = System.Math.Max(newColumn, desiredLine.Length + 1); } UpdateCaretOffset(); OnPositionChanged(new DocumentLocationEventArgs(old)); }
void CheckColumn() { var curLine = TextEditor.Document.GetLine(Line); if (TextEditor.HasIndentationTracker && TextEditor.Options.IndentStyle == IndentStyle.Virtual && curLine.Length == 0) { if (column > DocumentLocation.MinColumn) { var indentColumn = TextEditor.GetVirtualIndentationColumn(Location); if (column < indentColumn) { column = indentColumn; UpdateCaretOffset(); return; } if (column == indentColumn) { return; } } } if (!AllowCaretBehindLineEnd) { var max = curLine.Length + 1; if (column > max) { column = max; UpdateCaretOffset(); } } }
internal void UpdateCaretPosition(DocumentChangeEventArgs e) { if (e.AnchorMovementType == AnchorMovementType.BeforeInsertion && caretOffset == e.Offset) { offsetVersion = TextEditor.Document.Version; return; } var curVersion = TextEditor.Document.Version; if (offsetVersion == null) { offsetVersion = curVersion; return; } var newOffset = offsetVersion.MoveOffsetTo(curVersion, caretOffset); offsetVersion = curVersion; if (newOffset == caretOffset || !AutoUpdatePosition) { return; } DocumentLocation old = Location; var newLocation = TextEditor.Document.OffsetToLocation(newOffset); int newColumn = newLocation.Column; var curLine = TextEditor.Document.GetLine(newLocation.Line); if (TextEditor.HasIndentationTracker && TextEditor.Options.IndentStyle == IndentStyle.Virtual && curLine.Length == 0) { var indentColumn = TextEditor.GetVirtualIndentationColumn(Location); if (column == indentColumn) { newColumn = indentColumn; } } if (AllowCaretBehindLineEnd) { if (curLine != null && column > curLine.Length) { newColumn = column; } } line = newLocation.Line; column = newColumn; SetDesiredColumn(); UpdateCaretOffset(); OnPositionChanged(new DocumentLocationEventArgs(old)); }
void SetColumn() { var curLine = TextEditor.Document.GetLine(Line); if (curLine == null) { return; } column = System.Math.Max(DocumentLocation.MinColumn, Column); column = curLine.GetLogicalColumn(TextEditor, DesiredColumn); if (TextEditor.HasIndentationTracker && TextEditor.Options.IndentStyle == IndentStyle.Virtual && curLine.GetVisualColumn(TextEditor, column) < DesiredColumn) { column = TextEditor.GetVirtualIndentationColumn(Line, column); } else { if (!AllowCaretBehindLineEnd && Column > curLine.Length + 1) { column = System.Math.Min(curLine.Length + 1, column); } } }