public void DoFormatSelection(TextSpanStyle textStyle) { int startLineNum = textLineWriter.LineNumber; int startCharIndex = textLineWriter.CharIndex; SplitSelectedText(); VisualSelectionRange selRange = SelectionRange; if (selRange != null) { foreach (EditableRun r in selRange.GetPrintableTextRunIter()) { r.SetStyle(textStyle); } this.updateJustCurrentLine = selectionRange.IsOnTheSameLine; CancelSelect(); CharIndex++; CharIndex--; } }
public LinkedList <EditableRun> CopySelectedTextRuns(VisualSelectionRange selectionRange) { LinkedList <EditableRun> output = new LinkedList <EditableRun>(); currentLine.Copy(selectionRange, output); return(output); }
public void RemoveSelectedTextRuns(VisualSelectionRange selectionRange) { int precutIndex = selectionRange.StartPoint.LineCharIndex; CurrentLine.Remove(selectionRange); CurrentLine.TextLineReCalculateActualLineSize(); CurrentLine.RefreshInlineArrange(); EnsureCurrentTextRun(precutIndex); }
internal void WriteInfo(VisualSelectionRange range) { if (range == null) { return; } WriteInfo(range.ToString()); }
public void StartSelect() { if (textLineWriter != null) { selectionRange = new VisualSelectionRange(GetCurrentPointInfo(), GetCurrentPointInfo()); } #if DEBUG if (dbugEnableTextManRecorder) { dbugTextManRecorder.WriteInfo("TxLMan::StartSelect"); } #endif }
Rectangle GetSelectionUpdateArea() { VisualSelectionRange selectionRange = internalTextLayerController.SelectionRange; if (selectionRange != null && selectionRange.IsValid) { return(Rectangle.FromLTRB(0, selectionRange.TopEnd.LineTop, Width, selectionRange.BottomEnd.Line.LineBottom)); } else { return(Rectangle.Empty); } }
void SplitSelectedText() { VisualSelectionRange selRange = SelectionRange; if (selRange != null) { EditableVisualPointInfo[] newPoints = textLineWriter.SplitSelectedText(selRange); if (newPoints != null) { selRange.StartPoint = newPoints[0]; selRange.EndPoint = newPoints[1]; return; } else { selectionRange = null; } } }
public TextSpanStyle GetFirstTextStyleInSelectedRange() { VisualSelectionRange selRange = SelectionRange; if (selRange != null) { if (selectionRange.StartPoint.TextRun != null) { return(selectionRange.StartPoint.TextRun.SpanStyle); } else { return(TextSpanStyle.Empty); } } else { return(TextSpanStyle.Empty); } }
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.LocalSelectedIndex + 1, 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 == -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); } } 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 > -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) { 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(); } } }
public void Copy(VisualSelectionRange selectionRange, LinkedList<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.LocalSelectedIndex + 1, endPoint.LineCharIndex - startPoint.LineCharIndex); if (elem != null) { output.AddLast(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.LocalSelectedIndex + 1); if (postCutTextRun != null) { output.AddLast(postCutTextRun); } if (startPoint.TextRun.NextTextRun != endPoint.TextRun) { foreach (EditableRun t in editableFlowLayer.TextRunForward(startPoint.TextRun.NextTextRun, endPoint.TextRun.PrevTextRun)) { output.AddLast(t.Clone()); } } EditableRun preCutTextRun = endPoint.TextRun.LeftCopy(endPoint.LocalSelectedIndex); if (preCutTextRun != null) { output.AddLast(preCutTextRun); } } else { int startLineId = startPoint.LineId; int stopLineId = endPoint.LineId; startLine.RightCopy(startPoint, output); for (int i = startLineId + 1; i < stopLineId; i++) { output.AddLast(new EditableTextRun(this.Root, '\n', this.CurrentTextSpanStyle)); EditableTextLine line = editableFlowLayer.GetTextLine(i); line.Copy(output); } if (endPoint.LineCharIndex > -1) { output.AddLast(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.AddLast(t.Clone()); } EditableRun postCutTextRun = endPoint.TextRun.Copy(endPoint.LocalSelectedIndex + 1); if (postCutTextRun != null) { output.AddLast(postCutTextRun); } } else { EditableRun postCutTextRun = startPoint.TextRun.Copy(startPoint.LocalSelectedIndex + 1); if (postCutTextRun != null) { output.AddLast(postCutTextRun); } foreach (EditableRun t in editableFlowLayer.TextRunForward(startPoint.TextRun.NextTextRun, endPoint.TextRun.PrevTextRun)) { output.AddLast(t.Clone()); } EditableRun preCutTextRun = endPoint.TextRun.LeftCopy(startPoint.LocalSelectedIndex); if (preCutTextRun != null) { output.AddLast(preCutTextRun); } } } else { int startLineId = startPoint.LineId; int stopLineId = endPoint.LineId; startLine.RightCopy(startPoint, output); for (int i = startLineId + 1; i < stopLineId; i++) { output.AddLast(new EditableTextRun(this.Root, '\n', this.CurrentTextSpanStyle)); EditableTextLine line = editableFlowLayer.GetTextLine(i); line.Copy(output); } stopLine.LeftCopy(endPoint, output); } } }
public void CopySelectedTextRuns(VisualSelectionRange selectionRange, List <EditableRun> output) { currentLine.Copy(selectionRange, output); }
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); } } }
public EditableVisualPointInfo[] SplitSelectedText(VisualSelectionRange selectionRange) { EditableVisualPointInfo[] newPoints = CurrentLine.Split(selectionRange); EnsureCurrentTextRun(); return(newPoints); }
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 + 1, endPoint.LineCharIndex - startPoint.LineCharIndex); EditableRun postCutTextRun = (EditableRun)toBeCutTextRun.Copy(endPoint.RunLocalSelectedIndex + 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 }); } }
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(); } } }
public EditableVisualPointInfo[] SplitSelectedText(VisualSelectionRange selectionRange) { EditableVisualPointInfo[] newPoints = CurrentLine.Split(selectionRange); EnsureCurrentTextRun(); return newPoints; }
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 }; } }
public LinkedList<EditableRun> CopySelectedTextRuns(VisualSelectionRange selectionRange) { LinkedList<EditableRun> output = new LinkedList<EditableRun>(); currentLine.Copy(selectionRange, output); return output; }