static void MoveCaret(TextArea textArea, CaretMovementType direction) { DocumentLine caretLine = textArea.Document.GetLineByNumber(textArea.Caret.Line); VisualLine visualLine = textArea.TextView.GetOrConstructVisualLine(caretLine); TextViewPosition caretPosition = textArea.Caret.Position; TextLine textLine = visualLine.GetTextLine(caretPosition.VisualColumn); switch (direction) { case CaretMovementType.CharLeft: MoveCaretLeft(textArea, caretPosition, visualLine, CaretPositioningMode.Normal); break; case CaretMovementType.CharRight: MoveCaretRight(textArea, caretPosition, visualLine, CaretPositioningMode.Normal); break; case CaretMovementType.WordLeft: MoveCaretLeft(textArea, caretPosition, visualLine, CaretPositioningMode.WordStart); break; case CaretMovementType.WordRight: MoveCaretRight(textArea, caretPosition, visualLine, CaretPositioningMode.WordStart); break; case CaretMovementType.LineUp: case CaretMovementType.LineDown: case CaretMovementType.PageUp: case CaretMovementType.PageDown: MoveCaretUpDown(textArea, direction, visualLine, textLine, caretPosition.VisualColumn); break; case CaretMovementType.DocumentStart: SetCaretPosition(textArea, 0, 0); break; case CaretMovementType.DocumentEnd: SetCaretPosition(textArea, -1, textArea.Document.TextLength); break; case CaretMovementType.LineStart: MoveCaretToStartOfLine(textArea, visualLine); break; case CaretMovementType.LineEnd: MoveCaretToEndOfLine(textArea, visualLine); break; default: throw new NotSupportedException(direction.ToString()); } }
int GetTextLineIndexFromOffset(List <TextLine> textLines, int offset) { int lineNumber = TextView.Document.GetLineByOffset(offset).LineNumber; VisualLine vl = TextView.GetVisualLine(lineNumber); if (vl != null) { int relOffset = offset - vl.FirstDocumentLine.Offset; TextLine line = vl.GetTextLine(vl.GetVisualColumn(relOffset)); return(textLines.IndexOf(line)); } return(-1); }
Rect CalcCaretRectangle(VisualLine visualLine) { if (!visualColumnValid) { RevalidateVisualColumn(visualLine); } TextLine textLine = visualLine.GetTextLine(position.VisualColumn); double xPos = textLine.GetDistanceFromCharacterHit(new CharacterHit(position.VisualColumn, 0)); double lineTop = visualLine.GetTextLineVisualYPosition(textLine, VisualYPosition.TextTop); double lineBottom = visualLine.GetTextLineVisualYPosition(textLine, VisualYPosition.LineBottom); return(new Rect(xPos, lineTop, SystemParameters.CaretWidth, lineBottom - lineTop)); }