public VisualPointInfo GetTextPointInfoFromCaretPoint(int caretX) { int accTextRunWidth = 0; int accTextRunCharCount = 0; Run lastestTextRun = null; foreach (Run t in _runs) { lastestTextRun = t; int thisTextRunWidth = t.Width; if (accTextRunWidth + thisTextRunWidth > caretX) { CharLocation localPointInfo = t.GetCharacterFromPixelOffset(caretX - thisTextRunWidth); var pointInfo = new EditableVisualPointInfo(this, accTextRunCharCount + localPointInfo.RunCharIndex, t); pointInfo.SetAdditionVisualInfo(accTextRunCharCount, caretX, accTextRunWidth); return(pointInfo); } else { accTextRunWidth += thisTextRunWidth; accTextRunCharCount += t.CharacterCount; } } if (lastestTextRun != null) { return(null); } else { EditableVisualPointInfo pInfo = new EditableVisualPointInfo(this, -1, null); pInfo.SetAdditionVisualInfo(accTextRunCharCount, caretX, accTextRunWidth); return(pInfo); } }
EditableVisualPointInfo CreateTextPointInfo(int lineId, int lineCharIndex, int caretPixelX, EditableRun onTextRun, int textRunCharOffset, int textRunPixelOffset) { EditableVisualPointInfo textPointInfo = new EditableVisualPointInfo(this, lineCharIndex); textPointInfo.SetAdditionVisualInfo(onTextRun, textRunCharOffset, caretPixelX, textRunPixelOffset); return(textPointInfo); }
internal VisualSelectionRange( EditableVisualPointInfo startPoint, EditableVisualPointInfo endPoint) { _startPoint = startPoint; _endPoint = endPoint; this.BackgroundColor = Color.LightGray; }
internal VisualSelectionRange( TextFlowLayer layer, EditableVisualPointInfo startPoint, EditableVisualPointInfo endPoint) { _layer = layer; _startPoint = startPoint; _endPoint = endPoint; this.BackgroundColor = Color.FromArgb(150, Color.Yellow); }
public EditableVisualPointInfo GetCurrentPointInfo() { #if DEBUG if (_currentTextRun != null && !_currentTextRun.HasParent) { throw new NotSupportedException(); } if (_currentTextRun == null) { } #endif EditableVisualPointInfo textPointInfo = new EditableVisualPointInfo(_currentLine, caret_char_index, _currentTextRun); textPointInfo.SetAdditionVisualInfo( _rCharOffset, _caretXPos, _rPixelOffset); return(textPointInfo); }
public EditableVisualPointInfo GetTextPointInfoFromCharIndex(int charIndex) { int limit = CharCount() - 1; if (charIndex > limit) { charIndex = limit; } int rCharOffset = 0; int rPixelOffset = 0; Run lastestRun = null; EditableVisualPointInfo textPointInfo = null; foreach (Run r in _runs) { lastestRun = r; int thisCharCount = lastestRun.CharacterCount; if (thisCharCount + rCharOffset > charIndex) { int localCharOffset = charIndex - rCharOffset; int pixelOffset = lastestRun.GetRunWidth(localCharOffset); textPointInfo = new EditableVisualPointInfo(this, charIndex, lastestRun); textPointInfo.SetAdditionVisualInfo(localCharOffset, rPixelOffset + pixelOffset, rPixelOffset); return(textPointInfo); } else { rCharOffset += thisCharCount; rPixelOffset += r.Width; } } textPointInfo = new EditableVisualPointInfo(this, charIndex, lastestRun); textPointInfo.SetAdditionVisualInfo(rCharOffset - lastestRun.CharacterCount, rPixelOffset, rPixelOffset - lastestRun.Width); return(textPointInfo); }
public void Copy(VisualSelectionRange selectionRange, TextRangeCopy output) { EditableVisualPointInfo startPoint = selectionRange.StartPoint; EditableVisualPointInfo endPoint = selectionRange.EndPoint; if (startPoint.Run != null) { if (startPoint.Run == endPoint.Run) { CopyRun elem = startPoint.Run.Copy( startPoint.RunLocalSelectedIndex, endPoint.LineCharIndex - startPoint.LineCharIndex); if (elem != null) { output.AppendRun(elem); } } else { GetStartAndStopLine(startPoint, endPoint, out TextLineBox startLine, out TextLineBox stopLine); if (startLine == stopLine) { CopyRun rightPart = startPoint.Run.Copy(startPoint.RunLocalSelectedIndex); if (rightPart != null) { output.AppendRun(rightPart); } if (startPoint.Run.NextRun != endPoint.Run) { foreach (Run run in _textFlowLayer.TextRunForward( startPoint.Run.NextRun, endPoint.Run.PrevRun)) { output.AppendRun(run); } } CopyRun leftPart = endPoint.Run.LeftCopy(endPoint.RunLocalSelectedIndex); if (leftPart != null) { output.AppendRun(leftPart); } } else { int startLineId = startPoint.LineId; int stopLineId = endPoint.LineId; startLine.RightCopy(startPoint, output); for (int i = startLineId + 1; i < stopLineId; i++) { //begine new line output.AppendNewLine(); TextLineBox line = _textFlowLayer.GetTextLine(i); line.Copy(output); } if (endPoint.LineCharIndex > -1) { output.AppendNewLine(); stopLine.LeftCopy(endPoint, output); } } } } else { GetStartAndStopLine(startPoint, endPoint, out TextLineBox startLine, out TextLineBox stopLine); if (startLine == stopLine) { if (startPoint.LineCharIndex == -1) { foreach (Run t in _textFlowLayer.TextRunForward( startPoint.Run, endPoint.Run.PrevRun)) { output.AppendRun(t); } CopyRun postCutTextRun = endPoint.Run.Copy(endPoint.RunLocalSelectedIndex + 1); if (postCutTextRun != null) { output.AppendRun(postCutTextRun); } } else { CopyRun rightPart = startPoint.Run.Copy(startPoint.RunLocalSelectedIndex + 1); if (rightPart != null) { output.AppendRun(rightPart); } foreach (Run t in _textFlowLayer.TextRunForward( startPoint.Run.NextRun, endPoint.Run.PrevRun)) { output.AppendRun(t.CreateCopy()); } CopyRun leftPart = endPoint.Run.LeftCopy(startPoint.RunLocalSelectedIndex); if (leftPart != null) { output.AppendRun(leftPart); } } } else { int startLineId = startPoint.LineId; int stopLineId = endPoint.LineId; startLine.RightCopy(startPoint, output); for (int i = startLineId + 1; i < stopLineId; i++) { output.AppendNewLine(); TextLineBox line = _textFlowLayer.GetTextLine(i); line.Copy(output); } stopLine.LeftCopy(endPoint, output); } } }
void GetStartAndStopLine(EditableVisualPointInfo startPoint, EditableVisualPointInfo endPoint, out TextLineBox startLine, out TextLineBox stopLine) { startLine = (startPoint.LineId == _currentLineNumber) ? this : _textFlowLayer.GetTextLine(startPoint.LineId); stopLine = (endPoint.LineId == _currentLineNumber) ? this : _textFlowLayer.GetTextLine(endPoint.LineId); }
internal EditableVisualPointInfo Split(EditableVisualPointInfo pointInfo) { if (pointInfo.LineId != _currentLineNumber) { throw new NotSupportedException(); } Run tobeCutRun = pointInfo.Run; if (tobeCutRun == null) { return(CreateTextPointInfo( pointInfo.LineId, pointInfo.LineCharIndex, pointInfo.X, null, pointInfo.TextRunCharOffset, pointInfo.TextRunPixelOffset)); } this.LocalSuspendLineReArrange(); EditableVisualPointInfo result = null; CopyRun leftPart = tobeCutRun.LeftCopy(pointInfo.RunLocalSelectedIndex); CopyRun rightPart = tobeCutRun.Copy(pointInfo.RunLocalSelectedIndex); if (leftPart != null) { Run leftRun = AddBefore(tobeCutRun, leftPart); if (rightPart != null) { this.AddAfter(tobeCutRun, rightPart); } result = CreateTextPointInfo( pointInfo.LineId, pointInfo.LineCharIndex, pointInfo.X, leftRun, pointInfo.TextRunCharOffset, pointInfo.TextRunPixelOffset); } else { if (rightPart != null) { this.AddAfter(tobeCutRun, rightPart); } Run infoTextRun = null; if (IsSingleLine) { if (tobeCutRun.PrevRun != null) { infoTextRun = tobeCutRun.PrevRun; } else { infoTextRun = tobeCutRun.NextRun; } } else { if (IsFirstLine) { if (tobeCutRun.PrevRun != null) { infoTextRun = tobeCutRun.PrevRun; } else { if (tobeCutRun.NextRun == null) { infoTextRun = null; } else { infoTextRun = tobeCutRun.NextRun; } } } else if (IsLastLine) { if (tobeCutRun.PrevRun != null) { infoTextRun = tobeCutRun.PrevRun; } else { } } else { if (tobeCutRun.NextRun != null) { infoTextRun = tobeCutRun.NextRun; } else { infoTextRun = null; } } } result = CreateTextPointInfo( pointInfo.LineId, pointInfo.LineCharIndex, pointInfo.X, infoTextRun, pointInfo.TextRunCharOffset, pointInfo.TextRunPixelOffset); } this.Remove(tobeCutRun); this.LocalResumeLineReArrange(); return(result); }
internal SelectionRangeInfo Split(VisualSelectionRange selectionRange) { selectionRange.SwapIfUnOrder(); EditableVisualPointInfo startPoint = selectionRange.StartPoint; EditableVisualPointInfo endPoint = selectionRange.EndPoint; if (startPoint.Run == endPoint.Run) { Run toBeCutTextRun = startPoint.Run; CopyRun leftPart = toBeCutTextRun.LeftCopy(startPoint.RunLocalSelectedIndex); CopyRun middlePart = toBeCutTextRun.Copy(startPoint.RunLocalSelectedIndex, endPoint.LineCharIndex - startPoint.LineCharIndex); CopyRun rightPart = toBeCutTextRun.Copy(endPoint.RunLocalSelectedIndex); EditableVisualPointInfo newStartRangePointInfo = null; EditableVisualPointInfo newEndRangePointInfo = null; TextLineBox line = this; if (startPoint.LineId != _currentLineNumber) { line = _textFlowLayer.GetTextLine(startPoint.LineId); } line.LocalSuspendLineReArrange(); if (leftPart != null) { Run leftRun = line.AddBefore(toBeCutTextRun, leftPart); newStartRangePointInfo = CreateTextPointInfo( startPoint.LineId, startPoint.LineCharIndex, startPoint.X, leftRun, startPoint.TextRunCharOffset, startPoint.TextRunPixelOffset); } else { //no left part, //so we connect to prev text run Run prevTxtRun = startPoint.Run.PrevRun; if (prevTxtRun != null) { newStartRangePointInfo = CreateTextPointInfo( startPoint.LineId, startPoint.LineCharIndex, startPoint.X, prevTxtRun, startPoint.TextRunCharOffset - leftPart.CharacterCount, startPoint.TextRunPixelOffset - prevTxtRun.Width); } else { //no prev run, we are at the begining of the line newStartRangePointInfo = CreateTextPointInfo( startPoint.LineId, startPoint.LineCharIndex, 0, null, 0, 0); } } if (rightPart != null) { Run rightRun = line.AddAfter(toBeCutTextRun, rightPart); newEndRangePointInfo = CreateTextPointInfo( endPoint.LineId, endPoint.LineCharIndex, endPoint.X, null, ///?? startPoint.TextRunCharOffset + middlePart.CharacterCount, startPoint.TextRunPixelOffset + MeasureCopyRunLength(middlePart).Width); } else { Run nextTxtRun = endPoint.Run.NextRun; if (nextTxtRun != null) { newEndRangePointInfo = CreateTextPointInfo( endPoint.LineId, endPoint.LineCharIndex, endPoint.X, null, ///?? endPoint.TextRunPixelOffset + endPoint.Run.CharacterCount, endPoint.TextRunPixelOffset + endPoint.Run.Width); } else { newEndRangePointInfo = CreateTextPointInfo( endPoint.LineId, endPoint.LineCharIndex, endPoint.X, null, endPoint.TextRunCharOffset, endPoint.TextRunPixelOffset); } } if (middlePart != null) { line.AddAfter(toBeCutTextRun, middlePart); } else { throw new NotSupportedException(); } line.Remove(toBeCutTextRun); line.LocalResumeLineReArrange(); return(new SelectionRangeInfo(newStartRangePointInfo, newEndRangePointInfo)); } else { TextLineBox workingLine = this; if (startPoint.LineId != _currentLineNumber) { workingLine = _textFlowLayer.GetTextLine(startPoint.LineId); } EditableVisualPointInfo newStartPoint = workingLine.Split(startPoint); workingLine = this; if (endPoint.LineId != _currentLineNumber) { workingLine = _textFlowLayer.GetTextLine(endPoint.LineId); } EditableVisualPointInfo newEndPoint = workingLine.Split(endPoint); return(new SelectionRangeInfo(newStartPoint, newEndPoint)); } }
internal void Remove(VisualSelectionRange selectionRange) { EditableVisualPointInfo startPoint = selectionRange.StartPoint; EditableVisualPointInfo endPoint = selectionRange.EndPoint; if (startPoint.Run != null) { if (startPoint.Run == endPoint.Run) { Run removedRun = startPoint.Run; Run.InnerRemove(removedRun, startPoint.RunLocalSelectedIndex, endPoint.LineCharIndex - startPoint.LineCharIndex, false); if (removedRun.CharacterCount == 0) { if (startPoint.LineId == _currentLineNumber) { this.Remove(removedRun); } else { TextLineBox line = _textFlowLayer.GetTextLine(startPoint.LineId); line.Remove(removedRun); } } } else { GetStartAndStopLine(startPoint, endPoint, out TextLineBox startLine, out TextLineBox stopLine); EditableVisualPointInfo newStartPoint = startLine.Split(startPoint); EditableVisualPointInfo newStopPoint = stopLine.Split(endPoint); if (startLine == stopLine) { if (newStartPoint.Run != null) { LinkedList <Run> tobeRemoveRuns = new LinkedList <Run>(); if (newStartPoint.LineCharIndex == 0) { foreach (Run t in _textFlowLayer.TextRunForward( newStartPoint.Run, newStopPoint.Run)) { tobeRemoveRuns.AddLast(t); } } else { foreach (Run t in _textFlowLayer.TextRunForward( newStartPoint.Run.NextRun, newStopPoint.Run)) { tobeRemoveRuns.AddLast(t); } } startLine.LocalSuspendLineReArrange(); foreach (Run t in tobeRemoveRuns) { startLine.Remove(t); } startLine.LocalResumeLineReArrange(); } else { //this may be the blank line startLine.Clear(); #if DEBUG //TODO: review here again //System.Diagnostics.Debug.WriteLine("EditableTextLine_adv1"); #endif } } else { int startLineId = newStartPoint.LineId; int stopLineId = newStopPoint.LineId; if (newStopPoint.LineCharIndex > 0) { stopLine.RemoveLeft(newStopPoint.Run); } for (int i = stopLineId - 1; i > startLineId; i--) { TextLineBox line = _textFlowLayer.GetTextLine(i); line.Clear(); line.JoinWithNextLine(); } if (newStartPoint.LineCharIndex == 0) { startLine.RemoveRight(newStartPoint.Run); } else { Run nextRun = (newStartPoint.Run).NextRun; if (nextRun != null) { startLine.RemoveRight(nextRun); } } startLine.JoinWithNextLine(); } } } else { GetStartAndStopLine(startPoint, endPoint, out TextLineBox startLine, out TextLineBox stopLine); EditableVisualPointInfo newStartPoint = startLine.Split(startPoint); EditableVisualPointInfo newStopPoint = stopLine.Split(endPoint); if (startLine == stopLine) { if (newStartPoint.Run != null) { LinkedList <Run> tobeRemoveRuns = new LinkedList <Run>(); if (newStartPoint.LineCharIndex == -1) { foreach (Run t in _textFlowLayer.TextRunForward( newStartPoint.Run, newStopPoint.Run)) { tobeRemoveRuns.AddLast(t); } } else { foreach (Run t in _textFlowLayer.TextRunForward( newStartPoint.Run.NextRun, newStopPoint.Run)) { tobeRemoveRuns.AddLast(t); } } foreach (Run t in tobeRemoveRuns) { startLine.Remove(t); } } else { throw new NotSupportedException(); } } else { int startLineId = newStartPoint.LineId; int stopLineId = newStopPoint.LineId; if (newStopPoint.LineCharIndex > -1) { stopLine.RemoveLeft(newStopPoint.Run); } for (int i = stopLineId - 1; i > startLineId; i--) { TextLineBox line = _textFlowLayer.GetTextLine(i); line.Clear(); line.JoinWithNextLine(); } if (newStartPoint.LineCharIndex == -1) { //TODO: review here again //at this point newStartPoint.TextRun should always null if (newStartPoint.Run != null) { startLine.RemoveRight(newStartPoint.Run); } } else { //at this point newStartPoint.TextRun should always null //TODO newStartPoint.TextRun == null??? if (newStartPoint.Run != null) { Run nextRun = newStartPoint.Run.NextRun; if (nextRun != null) { startLine.RemoveRight(nextRun); } } } startLine.JoinWithNextLine(); } } }
public SelectionRangeInfo(EditableVisualPointInfo start, EditableVisualPointInfo end) { this.start = start; this.end = end; }
public void Copy(VisualSelectionRange selectionRange, List <EditableRun> output) { EditableVisualPointInfo startPoint = selectionRange.StartPoint; EditableVisualPointInfo endPoint = selectionRange.EndPoint; if (startPoint.TextRun != null) { if (startPoint.TextRun == endPoint.TextRun) { EditableRun elem = startPoint.TextRun.Copy( startPoint.RunLocalSelectedIndex, endPoint.LineCharIndex - startPoint.LineCharIndex); if (elem != null) { output.Add(elem); } } else { EditableTextLine startLine = null; EditableTextLine stopLine = null; if (startPoint.LineId == _currentLineNumber) { startLine = this; } else { startLine = EditableFlowLayer.GetTextLine(startPoint.LineId); } if (endPoint.LineId == _currentLineNumber) { stopLine = this; } else { stopLine = EditableFlowLayer.GetTextLine(endPoint.LineId); } if (startLine == stopLine) { EditableRun postCutTextRun = startPoint.TextRun.Copy(startPoint.RunLocalSelectedIndex); if (postCutTextRun != null) { output.Add(postCutTextRun); } if (startPoint.TextRun.NextTextRun != endPoint.TextRun) { foreach (EditableRun t in EditableFlowLayer.TextRunForward(startPoint.TextRun.NextTextRun, endPoint.TextRun.PrevTextRun)) { output.Add(t.Clone()); } } EditableRun preCutTextRun = endPoint.TextRun.LeftCopy(endPoint.RunLocalSelectedIndex); if (preCutTextRun != null) { output.Add(preCutTextRun); } } else { int startLineId = startPoint.LineId; int stopLineId = endPoint.LineId; startLine.RightCopy(startPoint, output); for (int i = startLineId + 1; i < stopLineId; i++) { output.Add(new EditableTextRun(this.Root, '\n', this.CurrentTextSpanStyle)); EditableTextLine line = EditableFlowLayer.GetTextLine(i); line.Copy(output); } if (endPoint.LineCharIndex > -1) { output.Add(new EditableTextRun(this.Root, '\n', this.CurrentTextSpanStyle)); stopLine.LeftCopy(endPoint, output); } } } } else { EditableTextLine startLine = null; EditableTextLine stopLine = null; if (startPoint.LineId == _currentLineNumber) { startLine = this; } else { startLine = EditableFlowLayer.GetTextLine(startPoint.LineId); } if (endPoint.LineId == _currentLineNumber) { stopLine = this; } else { stopLine = EditableFlowLayer.GetTextLine(endPoint.LineId); } if (startLine == stopLine) { if (startPoint.LineCharIndex == -1) { foreach (EditableRun t in EditableFlowLayer.TextRunForward(startPoint.TextRun, endPoint.TextRun.PrevTextRun)) { output.Add(t.Clone()); } EditableRun postCutTextRun = endPoint.TextRun.Copy(endPoint.RunLocalSelectedIndex + 1); if (postCutTextRun != null) { output.Add(postCutTextRun); } } else { EditableRun postCutTextRun = startPoint.TextRun.Copy(startPoint.RunLocalSelectedIndex + 1); if (postCutTextRun != null) { output.Add(postCutTextRun); } foreach (EditableRun t in EditableFlowLayer.TextRunForward(startPoint.TextRun.NextTextRun, endPoint.TextRun.PrevTextRun)) { output.Add(t.Clone()); } EditableRun preCutTextRun = endPoint.TextRun.LeftCopy(startPoint.RunLocalSelectedIndex); if (preCutTextRun != null) { output.Add(preCutTextRun); } } } else { int startLineId = startPoint.LineId; int stopLineId = endPoint.LineId; startLine.RightCopy(startPoint, output); for (int i = startLineId + 1; i < stopLineId; i++) { output.Add(new EditableTextRun(this.Root, '\n', this.CurrentTextSpanStyle)); EditableTextLine line = EditableFlowLayer.GetTextLine(i); line.Copy(output); } stopLine.LeftCopy(endPoint, output); } } }
internal EditableVisualPointInfo[] Split(VisualSelectionRange selectionRange) { selectionRange.SwapIfUnOrder(); EditableVisualPointInfo startPoint = selectionRange.StartPoint; EditableVisualPointInfo endPoint = selectionRange.EndPoint; if (startPoint.TextRun == endPoint.TextRun) { EditableRun toBeCutTextRun = startPoint.TextRun; EditableRun preCutTextRun = (EditableRun)toBeCutTextRun.LeftCopy(startPoint.RunLocalSelectedIndex); EditableRun middleCutTextRun = (EditableRun)toBeCutTextRun.Copy(startPoint.RunLocalSelectedIndex, endPoint.LineCharIndex - startPoint.LineCharIndex); EditableRun postCutTextRun = (EditableRun)toBeCutTextRun.Copy(endPoint.RunLocalSelectedIndex); EditableVisualPointInfo newStartRangePointInfo = null; EditableVisualPointInfo newEndRangePointInfo = null; EditableTextLine line = this; if (startPoint.LineId != _currentLineNumber) { line = EditableFlowLayer.GetTextLine(startPoint.LineId); } line.LocalSuspendLineReArrange(); if (preCutTextRun != null) { line.AddBefore(toBeCutTextRun, preCutTextRun); newStartRangePointInfo = CreateTextPointInfo( startPoint.LineId, startPoint.LineCharIndex, startPoint.X, preCutTextRun, startPoint.TextRunCharOffset, startPoint.TextRunPixelOffset); } else { EditableRun prevTxtRun = GetPrevTextRun((EditableRun)startPoint.TextRun); if (prevTxtRun != null) { newStartRangePointInfo = CreateTextPointInfo( startPoint.LineId, startPoint.LineCharIndex, startPoint.X, prevTxtRun, startPoint.TextRunCharOffset - preCutTextRun.CharacterCount, startPoint.TextRunPixelOffset - prevTxtRun.Width); } else { newStartRangePointInfo = CreateTextPointInfo( startPoint.LineId, startPoint.LineCharIndex, 0, null, 0, 0); } } if (postCutTextRun != null) { line.AddAfter(toBeCutTextRun, postCutTextRun); newEndRangePointInfo = CreateTextPointInfo( endPoint.LineId, endPoint.LineCharIndex, endPoint.X, middleCutTextRun, startPoint.TextRunCharOffset + middleCutTextRun.CharacterCount, startPoint.TextRunPixelOffset + middleCutTextRun.Width); } else { EditableRun nextTxtRun = GetNextTextRun((EditableRun)endPoint.TextRun); if (nextTxtRun != null) { newEndRangePointInfo = CreateTextPointInfo( endPoint.LineId, endPoint.LineCharIndex, endPoint.X, nextTxtRun, endPoint.TextRunPixelOffset + endPoint.TextRun.CharacterCount, endPoint.TextRunPixelOffset + endPoint.TextRun.Width); } else { newEndRangePointInfo = CreateTextPointInfo( endPoint.LineId, endPoint.LineCharIndex, endPoint.X, middleCutTextRun, endPoint.TextRunCharOffset, endPoint.TextRunPixelOffset); } } if (middleCutTextRun != null) { line.AddAfter(toBeCutTextRun, middleCutTextRun); } else { throw new NotSupportedException(); } line.Remove(toBeCutTextRun); line.LocalResumeLineReArrange(); return(new EditableVisualPointInfo[] { newStartRangePointInfo, newEndRangePointInfo }); } else { EditableTextLine workingLine = this; if (startPoint.LineId != _currentLineNumber) { workingLine = EditableFlowLayer.GetTextLine(startPoint.LineId); } EditableVisualPointInfo newStartPoint = workingLine.Split(startPoint); workingLine = this; if (endPoint.LineId != _currentLineNumber) { workingLine = EditableFlowLayer.GetTextLine(endPoint.LineId); } EditableVisualPointInfo newEndPoint = workingLine.Split(endPoint); return(new EditableVisualPointInfo[] { newStartPoint, newEndPoint }); } }