/*
* Copyright 2011-2012 Blazebit
*/
package com.blazebit.blazefaces.behavior.handler;
import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.behavior.ClientBehavior;
import javax.faces.component.behavior.ClientBehaviorContext;
import javax.faces.context.FacesContext;
import com.blazebit.blazefaces.apt.JsfRenderer;
import com.blazebit.blazefaces.renderkit.CoreRenderer;
import com.blazebit.blazefaces.util.ComponentUtils;
import com.blazebit.blazefaces.util.RendererUtils;
//@JsfRenderer
public class EventHandlerRenderer extends CoreRenderer {
@Override
public boolean getRendersChildren() {
return true;
}
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
EventHandler eh = (EventHandler) component;
StringBuilder scriptBuilder = new StringBuilder();
if (!eh.getChildren().isEmpty()) {
String event = getEventName(eh);
String domEvent = event;
if("valueChange".equals(event)){
domEvent = "change";
}else if("action".equals(event)){
domEvent = "click";
}
String target = (String) component.getAttributes().get("for");
UIComponent source = null;
if(target != null){
source = ComponentUtils.findComponent(context.getViewRoot(), target);
}else{
source = component.getParent();
}
scriptBuilder.append("BlazeJS.EventHandler.add('");
scriptBuilder.append(ComponentUtils.escapeJQueryId(source.getClientId()));
scriptBuilder.append("','");
scriptBuilder.append(domEvent);
scriptBuilder.append("',");
encodeBehaviors(scriptBuilder, context, source, eh, event);
scriptBuilder.append(");");
}
if(scriptBuilder.length() > 0){
RendererUtils.addBodyBottomScript(context, scriptBuilder.toString());
}
}
private void encodeBehaviors(StringBuilder scriptBuilder, FacesContext context, UIComponent source, EventHandler component, String event){
List<ClientBehaviorContext.Parameter> params = Collections.emptyList();
scriptBuilder.append("BlazeJS.EventHandler.create('");
scriptBuilder.append("parallel".equals(component.getAttributes().get("type")) ? "parallel" : "sequential");
scriptBuilder.append("',[");
for (Iterator<UIComponent> childIterator = component.getChildren().iterator(); childIterator.hasNext();) {
UIComponent current = childIterator.next();
if(current instanceof EventHandler){
encodeBehaviors(scriptBuilder, context, source, (EventHandler) current, event);
}else if(current instanceof EventHandler.DefinitionOrderComponent){
ClientBehavior behavior = ((EventHandler.DefinitionOrderComponent)current).getBehavior();
ClientBehaviorContext cbc = ClientBehaviorContext.createClientBehaviorContext(context, source, event, null, params);
scriptBuilder.append("function(event){");
scriptBuilder.append(behavior.getScript(cbc));
scriptBuilder.append("}");
}else{
continue;
}
if(childIterator.hasNext()){
scriptBuilder.append(",");
}
}
scriptBuilder.append("])");
}
private String getEventName(EventHandler eh) {
String event = (String) eh.getAttributes().get("event");
if(event != null){
return event;
}
if(eh.getParent() instanceof UIInput)
return "valueChange";
else
return "action";
}
}