void LeftCopy(VisualPointInfo pointInfo, TextRangeCopy output) { if (pointInfo.LineId != _currentLineNumber) { throw new NotSupportedException(); } Run tobeCutRun = pointInfo.Run; if (tobeCutRun == null) { return; } foreach (Run run in _runs) { if (run != tobeCutRun) { output.AppendRun(run); } else { break; } } CopyRun leftPart = tobeCutRun.LeftCopy(pointInfo.RunLocalSelectedIndex); if (leftPart != null) { output.AppendRun(leftPart); } }
internal override CopyRun Remove(int startIndex, int length, bool withFreeRun) { if (startIndex == _mybuffer.Length) { //at the end return(null); } // startIndex = 0; //*** length = _mybuffer.Length; CopyRun freeRun = null; if (startIndex > -1 && length > 0) { int oldLexLength = _mybuffer.Length; char[] newBuff = new char[oldLexLength - length]; if (withFreeRun) { freeRun = MakeTextRun(startIndex, length); } if (startIndex > 0) { Array.Copy(_mybuffer, 0, newBuff, 0, startIndex); } Array.Copy(_mybuffer, startIndex + length, newBuff, startIndex, oldLexLength - startIndex - length); _mybuffer = newBuff; InvalidateOwnerLineCharCount(); UpdateRunWidth(); } return(withFreeRun ? freeRun : null); }
Size MeasureCopyRunLength(CopyRun copyRun) { //IAdvanceTextService txServices = GlobalTextService.AdvanceTextService; char[] mybuffer = copyRun.RawContent; //if (txServices.SupportsWordBreak) //{ var textBufferSpan = new Typography.Text.TextBufferSpan(mybuffer); _lineSegs.Clear(); _wordVisitor.SetLineSegmentList(_lineSegs); Typography.Text.GlobalTextService.TxtClient.BreakToLineSegments(textBufferSpan, _wordVisitor); var result = new TextSpanMeasureResult(); result.outputXAdvances = new int[mybuffer.Length]; Typography.Text.GlobalTextService.TxtClient.CalculateUserCharGlyphAdvancePos(textBufferSpan, _lineSegs, DefaultRunStyle.ReqFont, ref result); return(new Size(result.outputTotalW, result.lineHeight)); //} //else //{ // var textBufferSpan = new Typography.Text.TextBufferSpan(mybuffer); // var result = new TextSpanMeasureResult(); // result.outputXAdvances = new int[mybuffer.Length]; // txServices.CalculateUserCharGlyphAdvancePos(textBufferSpan, // DefaultRunStyle.ReqFont, // ref result); // return new Size(result.outputTotalW, result.lineHeight); //} }
void RightCopy(VisualPointInfo pointInfo, TextRangeCopy output) { if (pointInfo.LineId != _currentLineNumber) { throw new NotSupportedException(); } Run tobeCutRun = pointInfo.Run; if (tobeCutRun == null) { return; } CopyRun rightPart = tobeCutRun.Copy(pointInfo.RunLocalSelectedIndex); if (rightPart != null) { output.AppendRun(rightPart); } foreach (Run run in GetRunIterForward(tobeCutRun.NextRun, this.LastRun)) { output.AppendRun(run); } }
public void SplitToNewLine() { Run currentRun = CurrentTextRun; if (CurrentLine.IsBlankLine) { CurrentLine.AddLineBreakAfterLastRun(); } else { if (CharIndex == -1) { CurrentLine.AddLineBreakBeforeFirstRun(); SetCurrentTextRun(null); } else { CopyRun rightSplitedPart = Run.InnerRemove(currentRun, CurrentTextRunCharIndex + 1, true); if (rightSplitedPart != null) { CurrentLine.AddAfter(currentRun, rightSplitedPart); } CurrentLine.AddLineBreakAfter(currentRun); if (currentRun.CharacterCount == 0) { CurrentLine.Remove(currentRun); } } } this.TextLayer.TopDownReCalculateContentSize(); EnsureCurrentTextRun(); }
internal override CopyRun Remove(int startIndex, int length, bool withFreeRun) { CopyRun freeRun = null; if (startIndex > -1 && length > 0) { int oldLexLength = _mybuffer.Length; char[] newBuff = new char[oldLexLength - length]; if (withFreeRun) { freeRun = MakeCopy(startIndex, length); } if (startIndex > 0) { Array.Copy(_mybuffer, 0, newBuff, 0, startIndex); } Array.Copy(_mybuffer, startIndex + length, newBuff, startIndex, oldLexLength - startIndex - length); SetNewContent(newBuff); InvalidateOwnerLineCharCount(); UpdateRunWidth(); } return(withFreeRun ? freeRun : null); }
public void Copy(VisualSelectionRange selectionRange, TextRangeCopy output) { EditableVisualPointInfo startPoint = selectionRange.StartPoint; EditableVisualPointInfo endPoint = selectionRange.EndPoint; if (startPoint.Run != null) { if (startPoint.Run == endPoint.Run) { CopyRun elem = startPoint.Run.Copy( startPoint.RunLocalSelectedIndex, endPoint.LineCharIndex - startPoint.LineCharIndex); if (elem != null) { output.AppendRun(elem); } } else { GetStartAndStopLine(startPoint, endPoint, out TextLineBox startLine, out TextLineBox stopLine); if (startLine == stopLine) { CopyRun rightPart = startPoint.Run.Copy(startPoint.RunLocalSelectedIndex); if (rightPart != null) { output.AppendRun(rightPart); } if (startPoint.Run.NextRun != endPoint.Run) { foreach (Run run in _textFlowLayer.TextRunForward( startPoint.Run.NextRun, endPoint.Run.PrevRun)) { output.AppendRun(run); } } CopyRun leftPart = endPoint.Run.LeftCopy(endPoint.RunLocalSelectedIndex); if (leftPart != null) { output.AppendRun(leftPart); } } else { int startLineId = startPoint.LineId; int stopLineId = endPoint.LineId; startLine.RightCopy(startPoint, output); for (int i = startLineId + 1; i < stopLineId; i++) { //begine new line output.AppendNewLine(); TextLineBox line = _textFlowLayer.GetTextLine(i); line.Copy(output); } if (endPoint.LineCharIndex > -1) { output.AppendNewLine(); stopLine.LeftCopy(endPoint, output); } } } } else { GetStartAndStopLine(startPoint, endPoint, out TextLineBox startLine, out TextLineBox stopLine); if (startLine == stopLine) { if (startPoint.LineCharIndex == -1) { foreach (Run t in _textFlowLayer.TextRunForward( startPoint.Run, endPoint.Run.PrevRun)) { output.AppendRun(t); } CopyRun postCutTextRun = endPoint.Run.Copy(endPoint.RunLocalSelectedIndex + 1); if (postCutTextRun != null) { output.AppendRun(postCutTextRun); } } else { CopyRun rightPart = startPoint.Run.Copy(startPoint.RunLocalSelectedIndex + 1); if (rightPart != null) { output.AppendRun(rightPart); } foreach (Run t in _textFlowLayer.TextRunForward( startPoint.Run.NextRun, endPoint.Run.PrevRun)) { output.AppendRun(t.CreateCopy()); } CopyRun leftPart = endPoint.Run.LeftCopy(startPoint.RunLocalSelectedIndex); if (leftPart != null) { output.AppendRun(leftPart); } } } else { int startLineId = startPoint.LineId; int stopLineId = endPoint.LineId; startLine.RightCopy(startPoint, output); for (int i = startLineId + 1; i < stopLineId; i++) { output.AppendNewLine(); TextLineBox line = _textFlowLayer.GetTextLine(i); line.Copy(output); } stopLine.LeftCopy(endPoint, output); } } }
internal EditableVisualPointInfo Split(EditableVisualPointInfo pointInfo) { if (pointInfo.LineId != _currentLineNumber) { throw new NotSupportedException(); } Run tobeCutRun = pointInfo.Run; if (tobeCutRun == null) { return(CreateTextPointInfo( pointInfo.LineId, pointInfo.LineCharIndex, pointInfo.X, null, pointInfo.TextRunCharOffset, pointInfo.TextRunPixelOffset)); } this.LocalSuspendLineReArrange(); EditableVisualPointInfo result = null; CopyRun leftPart = tobeCutRun.LeftCopy(pointInfo.RunLocalSelectedIndex); CopyRun rightPart = tobeCutRun.Copy(pointInfo.RunLocalSelectedIndex); if (leftPart != null) { Run leftRun = AddBefore(tobeCutRun, leftPart); if (rightPart != null) { this.AddAfter(tobeCutRun, rightPart); } result = CreateTextPointInfo( pointInfo.LineId, pointInfo.LineCharIndex, pointInfo.X, leftRun, pointInfo.TextRunCharOffset, pointInfo.TextRunPixelOffset); } else { if (rightPart != null) { this.AddAfter(tobeCutRun, rightPart); } Run infoTextRun = null; if (IsSingleLine) { if (tobeCutRun.PrevRun != null) { infoTextRun = tobeCutRun.PrevRun; } else { infoTextRun = tobeCutRun.NextRun; } } else { if (IsFirstLine) { if (tobeCutRun.PrevRun != null) { infoTextRun = tobeCutRun.PrevRun; } else { if (tobeCutRun.NextRun == null) { infoTextRun = null; } else { infoTextRun = tobeCutRun.NextRun; } } } else if (IsLastLine) { if (tobeCutRun.PrevRun != null) { infoTextRun = tobeCutRun.PrevRun; } else { } } else { if (tobeCutRun.NextRun != null) { infoTextRun = tobeCutRun.NextRun; } else { infoTextRun = null; } } } result = CreateTextPointInfo( pointInfo.LineId, pointInfo.LineCharIndex, pointInfo.X, infoTextRun, pointInfo.TextRunCharOffset, pointInfo.TextRunPixelOffset); } this.Remove(tobeCutRun); this.LocalResumeLineReArrange(); return(result); }
internal SelectionRangeInfo Split(VisualSelectionRange selectionRange) { selectionRange.SwapIfUnOrder(); EditableVisualPointInfo startPoint = selectionRange.StartPoint; EditableVisualPointInfo endPoint = selectionRange.EndPoint; if (startPoint.Run == endPoint.Run) { Run toBeCutTextRun = startPoint.Run; CopyRun leftPart = toBeCutTextRun.LeftCopy(startPoint.RunLocalSelectedIndex); CopyRun middlePart = toBeCutTextRun.Copy(startPoint.RunLocalSelectedIndex, endPoint.LineCharIndex - startPoint.LineCharIndex); CopyRun rightPart = toBeCutTextRun.Copy(endPoint.RunLocalSelectedIndex); EditableVisualPointInfo newStartRangePointInfo = null; EditableVisualPointInfo newEndRangePointInfo = null; TextLineBox line = this; if (startPoint.LineId != _currentLineNumber) { line = _textFlowLayer.GetTextLine(startPoint.LineId); } line.LocalSuspendLineReArrange(); if (leftPart != null) { Run leftRun = line.AddBefore(toBeCutTextRun, leftPart); newStartRangePointInfo = CreateTextPointInfo( startPoint.LineId, startPoint.LineCharIndex, startPoint.X, leftRun, startPoint.TextRunCharOffset, startPoint.TextRunPixelOffset); } else { //no left part, //so we connect to prev text run Run prevTxtRun = startPoint.Run.PrevRun; if (prevTxtRun != null) { newStartRangePointInfo = CreateTextPointInfo( startPoint.LineId, startPoint.LineCharIndex, startPoint.X, prevTxtRun, startPoint.TextRunCharOffset - leftPart.CharacterCount, startPoint.TextRunPixelOffset - prevTxtRun.Width); } else { //no prev run, we are at the begining of the line newStartRangePointInfo = CreateTextPointInfo( startPoint.LineId, startPoint.LineCharIndex, 0, null, 0, 0); } } if (rightPart != null) { Run rightRun = line.AddAfter(toBeCutTextRun, rightPart); newEndRangePointInfo = CreateTextPointInfo( endPoint.LineId, endPoint.LineCharIndex, endPoint.X, null, ///?? startPoint.TextRunCharOffset + middlePart.CharacterCount, startPoint.TextRunPixelOffset + MeasureCopyRunLength(middlePart).Width); } else { Run nextTxtRun = endPoint.Run.NextRun; if (nextTxtRun != null) { newEndRangePointInfo = CreateTextPointInfo( endPoint.LineId, endPoint.LineCharIndex, endPoint.X, null, ///?? endPoint.TextRunPixelOffset + endPoint.Run.CharacterCount, endPoint.TextRunPixelOffset + endPoint.Run.Width); } else { newEndRangePointInfo = CreateTextPointInfo( endPoint.LineId, endPoint.LineCharIndex, endPoint.X, null, endPoint.TextRunCharOffset, endPoint.TextRunPixelOffset); } } if (middlePart != null) { line.AddAfter(toBeCutTextRun, middlePart); } else { throw new NotSupportedException(); } line.Remove(toBeCutTextRun); line.LocalResumeLineReArrange(); return(new SelectionRangeInfo(newStartRangePointInfo, newEndRangePointInfo)); } else { TextLineBox workingLine = this; if (startPoint.LineId != _currentLineNumber) { workingLine = _textFlowLayer.GetTextLine(startPoint.LineId); } EditableVisualPointInfo newStartPoint = workingLine.Split(startPoint); workingLine = this; if (endPoint.LineId != _currentLineNumber) { workingLine = _textFlowLayer.GetTextLine(endPoint.LineId); } EditableVisualPointInfo newEndPoint = workingLine.Split(endPoint); return(new SelectionRangeInfo(newStartPoint, newEndPoint)); } }
public void AppendRun(CopyRun run) { _stbuilder.Append(run.RawContent); }