package org.richfaces.renderkit.html;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIMessage;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.ajax4jsf.resource.InternetResource;
import org.richfaces.component.UIRichMessage;
import org.richfaces.renderkit.RichMessageBaseRenderer;
/**
* @author Anton Belevich
*
*/
public class HtmlRichMessageRenderer extends RichMessageBaseRenderer{
private final InternetResource[] styles = {getResource("/org/richfaces/renderkit/html/css/msg.css")};
private InternetResource[] stylesAll = null;
protected InternetResource[] getStyles(){
synchronized (this){
if(stylesAll == null){
InternetResource[] rsrcs = super.getStyles();
boolean ignoreSuper = rsrcs == null || rsrcs.length == 0;
boolean ignoreThis = styles == null || styles.length == 0;
if(ignoreSuper){
if (ignoreThis) {
stylesAll = new InternetResource[0];
} else {
stylesAll = styles;
}
}else{
if(ignoreThis){
stylesAll = rsrcs;
}else{
Set rsrcsSet = new java.util.LinkedHashSet();
for(int i = 0; i < rsrcs.length; i++ ){
rsrcsSet.add(rsrcs[i]);
}
for(int i = 0; i < styles.length; i++ ){
rsrcsSet.add(styles[i]);
}
stylesAll = (InternetResource[]) rsrcsSet.toArray(new InternetResource[rsrcsSet.size()]);
}
}
}
}
return stylesAll;
}
protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException {
Iterator msgIter = null;
UIRichMessage msgComponent = (UIRichMessage)component;
String forClientId = msgComponent.getFor();
if(forClientId == null){
if(log.isErrorEnabled()){
log.error(NULL_PARAMETER_ERROR_MESSAGE);
}
}else{
msgIter = getMessageIterator(context, forClientId, msgComponent);
writer.startElement(HTML.SPAN_ELEM, msgComponent);
getUtils().writeAttribute(writer, HTML.id_ATTRIBUTE, msgComponent.getClientId(context));
if(!msgIter.hasNext() && msgComponent.isPassed()){
encodingUIContent(msgComponent, context, null);
}else if(msgIter.hasNext() ){
FacesMessage message = (FacesMessage)msgIter.next();
encodingUIContent(msgComponent, context, message);
}
writer.endElement(HTML.SPAN_ELEM);
}
}
protected void encodingUIContent(UIRichMessage uiMsg, FacesContext context, FacesMessage facesMsg) throws IOException{
ResponseWriter writer = context.getResponseWriter();
outerStyles(uiMsg, context, writer, facesMsg);
renderMarkerFacet(uiMsg,context, writer,facesMsg);
renderLabel(uiMsg, context, writer, facesMsg);
}
public void renderOuterStyles(UIComponent component, FacesContext context, ResponseWriter writer,String outerStyle, String outerClass) throws IOException{
UIRichMessage uiMsg = null;
if(!(component instanceof UIRichMessage)){
return;
}
uiMsg = (UIRichMessage)component;
String parentStyle = (String)uiMsg.getAttributes().get("style");
String parentClass = (String)uiMsg.getAttributes().get("styleClass");
String richMessageClass = "rich-message" + (null != outerClass ? " " + outerClass : "");
String richMessageStyle = (null != outerStyle ? outerStyle + "," : "");
parentStyle = parentStyle != null ? (richMessageStyle + parentStyle) : richMessageStyle;
parentClass = parentClass != null ? (richMessageClass + " " + parentClass) : richMessageClass;
getUtils().writeAttribute(writer, HTML.class_ATTRIBUTE, parentClass);
getUtils().writeAttribute(writer, HTML.style_ATTRIBUTE, parentStyle);
}
public void renderMarkerHtml(UIComponent component,UIComponent marker, FacesContext context,
ResponseWriter writer,String markerClass, String markerStyle) throws IOException{
UIRichMessage uiMsg = null;
if(!(component instanceof UIRichMessage)){
return;
}
uiMsg = (UIRichMessage)component;
writer.startElement(HTML.SPAN_ELEM, uiMsg);
String classes = markerClass == null ? "rich-message-marker" : "rich-message-marker " + markerClass;
getUtils().writeAttribute(writer, HTML.class_ATTRIBUTE, classes);
getUtils().writeAttribute(writer, HTML.style_ATTRIBUTE, markerStyle);
renderChild(context, marker);
writer.endElement(HTML.SPAN_ELEM);
}
public void renderLabelHtml(UIComponent component, FacesContext context, ResponseWriter writer,
FacesMessage facesMsg, String labelClass, String labelStyle, String passLabel) throws IOException{
String summary = null;
String detail = null;
String title = null;
UIRichMessage uiMsg = null;
if(!(component instanceof UIRichMessage)){
return;
}
uiMsg = (UIRichMessage)component;
boolean isTooltip = getUtils().isBooleanAttribute(uiMsg, "tooltip");
boolean showSummary = uiMsg.isShowSummary();
boolean showDetail = uiMsg.isShowDetail();
if(facesMsg != null){
summary = (null != (summary = facesMsg.getSummary())) ? summary : "";
detail = (null != (detail = facesMsg.getDetail())) ? detail : "";
}
String classes = labelClass == null ? "rich-message-label" : "rich-message-label " + labelClass;
writer.startElement(HTML.SPAN_ELEM, uiMsg);
getUtils().writeAttribute(writer, HTML.class_ATTRIBUTE,classes);
getUtils().writeAttribute(writer, HTML.style_ATTRIBUTE, labelStyle);
if(facesMsg != null){
if(isTooltip){
title = (String) uiMsg.getAttributes().get("title");
if(title != null){
getUtils().writeAttribute(writer, HTML.title_ATTRIBUTE, title);
}else{
getUtils().writeAttribute(writer, HTML.title_ATTRIBUTE, summary);
}
}
if(showDetail){
writer.writeText(detail, null);
writer.writeText("\t", null);
}
if(showSummary){
writer.writeText(summary, null);
writer.writeText("\t", null);
}
}else {
if(passLabel != null){
writer.writeText(passLabel, null);
writer.writeText("\t", null);
}
}
writer.endElement(HTML.SPAN_ELEM);
}
protected Class getComponentClass() {
return UIMessage.class;
}
}