package org.jboss.seam.pdf.ui; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import javax.faces.FacesException; import javax.faces.component.ValueHolder; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.convert.Converter; import org.jboss.seam.ui.util.JSF; import com.lowagie.text.html.simpleparser.HTMLWorker; import com.lowagie.text.html.simpleparser.StyleSheet; public class UIHtmlText extends ITextComponent implements ValueHolder { private Converter converter; private Object localValue; @Override public boolean getRendersChildren() { return true; } @Override public void encodeChildren(FacesContext context) throws IOException { ResponseWriter writer = context.getResponseWriter(); StringWriter stringWriter = new StringWriter(); ResponseWriter cachingResponseWriter = writer.cloneWithWriter(stringWriter); context.setResponseWriter(cachingResponseWriter); JSF.renderChildren(context, this); context.setResponseWriter(writer); String output = stringWriter.getBuffer().toString(); addFromHtml(output); } @Override public void encodeEnd(FacesContext context) throws IOException { Object value = getValue(); if (value != null) { addFromHtml(convert(context, value)); } super.encodeEnd(context); } private void addFromHtml(String html) throws IOException { for (Object o : HTMLWorker.parseToList(new StringReader(html), getStyle())) { addToITextParent(o); } // paragraph.addAll(HTMLWorker.parseToList(new StringReader(html), // getStyle())); } /** * XXX - this needs some work */ private StyleSheet getStyle() { StyleSheet styles = new StyleSheet(); styles.loadTagStyle("body", "leading", "16,0"); return styles; } protected String convert(FacesContext context, Object value) { Converter myConverter = converterForValue(context, value); if (myConverter != null) { return myConverter.getAsString(context, this, value); } else if (value != null) { return value.toString(); } else { return ""; } } protected Converter converterForValue(FacesContext ctx, Object value) { if (converter != null) { return converter; } if (value != null) { try { return ctx.getApplication().createConverter(value.getClass()); } catch (FacesException e) { // no converter defined - no problem } } return null; } @Override public void createITextObject(FacesContext context) { } @Override public Object getITextObject() { return null; } @Override public void removeITextObject() { } @Override public void handleAdd(Object other) { throw new RuntimeException("illegal child element"); } public Converter getConverter() { return converter; } public void setConverter(Converter converter) { this.converter = converter; } public Object getValue() { return valueBinding(FacesContext.getCurrentInstance(), "value", localValue); } public void setValue(Object value) { this.localValue = value; } public Object getLocalValue() { return localValue; } }