public void Select(Guid id, int selectionStartOffset, int selectionEndOffset) { if (Selections.Count == 0) { return; } if (selectionStartOffset == 0 && selectionEndOffset == 0) { Selections[id].Lines = null; return; } TextLocation start, end; if (selectionStartOffset < selectionEndOffset) { start = Editor.Document.GetLocation(selectionStartOffset); end = Editor.Document.GetLocation(selectionEndOffset); } else { start = Editor.Document.GetLocation(selectionEndOffset); end = Editor.Document.GetLocation(selectionStartOffset); } var lines = new List <LineSelection>(); if (start.Line == end.Line) { //just get that one rectangle var startPos = GetVisualPosition(start); var endPos = GetVisualPosition(end); int width = (int)(endPos.X - startPos.X); lines.Add(new LineSelection(width, startPos, Selections[id].Color)); } else { //first line var topStartPos = GetVisualPosition(start); var topEndPos = GetVisualPosition(Editor.Document.Lines[start.Line - 1].EndOffset); int topWidth = (int)(topEndPos.X - topStartPos.X); lines.Add(new LineSelection(topWidth, topStartPos, Selections[id].Color)); //last line var bottomStartPos = GetVisualPosition(Editor.Document.Lines[end.Line - 1].Offset); var bottomEndPos = GetVisualPosition(end); int bottomWidth = (int)(bottomEndPos.X - bottomStartPos.X); lines.Add(new LineSelection(bottomWidth, bottomStartPos, Selections[id].Color)); for (int i = start.Line; i < end.Line - 1; i++) { int offset = Editor.TextArea.Document.Lines[i].Offset; int endOffset = Editor.TextArea.Document.Lines[i].EndOffset; var lineStart = GetVisualPosition(offset); var lineEnd = GetVisualPosition(endOffset); int width = (int)(lineEnd.X - lineStart.X); var lineSelection = new LineSelection(width, lineStart, Selections[id].Color); lines.Add(lineSelection); } } Selections[id].Lines = lines; }
private static void AdjustLine(LineSelection line) { Canvas.SetLeft(line.Box, line.Position.X); Canvas.SetTop(line.Box, line.Position.Y); }