internal void Remove(VisualSelectionRange selectionRange) { EditableVisualPointInfo startPoint = selectionRange.StartPoint; EditableVisualPointInfo endPoint = selectionRange.EndPoint; if (startPoint.TextRun != null) { if (startPoint.TextRun == endPoint.TextRun) { EditableRun removedRun = (EditableRun)startPoint.TextRun; EditableRun.InnerRemove(removedRun, startPoint.RunLocalSelectedIndex, endPoint.LineCharIndex - startPoint.LineCharIndex, false); if (removedRun.CharacterCount == 0) { if (startPoint.LineId == this.currentLineNumber) { this.Remove(removedRun); } else { EditableTextLine line = editableFlowLayer.GetTextLine(startPoint.LineId); line.Remove(removedRun); } } } else { EditableVisualPointInfo newStartPoint = null; EditableVisualPointInfo newStopPoint = null; EditableTextLine startLine = null; EditableTextLine stopLine = null; if (startPoint.LineId == currentLineNumber) { startLine = this; } else { startLine = editableFlowLayer.GetTextLine(startPoint.LineId); } newStartPoint = startLine.Split(startPoint); if (endPoint.LineId == currentLineNumber) { stopLine = this; } else { stopLine = editableFlowLayer.GetTextLine(endPoint.LineId); } newStopPoint = stopLine.Split(endPoint); if (startLine == stopLine) { if (newStartPoint.TextRun != null) { LinkedList <EditableRun> tobeRemoveRuns = new LinkedList <EditableRun>(); if (newStartPoint.LineCharIndex == 0) { foreach (EditableRun t in editableFlowLayer.TextRunForward( (EditableRun)newStartPoint.TextRun, (EditableRun)newStopPoint.TextRun)) { tobeRemoveRuns.AddLast(t); } } else { foreach (EditableRun t in editableFlowLayer.TextRunForward( newStartPoint.TextRun.NextTextRun, (EditableRun)newStopPoint.TextRun)) { tobeRemoveRuns.AddLast(t); } } startLine.LocalSuspendLineReArrange(); foreach (EditableRun t in tobeRemoveRuns) { startLine.Remove(t); } startLine.LocalResumeLineReArrange(); } else { throw new NotSupportedException(); } } else { int startLineId = newStartPoint.LineId; int stopLineId = newStopPoint.LineId; if (newStopPoint.LineCharIndex > 0) { stopLine.RemoveLeft((EditableRun)newStopPoint.TextRun); } for (int i = stopLineId - 1; i > startLineId; i--) { EditableTextLine line = editableFlowLayer.GetTextLine(i); line.Clear(); line.JoinWithNextLine(); } if (newStartPoint.LineCharIndex == 0) { startLine.RemoveRight((EditableRun)newStartPoint.TextRun); } else { EditableRun nextRun = ((EditableRun)newStartPoint.TextRun).NextTextRun; if (nextRun != null && !nextRun.IsLineBreak) { startLine.RemoveRight(nextRun); } } startLine.JoinWithNextLine(); } } } else { VisualPointInfo newStartPoint = null; VisualPointInfo newStopPoint = null; EditableTextLine startLine = null; EditableTextLine stopLine = null; if (startPoint.LineId == this.currentLineNumber) { startLine = this; } else { startLine = editableFlowLayer.GetTextLine(startPoint.LineId); } newStartPoint = startLine.Split(startPoint); if (endPoint.LineId == currentLineNumber) { stopLine = this; } else { stopLine = editableFlowLayer.GetTextLine(endPoint.LineId); } newStopPoint = stopLine.Split(endPoint); if (startLine == stopLine) { if (newStartPoint.TextRun != null) { LinkedList <EditableRun> tobeRemoveRuns = new LinkedList <EditableRun>(); if (newStartPoint.LineCharIndex == -1) { foreach (EditableRun t in editableFlowLayer.TextRunForward( (EditableRun)newStartPoint.TextRun, (EditableRun)newStopPoint.TextRun)) { tobeRemoveRuns.AddLast(t); } } else { foreach (EditableRun t in editableFlowLayer.TextRunForward( newStartPoint.TextRun.NextTextRun, (EditableRun)newStopPoint.TextRun)) { tobeRemoveRuns.AddLast(t); } } foreach (EditableRun 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((EditableRun)newStopPoint.TextRun); } for (int i = stopLineId - 1; i > startLineId; i--) { EditableTextLine line = editableFlowLayer.GetTextLine(i); line.Clear(); line.JoinWithNextLine(); } if (newStartPoint.LineCharIndex == -1) { if (newStartPoint.TextRun != null) { startLine.RemoveRight((EditableRun)newStartPoint.TextRun); } } else { EditableRun nextRun = newStartPoint.TextRun.NextTextRun; if (nextRun != null && !nextRun.IsLineBreak) { startLine.RemoveRight(nextRun); } } startLine.JoinWithNextLine(); } } }