private static void CreateTextBlockSegments( VisualSpanner Parent, string Text, IRowCol StartRowCol, byte?AttrByte, CanvasDefn CanvasDefn) { IRowCol rowCol = StartRowCol; string text = Text; int segNum = 0; int segBx = 0; // advance past attrByte. #if skip if (AttrByte != null) { rowCol = rowCol.Advance(1); } #endif bool attrByteOccupySpace = true; // loop create textblock segments until no more text. while (text.Length > 0) { // space on this row. var remLx = rowCol.GetRowRemaining(); if (attrByteOccupySpace == true) { remLx -= 1; } // text to place on current row. int usedLx = 0; if (remLx > text.Length) { usedLx = text.Length; } else { usedLx = remLx; } // create the textblock segment. if (usedLx > 0) { segNum += 1; var vtb = new VisualTextBlockSegment( Parent, segNum, segBx, Text.Substring(segBx, usedLx), rowCol as ZeroRowCol, AttrByte, CanvasDefn, attrByteOccupySpace); vtb.SetupUnderline(); Parent.SegmentList.Add(vtb); // advance to next segment in show text. segBx += usedLx; if (text.Length > usedLx) { text = text.Substring(usedLx); } else { text = ""; } } // advance rowCol if (attrByteOccupySpace == true) { usedLx += 1; } rowCol = rowCol.Advance(usedLx); attrByteOccupySpace = false; } }