char BackSpaceOneChar() { if (CurrentTextRun == null) { return('\0'); } else { if (CharIndex == 0) { return('\0'); } //move back 1 char and do delete EditableRun removingTextRun = CurrentTextRun; int removeIndex = CurrentTextRunCharIndex; SetCurrentCharStepLeft(); char toBeRemovedChar = CurrentChar; EditableRun.InnerRemove(removingTextRun, removeIndex, 1, false); if (removingTextRun.CharacterCount == 0) { CurrentLine.Remove(removingTextRun); EnsureCurrentTextRun(); } CurrentLine.TextLineReCalculateActualLineSize(); CurrentLine.RefreshInlineArrange(); return(toBeRemovedChar); } }
char Delete() { if (CurrentTextRun == null) { return('\0'); } else { if (CharIndex < 0) { return('\0'); } char toBeRemovedChar = CurrentChar; EditableRun removingTextRun = CurrentTextRun; int removeIndex = CurrentTextRunCharIndex; CharIndex--; EditableRun.InnerRemove(removingTextRun, removeIndex, 1, false); if (removingTextRun.CharacterCount == 0) { CurrentLine.Remove(removingTextRun); EnsureCurrentTextRun(); } CurrentLine.TextLineReCalculateActualLineSize(); CurrentLine.RefreshInlineArrange(); return(toBeRemovedChar); } }
public void SplitToNewLine() { EditableRun lineBreakRun = new EditableTextRun(this.Root, '\n', this.CurrentSpanStyle); EditableRun currentRun = CurrentTextRun; if (CurrentLine.IsBlankLine) { CurrentLine.AddLast(lineBreakRun); } else { if (CharIndex == -1) { CurrentLine.AddFirst(lineBreakRun); SetCurrentTextRun(null); } else { EditableRun rightSplitedPart = EditableRun.InnerRemove(currentRun, CurrentTextRunCharIndex + 1, true); if (rightSplitedPart != null) { CurrentLine.AddAfter(currentRun, rightSplitedPart); } CurrentLine.AddAfter(currentRun, lineBreakRun); if (currentRun.CharacterCount == 0) { CurrentLine.Remove(currentRun); } } } this.TextLayer.TopDownReCalculateContentSize(); EnsureCurrentTextRun(); }
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(); } } }