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();
}
}
}