@Override
	public RowColLocation textOffsetToScreenLocation(int textOffset) {

		int extraSpace = rowSeparator.length();
		int n = fieldRows.size();
		int textOffsetSoFar = 0;
		for (int i = 0; i < n; i++) {

			if (textOffsetSoFar > textOffset) {
				break;
			}

			FieldRow fieldRow = fieldRows.get(i);
			int length = fieldRow.field.getText().length() + extraSpace;
			int end = textOffsetSoFar + length;
			if (end > textOffset) {
				int relativeOffset = textOffset - textOffsetSoFar;
				RowColLocation location = fieldRow.field.textOffsetToScreenLocation(relativeOffset);
				int screenRow = fieldRow.fromRelativeRow(location.row());
				return location.withRow(screenRow);
			}

			textOffsetSoFar += length;
		}

		FieldRow lastRow = fieldRows.get(fieldRows.size() - 1);
		int length = lastRow.field.getText().length();
		return new DefaultRowColLocation(numRows - 1, length);
	}
A {@link TextField} that takes in other TextFields.

<P>This class allows clients to create custom text layout behavior by combining individual
TextFields that dictate layout behavior.  As an example, consider this rendering:
<pre>
	1)  This is some text...
	2)	This
		is
		more
		text
</pre>
In this example, 1) is a row of text inside of a {@link ClippingTextField}.  Row 2) is a
multi-line text rendering specified in a single {@link FlowLayoutTextField}, using a
narrow width to trigger the field to place each element on its own line.
Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/field/CompositeVerticalLayoutTextField.java