package org.emdev.common.textmarkup.line; import android.graphics.RectF; import org.emdev.common.textmarkup.RenderingStyle; public abstract class AbstractLineElement implements LineElement { public final int height; public float width; public final boolean isWhiteSpace; public AbstractLineElement(final float width, final int height, final boolean isWS) { this.height = height; this.width = width; this.isWhiteSpace = isWS; } public AbstractLineElement(final RectF rect) { this(rect.width(), (int) rect.height(), false); } @Override public final void publishToLines(final LineStream lines) { Line line = lines.tail(); final int h = Math.max(line.getHeight(), height); final LineWhiteSpace space = RenderingStyle.getTextPaint(lines.params.content, h).space; float remaining = lines.params.maxLineWidth - (line.width + (isWhiteSpace ? 0 : space.width)); if (remaining <= 0 && !lines.params.noLineBreak) { line = lines.add(); remaining = lines.params.maxLineWidth; } if (this.width <= remaining || lines.params.noLineBreak) { if (line.hasNonWhiteSpaces() && lines.params.insertSpace && !isWhiteSpace) { line.append(space); } line.append(this); } else { final AbstractLineElement[] splitted = split(remaining, lines.params.hyphenEnabled); if (splitted != null && splitted.length > 1) { if (line.hasNonWhiteSpaces() && lines.params.insertSpace && !isWhiteSpace) { line.append(space); } for (int i = 0; i < splitted.length - 1; i++) { line.append(splitted[i]); } } line = lines.add(); if (splitted == null) { line.append(this); } else { splitted[splitted.length - 1].publishToLines(lines); } } lines.params.insertSpace = !isWhiteSpace; lines.params.noLineBreak = false; } public AbstractLineElement[] split(final float remaining, boolean hyphenEnabled) { return null; } }