package co.smartreceipts.android.workers.reports.pdf.misc;
import android.support.annotation.NonNull;
import com.tom_roush.pdfbox.util.awt.AWTColor;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import co.smartreceipts.android.workers.reports.pdf.utils.PdfBoxUtils;
import co.smartreceipts.android.workers.reports.pdf.fonts.PdfFontSpec;
import co.smartreceipts.android.workers.reports.pdf.utils.HeavyHandedReplaceIllegalCharacters;
public class FixedWidthTextCell implements FixedWidthCell {
private final float mWidth;
private final String mText;
private final PdfFontSpec mFontSpec;
private final AWTColor mColor;
private final float mCellPadding;
private List<String> lines;
public FixedWidthTextCell(float width, float cellPadding, String text,
@NonNull PdfFontSpec fontSpec,
@NonNull AWTColor color) {
mWidth = width;
mCellPadding = cellPadding;
mText = HeavyHandedReplaceIllegalCharacters.getSafeString(text);
mFontSpec = fontSpec;
mColor = color;
}
private void breakUpString(String text) throws IOException {
lines = new ArrayList<>();
StringTokenizer tokenizer = new StringTokenizer(text, " ");
StringBuilder sb = new StringBuilder();
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
sb.append(token).append(" ");
String currentLine = sb.toString();
if (PdfBoxUtils.getStringWidth(currentLine, mFontSpec) > mWidth) {
if (sb.indexOf(token) > 0) {
lines.add(sb.substring(0, sb.indexOf(token)));
sb = new StringBuilder();
sb.append(token).append(" ");
} else {
lines.add(sb.toString().trim());
sb = new StringBuilder();
}
}
}
if (!sb.toString().isEmpty()) {
lines.add(sb.toString().trim());
}
}
public float getWidth() {
return mWidth;
}
@Override
public float getHeight() {
try {
breakUpString(mText);
return PdfBoxUtils.getFontHeight(mFontSpec) * lines.size() + 2 * mCellPadding;
} catch (IOException e) {
e.printStackTrace();
return 0;
}
}
public List<String> getLines() throws IOException {
// TODO, that's not very cool... Should we initialize lines in the constructor?
if (lines == null) {
breakUpString(mText);
}
return lines;
}
public PdfFontSpec getFontSpec() {
return mFontSpec;
}
public AWTColor getColor() {
return mColor;
}
@Override
public float getCellPadding() {
return mCellPadding;
}
}