internal IEnumerable <EditableRun> TextRunForward(EditableRun startRun, EditableRun stopRun) { EditableTextLine currentLine = startRun.OwnerEditableLine; EditableTextLine stopLine = stopRun.OwnerEditableLine; if (currentLine == stopLine) { foreach (EditableRun r in currentLine.GetVisualElementForward(startRun, stopRun)) { yield return(r); } } else { foreach (EditableRun r in currentLine.GetVisualElementForward(startRun)) { yield return(r); } currentLine = currentLine.Next; while (currentLine != null) { if (currentLine == stopLine) { foreach (EditableRun r in currentLine.GetTextRunIter()) { if (r == stopRun) { break; } else { yield return(r); } } break; } else { foreach (EditableRun r in currentLine.GetTextRunIter()) { yield return(r); } currentLine = currentLine.Next; } } } }
void PerformHorizontalFlowArrangeForMultilineText( int ownerClientLeft, int ownerClientWidth, int ownerClientTop) { #if DEBUG long startTick = DateTime.Now.Ticks; #endif List <EditableTextLine> lines = (List <EditableTextLine>) this.lineCollection; int ownerClientRight = ownerClientLeft + ownerClientWidth; int curX = 0; int curY = 0; bool lastestIsBlock = false; int maxWidth = 0; int curY_fromTop = ownerClientTop; int maxHeightInRow = EditableTextLine.DEFAULT_LINE_HEIGHT; int lineCount = lines.Count; for (int i = 0; i < lineCount; ++i) { EditableTextLine line = lines[i]; curX = ownerClientLeft; lastestIsBlock = false; line.SetTop(curY_fromTop); if (!line.NeedArrange) { maxHeightInRow = line.ActualLineHeight; if (line.ActualLineWidth > maxWidth) { maxWidth = line.ActualLineWidth; } } else { maxHeightInRow = EditableTextLine.DEFAULT_LINE_HEIGHT; EditableTextLine newLine = null; line.ValidateContentArrangement(); bool isFirstRunInThisLine = true; foreach (EditableRun currentRun in line.GetTextRunIter()) { #if DEBUG vinv_dbug_BeginSetElementBound(currentRun); #endif int v_desired_width = currentRun.Width; int v_desired_height = currentRun.Height; if (isFirstRunInThisLine) { lastestIsBlock = currentRun.IsInlineBlockElement; if (v_desired_height > maxHeightInRow) { maxHeightInRow = v_desired_height; } currentRun.SetLocation(curX, 0); if (v_desired_height > maxHeightInRow) { maxHeightInRow = v_desired_height; } if (lastestIsBlock) { v_desired_width = ownerClientWidth; } currentRun.SetSize(v_desired_width, v_desired_height); currentRun.MarkValidContentArrangement(); curX += v_desired_width; isFirstRunInThisLine = false; } else { if (lastestIsBlock || currentRun.IsInlineBlockElement || (curX + v_desired_width > ownerClientRight)) { newLine = new EditableTextLine(this); newLine.AddLast(currentRun); curY = curY_fromTop + maxHeightInRow; curY_fromTop = curY; maxHeightInRow = EditableTextLine.DEFAULT_LINE_HEIGHT; EditableRun nextR = currentRun.NextTextRun; while (nextR != null) { line.UnsafeRemoveVisualElement(nextR); newLine.AddLast(nextR); nextR = nextR.NextTextRun; } if (i + 1 == lineCount) { lines.Add(newLine); } else { lines.Insert(i + 1, newLine); } lineCount++; break; } else { lastestIsBlock = currentRun.IsInlineBlockElement; if (v_desired_height > maxHeightInRow) { maxHeightInRow = v_desired_height; } currentRun.SetLocation(curX, 0); currentRun.SetSize(v_desired_width, v_desired_height); currentRun.MarkValidContentArrangement(); curX += v_desired_width; } } #if DEBUG vinv_dbug_EndSetElementBound(currentRun); #endif } if (curX > maxWidth) { maxWidth = curX; } } line.SetPostArrangeLineSize(maxWidth, maxHeightInRow); curY = curY_fromTop + maxHeightInRow; curY_fromTop = curY; } ValidateArrangement(); }