public TextElementLine EndLine() { TextElementLine line = (TextElementLine)ContainerStack.Pop(); ContainerStack.Peek().Add(line); return(line); }
public IEnumerable <ITextElement> Split(float width) { LinkedList <ITextElement> backlog = new LinkedList <ITextElement>(Contents); TextElementLine a = new TextElementLine(Alignment); TextElementLine b = new TextElementLine(Alignment); float aWidth = 0; while (backlog.Any()) { var element = backlog.PopFirst(); float elementWidth = element.Width; if (b.Contents.Any()) { b.Add(element); } else if (aWidth + elementWidth > width) { if (elementWidth > width && aWidth < width) //Special case, word would never fit! { if (element is ITextSplitable splitable && !element.IsUnit) //Only non-units can be split { var splitResult = splitable.Split(width - aWidth).ToList(); if (splitResult.First().Width <= 0) { aWidth = width; } foreach (var split in splitResult.Reverse <ITextElement>()) { if (split.Width > 0) { backlog.AddFirst(split); } } } continue; } else { b.Add(element); } } else { a.Add(element); } aWidth += elementWidth; } a.Trim(); b.Trim(); yield return(a); if (b.Contents.Any()) { yield return(b); } }
public void StartLine(LineAlignment alignment) { var line = new TextElementLine(alignment); ContainerStack.Push(line); }