@Override
	public void paint(JComponent c, Graphics g, PaintContext context, Rectangle clip,
			FieldBackgroundColorManager colorManager, RowColLocation cursorLocation,
			int rowHeight) {

		// the graphics have been translated such that the first line of text's base line is
		// at y=0  (So if we are not clipped, we will drawing from a negative value that is the
		// font's height above the baseline (-heightAbove) to rowHeight (-heightAbove)
		int myStartY = -heightAbove;
		int myEndY = myStartY + rowHeight;
		int clipStartY = clip.y;
		int clipEndY = clip.y + clip.height;

		Color fieldBackgroundColor = colorManager.getBackgroundColor();
		if (fieldBackgroundColor != null) {
			g.setColor(fieldBackgroundColor);

			// restrict background rectangle to clipping rectangle
			int startY = Math.max(myStartY, clipStartY);
			int endY = Math.min(myEndY, clipEndY);
			int clippedHeight = endY - startY;
			g.fillRect(startX, startY, width, clippedHeight);
		}

		FieldRow cursorRow = null;
		if (cursorLocation != null) {
			cursorRow = getFieldRow(cursorLocation.row());
		}

		int startY = myStartY;
		int translatedY = 0;

		for (FieldRow fieldRow : fieldRows) {

			// if past clipping region we are done
			if (startY > clipEndY) {
				break;
			}

			TextField field = fieldRow.field;
			int subFieldHeight = fieldRow.field.getHeight();
			int endY = startY + subFieldHeight;

			// if any part of the line is in the clip region, draw it
			if (endY >= clipStartY) {
				RowColLocation cursor = null;
				if (fieldRow == cursorRow) {
					int relativeRow = fieldRow.getRelativeRow(cursorLocation.row());
					cursor = cursorLocation.withRow(relativeRow);
				}

				field.paint(c, g, context, clip, colorManager, cursor, rowHeight);
			}

			// translate for next row of text
			startY += subFieldHeight;
			g.translate(0, subFieldHeight);
			translatedY += subFieldHeight;
		}

		// restore the graphics to where it was when we started.
		g.translate(0, -translatedY);
	}
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