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.LocalSelectedIndex);
EditableRun middleCutTextRun = (EditableRun)toBeCutTextRun.Copy(startPoint.LocalSelectedIndex + 1, endPoint.LineCharIndex - startPoint.LineCharIndex);
EditableRun postCutTextRun = (EditableRun)toBeCutTextRun.Copy(endPoint.LocalSelectedIndex + 1);
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 });
}
}